PIYO - Tech & Life -

RubyのOPMLパーサー

結論

これ使えば一発です。

feedbin/opml_saw

あとは雑談

2013年6月末のGoogleリーダーのシャットダウンの際、OPMLというフォーマットを初めて知りました。なんのことはないただのXMLなんですが、一応アウトラインプロセッサーのためのMLということでOPMLという名前になっているらしいです。

RSSフィードの購読データのエクスポートやインポートに使われているのしか見たことがありません。GoogleリーダーやFeedlyでも購読しているフィードをOPMLファイルで出力できるようになっています。

昨年僕が開発していたRSSリーダーでもOPMLのインポート機能を実装していました。これを実装するにあたりやるべきステップは3つありました。

  1. OPMLをパースする
  2. フィードのフォルダを作る
  3. フィードを購読する

このうち2と3はOPML対応前から持っていた機能だったのでOPMLインポート機能のためにはパース処理のみを書けばよかったわけです。

XMLなのでNokogiriで簡単にパースできるのでしょうが、RSSリーダーのFeedbinがちょうどぴったりなライブラリ、feedbin/opml_sawというものを公開していたのでこちらを使うことにしました。

使い方は至ってシンプルで、OPMLファイルの中身を渡すとフィードのArrayが返ってくるというものです。

READMEから拝借しますが、これだけです。Nokogiriで頑張るよりも更に楽なので良いですね。

file = File.open('subscriptions.xml', 'r')
contents = file.read
opml = OpmlSaw::Parser.new(contents)
opml.parse
pp opml.feeds

opmlsawのおかげでほとんど実装要らずでOPMLインポートの機能を実装できたという話でした。

ちなみに、OPMLインポート自体はとても重い処理なのでバックグラウンドに回しました。実装は簡単だったものの、バックグラウンドジョブでエラーになったりしてそっちの解消が大変だったりしました。例えばOPMLファイルがでかすぎてインポートが全然終わらないとか…。懐かしい。