From 199ec1473afa49ade9a5466d340a3361b60244cd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Demians?= Date: Sat, 25 Apr 2009 09:24:54 +0200 Subject: [PATCH] Bugfix #2920 Avoid doing unecessary calls to Amazon Web Services This patch modifies how AWS is called. AWS is now called depending on syspref. It works completly for OPAC; it has to be refined for intranet. For OPAC: * If OPACAmazonReviews is set, AWS EditorialReview and Reviews (users) are grabed. * If OPACAmazonSimilarItems is set, AWS Similarities info are grabed. * If nothing is asked, AWS is not called anymore, sparing server bandwidth. For intranet: It works as it used to work. AWS is called if AmazonEnabled is set whatever how other syspref are set. TODO: * Add a AmazonReviews syspref * Request Amazon content depending on AmazonSimilarities and AmazonReviews syspref DOCUMENTATION: It should be explained that Amazon services related syspref have two levels: * AmazonEnable / OPACAmazonEnable * Other: OPACAmazonReviews (new), OPACAmazonSimilarProduct, OPACAmazonCover Signed-off-by: Galen Charlton --- C4/External/Amazon.pm | 58 +++++++++++++++++++++++++++++++++--------- catalogue/detail.pl | 4 +-- opac/opac-detail.pl | 59 ++++++++++++++++++++++++++----------------- 3 files changed, 84 insertions(+), 37 deletions(-) diff --git a/C4/External/Amazon.pm b/C4/External/Amazon.pm index 4c64e9d601..78cdadf812 100644 --- a/C4/External/Amazon.pm +++ b/C4/External/Amazon.pm @@ -33,9 +33,8 @@ BEGIN { $VERSION = 0.03; @ISA = qw(Exporter); @EXPORT = qw( - &get_amazon_details - &check_search_inside - &get_amazon_tld + get_amazon_details + get_amazon_tld ); } @@ -60,24 +59,57 @@ sub get_amazon_tld { C4::External::Amazon - Functions for retrieving Amazon.com content in Koha -=head1 FUNCTIONS +=head2 FUNCTIONS This module provides facilities for retrieving Amazon.com content in Koha -=head2 get_amazon_details +=over -=over 4 +=item get_amazon_detail( $isbn, $record, $marcflavour, $services ) -my $amazon_details = &get_amazon_details( $xisbn, $record, $marcflavour ); +Get editorial reviews, customer reviews, and similar products using Amazon Web Services. + +Parameters: + +=over + +=item $isbn + +Biblio record isbn + +=item $record + +Biblio MARC record + +=item $marcflavour + +MARC flavor, MARC21 or UNIMARC + +=item $services + +Requested Amazon services: A ref to an array. For example, +[ 'Similarities', 'EditorialReviews', 'Reviews' ]. +No other service will be accepted. Services must be spelled exactly. +If no sercice is requested, AWS isn't called. =back -Get editorial reviews, customer reviews, and similar products using Amazon Web Services. +=item get_amazon_tld() + +Get Amazon Top Level Domain depending on Amazon local preference: AmazonLocal. +For example, if AmazonLocal is 'UK', returns '.co.uk'. + +=back =cut + sub get_amazon_details { - my ( $isbn, $record, $marcflavour ) = @_; + my ( $isbn, $record, $marcflavour, $aws_ref ) = @_; + + return unless defined $aws_ref; + my @aws = @$aws_ref; + return if $#aws == -1; # Normalize the fields $isbn = GetNormalizedISBN($isbn); @@ -107,7 +139,9 @@ sub get_amazon_details { return undef; } - my $format = substr $record->leader(), 6, 1; # grab the item format to determine Amazon search index + # grab the item format to determine Amazon search index + # FIXME: This is MARC21 specific + my $format = substr $record->leader(), 6, 1; my $formats; $formats->{'a'} = 'Books'; $formats->{'g'} = 'Video'; @@ -125,12 +159,12 @@ sub get_amazon_details { #grab the associates tag: mine is 'kadabox-20' my $af_tag=C4::Context->preference('AmazonAssocTag'); - my $response_group = "Similarities,EditorialReview,Reviews,ItemAttributes,Images"; + my $response_group = join( ',', @aws ); my $url = "http://ecs.amazonaws$tld/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=$aws_access_key_id&Operation=ItemLookup&AssociateTag=$af_tag&Version=2007-01-15&ItemId=$item_id&IdType=$id_type&ResponseGroup=$response_group"; if ($id_type ne 'ASIN') { $url .= "&SearchIndex=$search_index"; } - # warn $url; + #warn $url; my $content = get($url); warn "could not retrieve $url" unless $content; my $xmlsimple = XML::Simple->new(); diff --git a/catalogue/detail.pl b/catalogue/detail.pl index 663f7703f2..aaf07c7b0e 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -224,8 +224,8 @@ if (C4::Context->preference("FRBRizeEditions")==1) { } if ( C4::Context->preference("AmazonEnabled") == 1 ) { my $similar_products_exist; - my $amazon_details = &get_amazon_details( $isbn, $record, $marcflavour ); - my $item_attributes = \%{$amazon_details->{Items}->{Item}->{ItemAttributes}}; + my @aws = qw( Similarities EditorialReview Reviews ); + my $amazon_details = &get_amazon_details( $isbn, $record, $marcflavour, \@aws ); my $customer_reviews = \@{$amazon_details->{Items}->{Item}->{CustomerReviews}->{Review}}; my @similar_products; for my $similar_product (@{$amazon_details->{Items}->{Item}->{SimilarProducts}->{SimilarProduct}}) { diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index ae6bc419f6..f98f30e449 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -276,33 +276,46 @@ if (C4::Context->preference("OPACFRBRizeEditions")==1) { # Amazon.com Stuff if ( C4::Context->preference("OPACAmazonEnabled") ) { $template->param( AmazonTld => get_amazon_tld() ); - $template->param( OPACAmazonReviews => C4::Context->preference("OPACAmazonReviews") ); -} -if ( C4::Context->preference("OPACAmazonEnabled") && C4::Context->preference("OPACAmazonSimilarItems") ) { + my $amazon_reviews = C4::Context->preference("OPACAmazonReviews"); + my $amazon_similars = C4::Context->preference("OPACAmazonSimilarItems"); + my @services; + if ( $amazon_reviews ) { + $template->param( OPACAmazonReviews => 1 ); + push( @services, 'EditorialReview', 'Reviews' ); + } + if ( $amazon_similars ) { + $template->param( OPACAmazonSimilarItems => 1 ); + push( @services, 'Similarities' ); + } + my $amazon_details = &get_amazon_details( $isbn, $record, $marcflavour, \@services ); my $similar_products_exist; - my $amazon_details = &get_amazon_details( $isbn, $record, $marcflavour ); - my $item_attributes = \%{$amazon_details->{Items}->{Item}->{ItemAttributes}}; - my $customer_reviews = \@{$amazon_details->{Items}->{Item}->{CustomerReviews}->{Review}}; - for my $one_review (@$customer_reviews) { - $one_review->{Date} = format_date($one_review->{Date}); + if ( $amazon_reviews ) { + my $item = $amazon_details->{Items}->{Item}; + my $customer_reviews = \@{ $item->{CustomerReviews}->{Review} }; + for my $one_review ( @$customer_reviews ) { + $one_review->{Date} = format_date($one_review->{Date}); + } + my $editorial_reviews = \@{ $item->{EditorialReviews}->{EditorialReview} }; + my $average_rating = $item->{CustomerReviews}->{AverageRating} || 0; + $template->param( amazon_average_rating => $average_rating * 20); + $template->param( AMAZON_CUSTOMER_REVIEWS => $customer_reviews ); + $template->param( AMAZON_EDITORIAL_REVIEWS => $editorial_reviews ); } - my @similar_products; - for my $similar_product (@{$amazon_details->{Items}->{Item}->{SimilarProducts}->{SimilarProduct}}) { - # do we have any of these isbns in our collection? - my $similar_biblionumbers = get_biblionumber_from_isbn($similar_product->{ASIN}); - # verify that there is at least one similar item - if (scalar(@$similar_biblionumbers)){ - $similar_products_exist++ if ($similar_biblionumbers && $similar_biblionumbers->[0]); - push @similar_products, +{ similar_biblionumbers => $similar_biblionumbers, title => $similar_product->{Title}, ASIN => $similar_product->{ASIN} }; + if ( $amazon_similars ) { + my $item = $amazon_details->{Items}->{Item}; + my @similar_products; + for my $similar_product (@{ $item->{SimilarProducts}->{SimilarProduct} }) { + # do we have any of these isbns in our collection? + my $similar_biblionumbers = get_biblionumber_from_isbn($similar_product->{ASIN}); + # verify that there is at least one similar item + if (scalar(@$similar_biblionumbers)){ + $similar_products_exist++ if ($similar_biblionumbers && $similar_biblionumbers->[0]); + push @similar_products, +{ similar_biblionumbers => $similar_biblionumbers, title => $similar_product->{Title}, ASIN => $similar_product->{ASIN} }; + } } + $template->param( OPACAmazonSimilarItems => $similar_products_exist ); + $template->param( AMAZON_SIMILAR_PRODUCTS => \@similar_products ); } - my $editorial_reviews = \@{$amazon_details->{Items}->{Item}->{EditorialReviews}->{EditorialReview}}; - my $average_rating = $amazon_details->{Items}->{Item}->{CustomerReviews}->{AverageRating} || 0; - $template->param( OPACAmazonSimilarItems => $similar_products_exist ); - $template->param( amazon_average_rating => $average_rating * 20); - $template->param( AMAZON_CUSTOMER_REVIEWS => $customer_reviews ); - $template->param( AMAZON_SIMILAR_PRODUCTS => \@similar_products ); - $template->param( AMAZON_EDITORIAL_REVIEWS => $editorial_reviews ); } my $syndetics_elements; -- 2.39.5