Incorporation into a web site or online service is one thing, but RSS feeds can be far more useful than that. Desktop readers, a category of software that can display your favorite RSS feeds directly on your desktop, are quickly gaining in popularity. In this section, we look at some examples of good desktop readers and their similarities.
The first RSS desktop reader to come to prominence was Carmen's Headline Viewer (CHV). Its origins were shrouded in mystery for a while, but CHV was actually written by Jeff Barr?the man behind Syndic8?and named after his wife. Version 0.1 came out in April 1999, and development continues at the time of this writing. It captured the imagination of many users by giving two advantages over reading RSS feeds over the existing online portals. First, it allowed users to be offline when they read the feeds, which allowed hundreds of sources to be downloaded and perused at a user's leisure in an era when Internet access was expensive in many countries. Second, the author considered a non-browser-based RSS vehicle to be potentially superior.
Since then, desktop readers have flourished. There are currently over 30 different examples listed on the Open Directory Project at http://www.dmoz.org. Many are free or cost very little.
The evolution of RSS desktop readers is still in its early stages, but already many common features have emerged. Future developers should take note of these, as they are rapidly growing in popularity. Some of them may be refined over the next few years, but it is not expected that any of them will disappear entirely.
Userland Software, whose CEO Dave Winer has been instrumental in the development of RSS 0.9x and 2.0, was one of the first companies to invest commercially in RSS. They produced an RSS-reading feature within their desktop weblogging software, Radio. This introduced a new idea into desktop readers: the subscription icon. Because Radio runs as a web server on port 5335 on the host machine, web sites can display icons that are hyperlinked to an IP address of 220.127.116.11 ? that of the user's machine. Clicking on the link tells Radio to subscribe to the feed denoted in the URL's attributes. For example, a link to:
will, when activated, tell Radio to subscribe to the feed at the URL http://www.scripting.com/rss.xml (which is actually the feed from Dave Winer's own weblog, Scripting News).
This feature allowed for all Radio-built weblogs to include the requisite coffee-cup icon, shown in Figure 10-3. A circle of virtuous people was attracted to Radio for this feature, using it to produce more icon-decorated sites, which, in turn, attracted more people.
This proved to be such a popular feature that now many of the desktop reader products (and web-based aggregators too, for that matter) allow for the same thing, with similar methods of invoking the subscription function:
Web site publishers who want to make it easy for the users of these products to subscribe can provide links in these formats. At the time of this writing a small effort is underway to standardize the port number and path that the desktop readers listen on, so that only one URL need be given by the web site publisher to support, for example, Radio, Amphetadesk, and Headline Viewer together.
Support is also growing for desktop readers to support subscription requests in which the user gives only the URL of the main page of the site. Assuming that this page contains the relevant <link rel=""> tag, as discussed in Chapter 4, the reader should be able to determine the path to the RSS file it seeks. As we have already seen, desktop readers could use the Syndic8 API to find the URL of the RSS feed, if Syndic8 contains the correct information (but I am unaware of one that does as yet).
Automatic discovery of feed URLs can be very useful, especially when the user is trying to subscribe to a large number of feeds in one go: by importing someone's blogroll, for example.
As RSS gains popularity among the weblogging community, it has become an interesting fashion to provide a link to a list of all the feeds you subscribe to and the sites you read. The list of sites you read is called a blogroll and the list of subscribed-to feeds is called a subscription list.
Publishing your blogroll or subscription list is interesting for a few reasons. First, it allows all sorts of digital social network stuff to go on: your readers can see who you read, they can read the same, you form communities, and by reading other people's blogrolls you can get an interesting insight into the mind and interests of the person whose site you visit every day.
Second, and more important for us here, it means that desktop readers can import the subscription list and subscribe you en masse to all the feeds listed. To do this, we need such files to be in a standard format. Luckily, one format has been co-opted to do the job: OPML.
OPML is a simple XML format, originally developed for the markup of outlines. The OPML specification defines an outline as "a tree, where each node contains a set of named attributes with string values."
Example 10-1 shows a reduced version of my own blogroll. (I actually have close to 100 sites in my blogroll, but you will get the point here.) Notice that an OPML file consists of a root element of opml, followed by a head element, which contains a subelement of title. Following that is a body element, which may have one or more outline elements, each containing various attributes. Each outline element contains the details of a site to which I am subscribed.
<?xml version="1.0"?> <opml version="1.1"> <head> <title>mySubscriptions</title> </head> <body> <outline text="Aaron Swartz: The Weblog" description=""the world's most influential teen who is not in a bubble-gum pop outfit" (Joey deVilla)" title="Aaron Swartz: The Weblog" type="rss" version="RSS" htmlUrl="http://www.aaronsw.com/weblog/" xmlUrl="http://www.aaronsw.com/weblog/index.xml"/> <outline text="BBC News | Front Page" description="Updated every minute of every day" title="BBC News | Front Page" type="rss" version="RSS" htmlUrl="http://news.bbc.co.uk/go/rss/-/1/hi/default.stm" xmlUrl="http://www.bbc.co.uk/syndication/feeds/news/ukfs_news/front_page/rss091.xml"/> <outline text="Ben Hammersley.com" description="Ben Hammersley.com - Stuff you'll like to read." title="Ben Hammersley.com" type="rss" version="RSS" htmlUrl="http://www.benhammersley.com/" xmlUrl="http://www.benhammersley.com/index.rdf"/> <outline text="Blackbeltjones Work" description="a blog about experience design, design matters and occasionally other stuff like tech, science and comicbooks." title="Blackbeltjones Work" type="rss" version="RSS" htmlUrl="http://www.blackbeltjones.com/work/" xmlUrl="http://www.blackbeltjones. com/work/xml_index.xml"/> </body> </opml>
As you can see from this example, the outline element has seven attributes:
This holds the string that, if displayed as an outline, would appear at that node. Depending on the application, either this or the title attribute is used as the name of the feed. As such, they are usually identical.
The contents of the description subelement of channel within the feed. It therefore contains a short description of the feed.
As with the text attribute, this holds the title of the feed to which you are subscribed.
When OPML is being used for other purposes, type denotes what sort of branch of the outline this section is. For our purposes it is always "rss".
This denotes the format of the file to which the branch links. Here it is always "RSS".
The URL of the HTML representation of the feed (i.e., the page itself).
The URL of the feed itself.
Subscription lists and blogrolls can also be listed within link elements inside the head section of an HTML page, in a manner similar to RSS feeds, like so:
<link rel="subscriptions" type="text/x-opml" title="Subscriptions" href="URL_TO_SUBSCRIPTIONS"> <link rel="blogroll" type="text/x-opml" title="Blogroll" href="URL_TO_BLOGROLL">
Now that we have discussed the generalities of desktop readers, let's move on to Chapter 11, where we will design a new RSS module and expand two of the most popular desktop readers to handle it.