在开发 Rss Reader 时我是以 FeedDemon 为原型做的,因此在功能上也尽量的模仿,那么的确发现一些有趣的东西。比如:

网站图标的显示

在Rss Reader 中可以在分析一个Feed时自动将它的网站的图标抓下来,同时显示在Feed的树型结构中。关于这一点并不是所有的 Rss Reader 都有的。那么主要的实现首先是在得到Feed的内容之后,看一下是否有网站的链接(link值),如果有则取出此link值的协议类型和domain值,然后与favicon.ico合并成一个新的url(使用urlparser)。然后使用 PycURL 去得到它的内容。再将其保存到本地,以domain.ico为文件名。

不过得到这个文件不一定就是一个真正的ico文件。因为使用 pycurl 得到的结果也可能是一个 html,它报告了一些错误。因此我需要先判断生成的 .ico 文件是否是合法的,如果不合法则删除。我使用下面的代码:

text = self.get_feed_text(iconurl)
if text:
    file(iconfile, ‘wb’).write(text)
    icon = wx.Image(iconfile)
    if not icon.Ok():
        os.remove(iconfile)

使用 wx.Image 来生成一个 image 对象,然后判断它是否 Ok() ,如果是表示图片没有问题。但在这里我还没有解决的就是:一旦非法,wxPython 会弹出一个窗口,很讨厌,目前还不知道怎么关掉这个特性。

再有在处理将ico文件转为wxBitmap,然后应用在 wxTreeCtrl 中,我发现有些图标好象只显示了一个角,可 FeedDemon 中却是完整的,为什么?后来才发现,有些网站提供的 ico 文件是那种多个 icon 的格式,有可能是 16×16, 32×32。是我需要的是 16×16 的大小,而且最初使用 wx.Image() 来处理时它并不能正确处理,因此我在网上查呀查,终于明白了 wx.Icon 的构造函数中几个参数的作用。一般 wx.Icon 支持四个参数:

wx.Icon(name, type, desiredWidth=-1, desiredHeight=-1)

这里很重要的就是最后两个参数,它会根据你希望的大小取出正确的图标图形来。因此传入(16, 16)就对了。

Feed的解析

Feed解析是最重要的。我使用 feedparser 来做这件事情。但发现在某些地方数据并不都是标准的,主要是有些数据项可能不存在。比如每个 post 的发布时间,在我处理 django 的 Rss 时发现不存在。因此我只能采用本地时间来处理。还有我看到 FeedDemon 的一个特性那就是网站图片(与上面的网站图标不同)。在某些 Feed 处理时,你点击一个 Feed ,它会显示一个未读 Post 的列表,最上面可能会显示一个图片,而这个图片也来源于网站。目前在我收集的 Rss 中已经有象 Python411, Solidot, 歪酷博客等有这样的功能。

能够提供网建图形的一般都在 Rss 数据中有一个 image 属性,它的 url 子属性就是图片的链接。但并不是所有的 Feed 有提供这些信息。

还有象的有 Feed 会提供一个 comments 地址,它是某个 Post 的评论的地址。

一般的 Feed 对于每个 Post 都会有一个 guid 的属性,它表示这个贴子的唯一标识,但有些 Feed 并不提供,因此我只好使用 link 来代替它。

其它

其它在开发 Rss Reader 中让我感到相对满意的可能有:Casing 的使用, SQLAlchemy 的使用。

使用Casing 的确很好的解决了多线程的问题。而使用 SQLAlchemy 则方便了数据的访问,修改,删除等数据库操作。同时它对多线程支持也非常好。

不要还是要说明一下,想在 NewEdit 中运行这个Rss Reader你需要使用源码版,并且不能运行 .pyw ,要运行 .py才行,我不知道为什么 socket 会阻塞住,wxPython中还有许多我很难解决的问题。

当然这个 Rss Reader 的功能还是很不足,我也只是用它来体验Rss Reader的开发。


5条评论

  1. 能把你的代码发布一下吗?

  2. NewEdit 本身就是开源软件呀,所有的代码都是公开的。 http://wiki.woodpecker.org.cn/moin/NewEdit

    关于 Rss Reader 的代码主要在 plugins/rssreader 中。Tree的框架在mixins/ShareWindow.py中。

  3. 你好 刚刚考到你的一篇文章。关于读取opml的。我也正在开发一个rss reader。但是读取opml的时候 遇到困难。能不能交流一下?

    jrunner@yahoo.cn

  4. 你好:

    我刚接触wxWidgets,想隐藏掉wxTreeCtrl的水平滚动条,你有什么办法吗!我已经搞了几天了,都没什么办法!

    谢谢!!

发表评论

评论也有版权!

click to change验证码