Diagnosing Feed Reading Problems in IE, Part 2
Posted: January 10, 2010 Filed under: Windows Internals Leave a commentIn the last post, I used PowerShell to talk to the Windows RSS Platform, give me my feeds, retrieve a particular feed, Toolmonger, and mark it read. If this had worked, the Toolmonger item in the IE feeds list would be unbolded and marked as read.
The RSS platform does mark the feed appropriately, as you can see, but IE does not indicate it as read.
As I write this, I’m still looking for the answer. Here’s what else I’ve found.
The RSS feed database, which is one for each user on the machine, is stored in each user profile under appdata\microsoft\feeds:
Note the FeedsStore.feedsdb-ms. It may keep track of unread items. Note too that all the feed folders have a tilde (~) appended to them; this is true for all folders, subfolders and feeds. I’m not sure what the hidden GUID folder is about, but it was last changed when my old profile was imported from Vista into Seven.
Here’s the Technology folder:
The files are binary blobs with bits of XML (the feed content) embedded within. Enclosures and images don’t appear to be included.
While I have no solution yet for my problem, there are a few things you can try if your RSS feeds don’t work in IE.
Most likely symptom you’ll have is that one feed may never update or IE may report feed errors. Check first that it isn’t a problem with the site (IE 8 is much better with RSS compatibility, but some sites still break it) and that the feed still exists. Then try these things in order:
- Quit IE. Delete Feedsstore.feeds-ms. Restart IE. Your feeds will all be marked as unread.
- If you know the feed causing problems, delete it and quit IE. Restart IE, go to the web site with the feed and try readding it.
- If you don’t know the problem feed—and sometimes you may not—you may need to open PowerShell and walk through each of your feed folders as detailed in Part 1. Corrupt items won’t be retrievable; the one that isn’t is the bad one.
- You may need to export all your feeds and recreate them. In IE go to File/Import and Export and select Export to A File. Click Next. Select Feeds. Click Next. It will export to an OPML file in your directory. Delete all your feeds in IE. Quit IE and restart it. Go to File/Import and Export and select Import from a File. Select Feeds. Select the OPML file you just created and click OK. Click Import.
A frustrating scenario you might run into is when the IE export runs into a corrupted feed and won’t finish. I’ve used Process Monitor to determine what feed is choking, in which case I have to delete the feed and try the export again.
I’ve only done the first step, deleting feedsstore.feeds-ms, in my case. It didn’t work. I haven’t tried the others because I wanted to learn more about the problem. I also hate turning my machine upside down only to find the problem still persisting; there are many Windows reinstalls that did nothing to fix things, that turned out to have some other cause that reinstalling would never fix.
I think that, rather than the feeds manager not working, IE is not properly refreshing the feeds window to reflect the current status. I note that when I manually mark feeds as read in IE, the feed is updated (unbolded) properly. I also note that some feeds will update their unread status immediately when I close their associated windows. Other feeds will not. I haven’t discovered any commonality between feeds that update their status and feeds that don’t.
Throughout this, the feeds manager has been working and giving me plenty of feed items to read.
I’d like to find a solution. It is a minor problem, but it is also a significant fit-and-finish problem for the IE team. UI appearance matters. I’d be happy to share this with the IE team if I knew where to file a report.
Diagnosing Feed Reading Problems in IE, Part 1
Posted: January 10, 2010 Filed under: Windows Internals Leave a commentFor several months, I’ve been having an annoying problem with IE8. This is going to be a long post, an excuse to explain some IE RSS internals.
I use IE’s built in RSS reader and read items as seen in the screenshot above. Unfortunately, when I close one feed and go to the next, the feed is often still marked as unread, even though I’ve read it. The popup tells the truth: I’ve read all the posts in Gadget Freak, yet the feed name is still highlighted, meaning “unread”, as is the common convention for RSS readers (and Usenet/web forum readers before that.)
The IE RSS feeds manager is a component built into IE that is available to all Windows applications. It’s documented in MSDN and known as the Windows RSS Platform. It can be accessed through the COM object “Microsoft.Feedsmanager”, and it is very useable and discoverable in PowerShell.
First, reference the Feedsmanager:
$feeds = new-object -com "Microsoft.FeedsManager"
What can we do? Get its methods:
$feeds | gm TypeName: System.__ComObject#{a74029cc-1f1a-4906-88f0-810638d86591} Name MemberType Definition ---- ---------- ---------- AsyncSyncAll Method void AsyncSyncAll () BackgroundSync Method void BackgroundSync (FEEDS_BACKGROUNDSYNC_ACTION) DeleteFeed Method void DeleteFeed (string) DeleteFolder Method void DeleteFolder (string) ExistsFeed Method bool ExistsFeed (string) ExistsFolder Method bool ExistsFolder (string) GetFeed Method IDispatch GetFeed (string) GetFeedByUrl Method IDispatch GetFeedByUrl (string) GetFolder Method IDispatch GetFolder (string) IsSubscribed Method bool IsSubscribed (string) Normalize Method string Normalize (string) BackgroundSyncStatus Property FEEDS_BACKGROUNDSYNC_STATUS BackgroundSyncStatus () {get} DefaultInterval Property int DefaultInterval () {get} {set} ItemCountLimit Property int ItemCountLimit () {get} RootFolder Property IDispatch RootFolder () {get}
You may remember the Default Interval and Item Count Limit if you’ve configured RSS in IE.
Let’s get the root folder and its properties:
$feedsfolder = $Feeds.RootFolder $feedsfolder | gm TypeName: System.__ComObject#{81f04ad1-4194-4d7d-86d6-11813cec163c} Name MemberType Definition ---- ---------- ---------- ItemCount AliasProperty ItemCount = TotalItemCount UnreadItemCount AliasProperty UnreadItemCount = TotalUnreadItemCount CreateFeed Method IDispatch CreateFeed (string, string) CreateSubfolder Method IDispatch CreateSubfolder (string) Delete Method void Delete () ExistsFeed Method bool ExistsFeed (string) ExistsSubfolder Method bool ExistsSubfolder (string) GetFeed Method IDispatch GetFeed (string) GetSubfolder Method IDispatch GetSubfolder (string) GetWatcher Method IDispatch GetWatcher (FEEDS_EVENTS_SCOPE, FEEDS_EVENTS_MASK) Move Method void Move (string) Rename Method void Rename (string) Feeds Property IDispatch Feeds () {get} IsRoot Property bool IsRoot () {get} Name Property string Name () {get} Parent Property IDispatch Parent () {get} Path Property string Path () {get} Subfolders Property IDispatch Subfolders () {get} TotalItemCount Property int TotalItemCount () {get} TotalUnreadItemCount Property int TotalUnreadItemCount () {get} Type ScriptProperty System.Object Type {get="folder";}
Now, subfolders:
$feedsfolder.Subfolders Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- folder Microsoft Feeds 396 302 folder Moisan's Feeds 40015 1459
Let’s skip ahead. My feeds are stored in “Moisan’s Feeds” and I want to see the “Technology” folder:
$feedstech = (($feedsfolder.GetSubfolder("Moisan's Feeds")).GetSubfolder("Technology")).Feeds $feedstech Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- feed adafruit industries blog 200 0 feed bunnie's blog 77 0 feed Dark Roasted Blend 200 0 feed Design News - Gadget Freak 57 0 feed Flylogic Engineering's Analytical Blog 16 0 feed Gadget Freak 200 0 feed hack a day 200 0 feed Hacked Gadgets 200 10 feed HacknMod.com - You name it. We hack it. 200 0 feed Hotsolder 37 1 feed How To Spot A Psychopath 200 1 feed It Ain't Dead Yet 30 0 feed Jeff Duntemann's ContraPositive Diary 200 1 feed Keith's Electronics Blog 88 2 feed LED Luminaries 78 1 feed Lifehacker 200 9 feed Made By Monkeys 159 2 feed MAKE: Blog 200 103 feed Modern Mechanix 200 0 feed Neato Coolville 200 0 feed OTA HDTV Reception Q&A 37 0 feed Paleo-Future Blog 88 1 feed Retro Thing 200 7 feed Safety Graphic Fun 200 12 feed There, I Fixed It. 200 20 feed Toolmonger 200 32 feed Uplinks
We’ll get Toolmonger:
$feedstoolmonger = (($feedsfolder.GetSubfolder("Moisan's Feeds")).GetSubfolder("Technology")).GetFeed("Toolmonger") $feedstoolmonger Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- feed Toolmonger 200 32
Here are the properties of the feed:
$feedstoolmonger | gm TypeName: System.__ComObject#{33f2ea09-1398-4ab9-b6a4-f94b49d0a42e} Name MemberType Definition ---- ---------- ---------- AsyncDownload Method void AsyncDownload () CancelAsyncDownload Method void CancelAsyncDownload () ClearCredentials Method void ClearCredentials () Delete Method void Delete () Download Method void Download () GetItem Method IDispatch GetItem (int) GetItemByEffectiveId Method IDispatch GetItemByEffectiveId (int) GetWatcher Method IDispatch GetWatcher (FEEDS_EVENTS_SCOPE, FEEDS_EVENTS_MASK) MarkAllItemsRead Method void MarkAllItemsRead () Merge Method void Merge (string, string) Move Method void Move (string) Rename Method void Rename (string) SetCredentials Method void SetCredentials (string, string) Xml Method string Xml (int, FEEDS_XML_SORT_PROPERTY, FEEDS_XML_SORT_ORDER, FEEDS_XML_FILTER_FLAGS, FEEDS_XM... Copyright Property string Copyright () {get} Description Property string Description () {get} DownloadEnclosuresAutomatically Property bool DownloadEnclosuresAutomatically () {get} {set} DownloadStatus Property FEEDS_DOWNLOAD_STATUS DownloadStatus () {get} DownloadUrl Property string DownloadUrl () {get} Image Property string Image () {get} Interval Property int Interval () {get} {set} IsList Property bool IsList () {get} ItemCount Property int ItemCount () {get} Items Property IDispatch Items () {get} Language Property string Language () {get} LastBuildDate Property Date LastBuildDate () {get} LastDownloadError Property FEEDS_DOWNLOAD_ERROR LastDownloadError () {get} LastDownloadTime Property Date LastDownloadTime () {get} LastItemDownloadTime Property Date LastItemDownloadTime () {get} LastWriteTime Property Date LastWriteTime () {get} Link Property string Link () {get} LocalEnclosurePath Property string LocalEnclosurePath () {get} LocalId Property string LocalId () {get} MaxItemCount Property int MaxItemCount () {get} {set} Name Property string Name () {get} Parent Property IDispatch Parent () {get} Password Property string Password () {get} Path Property string Path () {get} PubDate Property Date PubDate () {get} SyncSetting Property FEEDS_SYNC_SETTING SyncSetting () {get} {set} Title Property string Title () {get} Ttl Property int Ttl () {get} UnreadItemCount Property int UnreadItemCount () {get} Url Property string Url () {get} {set} Username Property string Username () {get} Type ScriptProperty System.Object Type {get="feed";}
An excerpt of the feed itself:
$feedstoolmonger.Items Title : Overpriced Center Finder Link : http://toolmonger.com/2009/11/30/overpriced-center-finder/ Guid : http://toolmonger.com/?p=35079 Description : <p><a href="http://toolmonger.com/wp-content/uploads/2009/11/center-finder.jpg"><img class="aligncenter size-full wp-image-3509 8" src="http://toolmonger.com/wp-content/uploads/2009/11/center-finder.jpg" alt="" width=450 height=475></a></p> <p>When I first saw Eagle’s Marking Center Finder, I thought, “Cool, that works on the same principle as <a title="Previous Art icle" href="http://toolmonger.com/feed/2008/03/17/center-mortises-with-rocklers-router-baseplate/">Rockler’s mortise-centering router baseplate</a>.” Looking at the PVC-made jig, I figured it’d be 5 to 10 bucks tops, but then I saw $25 price tag and figu red I’d tell everyone they should spend 15 minutes in the shop and make one with a with a piece of scrap wood and a section of dowel instead.</p> <p>It’s simple geometry that if you build it right, drilling three evenly spaced holes on a line, the resulting jig should be p retty accurate in finding the center of a board. And if you build your own you won’t be limited to the width of a 2×4 like Eagl e’s model.</p> <p><span id=more-35079></span> Why would you want to build one in the first place? It’s handy for marking the center of board e dge when you’re laying out mortises, holes for dowels, centering biscuits, and doing plenty of other operations. If you find yo u’d actually want to purchase Eagle America’s marking center finder, they generously throw in a pencil for your $25.</p> <p><a title="Marking Center Finder Manufacturer" href="http://www.eagleamerica.com/product/400-2048/eagle_originals">Center Fin der</a> [Eagle America]<br> <a title="Marking Center Finder At Amazon" href="http://www.amazon.com/dp/B001CMNCAU?tag=toolmonger-20">Via Amazon</a> [<a href ="http://toolmonger.com/amazon-links/">What’s This?</a>]</p> PubDate : 11/30/2009 12:05:29 PM Comments : http://toolmonger.com/2009/11/30/overpriced-center-finder/#comments Author : Benjamen Johnson Enclosure : IsRead : True LocalId : 2830 Parent : System.__ComObject DownloadUrl : http://toolmonger.com/feed/ LastDownloadTime : 11/30/2009 10:25:27 PM Modified : 11/30/2009 12:05:29 PM EffectiveId : -77766319
How many unread items are in Toolmonger?
$feedstoolmonger.UnreadItemCount 32
Let’s mark them all read to see if IE updates the status:
$feedstoolmonger.MarkAllItemsRead() $feedstoolmonger.UnreadItemCount 0
They are marked as unread.
Did it work? See the next post, which explains where IE stores its feed database and what do to for common problems.
My New Year’s Resolutions? Overwhelmed!
Posted: January 5, 2010 Filed under: SATV Leave a commentOver the last week, I have completed my share of maintenance at SATV. While everyone else was helping to paint the hallways, I was installing our new $300 powerstrip. Now, in many ways, the real work of 2010 begins.
These projects are looming:
- Completing migration from three-ring reservation binders to our computer-based reservation DB
- Planning our migration from Vista (which will be oh-so-brief at SATV) to Seven, to be done by President’s Day
- Comply with new Massachusetts regulations on personal information by March 1st.
- New firewall/NAT appliance to supersede our cranky cable modem.
- New network switch to replace one in Cablecast which is totally full (8 ports used out of 8).
- Implement an image-based backup scheme for our workstations.
- Figure out how to provide city news and announcements to blind and visually-impaired users.
- Automate and report everything that is not already automatable and reportable.
Amazon.com has a new BFF in me, as seen above!
Except for Windows Internals, I haven’t opened any of those books.
I’m overwhelmed.
While I have loved IT for 30 years, I am mentally exhausted. I have ADD and have had it my whole life. Even though I have and use all the organizational coping strategies available (Outlook, Word, my PDA and Spiceworks), I can do 4 hours of mental work on a computer—and feel like I’ve done 20!
The past six months of database migration have killed me. I’m almost not sure I want to open the books and get going for 2010.