Subscription::Bloglinesの既読処理
今日もいつものようにBloglines2Gmail♪
・・・
Plaggerが落ちましたorz
んで、Bloglinesにログインしてみると予想通り全部既読になってました。
Bloglinesにはmark_readというオプションがあるんですが、
これを設定してると(デフォルトではオンになってます)、
更新feedを取得するとその分を既読にしてくれます。
その既読にする処理はsubscription.loadフェーズで行われます。
なので、subscription.loadフェーズの後に
Plaggerが落ちたり他のPluginでdieしたりすると、
Gmailに転送できてないけどBloglines側は全部既読になってしまうわけですね。
しばし考えて、
既読にする処理をplugin.finalizeフェーズに持っていけばいいんじゃね?と思ったのでやってみました。
以下Subscription::Bloglinesのソース。
・register_hookにplugin.finalizeを追加。
$context->register_hook( $self, 'subscription.load' => \¬ifier, 'plugin.finalize' => \&mark_read,
・既読にするよ処理を追加。
sub mark_read { my ($self, $context) =@_; my $mark_read = $self->conf->{mark_read}; $mark_read = 1 unless defined $mark_read; return unless $mark_read; my $count = $self->{bloglines}->notify(); $context->log(debug => "mark $count unread items as read"); eval { $self->{bloglines}->getitems(0, $mark_read) }; }
・subscription.loadフェーズの既読処理をコメントアウト。
(147〜151行目付近)
#} elsif ($mark_read) { # # no error found with XML ... call the API again to mark read # eval { # @updates = $self->{bloglines}->getitems(0, $mark_read); # };
こんな感じなんですがちょっと問題もあって、
Subscription::Bloglinesはfeedを取得しに行くときに、
mark_readオフでfeedを取得→エラーがなければmark_readオンでもう一度feedを取得 getitems(0,0) →getitems(0,$mark_read)
という風にやってます。
なので、
subscription.loadフェーズとplugin.finalizeフェーズの間にものすごく時間がかかった場合、
その間にBloglines側で新しいfeedが更新されちゃったりして、
まだ読んでないfeedまで既読になってしまう可能性があるかも??
う〜ん。
あと例外処理どうしよう。