package Plagger::Plugin::Subscription::OpenSearch; use strict; use base qw( Plagger::Plugin ); use DateTime; use DateTime::Format::Strptime; use WWW::OpenSearch; sub register { my($self, $context) = @_; $context->register_hook( $self, 'subscription.load' => \&load, 'aggregator.aggregate.opensearch' => \&search, ); } sub load { my($self, $context, $args) = @_; my $urls = $self->conf->{url}; my $keywords = $self->conf->{keyword}; $urls = [ $urls ] unless ref($urls) eq 'ARRAY'; $keywords = [ $keywords ] unless ref($keywords) eq 'ARRAY'; for my $url (@{ $urls }) { for my $keyword (@{ $keywords }) { my $feed = Plagger::Feed->new; $feed->type('opensearch'); $feed->url($url); $feed->meta({ keyword => $keyword }); $context->subscription->add($feed); } } } sub search { my($self, $context, $args) = @_; my $url = $args->{feed}->url; my $keyword = $args->{feed}->meta->{keyword}; $context->log(info => "Fetch $url - $keyword"); my $engine = eval { WWW::OpenSearch->new($url) }; unless ($engine) { $context->log(info => "Parsing $url failed."); return; } my $result = eval { $engine->search($keyword) }; return unless $result; return unless @{ $result->items }; my $feed = Plagger::Feed->new; $feed->title($result->channel->{title}); $feed->url($result->channel->{link}); $feed->link($result->channel->{link}); $feed->description($result->channel->{description}); $feed->language($result->channel->{language}); $feed->author($engine->ShortName); $feed->image({ url => $engine->Image }) if $engine->Image; my $format = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %H:%M:%S'); for my $e (@{ $result->items }) { my $entry = Plagger::Entry->new; $entry->title($e->{title}); $entry->link($e->{link}); $entry->id($e->{id}); $entry->body($e->{description}); my $dt = DateTime->now; $dt->set_time_zone($context->conf->{timezone}); $entry->date( Plagger::Date->parse($format, $dt->ymd . ' ' . $dt->hms) ); $feed->add_entry($entry); } $context->log(info => "$url success: " . $feed->count . " entries."); $context->update->add($feed); } 1; __END__ =head1 NAME Plagger::Plugin::Subscrption::OpenSearch - Subscription from OpenSearch =head1 SYNOPSIS - module: Subscription::OpenSearch config: url: - http://bulkfeeds.net/opensearch.xml - http://blogdb.jp/a9open.xml keyword: - perl - plagger - cpan =head1 DESCRIPTION This plugin creates Subscription by fetching OpenSearch. =head1 AUTHOR Kazuhiro Osawa =head1 SEE ALSO L, L =cut