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 <galen.charlton@liblime.com>
This commit is contained in:
Frédéric Demians 2009-04-25 09:24:54 +02:00 committed by Galen Charlton
parent c101ea2379
commit 199ec1473a
3 changed files with 87 additions and 40 deletions

62
C4/External/Amazon.pm vendored
View File

@ -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
my $amazon_details = &get_amazon_details( $xisbn, $record, $marcflavour );
=back
=item get_amazon_detail( $isbn, $record, $marcflavour, $services )
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
=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();

View File

@ -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}}) {

View File

@ -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});
}
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_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 );
}
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;