#!/usr/bin/perl -w

#
# This perl script is intended to grab a CD album cover from the amazon
# website.
#
# Author: Paul Stuttard
# v 1.0

use LWP::Simple;      # libwww-perl providing simple HTML get actions
use HTML::Entities;
use URI::Escape;
use XML::Simple;

use vars qw($opt_h $opt_r $opt_d $opt_i $opt_v);
use Getopt::Std; 

$title = "Amazon Query"; 
$version = "v1.0";
$author = "Paul Stuttard";


  # Various components of amazon REST API URL, choose appropriate locale
  $url_locale  = "http://webservices.amazon.co.uk";
  #$url_->locale  = "http://webservices.amazon.com";
  #$url_->locale  = "http://webservices.amazon.de";
  #$url_->locale  = "http://webservices.amazon.co.jp";

  $url_base    = $url_locale . "/onca/xml?Service=AWSECommerceService";
  $url_subid   = "&SubscriptionId=";
  $url_item    = "&Operation=ItemSearch";
  $url_artist  = "&Artist=";
  $url_title   = "&Title=";
  $url_tail    = "&SearchIndex=Music&Sort=salesrank&ResponseGroup=";

# display usage
sub usage {
   print "usage: $0 -hdrvi <directory>\n";
   print "       -h           help\n";
   print "       -d           debug\n";
   print "       -r           dump raw query result data only\n";
   print "       -v           display version\n";
   print "       -i           display info\n";
   print "\n";
   exit(-1);
}

# display 1-line of info that describes the version of the program
sub version {
   print "$title ($version) by $author\n"
} 

# display 1-line of info that can describe the type of query used
sub info {
   print "Performs queries using the $url_locale website.\n";
}

# display detailed help 
sub help {
   version();
   info();
   usage();
}

# dump Movie Poster
sub getCDCover {

   if (defined $opt_d) { print "# starting to look for poster on Amazon.com\n"; }

   $my_id     = '1TVEWDEEY32CBFSNKXR2';

   my $titleid = 0;
   my $found = 0;
   my $ama_uri = "";
   my $xml_parser = XML::Simple->new();
   
   $album =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;      
   $artist =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;      

   # Construct the Amazon Web Services API call
   $url    = $url_base . $url_subid . $my_id . $url_item ;
   $url    = $url . $url_artist . $artist;
   $url    = $url . $url_title . $album;
   $url    = $url . $url_tail . "Images,Small";

   if (defined $opt_d) { print "# Query URL: $url\n";}
      
   # get the response
   $response = get $url;
   if (defined $opt_r) { printf("%s", $response); }
   
   # parse the response
   my $xml_doc = $xml_parser->XMLin($response);

   #print "XML: $xml_doc->{Items}->{Item}->[0]->{LargeImage}->{URL}\n";
   #foreach my $key (keys (%{$xml_doc->{Items}->{Item}->[0]->{LargeImage}})){
      #print "XML: $key\n";
   #}
   # if we only got one result, fake it as array
   if (ref($xml_doc->{Items}->{Item}) ne 'ARRAY') {
      my @tmpArray = ($xml_doc->{Items}->{Item});
      $xml_doc->{Items}->{Item} = \@tmpArray;
   }

   $k = 0;
   do {
      $am_artist = $xml_doc->{Items}->{Item}->[$k]->{ItemAttributes}->{Artist};
      $am_title  = $xml_doc->{Items}->{Item}->[$k]->{ItemAttributes}->{Title};
      if (defined $opt_d) { print "# Amazon: found poster for $am_artist/$am_title: " . $xml_doc->{Items}->{Item}->[$k]->{LargeImage}->{URL} . "\n"; }
      $ama_uri = $xml_doc->{Items}->{Item}->[$k]->{LargeImage}->{URL};
      $found = 1;
      $k++;
   } until ($found || $k == 5);
   #only search through first 5 matches

   $titleid++;
      
   my $image = get $ama_uri if (defined($ama_uri) && $ama_uri ne "");
   if ($ama_uri ne "" && length($image) eq "807") {
      if (defined $opt_d) { printf("# this image is blank\n"); }
      $ama_uri = "";
   }
      
   if (!defined($ama_uri)) {
      $ama_uri = "";
   }
	
   if ($ama_uri ne "") {
      $uri = $ama_uri;
   }

   $jpeg_image = get $uri;
   $outfile = $directory . "/folder_large.jpg";
   open(INFO, ">$outfile");

   binmode INFO;
   print INFO $jpeg_image;
   close INFO;

}

#
# Main Program
#

# parse command line arguments 
getopts('ohrdiv');

# print out info 
if (defined $opt_v) { version(); exit 1; }
if (defined $opt_i) { info(); exit 1; }

# print out usage if needed
if (defined $opt_h || $#ARGV<0) { help(); }

# take directory from command line
$directory = shift || die "Usage : $0 <music directory>\n";
$artist = shift || die "Usage : $0 <music directory>\n";
$album = shift || die "Usage : $0 <music directory>\n";
getCDCover($directory, $artist, $album);
