Plagger::Plugin::CustomFeed::PerlMonks - Perl Monks Newest Nodes Custom Feed


Plagger documentation Contained in the Plagger distribution.

Index


Code Index:

NAME

Top

Plagger::Plugin::CustomFeed::PerlMonks - Perl Monks Newest Nodes Custom Feed

SYNOPSIS

Top

  - module: Subscription::Config
    config:
      feed:
        - http://perlmonks.org/?node_id=30175

  - module: CustomFeed::PerlMonks

DESCRIPTION

Top

This plugin creates a custom feed off of the Perl Monks Newest Nodes XML Feed.

AUTHOR

Top

Jeff Bisbee

SEE ALSO

Top

Plagger


Plagger documentation Contained in the Plagger distribution.

package Plagger::Plugin::CustomFeed::PerlMonks;
use strict;
use base qw( Plagger::Plugin );

use Plagger::UserAgent;
use Plagger::Util;
use URI;
use URI::QueryParam;
use XML::LibXML;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

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

    if ( $args->{feed}->url =~ /perlmonks.(?:com|org)\/\?node_id=30175$/ ) {
        $self->aggregate( $context, $args );
        return 1;
    }

    return;
}

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

    my $url = URI->new( $args->{feed}->url );
    $context->log(info => "GET $url");

    my $agent = Plagger::UserAgent->new;
    my $res   = $agent->fetch( $url, $self );

    if ( $res->is_error ) {
        $context->log( error => "GET $url failed: " . $res->status );
        return;
    }

    my $content = Plagger::Util::decode_content($res);
    my $title   = "Perl Monks Newest Nodes";

    my $feed = Plagger::Feed->new;
    $feed->title($title);
    $feed->meta( $args->{feed}->meta );
    $feed->link( $args->{feed}->url );

    my $parser = XML::LibXML->new;
    my $pm_doc = $parser->parse_string( $content );

    my ($node) = $pm_doc->findnodes("/NEWESTNODES/INFO");

    my @nodes = ();
    for my $node ( $pm_doc->findnodes("/NEWESTNODES/NODE") ) {
        my $type = $node->getAttribute( 'nodetype' );
        next if $type eq "note" || $type eq "user";

        my $new_node = {
            author     => $node->getAttribute('authortitle'),
            createtime => $node->getAttribute('createtime'),
            title      => $node->textContent,
        };

        $new_node->{title} =~ s/\n//g;
        $new_node->{link} = "http://perlmonks.org/?node_id="
            . $node->getAttribute('node_id');

        push @nodes, $new_node;
    }

    for my $node ( sort { $a->{createtime} <=> $b->{createtime} } @nodes ) {
        my $entry = Plagger::Entry->new;
        $entry->title( $node->{title} );
        $entry->link( $node->{link} );
        $entry->author( $node->{author} );

        my $dt = Plagger::Date->strptime( "%Y%m%d%H%M%S", $node->{createtime} );
        $dt->set_time_zone('America/New_York');
        $entry->date( $dt );

        $feed->add_entry($entry);
    }

    $context->update->add($feed);
}

1;

__END__