package WWW::Metalgate::Year; use warnings; use strict; use Moose; use MooseX::Types::URI qw(Uri FileUri DataUri); use Encode; use IO::All; use Text::Trim; use Web::Scraper; =head1 NAME WWW::Metalgate::Year =head1 VERSION Version 0.02 =cut our $VERSION = '0.02'; =head1 SYNOPSIS use WWW::Metalgate::Year; use XXX; my $year = WWW::Metalgate::Year->new( year => 2003 ); my @albums = $year->best_albums; YYY @albums; #--- #album: EPICA #artist: KAMELOT #no: 1 #year: 2003 #--- #album: DELIRIUM VEIL #artist: TWILIGHTNING #no: 2 #year: 2003 #--- #... snip ... =head1 FUNCTIONS =head2 uri =head2 year =cut has 'uri' => (is => 'rw', isa => Uri, coerce => 1); has 'year' => (is => 'ro', isa => 'Int', required => 1); with 'WWW::Metalgate::Role::Html'; =head2 BUILD =cut sub BUILD { my $self = shift; # http://www.metalgate.jp/best1992.htm $self->uri( sprintf("http://www.metalgate.jp/best%s.htm", $self->year) ); } =head2 best_albums =cut sub best_albums { my $self = shift; my $album = sub { my $node = shift; return () unless $node->as_text =~ m/No\.\d+/ and $node->find_by_tag_name('img'); my ($no, $artist, $album) = ($node->as_text =~ m/No\.(\d+)\s*(.*?)\s*\/\s*(.*?)\s*$/); return { no => $no, album => $album, artist => $artist, year => $self->year, description => trim( $node->right->right->as_text ), #raw => $node->as_text, }; }; my $tables = scraper { process "table", 'tables[]' => $album; }; my $data = $tables->scrape( $self->html ); return @{$data->{tables}}; } =head2 best_tunes =cut sub best_tunes { my $self = shift; my $tune = sub { my $node = shift; return () unless $node->as_text =~ m/^No\.\d+/ and !$node->find_by_tag_name('img'); my ($name, $artist) = split(/\s*\/\s*/, $node->address(".0.1")->as_text); my $description = $node->right->as_text || $node->address(".1")->as_text; return { no => ($node->address(".0.0")->as_text =~ m/(\d+)/), name => trim($name), artist => trim($artist), year => $self->year, description => trim($description), }; }; my $tables = scraper { process "table", 'tables[]' => $tune; }; my $data = $tables->scrape( $self->html ); return @{$data->{tables}}; } =head1 AUTHOR Tomohiro Hosaka, C<< >> =head1 COPYRIGHT & LICENSE Copyright 2008 Tomohiro Hosaka, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1;