package Plagger::Plugin::Filter::BulkfeedsTerms; use strict; use base qw( Plagger::Plugin ); use Encode; use Plagger::UserAgent; use XML::LibXML; use URI; sub register { my($self, $context) = @_; $context->register_hook( $self, 'update.entry.fixup' => \&update, ); } sub update { my($self, $context, $args) = @_; $context->log(debug => "calling Bulkfeeds Terms API for " . $args->{entry}->link); # TODO: needs cache based on URL my $ua = Plagger::UserAgent->new; my $body = encode("utf-8", $args->{entry}->body_text); my %param = (content => $body); $param{apikey} = $self->conf->{apikey} if $self->conf->{apikey}; my $res = $ua->post("http://bulkfeeds.net/app/terms.xml", \%param); unless ($res->is_success) { $context->log(error => "Bulkfeeds API failed: " . $res->status_line); return; } my @terms = eval { $self->parse_terms($res->content) }; $context->log(info => "Terms for " . $args->{entry}->link . ": " . join(", ", @terms)); for my $term (@terms) { $args->{entry}->add_tag($term); } } sub parse_terms { my($self, $xml) = @_; my $doc = XML::LibXML->new->parse_string($xml); my @terms; for my $node ( $doc->findnodes('/terms/term')->get_nodelist ) { my $term = $node->textContent; push @terms, $term if defined $term && $term ne ''; } return @terms; } 1; __END__ =head1 NAME Plagger::Plugin::Filter::BulkfeedsTerms - Bulkfeeds Terms API for auto-tagging =head1 SYNOPSIS - module: Filter::BulkfeedsTerms config: apikey: XXXXXXXXXXXXXXXXXX =head1 DESCRIPTION This plugin queries Bulkfeeds (L for specific terms used in entry body and auto-tag them. =head1 AUTHOR Tatsuhiko Miyagawa =head1 SEE ALSO L, L =cut