実現したい機能は多々ありますが、まず基本から。
今日は勇気を出してソースも載せて見ました。先達の方々には笑止千万かもしれませんが、ご助言などいただければ幸いです。
まず、今回RSS化を試みた図書館の新着図書案内ページでの新着図書の記載は、HTMLでは以下のように記述されている。
<img alt="New" src="/opac-image/new.gif" align="right" />
<td></td><a href="(詳細情報、排架場所表示のURL)">書名 / 著者
これを以下のCustomFeed-Config用YAML設定ファイルで
- 詳細情報、排架場所表示のURL : link要素へ
- 書名 / 著者 : title要素へ
- - 出版地 : 出版社, 発行年 -(シリーズ名) : decsription要素へ
と3つに切り分ける。
# /usr/local/share/Plagger/assets/plugins/CustomFeed-Config/lib.yaml
#
author: toshokan taikutsu otoko
match: http://opac\.lib\.prikuma\.ac\.jp/opac-new/book/new.html
extract: <img alt="New" src="/opac-image/new.gif" align="right" /><td>
</td><a href="(.*?)">(.*?)</a>.*?<br />
extract_capture: link title body
extract_after_hook: $data->{link} = "http://opac\.lib\.prikuma\.ac\.jp" . $data->{link}
match:で記述されている http://opac.lib.prikuma.ac.jp/opac-new/book/new.html が実際に新着情報が掲載されているURLで、extract: でこの内容を正規表現で切り出している。(.*?)が順に、extract_capture: で指定したlink, title, bodyの順に格納される。
さらに、ここでのURLの記述にはサーバ名が含まれていないため、extract_after_hook: で $data->{link} に補記している。extract_after_hook: ではperl互換の文字列操作が可能であるため、文字列の追加・削除・置換等も可能である。
このファイルは CustomFeed-Config から参照できるよう、assetsディレクトリの下、plugins/CustomFeed-Config あたりで保存する。
次は実際にサーバにアクセスしデータを取得、RSSに変換する命令を記述した config.yaml である。
plagger -c config.yaml
として実行すると、
- module: Subscription::Config : 指定したURLのファイルを取得
- module: CustomFeed::Config : 先のlib.yamlに従い、必要なデータを取得
- module: SmartFeed : feedのタイトル設定
- module: Publish::Feed : RSS出力
の順に処理が行われ、/var/www/html/kuma.xml として保存される。
もちろん、Publish::Gmailなどを利用すればメールでの送信も可能である。
#
# config.yaml
#
global:
assets_path: /usr/local/share/Plagger/assets
timezone: Asia/Tokyo
log:
level: debug
plugins:
- module: Subscription::Config
config:
feed:
- http://opac.lib.prikuma.ac.jp/opac-new/book/new.html
- module: CustomFeed::Config
- module: Filter::Rule
rule:
module: Deduped
- module: SmartFeed
rule:
module: Fresh
mtime:
path: /tmp/foo.tmp
autoupdate: 1
config:
title: Pri-Kuma Library New Books
# - module: Filter::EntryFullText
- module: Publish::Feed
config:
dir: /var/www/html/
format: RSS
filename: kuma.xml
Filter::EntryFullText ではデータ中のリンク先のファイルを取得してくれるのだが、これが通常のテキストに変換されとdescription要素に収められる。できれば <content:encoded> を使ってHTMLのままCDATAとして入れ込み詳細な情報を配信したいところではあるが、「新着を知らせる」用途であれば Filter::EntryFullText でファイルを取得しなくてもこのページのURLを併せて配信しているので十分であろう。詳細な書誌情報をも配信、となるとこのデータが必要となる。別途プラグインとして切り出す手段を考えるべきだろうか。
国内の図書館システムベンダは星の数ほどあるわけではなく、それなりの数にまとまっている。当然、システムが同一であれば(特別にカスタマイズをしていない限り)検索その他のインターフェースも同一であるため、この例であれば lib.xml を新着情報を出力可能な図書館システムの数だけ作成すれば、とりあえず新着情報をRSSで提供するサービスが可能となるだろう。今回の例も、実はいくつかの図書館で共通のフォーマットが使われている。
ここで Plagger を利用したのは、出力についてRSSだけでなく電子メール等での送信などをサポートできること、また今回は一つのみであったが複数のFeed(学部図書館や分野毎に新着情報を出力している館もある)をまとめるなど、利用者のニーズに合わせて柔軟に対応可能な入出力機能を有している点にある。また、各図書館システムに特有の出力形態にあわせて個別に設定ファイルを作成すれば、RSSフィード作成など残りの作業はPlagger本体とそのモジュール群に任せることができ、開発にかかる労力も低減されると思われる。
あとは「図書館の新着情報を(時にパーソナライズして)RSS等で配信」というサービススタイルがどこまで支持を集めるか、というところだろう。
これがNature, Science, Cell等といった学術雑誌であれば、すでに各出版社から配信されているRSSフィードを一本にして取得、(是非はともかく)Plaggerを使い著者名等でフィルタしたり自館で利用しているSFXなどのリンクリゾルバへのリンクを加え、論文の全文アクセスや所在情報検索、複写依頼等へのリンクへとサービスを連携させてゆくこともできるだろう。
なんとか実装したいなあ。