Net::iTMS::Search::Advanced - Represents an advanced search of the iTunes Music Store


Net-iTMS documentation Contained in the Net-iTMS distribution.

Index


Code Index:

NAME

Top

Net::iTMS::Search::Advanced - Represents an advanced search of the iTunes Music Store

SYNOPSIS

Top

    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";
    }

DESCRIPTION

Top

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.

Methods

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 artist, album, song, or composer.

Returns a blessed hashref (object) for Net::iTMS::Search::Advanced.

query

Returns the query hashref the search is for.

LICENSE

Top

Copyright 2004, Thomas R. Sibley.

You may use, modify, and distribute this package under the same terms as Perl itself.

AUTHOR

Top

Thomas R. Sibley, http://zulutango.org:82/

SEE ALSO

Top

Net::iTMS, Net::iTMS::Search, Net::iTMS::Song, Net::iTMS::Artist


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;