I noticed from my logs that somebody using feedonfeeds is subscribed to my blog. Feedonfeeds is a nice PHP aggregator/reader, written by Steve Minutillo.
After shopping around for a while for a news aggregator, I settled on feedonfeeds a couple of months ago for a couple of reasons:
- it has very few dependencies (any version of MySQL is ok, and a sufficiently recent PHP)
- it is a server-side aggregator, allowing me to read news from home/office/wherever
- it installs in a couple of minutes anywhere you can put a few PHP files
- it is easily customizable
- it works =)
So I installed feedonfeeds, and staying up to date has become a joy.
Never satisfied, after a couple of days of use I decided I absolutely needed a few features that feedonfeeds was lacking. So I set about refactoring it, and the project turned out to be a full rewrite. As usual with these things, the result is a half-completed app, so that I now have the (minor) features I wanted, and lack most basic ones feedonfeeds provides out of the box. =)
My rewrite is template-based, and factors out most common operations (eg SQL statements etc) in a few classes, instead of using lots of functions. So far, I have:
- a fully functional news reading page with save/read/unread flagging, paging by page and by date, etc. (the one you see in the picture above)
- a half-working feeds page, showing subscribed feeds and their new/read/saved news counts, and controls to add/edit/remove a feed that get you nowhere =)
- an improved SQL schema, using InnoDB tables support for foreign keys
- a new Python backend based on Mark Pilgrim's ultra-liberal feed parser, supporting the parser's use of HTTP features (If-None-Match and If- Modified-Since headers when requesting an RSS feed, and parsing the ETag and Last-Modified headers) to limit transfers; the uhm "backend" is an amazing 75 lines of code, including a 20 or 30 lines string containing the SQL schema =)
update: I finally managed to add the most important missing functionality to my feedonfeeds rewrite, and package it.