# 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