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' => \&notifier,
    '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まで既読になってしまう可能性があるかも??
う〜ん。


あと例外処理どうしよう。