package Plagger::Plugin::Search::Estraier; use strict; use base qw( Plagger::Plugin ); use Encode; use Search::Estraier; sub init { my $self = shift; $self->SUPER::init(@_); $self->conf->{url} ||= "http://localhost:1978/node/plagger"; $self->conf->{username} ||= "admin"; $self->conf->{password} ||= "admin"; $self->conf->{timeout} ||= 30; $self->{node} = Search::Estraier::Node->new( url => $self->conf->{url}, debug => $self->conf->{debug}, ); $self->{node}->set_auth($self->conf->{username}, $self->conf->{password}); $self->{node}->set_timeout($self->conf->{timeout}); } sub register { my($self, $context) = @_; $context->register_hook( $self, 'publish.entry' => \&entry, 'searcher.search' => \&search, ); } sub entry { my($self, $context, $args) = @_; return unless $args->{entry}->permalink; my $id = $self->{node}->uri_to_id($args->{entry}->permalink); $context->log(info => "Going to index entry " . $args->{entry}->permalink . ($id ? " with id=$id" : "")); my $doc = Search::Estraier::Document->new; $doc->add_attr('@uri' => $args->{entry}->permalink); $doc->add_attr('@title' => $args->{entry}->title->utf8); $doc->add_attr('@cdate' => $args->{entry}->date->format('W3CDTF')) if $args->{entry}->date; $doc->add_attr('@author' => $args->{entry}->author->utf8) if $args->{entry}->author; $doc->add_text($args->{entry}->body->utf8); $doc->add_hidden_text($args->{entry}->title->utf8); $doc->add_attr('@id' => $id) if $id; # update mode $self->{node}->put_doc($doc) or $context->error("Put failure: " . $self->{node}->status); } sub search { my($self, $context, $args) = @_; my $cond = Search::Estraier::Condition->new; $cond->set_phrase( encode_utf8($args->{query}) ); my $nres = $self->{node}->search($cond, 0); defined $nres or $context->error("search failed: " . $self->{node}->status); my $feed = Plagger::Feed->new; $feed->type('search:Estraier'); $feed->title("Search: $args->{query}"); for my $i ( 0 .. $nres->doc_num - 1 ) { my $doc = $nres->get_doc($i); my $entry = Plagger::Entry->new; $entry->link( $doc->attr('@uri') ); $entry->title( decode_utf8($doc->attr('@title')) ); $entry->date( $doc->attr('@cdate') ) if $doc->attr('@cdate'); $entry->author( decode_utf8($doc->attr('@author')) ) if $doc->attr('@author'); $entry->body( decode_utf8($doc->snippet) ); $feed->add_entry($entry); } return $feed; } sub _u { my $str = shift; Encode::_utf8_off($str); $str; } 1; __END__ =head1 NAME Plagger::Plugin::Search::Estraier - Search entries using Hyper Estraier P2P =head1 SYNOPSIS - module: Search::Estraier config: url: http://localhost:1978/node/plagger username: foobar password: p4ssw0rd =head1 DESCRIPTION This plugin uses Hyper Estraier (L) and its P2P Node API to search feed entries aggregated by Plagger. =head1 AUTHOR Tatsuhiko Miyagawa =head1 SEE ALSO L, L, L =cut