以前2chdat.pmを変更してから小変更を何度か経て、そのまま運用していた。
特に問題は出ていないように見えたが、Livedoor列車運行情報に特化しすぎていて少しもやもやしていた。
そんな中、Livedoor列車運行情報CustomFeedの作者様からトラックバックをいただき、変更があったことを知った。
主な変更点は、タイトルの情報を増やすこととTwitterへの投稿の部分のようだ。
タイトルの情報については自分も少しいじっていて、ほぼ平常通りの場合は「○」、遅れがある場合は「△」などを付加していたが、LDTrain.pmではなくて2chdat.pmの方で処理していた。
汎用性も考えると、作者にならってLDTrain.pmの方で処理した方が良いので変更した。
変更したところは、
- プラグインの名前
- すみません。列車関連の情報なので変えさせていただきました。
- Feedのタイトル
- 更新日時を付加した。
sub loadのところで$ymに処理時点の日時が入っているが、形式が違うので新たに$renewaltimeを定義した。
- FeedのDescription
- 以前は2chdat_m.pmでLivedoor列車運行情報に関するテキストを直接書き出していたが、LDTrain.pmに持ってきた。
内容的にはFeedのDescriptionではないが、他に適当なものがなかったので代用した。
- Entryのタイトル
- 以前は2chdat_m.pmで運行状態を表すシンボルを付加していたが、LDTrain.pmに持ってきた。
本文の内容とシンボルが直感的にあっているか様子見する必要がある。
作者みたいに【運転再開】【列車遅延】などを付加した方がわかりやすいのでどうするか迷い中。
- パース後に取得したリストをソート
- LivedoorのサイトではJRや私鉄などで掲載が分かれているが、単純に時間の新しいものが上に来て欲しいのでソートするようにした。
オリジナルはこちら。
以下、変更後のコード。
作者様、本当にありがとうございました。
package Plagger::Plugin::CustomFeed::LDTrain;
use utf8;
use strict;
use base qw( Plagger::Plugin );
use Plagger::Date;
use Plagger::Util;
use Switch;
use URI;
sub register {
my ($self, $context) = @_;
$context->register_hook(
$self,
'subscription.load' => \&load,
);
}
sub load {
my($self, $context) = @_;
my $ym = Plagger::Date->now()->strftime("%y%m");
my $feed = Plagger::Feed->new;
$feed->aggregator(sub {$self->aggregate($context, $ym);});
$context->subscription->add($feed);
}
sub aggregate {
my ($self, $context, $ym) = @_;
my $urls = "http://transit.livedoor.com/traffic_info/kantou";
my $feed = Plagger::Feed->new;
my $renewaltime = Plagger::Date->now();
$renewaltime->set_locale("ja_JP");
$feed->link($urls);
$feed->title("Livedoor鉄道運行情報 [".$renewaltime->strftime("%m/%d(%a) %H:%M")."更新]");
$feed->description("○:ほぼ平常通り、△:運転再開、遅れあり、×:運転見合わせ、運休");
my $list = $self->parse(Plagger::Util::load_uri(URI->new($urls)));
for my $item (@$list) {
my $entry = Plagger::Entry->new;
$entry->title($self->add_status($item->{body})." ".$item->{title}." [".$item->{hour}.":".$item->{min}."]");
$entry->body($item->{body});
$entry->date(Plagger::Date->strptime("%y%m%d%H%M", $ym.$item->{day}.$item->{hour}.$item->{min}));
$feed->add_entry($entry);
}
$context->update->add($feed);
}
sub parse {
my ($self, $content) = @_;
my $list = [];
while ($content =~ m{
<tr>
.*?<th.*?>(\d{2})/(\d{2}).(\d{2})\:(\d{2})</th>
.*?<td.*?>(.*?)</td>
.*?<td.*?>(.*?)</td>
.*?</tr>
}gsx) {
push @$list, {
month => $1,
day => $2,
hour => $3,
min => $4,
title => $5,
body => $6,
hm => $3.$4,
};
}
@$list = sort { $b->{hm} cmp $a->{hm} } @$list;
$list;
}
sub add_status {
my($self, $body) = @_;
my $status = "";
{
if ($body =~ /平常通り/) { $status = "○" ; last ; }
if ($body =~ /再開|遅れ|運転変更/) { $status = "△" ; last ; }
if ($body =~ /見合わせ|運休/) { $status = "×" ; last ; }
$status = " ";
}
$status;
}
1;