package Plagger::Plugin::Subscription::Fastladder; use strict; use base qw( Plagger::Plugin ); use JSON::Syck; use URI; use Plagger::Mechanize; use Plagger::Util; sub plugin_id { my $self = shift; $self->class_id . '-' . $self->conf->{username}; } sub register { my($self, $context) = @_; $self->init_reader; $context->register_hook( $self, 'subscription.load' => \¬ifier, ); } sub init_reader { my $self = shift; $self->{mech} = Plagger::Mechanize->new(cookie_jar => $self->cookie_jar); unless (defined($self->conf->{url})) { Plagger->context->error("url is missing"); } unless (defined($self->conf->{username}) && defined($self->conf->{password})) { Plagger->context->error("username and/or password is missing"); } } sub notifier { my($self, $context) = @_; my $content; my $feed = Plagger::Feed->new; $feed->aggregator(sub { $self->sync(@_) }); $context->subscription->add($feed); } sub sync { my($self, $context, $args) = @_; my $mark_read = $self->conf->{mark_read}; $mark_read = 1 unless defined $mark_read; $self->login_reader(); my $subs = $self->_request("/api/subs", { unread => 1 }) || []; for my $sub (@$subs) { $context->log(debug => "get unread items of $sub->{subscribe_id}"); my $data = $self->_request("/api/unread", { subscribe_id => $sub->{subscribe_id} }) or next; my $feed = Plagger::Feed->new; $feed->type('livedoorReader'); $feed->title($data->{channel}->{title}); $feed->link($data->{channel}->{link}); $feed->url($data->{channel}->{feedlink}); $feed->image({ url => $data->{channel}->{image} || $sub->{icon} }); $feed->meta->{livedoor_reader_id} = $sub->{subscribe_id}; $feed->meta->{rate} = $sub->{rate}; $feed->add_tag($_) for @{$sub->{tags}}; $feed->add_tag($sub->{folder}) if $sub->{folder}; $feed->updated( Plagger::Date->from_epoch($sub->{modified_on}) ) if $sub->{modified_on}; $feed->description($data->{channel}->{description}); $feed->meta->{livedoor_reader_subscribers_count} = $data->{channel}->{subscribers_count}; for my $item ( @{$data->{items}} ) { my $entry = Plagger::Entry->new; $entry->title($item->{title}); $entry->author($item->{author}) if $item->{author}; $entry->link($item->{link}); # TODO support enclosure $entry->tags([ $item->{category} ]) if $item->{category}; $entry->date( Plagger::Date->from_epoch($item->{modified_on}) ) if $item->{modified_on}; $entry->meta->{livedoor_reader_item_id} = $item->{id}; $entry->feed_link($feed->link); $entry->body($item->{body}); $feed->add_entry($entry); } $self->_request("/api/touch_all", { subscribe_id => $sub->{subscribe_id} }) if $mark_read; $context->update->add($feed); } } sub login_reader { my $self = shift; local $^W; # input type="search" warning my $uri = URI->new_abs("/reader/", $self->conf->{url}); $self->{mech}->get($uri); if ($self->{mech}->content =~ m!