修改 Aggregate.pm

要弄出一個火車時刻表,其實有很多種方式。

一開始使用MT的我,很自然地就選了 MT-RSSFeed 這種方式。
安裝完 XML::RSS 之後,加裝 Autrijus 所寫的 XML::RSS::Aggregate,具備了把一堆RSS抓回來集中一起,並依日期排列的功能。用merge.pl呼叫這個pm,讀入 rss url list,然後寫入成一個新的 rss。最後,再用 MT-RssFeed,把 rss變成火車時刻表的版面。

這一切其實運作的很好,程式也沒有什麼bug。

不過呢,RSS有好幾個「版本」,RSS 0.91/RSS 1.0/RSS 2.0,各個版本不要說「相容」了,根本就是不同人/組織提出來的規格。這也無妨,反正我們平常想輸出什麼隨我們高興,而一般的RSS reader也可以勝任愉快,輕鬆地通吃(連ATOM都吃),所以其實我一直沒有發現我架的火車時刻表其實是不吃RSS 2.0的 @@

其實也不是不吃,時刻表還是會快樂地把RSS讀進來,把內容合在一起,然後排序…..只不過, RSS 2.0的日期和作者是在 <pubDate> 跟 <author> ,而不是RSS 1.0 的 <dc:date> 跟 <dc:creator> ,所以在輸出成 RSS 時(輸出時RSS版本是1.0),這兩個欄位的內容會被濾掉,然後該則RSS就沒有了日期。沒有了日期,到時排序時就會被丟到遙遠的天邊去,再也擠不進火車時刻表最新更新的清單內。

也就是說,該則 RSS還在,可是沒有日期的它們,永遠擠不上火車時刻表的版面。

這個問題,我一直到大量把無名小站 blog的 RSS,加入我的火車時刻表中,卻沒有發現任何一篇RSS 浮出火車時刻表的水面中,才察知這個問題。無名小站blog的RSS 版本為 2.0

可是,這不是誰的錯,本來,RSS Aggregator就只是忠實地把 RSS搜集起來,然後合成一個大 RSS,在各版本RSS不相容的情況之下,選擇輸出成某版本的RSS,其他版本的tag當然很容易地就會被濾掉。

最好的方式,就是有一個可以轉換各家 RSS的pm,可以把其他版本的RSS(甚至是 ATOM)都轉成 RSS 1.0,然後給MT-RSSfeed讀,不過我找了一下,好像沒有什快速且方便的solution,所以還是硬著頭皮,改了Aggregate.pm。

我只能說 Autrijus 的功力太好了,我花了點時間才知道自己要改哪裡,加上去的少許code簡直像在雕塑品上加鐵絲。不過至少現在會把最重要的日期欄位給「複製」過去了。修改後的版本,就可以正常地看到那些使用 RSS 2.0 的blog 浮出火車時刻表了 🙂

修改後的版本在此,還有在用 MT-RSSfeed的人可以拿回去玩玩看。
不過這種人好像不多 😛

在〈修改 Aggregate.pm〉中有 2 則留言

  1. 用feed on feeds比較好改, 而且也比Aggregate.pm省資源,又好安裝, 現在憂鬱馬戲團用的就是改過的fof.

    回覆
  2. to jeph:
    Fof之前我有 servey過,蠻不錯的,不過我的個性有點懶,寧願疊床架屋也不願拆掉重新來過。

    大概等下一次blog改版(等我換成WordPress)時就會一併換掉吧 🙂

    回覆

發佈留言