Plagger::Plugin::Subscription::PingServer - Subscription from ping servers


Plagger documentation Contained in the Plagger distribution.

Index


Code Index:

NAME

Top

Plagger::Plugin::Subscription::PingServer - Subscription from ping servers

SYNOPSIS

Top

    - module: Subscription::PingServer
      config:
        fetch_items: 20
        servers:
          - url: http://ping.bloggers.jp/changes.xml?last=100

DESCRIPTION

Top

This plugin allows you to pingserver your subscription in config.yaml.

AUTHOR

Top

Kazuhiro Osawa

SEE ALSO

Top

Plagger


Plagger documentation Contained in the Plagger distribution.

package Plagger::Plugin::Subscription::PingServer;
use strict;
use base qw( Plagger::Plugin );

use List::Util qw(first);
use Plagger::UserAgent;
use XML::LibXML;

sub register {
    my($self, $context) = @_;

    $context->register_hook(
        $self,
        'subscription.load' => \&load,
    );
}

sub load {
    my($self, $context) = @_;

    my $servers = $self->conf->{servers};
       $servers = [ $servers ] unless ref $servers;

    my %cache;
    for my $server (@{ $servers }) {
        my $agent    = Plagger::UserAgent->new;
        my $response = $agent->fetch($server->{url});
        if ($response->is_error) {
            $context->log(error => "GET $server->{url} failed: " .
                          $response->http_status . " " .
                          $response->http_response->message);
            return;
        }

        my $link;
        my $doc = XML::LibXML->new->parse_string($response->content);
        my $items = $self->conf->{fetch_items} || 20;
        for my $node ( $doc->findnodes('/weblogUpdates/weblog')) {
            my $url = first { $_ } $node->findvalue('@url');
            next unless $url;
            next if $cache{$url}++;
            $context->log(debug => "get url: $url");

            my $feed = Plagger::Feed->new;
            $feed->url($url);
            $feed->link($url);
            $feed->title(first { $_ } $node->findvalue('@name') || $url);

            last if $context->subscription->add($feed) >= $items;
        }
    }
}

1;

__END__