Diagnosing Feed Reading Problems in IE, Part 2

In 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:

  1. Quit IE.  Delete Feedsstore.feeds-ms.  Restart IE.  Your feeds will all be marked as unread.
  2. 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.
  3. 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.
  4. 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

For 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!

Over 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.