# Plagger::Plugin::CustomFeed::NetLadio # $Id: NetLadio.pm 10 2006-05-20 07:44:27Z sekine $ package Plagger::Plugin::CustomFeed::NetLadio; use strict; use base qw( Plagger::Plugin ); use DateTime::Format::Strptime; use Encode qw(from_to decode); use Plagger::UserAgent; use XML::Simple; sub register { my($self, $context) = @_; $context->register_hook( $self, 'subscription.load' => \&load, ); } sub load { my($self, $context) = @_; my $feed = Plagger::Feed->new; $feed->aggregator(sub { $self->aggregate(@_) }); $context->subscription->add($feed); } sub aggregate { my($self, $context, $args) = @_; my $url = 'http://yp.ladio.livedoor.jp/stats/list.xml'; my $ua = Plagger::UserAgent->new; my $res = $ua->get($url); unless ($res->is_success) { $context->log(error => "GET $url failed: " . $res->status_line); return; } my $xml = $res->content; from_to($xml, 'shiftjis', 'utf8'); $xml =~ s/shift\-jis/utf-8/; my $data = XMLin($xml, ForceArray => ['source']); my $sort = lc($self->conf->{sort}) || 'tims'; my $order = lc($self->conf->{order}) || 'desc'; my @items; if ($sort eq 'tim' || $sort eq 'cln' || $sort eq 'clns' || $sort eq 'prt' || $sort eq 'bit') { @items = sort { $a->{$sort} <=> $b->{$sort} } @{$data->{source}}; } else { @items = sort { $a->{$sort} cmp $b->{$sort} } @{$data->{source}}; } @items = reverse @items if $order eq 'desc'; my $feed = Plagger::Feed->new; $feed->type('netladio'); $feed->title('livedoor Internet ladio'); $feed->link('http://live.ladio.livedoor.com/'); my $cnt = 0; my $limit = $self->conf->{limit} || 0; foreach my $item (@items) { my $entry = Plagger::Entry->new; my $name = $self->get_value($item, 'nam'); my $srv = $self->get_value($item, 'srv'); my $prt = $self->get_value($item, 'prt'); my $mnt = $self->get_value($item, 'mnt'); my $mp3 = "http://$srv:$prt" . $mnt; my $author = $mnt; $author =~ s!^/!!; my $cln = $self->get_value($item, 'cln'); my $clns = $self->get_value($item, 'clns'); my $tim = $self->get_value($item, 'tim'); my $tims = $self->get_value($item, 'tims'); my $url = $self->get_value($item, 'url'); my $bit = $self->get_value($item, 'bit'); my $gnl = $self->get_value($item, 'gnl'); my $body = "$gnl
\n" . "Broadcasting URL: $mp3
\n" . "Relation URL: $url
\n" . "Listeners: $cln
\n" . "Total listeners: $clns
\n" . "Bit rate: $bit
\n"; $entry->title(decode('utf8', $name)); $entry->link($mp3); $entry->author($author); my $format = DateTime::Format::Strptime->new(pattern => '%y/%m/%d %H:%M:%S'); $entry->date(Plagger::Date->parse($format, $tims)); $entry->body(decode('utf8', $body)); $feed->add_entry($entry); last if $limit > 0 && ++$cnt >= $limit; } $context->update->add($feed); } sub get_value { my($self, $item, $key) = @_; my $value = $item->{$key}; $value = '---' if ref $value; $value; } 1; __END__ =head1 NAME Plagger::Plugin::CustomFeed::NetLadio - Custom feed for livedoor Internet ladio =head1 SYNOPSIS - module: CustomFeed::NetLadio config: limit: 5 sort: tims order: asc =head1 DESCRIPTION This plugin fetches programs from livedoor Internet ladio(L). =head1 CONFIG =over 4 =item limit Number of programs. =item sort Sort item. =over 4 =item url URL column specified with broadcasting tool =item gnl Genre column specified with broadcasting tool =item nam Title column specified with broadcasting tool =item tit Name of a song information now at the time of transmit by broadcasting tool =item mnt Mount point =item tims Start of the broadcasting time =item cln Number of present listeners =item clns Number of total listeners that Icecast1.3 faction outputs =item srv Delivery server host name =item prt Delivery server port number =item bit Bit rate =back =item order The permutation order. =over 4 =item asc Ascending order =item desc Descending order =back =back =head1 AUTHOR Motokazu Sekine (CHEEBOW) =head1 SEE ALSO L =cut