| Net-iTMS documentation | Contained in the Net-iTMS distribution. |
Net::iTMS::Search::Advanced - Represents an advanced search of the iTunes Music Store
use Net::iTMS::Search::Advanced;
my $search = Net::iTMS::Search::Advanced->new($iTMS, {
artist => 'Elliott Smith',
album => 'From a Basement on the Hill',
song => 'distorted',
});
for my $album ($search->albums) {
print $album->title, " by ", $album->artist->name, "\n";
}
Net::iTMS::Search::Advanced represents an advanced search of the iTMS and encapsulates the associated results. It is a subclass of Net::iTMS::Search; only changes are noted in this doc. See the doc for Net::iTMS::Search for the other methods available.
The first argument must be an instance of Net::iTMS, the second a hashref
containing at least one of the keys artist, album, song, or
composer.
Returns a blessed hashref (object) for Net::iTMS::Search::Advanced.
Returns the query hashref the search is for.
Copyright 2004, Thomas R. Sibley.
You may use, modify, and distribute this package under the same terms as Perl itself.
Thomas R. Sibley, http://zulutango.org:82/
| Net-iTMS documentation | Contained in the Net-iTMS distribution. |
package Net::iTMS::Search::Advanced; # # Written by Thomas R. Sibley, <http://zulutango.org:82/> # use warnings; use strict; use vars '$VERSION'; $VERSION = '0.14'; use base 'Net::iTMS::Search';
sub _get_results { my $self = shift; my %q; for (qw(artist album song composer)) { $q{"${_}Term"} = $self->{query}->{$_} if defined $self->{query}->{$_}; } my $twig = $self->{_itms}->{_request}->url('advancedSearch', \%q) or return undef; my $root = $twig->root; $self->_get_results_albums($root); $self->_get_results_tracks($root); $twig->purge; } sub _get_results_albums { my ($self, $root) = @_; # # Albums # $self->{albums} = [ ]; my $sv = $root->first_child('ScrollView'); my $v = $sv->first_child('MatrixView') ->first_child('VBoxView'); # Find the View container we want my $tmp; for ($v->children('View')) { if ($_->children) { $tmp = $_; last; } } my $mv; eval { $mv = $tmp->first_child('MatrixView') ->first_child('MatrixView') ->first_child('MatrixView'); }; return if $@; # # This is mostly the same to the code in the regular search except # for some higher up structural changes in the XML which affect the # main for loop below and album fetching. # if (defined $mv) { for ($mv->children('VBoxView')) { my $album = $_->first_child('MatrixView') ->first_child('GotoURL'); next if not defined $album; my %data = ( title => $album->att('draggingName'), ); if (my $pic = $album->first_child('PictureView')) { $data{thumb} = { height => $pic->att('height'), width => $pic->att('width'), url => $pic->att('url'), }; } if (my $artist = $_->first_child('MatrixView') ->first_child('VBoxView') ->first_child('TextView') ->first_child('GotoURL')) { my ($id) = $artist->att('url') =~ /artistId=(\d+)\z/; $data{artist} = $self->{_itms}->get_artist( $id, name => $artist->trimmed_text, ); if (my $genre = $artist->parent ->next_sibling('TextView') ->first_child('ViewGenre')) { my ($name) = $genre->trimmed_text =~ /^Genre:\s+(.+)$/i; $data{genre} = $self->{_itms}->get_artist( $genre->att('id'), name => $name, ); } } my ($id) = $album->att('url') =~ /playListId=(\d+)\z/; push @{$self->{albums}}, $self->{_itms}->get_album( $id, %data, ); } } $sv->delete; }
42;