Just sent it to Python Argentina:
Yes, sometimes I think a feature is much harder than it really is.
So, since revision 571, every once in a while a new favicon will appear in your feed tree when you use uRSSus. No, they won't all appear at once. They will appear whenever:
You actually fetched new posts from a feed
You restart the app
Once they appear they will never change, either.
After 27 days of development, uRSSus is finally a really usable app. I miss nothing from Akregator, although there are a few unimplemented things. It was broken the alst couple of days, because I was rewriting large chunks of its guts, but the new guts work much better ;-)
The missing pieces (I know about):
Save column width in post list
Show total posts in feed list
Drag&Drop is not reliable (weird things happen every few tries)
Metafeeds (ex. your unread posts/ your starred posts) are not updated automatically
Del.icio.us sync is not working at all
No decent config dialog (but a functional replacement!)
Very occasional DB locking.
Logging is broken
Need to implement backup of the DB
That's not really more than a day or two of work.
Right now (revision 570) it's working pretty good, so it's a good revision to try, if you feel up to it.
I have been delaying this functionality because I expected it to be hard to do, then... it was very easy! Now you can create "metafeeds" based on queries. Here's the first example: "Post.important==True".
Of course, beyond a set of standard metafeeds, a UI to allow the user to create them will be hard but at least the basic functionality is there (BTW, it's 15 (fifteen!) lines of code)
When trying to serialize python data, often the first thing we look at is pickle. Well, sometimes pickle can be very expensive!
Here Post is an elixir class, which means it's an object mapped to a relational database, and comparing its properties to something is pretty much a piece of a SQL WHERE statement.
>>> print Post.important==True posts.important = ?
What happens when we pickle it?
>>> print len(pickle.dumps(Post.important==True)) 27287 >>> print pickle.loads(s) posts.important = :important_1
Yikes. What's a better solution?
>>> print eval('Post.important==True') posts.important = ?
As long as we are sure no weird data will get into the eval...