結論
これ使えば一発です。
あとは雑談
2013年6月末のGoogleリーダーのシャットダウンの際、OPMLというフォーマットを初めて知りました。なんのことはないただのXMLなんですが、一応アウトラインプロセッサーのためのMLということでOPMLという名前になっているらしいです。
RSSフィードの購読データのエクスポートやインポートに使われているのしか見たことがありません。GoogleリーダーやFeedlyでも購読しているフィードをOPMLファイルで出力できるようになっています。
昨年僕が開発していたRSSリーダーでもOPMLのインポート機能を実装していました。これを実装するにあたりやるべきステップは3つありました。
- OPMLをパースする
- フィードのフォルダを作る
- フィードを購読する
このうち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ファイルがでかすぎてインポートが全然終わらないとか…。懐かしい。