package Audio::Scrobbler::SimilarArtists; use strict; use Cache::File; use Carp; use File::Path qw/mkpath/; use LWP::Simple; use URI::Escape; use XML::Simple; our $VERSION = '0.01'; sub new { my ($class, %parameters) = @_; my $self = bless ({}, ref ($class) || $class); my %options = ( min_match => 75, cache_time => '1 week', cache_dir => '/tmp/audioscrobbler.cache', %parameters, ); $self->{'_options'} = \%options; # Check if the cache_dir exists if(!-d $self->{'_options'}->{'cache_dir'}) { eval { mkpath($self->{'_options'}->{'cache_dir'}) }; if($@) { Carp::croak("Couldn't create $self->{'_options'}->{'cache_dir'}:$@"); } } return $self; } sub lookup { my ($self, $name) = @_; unless($name) { Carp::croak('No name supplied!'); return; } my $cache = new Cache::File ( cache_root => $self->{'_options'}->{'cache_dir'}, ); my $filename = $name; $filename =~ s/\W//g; my @info; @info = @{$cache->thaw($filename)} if(ref $cache->thaw($filename) eq 'ARRAY'); unless(@info) { my $data = get(sprintf("%s/%s/%s", 'http://ws.audioscrobbler.com/1.0/artist', uri_escape($name), 'similar.xml') ); if($data) { my $xs = new XML::Simple(); my $x = $xs->XMLin($data); if(ref $x->{'artist'} eq 'ARRAY') { foreach my $item (@{$x->{'artist'}}) { next unless ref $item eq 'HASH'; push @info, $item if($item->{'match'} >= $self->{'_options'}->{'min_match'}); } $cache->freeze($filename, \@info, $self->{'_options'}->{'cache_time'}); } } else { Carp::carp("Couldn't fetch XML for $name"); return (); } } return @info; }