| [12655] | 1 | package WWW::CDTV; |
|---|
| 2 | |
|---|
| 3 | use warnings; |
|---|
| 4 | use strict; |
|---|
| 5 | use Carp; |
|---|
| 6 | use LWP::UserAgent; |
|---|
| 7 | use Encode; |
|---|
| 8 | use HTML::Entities; |
|---|
| 9 | use DateTime; |
|---|
| 10 | use WWW::CDTV::Track; |
|---|
| 11 | |
|---|
| [21123] | 12 | our $VERSION = "0.03"; |
|---|
| [12655] | 13 | |
|---|
| 14 | sub new { |
|---|
| 15 | my ( $class, $opt ) = @_; |
|---|
| 16 | my $self = |
|---|
| 17 | bless { url => $opt->{url} |
|---|
| [21122] | 18 | || "http://www.tbs.co.jp/cdtv/cddb/thisweek.html", }, $class; |
|---|
| [12655] | 19 | $self->init(); |
|---|
| 20 | $self; |
|---|
| 21 | } |
|---|
| 22 | |
|---|
| 23 | sub init { |
|---|
| [21122] | 24 | my $self = shift; |
|---|
| 25 | my $ua = LWP::UserAgent->new(); |
|---|
| [12655] | 26 | my $response = $ua->get( $self->{url} ); |
|---|
| 27 | Carp::croak $response->status_line unless $response->is_success; |
|---|
| 28 | my $content = $response->content; |
|---|
| [21122] | 29 | $content = decode( "iso-2022-jp", $content ); |
|---|
| [12655] | 30 | |
|---|
| [21122] | 31 | $self->{week} = $1 |
|---|
| 32 | if ( $content =~ m!<span class="date">(\d{4}/\d{2}/\d{2})</span>! ); |
|---|
| 33 | my @match = $content =~ m!<tr class="(?:tbg1|tbg2)">(.*?)</tr>!gs; |
|---|
| [12655] | 34 | |
|---|
| 35 | my $entry_regex = <<"EOF"; |
|---|
| [34407] | 36 | .*<th scope="row">(.*?)</th>.*<span class="ico_(.*?)">.*<td><a href="../songdb/song.*\.html">(.*?)</a></td>.*<td><a href="../artistdb/.*?">(.*?)</a></td> |
|---|
| [12655] | 37 | EOF |
|---|
| 38 | my @tracks; |
|---|
| [21122] | 39 | my %move_table = ( 'new' => 'new', 'up' => 'up', 'down' => 'down', ); |
|---|
| [12655] | 40 | foreach my $entry_html (@match) { |
|---|
| 41 | $entry_html =~ m/$entry_regex/gs; |
|---|
| 42 | my $entry = { |
|---|
| 43 | no => $1, |
|---|
| 44 | title => decode_entities($3), |
|---|
| 45 | artist => decode_entities($4), |
|---|
| 46 | }; |
|---|
| [21122] | 47 | $entry->{move} = $move_table{$2}; |
|---|
| [12655] | 48 | $tracks[ $entry->{no} ] = WWW::CDTV::Track->new($entry); |
|---|
| 49 | } |
|---|
| 50 | $self->{tracks} = \@tracks; |
|---|
| 51 | } |
|---|
| [21122] | 52 | |
|---|
| [12655] | 53 | sub track { |
|---|
| [21122] | 54 | my ( $self, $no ) = @_; |
|---|
| [12655] | 55 | $no = $no || 1; |
|---|
| [21122] | 56 | my @tracks = @{ $self->{tracks} }; |
|---|
| [12655] | 57 | return $tracks[$no]; |
|---|
| 58 | } |
|---|
| 59 | |
|---|
| 60 | sub week { |
|---|
| 61 | my $self = shift; |
|---|
| 62 | return $self->{week}; |
|---|
| 63 | } |
|---|
| 64 | |
|---|
| 65 | sub datetime { |
|---|
| 66 | my $self = shift; |
|---|
| 67 | my $str = $self->week; |
|---|
| 68 | $str =~ m!(\d{4})/(\d{2})/(\d{2})!; |
|---|
| 69 | my $dt = DateTime->new( |
|---|
| 70 | year => $1, |
|---|
| 71 | month => $2, |
|---|
| 72 | day => $3, |
|---|
| 73 | time_zone => 'Asia/Tokyo', |
|---|
| 74 | ); |
|---|
| 75 | return $dt; |
|---|
| 76 | } |
|---|
| 77 | |
|---|
| 78 | 1; |
|---|
| 79 | |
|---|
| 80 | __END__ |
|---|
| 81 | |
|---|
| 82 | =head1 NAME |
|---|
| 83 | |
|---|
| 84 | WWW::CDTV - Get a weekly music ranking from CDTV ( Japanese TV Program ) |
|---|
| 85 | |
|---|
| 86 | =head1 SYNOPSIS |
|---|
| 87 | |
|---|
| 88 | use WWW::CDTV; |
|---|
| 89 | my $cdtv = WWW::CDTV->new; |
|---|
| 90 | my $track = $cdtv->track(1); |
|---|
| 91 | print sprintf( "No.%d is %s by %s ", $track->no, $track->title, |
|---|
| 92 | $track->artist ); |
|---|
| 93 | |
|---|
| 94 | =head1 DESCRIPTION |
|---|
| 95 | |
|---|
| 96 | =head1 SEE ALSO |
|---|
| 97 | |
|---|
| 98 | http://www.tbs.co.jp/cdtv/ |
|---|
| 99 | |
|---|
| 100 | =head1 AUTHOR |
|---|
| 101 | |
|---|
| 102 | Yusuke Wada C<< <yusuke@kamawada.com> >> |
|---|
| 103 | |
|---|
| 104 | =head1 LICENCE AND COPYRIGHT |
|---|
| 105 | |
|---|
| 106 | Copyright (c) 2008, Yusuke Wada C<< <yusuke@kamawada.com> >>. All rights reserved. |
|---|
| 107 | |
|---|
| 108 | This module is free software; you can redistribute it and/or |
|---|
| 109 | modify it under the same terms as Perl itself. See L<perlartistic>. |
|---|
| 110 | |
|---|