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.

Advertisements


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s