package Plagger::Plugin::CustomFeed::2ch;
use strict;
use base qw( Plagger::Plugin );
use DateTime::Format::Strptime;
use Encode;
use Time::HiRes;
use WWW::2ch;
use Plagger::UserAgent;
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'subscription.load' => \&load,
'aggregator.aggregate.2ch' => \&aggregate,
);
}
sub load {
my($self, $context) = @_;
unless ($self->conf->{urls} && $self->conf->{cache}) {
$context->log(error => "plase config.");
}
for (@{ $self->conf->{urls} }) {
my $feed = Plagger::Feed->new;
$feed->type('2ch');
$feed->meta($_);
$context->subscription->add($feed);
}
}
sub aggregate {
my($self, $context, $args) = @_;
my $feed = $args->{feed};
my $bbs = WWW::2ch->new(url => $feed->meta->{url},
cache => $self->conf->{cache},
ua => Plagger::UserAgent->new->agent,
plugin => $feed->meta->{plugin});
if ($bbs->conf->{key}) {
$self->load_dat($context, $bbs);
} else {
$self->load_subject($context, $bbs);
}
Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 5 );
}
sub load_dat {
my ($self, $context, $bbs) = @_;
my $key = $bbs->conf->{key};
my $dat = $bbs->recall_dat($key);
my $last = 0;
unless (scalar(@{ $dat->reslist })) {
$bbs->load_setting;
$bbs->load_subject;
$dat = $bbs->subject->thread($key);
} else {
$last = scalar(@{ $dat->reslist });
}
$dat->load;
$context->log(info => $dat->permalink . ' load succeed.');
my $encoding = $bbs->worker->encoding;
my $feed = Plagger::Feed->new;
$feed->type('2ch');
$feed->title( decode($encoding, $dat->title) );
$feed->link($dat->permalink);
my $format = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %H:%M:%S');
my @reslist = @{ $dat->reslist };
for my $res (@reslist[$last...$#reslist]) {
my $entry = Plagger::Entry->new;
$entry->title($res->num);
$entry->link($dat->permalink);
$entry->author( decode($encoding, $res->name) );
my $body = decode($encoding, $res->body);
$body =~ s!
!
!g;
$entry->body($body);
my $dt = DateTime->from_epoch( epoch => $res->time );
$dt->set_time_zone($context->conf->{timezone});
$entry->date( Plagger::Date->parse($format, $dt->ymd . ' ' . $dt->hms) );
$feed->add_entry($entry);
}
$context->update->add($feed) if $feed->count;
}
sub load_subject {
my ($self, $context, $bbs) = @_;
$bbs->load_setting;
$bbs->load_subject;
my $encoding = $bbs->worker->encoding;
my $feed = Plagger::Feed->new;
$feed->type('2ch');
$feed->title( decode($encoding, $bbs->setting->title) );
$feed->link($bbs->subject->permalink);
$context->log(info => $bbs->conf->{subject} . ' load succeed.');
my $i = 0;
my $items = $self->conf->{fetch_items} || 50;
my $format = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %H:%M:%S');
for my $dat ($bbs->subject->threads) {
next if $dat->get_cache;
last if $i++ >= $items;
$dat->load;
my $res = $dat->res(1);
my $entry = Plagger::Entry->new;
$entry->title( decode($encoding, $dat->title) );
$entry->link($dat->permalink);
$entry->author( decode($encoding, $res->name) );
my $body = decode($encoding, $res->body);
$body =~ s!
!
!g;
$entry->body($body);
my $dt = DateTime->from_epoch( epoch => $res->time );
$dt->set_time_zone($context->conf->{timezone});
$entry->date( Plagger::Date->parse($format, $dt->ymd . ' ' . $dt->hms) );
$feed->add_entry($entry);
$context->log(info => $i . ': load to ' . $dat->permalink . ' succeed.');
Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 5 );
}
$context->update->add($feed) if $feed->count;
}
1;
__END__
=head1 NAME
Plagger::Plugin::CustomFeed::2ch - Custom feed for 2ch
=head1 SYNOPSIS
- module: CustomFeed::2ch
config:
cache: /home/yappo/perl/plagger/2chcache
fetch_body_interval: 5
fetch_items: 10
urls:
- url: http://live22.2ch.net/news/
- url: http://pc8.2ch.net/test/read.cgi/php/997829243/
- url: http://jbbs.livedoor.jp/computer/10298/
plugin: Jbbs
=head1 DESCRIPTION
This plugin fetches bbs article updates from 2ch
(L) and creates a custom feed.
=head1 AUTHOR
Kazuhiro Osawa
=head1 SEE ALSO
L, L, L
=cut