#!/usr/bin/perl -w use strict; use LWP; use HTTP::Request::Common; use MP3::Tag; use File::Find; use Data::Dumper; use SOAP::Lite; #FIXME: This should work if Image::Magick is installed # (the version on CPAN seems to be broken right now...) #use Image::Magick; my @blacklist = ('Vic Ruggiero','Various Artists','Eulogy','Vagrant Records'); my %imagecache = (); my $ua = new LWP::UserAgent; my $amazon = SOAP::Lite ->proxy('http://soap.amazon.com/onca/soap') ->uri('urn:PI/DevCentral/SoapService') #->readable(1) #->on_debug(sub{print@_}) ; sub wanted { return unless(/\.mp3$/); return if($_ eq 'dummy.mp3'); return unless(-f $_); print "$_\n"; my $mp3 = MP3::Tag->new($_); $mp3->get_tags; my $id3v2 = $mp3->{ID3v2} || die "No id3 for $_\n"; $mp3->close,return if($id3v2->get_frame('APIC')); my $album = $id3v2->album(); my $artist = $id3v2->artist(); $mp3->close,return if(!defined($album) || !defined($artist)); foreach(@blacklist) { print "$_\n",$mp3->close,return if($artist =~ /\Q$_\E/); print "$_\n",$mp3->close,return if($album =~ /\Q$_\E/); } my $key = "$artist\0$album\0"; if(!exists $imagecache{$key}) { print "Getting artwork for $artist/$album...\n"; my $url = docd($artist,$album); if(defined($url)) { my $response = $ua->request(GET $url); $response->is_success || die "$!"; my $data = $response->content; if($response->content_type ne 'image/jpeg') { print "FIXME: Its a gif - install Image::Magick!\n"; <>; $imagecache{$key} = undef; $mp3->close,return; my $image = Image::Magick->new('magick'=>'gif'); $image->BlobToImage($data); $data = $image->ImageToBlob('magick'=>'jpg'); } $imagecache{$key} = $data; open PIC,">/tmp/pic.jpg" || die "$!"; print PIC $data; close PIC; system("open /tmp/pic.jpg"); <>; } else { print STDERR "Warning: pic for $artist/$album not found\n"; $imagecache{$key} = undef; <>; } } my $data = $imagecache{$key}; $mp3->close,return unless(defined($data)); while($id3v2->get_frame('APIC')) { print "Removing frame....\n"; $id3v2->remove_frame('APIC'); } $id3v2->add_frame('APIC','image/jpeg',"\0","Cover Image",$data); $id3v2->write_tag() || die; $mp3->close; } find({ wanted=> \&wanted, no_chdir=> 1},$ARGV[0] || "$ENV{'HOME'}/Music"); sub docd { my ($artist,$album) = @_; my $lasthits = -1; my $url; my %params = ( 'artist' => $artist, 'page' => 1, 'mode' => 'music', 'tag' => 'webservices-20', 'type' => 'lite', 'devtag' => 'DNQ5YQI2NBCGC' ); $album =~ s/^The\s+//; while((($lasthits == -1) or ($lasthits >= 10)) && $params{'page'} < 15) { print "Checking page $params{'page'} ($lasthits)...\n"; my $response = $amazon->ArtistSearchRequest(\%params)->result; defined($response) || last; #print Dumper($response); $lasthits = scalar(@{$response->{'Details'}}); printf "Hits: $lasthits\n"; print Dumper(@{$response->{'Details'}}); my @albums = grep { $_->{'ProductName'} =~ /\Q$album\E/i } @{$response->{'Details'}}; if(scalar(@albums) >= 1) { print STDERR "Warning: multiple albums match for $artist/$album\n" if(scalar(@albums) > 1); foreach(qw(ImageUrlLarge ImageUrlMedium ImageUrlSmall)) { if(exists($albums[0]->{$_})) { $url = $albums[0]->{$_}; last; } } last; } $params{'page'}++; #print Dumper(@albums); } $url; } __END__ $VAR1 = bless( { 'Details' => [ bless( { 'OurPrice' => '$13.49', 'ImageUrlLarge' => 'http://images.amazon.com/images/P/B00006CYB2.01.LZZZZZZZ.jpg', 'ReleaseDate' => '15 April, 2003', 'ImageUrlMedium' => 'http://images.amazon.com/images/P/B00006CYB2.01.MZZZZZZZ.jpg', 'Catalog' => 'Music', 'Asin' => 'B00006CYB2', 'Manufacturer' => 'Private Music', 'Url' => 'http://www.amazon.com/exec/obidos/redirect?tag=webservices-20%26creative=DNQ5YQI2NBCGC%26camp=2025%26link_code=sp1%26path=ASIN/B00006CYB2', 'UsedPrice' => '$10.99', 'ListPrice' => '$18.98', 'ProductName' => 'Dragonfly', 'ImageUrlSmall' => 'http://images.amazon.com/images/P/B00006CYB2.01.THUMBZZZ.jpg', 'Artists' => [ 'Ziggy Marley' ] }, 'Details' ),