package Net::iTMS::Search::Advanced;
#
# Written by Thomas R. Sibley,
#
use warnings;
use strict;
use vars '$VERSION';
$VERSION = '0.14';
use base 'Net::iTMS::Search';
=head1 NAME
Net::iTMS::Search::Advanced - Represents an advanced search of the iTunes Music Store
=head1 SYNOPSIS
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";
}
=head1 DESCRIPTION
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.
=head2 Methods
=over 12
=item new($itms, { artist => "U2" })
The first argument must be an instance of Net::iTMS, the second a hashref
containing at least one of the keys C, C, C, or
C.
Returns a blessed hashref (object) for Net::iTMS::Search::Advanced.
=item query
Returns the query hashref the search is for.
=cut
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;
}
=back
=head1 LICENSE
Copyright 2004, Thomas R. Sibley.
You may use, modify, and distribute this package under the same terms as Perl itself.
=head1 AUTHOR
Thomas R. Sibley, L
=head1 SEE ALSO
L, L, L, L
=cut
42;