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:
parent
c101ea2379
commit
199ec1473a
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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}}) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue