From 9abcd844f50926ba33cdfbf141142e706a1a64bb Mon Sep 17 00:00:00 2001 From: Joshua Ferraro Date: Mon, 16 Feb 2009 10:28:00 -0600 Subject: [PATCH] Add Syndetics AuthorNotes, Awards, Series This patch also includes a new function to retrieve the index page from Syndetics and parse it for available content prior to retrieving content; this is done to speed up syndetics content by not retrieving content that doesn't exist for an item. However, Syndetics continues to be a very slow service compared to Amazon.com and other enhanced content services Signed-off-by: Galen Charlton --- C4/Auth.pm | 3 + C4/External/Syndetics.pm | 242 ++++++++++++------ admin/systempreferences.pl | 8 +- installer/data/mysql/updatedatabase.pl | 6 + .../prog/en/modules/opac-detail.tmpl | 38 ++- opac/opac-detail.pl | 41 ++- 6 files changed, 249 insertions(+), 89 deletions(-) diff --git a/C4/Auth.pm b/C4/Auth.pm index cfb65b1f5f..e8469263c6 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -277,6 +277,9 @@ sub get_template_and_user { SyndeticsEditions => C4::Context->preference("SyndeticsEditions"), SyndeticsExcerpt => C4::Context->preference("SyndeticsExcerpt"), SyndeticsReviews => C4::Context->preference("SyndeticsReviews"), + SyndeticsAuthorNotes => C4::Context->preference("SyndeticsAuthorNotes"), + SyndeticsAwards => C4::Context->preference("SyndeticsAwards"), + SyndeticsSeries => C4::Context->preference("SyndeticsSeries"), ); if ( $in->{'type'} eq "intranet" ) { diff --git a/C4/External/Syndetics.pm b/C4/External/Syndetics.pm index b9f480bdeb..b54a6d5b8f 100644 --- a/C4/External/Syndetics.pm +++ b/C4/External/Syndetics.pm @@ -32,11 +32,13 @@ BEGIN { $VERSION = 0.03; @ISA = qw(Exporter); @EXPORT = qw( + &get_syndetics_index &get_syndetics_summary &get_syndetics_toc - &get_syndetics_editions - &get_syndetics_excerpt - &get_syndetics_reviews + &get_syndetics_editions + &get_syndetics_excerpt + &get_syndetics_reviews + &get_syndetics_anotes ); } @@ -60,6 +62,41 @@ Get Summary data from Syndetics =cut +sub get_syndetics_index { + my ( $isbn ) = @_; + + #normalize the ISBN + $isbn = _normalize_match_point ($isbn); + + # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2' + my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); + + my $url = "http://syndetics.com/index.aspx?isbn=$isbn/INDEX.XML&client=$syndetics_client_code&type=xw10"; + my $ua = LWP::UserAgent->new; + $ua->timeout(10); + $ua->env_proxy; + my $response = $ua->get($url); + unless ($response->content_type =~ /xml/) { + return; + } + + my $content = $response->content; + warn "could not retrieve $url" unless $content; + my $xmlsimple = XML::Simple->new(); + $response = $xmlsimple->XMLin( + $content, + ) unless !$content; + + my $syndetics_elements; + for my $available_type ('SUMMARY','TOC','FICTION','AWARDS1','SERIES1','SPSUMMARY','SPREVIEW','AVSUMMARY','DBCHAPTER','LJREVIEW','PWREVIEW','SLJREVIEW','CHREVIEW','BLREVIEW','HBREVIEW','KIREVIEW','CRITICASREVIEW','ANOTES') { + if (exists $response->{$available_type} && $response->{$available_type} =~ /$available_type/) { + $syndetics_elements->{$available_type} = $available_type; + #warn "RESPONSE: $available_type : $response->{$available_type}"; + } + } + return $syndetics_elements if $syndetics_elements; +} + sub get_syndetics_summary { my ( $isbn ) = @_; @@ -70,12 +107,12 @@ sub get_syndetics_summary { my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); my $url = "http://syndetics.com/index.aspx?isbn=$isbn/SUMMARY.XML&client=$syndetics_client_code&type=xw10"; - my $ua = LWP::UserAgent->new; + my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; - my $response = $ua->get($url); - unless ($response->content_type =~ /xml/) { - return; + my $response = $ua->get($url); + unless ($response->content_type =~ /xml/) { + return; } my $content = $response->content; @@ -86,9 +123,9 @@ sub get_syndetics_summary { $content, forcearray => [ qw(Fld520) ], ) unless !$content; - # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a - my $summary; - $summary = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response; + # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a + my $summary; + $summary = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response; return $summary if $summary; } @@ -102,16 +139,16 @@ sub get_syndetics_toc { my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); my $url = "http://syndetics.com/index.aspx?isbn=$isbn/TOC.XML&client=$syndetics_client_code&type=xw10"; - my $ua = LWP::UserAgent->new; + my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; - my $response = $ua->get($url); - unless ($response->content_type =~ /xml/) { - return; - } + my $response = $ua->get($url); + unless ($response->content_type =~ /xml/) { + return; + } - my $content = $response->content; + my $content = $response->content; warn "could not retrieve $url" unless $content; my $xmlsimple = XML::Simple->new(); $response = $xmlsimple->XMLin( @@ -120,7 +157,7 @@ sub get_syndetics_toc { ) unless !$content; # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a my $toc; - $toc = \@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld970}} if $response; + $toc = \@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld970}} if $response; return $toc if $toc; } @@ -134,15 +171,15 @@ sub get_syndetics_excerpt { my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); my $url = "http://syndetics.com/index.aspx?isbn=$isbn/DBCHAPTER.XML&client=$syndetics_client_code&type=xw10"; - my $ua = LWP::UserAgent->new; + my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; my $response = $ua->get($url); unless ($response->content_type =~ /xml/) { - return; - } + return; + } - my $content = $response->content; + my $content = $response->content; warn "could not retrieve $url" unless $content; my $xmlsimple = XML::Simple->new(); $response = $xmlsimple->XMLin( @@ -156,63 +193,70 @@ sub get_syndetics_excerpt { } sub get_syndetics_reviews { - my ( $isbn ) = @_; + my ( $isbn, $syndetics_elements ) = @_; #normalize the ISBN $isbn = _normalize_match_point ($isbn); # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2' my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); - my @reviews; - my $review_sources = [ - {title => 'Library Journal Review', file => 'LJREVIEW.XML'}, - {title => 'Publishers Weekly Review', file => 'PWREVIEW.XML'}, - {title => 'School Library Journal Review', file => 'SLJREVIEW.XML'}, - {title => 'CHOICE Review', file => 'CHREVIEW.XML'}, - {title => 'Booklist Review', file => 'BLREVIEW.XML'}, - {title => 'Horn Book Review', file => 'HBREVIEW.XML'}, - {title => 'Kirkus Book Review', file => 'KIRKREVIEW.XML'}, - {title => 'Criticas Review', file => 'CRITICASREVIEW.XML'} - ]; - - for my $source (@$review_sources) { - my $url = "http://syndetics.com/index.aspx?isbn=$isbn/$source->{file}&client=$syndetics_client_code&type=xw10"; - - my $ua = LWP::UserAgent->new; - $ua->timeout(10); - $ua->env_proxy; + my @reviews; + my $review_sources = [ + {title => 'Library Journal Review', file => 'LJREVIEW.XML', element => 'LJREVIEW'}, + {title => 'Publishers Weekly Review', file => 'PWREVIEW.XML', element => 'PWREVIEW'}, + {title => 'School Library Journal Review', file => 'SLJREVIEW.XML', element => 'SLJREVIEW'}, + {title => 'CHOICE Review', file => 'CHREVIEW.XML', element => 'CHREVIEW'}, + {title => 'Booklist Review', file => 'BLREVIEW.XML', element => 'BLREVIEW'}, + {title => 'Horn Book Review', file => 'HBREVIEW.XML', element => 'HBREVIEW'}, + {title => 'Kirkus Book Review', file => 'KIREVIEW.XML', element => 'KIREVIEW'}, + {title => 'Criticas Review', file => 'CRITICASREVIEW.XML', element => 'CRITICASREVIEW'}, + {title => 'Spanish Review', file => 'SPREVIEW.XML', element => 'SPREVIEW'}, + ]; + + for my $source (@$review_sources) { + if ($syndetics_elements->{$source->{element}} and $source->{element} =~ $syndetics_elements->{$source->{element}}) { + + } else { + #warn "Skipping $source->{element} doesn't match $syndetics_elements->{$source->{element}} \n"; + next; + } + my $url = "http://syndetics.com/index.aspx?isbn=$isbn/$source->{file}&client=$syndetics_client_code&type=xw10"; + + my $ua = LWP::UserAgent->new; + $ua->timeout(10); + $ua->env_proxy; - my $response = $ua->get($url); - unless ($response->content_type =~ /xml/) { - next; - } - - my $content = $response->content; - warn "could not retrieve $url" unless $content; - my $xmlsimple = XML::Simple->new(); - eval { - $response = $xmlsimple->XMLin( - $content, - forcearray => [ qw(Fld520) ], - ) unless !$content; - }; - - # This particular review deserializes differently - if ($source->{file} =~ /BLREVIEW.XML/) { - for my $subfield_a (@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}}) { - my @content; - for my $content (@{$subfield_a->{a}->{content}}) { - push @content, {content => $content}; - } - push @reviews, {title => $source->{title}, reviews => \@content}; #[ {content => $content} ]}; - } - } - else { - push @reviews, {title => $source->{title}, reviews => \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}}} unless $@; - } - - } - return \@reviews; + my $response = $ua->get($url); + unless ($response->content_type =~ /xml/) { + next; + } + + my $content = $response->content; + warn "could not retrieve $url" unless $content; + my $xmlsimple = XML::Simple->new(); + eval { + $response = $xmlsimple->XMLin( + $content, + ForceContent => 1, + forcearray => [ qw(Fld520) ] + ) unless !$content; + }; + + for my $subfield_a (@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}}) { + my @content; + # this is absurd, but sometimes this data serializes differently + if(ref($subfield_a->{a}->{content}) eq 'ARRAY') { + for my $content (@{$subfield_a->{a}->{content}}) { + push @content, {content => $content}; + } + } + else { + push @content, {content => $subfield_a->{a}->{content}}; + } + push @reviews, {title => $source->{title}, reviews => \@content}; + } + } + return \@reviews; } sub get_syndetics_editions { @@ -225,7 +269,7 @@ sub get_syndetics_editions { my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); my $url = "http://syndetics.com/index.aspx?isbn=$isbn/FICTION.XML&client=$syndetics_client_code&type=xw10"; - my $ua = LWP::UserAgent->new; + my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; @@ -244,16 +288,60 @@ sub get_syndetics_editions { ) unless !$content; # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a my $similar_items; - $similar_items = \@{$response->{VarFlds}->{VarDFlds}->{NumbCode}->{Fld020}} if $response; + $similar_items = \@{$response->{VarFlds}->{VarDFlds}->{NumbCode}->{Fld020}} if $response; return $similar_items if $similar_items; } +sub get_syndetics_anotes { + my ( $isbn ) = @_; + + #normalize the ISBN + $isbn = _normalize_match_point ($isbn); + + # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2' + my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode'); + + my $url = "http://syndetics.com/index.aspx?isbn=$isbn/ANOTES.XML&client=$syndetics_client_code&type=xw10"; + my $ua = LWP::UserAgent->new; + $ua->timeout(10); + $ua->env_proxy; + + my $response = $ua->get($url); + unless ($response->content_type =~ /xml/) { + return; + } + + my $content = $response->content; + + warn "could not retrieve $url" unless $content; + my $xmlsimple = XML::Simple->new(); + $response = $xmlsimple->XMLin( + $content, + forcearray => [ qw(Fld980) ], + ForceContent => 1, + ) unless !$content; + my @anotes; + for my $fld980 (@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld980}}) { + # this is absurd, but sometimes this data serializes differently + if(ref($fld980->{a}->{content}) eq 'ARRAY') { + for my $content (@{$fld980->{a}->{content}}) { + push @anotes, {content => $content}; + + } + } + else { + push @anotes, {content => $fld980->{a}->{content}}; + } + } + return \@anotes; +} + sub _normalize_match_point { - my $match_point = shift; - (my $normalized_match_point) = $match_point =~ /([\d-]*[X]*)/; - $normalized_match_point =~ s/-//g; + my $match_point = shift; + (my $normalized_match_point) = $match_point =~ /([\d-]*[X]*)/; + $normalized_match_point =~ s/-//g; - return $normalized_match_point; + return $normalized_match_point; } 1; diff --git a/admin/systempreferences.pl b/admin/systempreferences.pl index ee546fd390..3f92a77aad 100755 --- a/admin/systempreferences.pl +++ b/admin/systempreferences.pl @@ -238,8 +238,12 @@ $tabsysprefs{SyndeticsCoverImages} = 'EnhancedContent'; $tabsysprefs{SyndeticsTOC} = 'EnhancedContent'; $tabsysprefs{SyndeticsSummary} = 'EnhancedContent'; $tabsysprefs{SyndeticsEditions} = 'EnhancedContent'; -$tabsysprefs{SyndeticsExcerpt} = 'EnhancedContent'; -$tabsysprefs{SyndeticsReviews} = 'EnhancedContent'; +$tabsysprefs{SyndeticsExcerpt} = 'EnhancedContent'; +$tabsysprefs{SyndeticsReviews} = 'EnhancedContent'; +$tabsysprefs{SyndeticsAuthorNotes} = 'EnhancedContent'; +$tabsysprefs{SyndeticsAwards} = 'EnhancedContent'; +$tabsysprefs{SyndeticsSeries} = 'EnhancedContent'; + # FRBR $tabsysprefs{FRBRizeEditions} = "EnhancedContent"; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 09210cd13a..140c26d4f6 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -2238,6 +2238,12 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsReviews', '0', 'Display Reviews on OPAC from Syndetics','','YesNo')"); + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsAuthorNotes', '0', 'Display Notes about the Author on OPAC from Syndetics','','YesNo')"); + + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsAwards', '0', 'Display Awards on OPAC from Syndetics','','YesNo')"); + + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SyndeticsSeries', '0', 'Display Series information on OPAC from Syndetics','','YesNo')"); + print "Upgrade to $DBversion done (added Syndetics Enhanced Content system preferences)\n"; SetVersion ($DBversion); } diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl index 256d850932..920406ea4e 100644 --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl +++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl @@ -214,6 +214,17 @@ + + + Series Information: &type=series&num=1&client=">Click to open in new window + + + + + Awards: &type=awards&client=">Click to open in new window + + + Enhanced Content:" target="_blank">Content Cafe">Content Cafe @@ -231,12 +242,17 @@
  • #toc">TOC
  • +
  • #excerpt">Excerpt
  • #reviews">Reviews
  • + +
  • #anotes">About the Author
  • + +
  • #subscriptions">Subscriptions
  • @@ -376,14 +392,15 @@ - - + + -

    From Syndetics:

    +

    Enhanced Description:

    + @@ -397,7 +414,7 @@ - +
    @@ -439,6 +456,19 @@
    +
    +
    + + + + + + + +
    +
    + +

    This is a serial subscription

    diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index 0964647d8e..0a46fa70bd 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -33,7 +33,7 @@ use C4::Tags qw(get_tags); use C4::Dates qw/format_date/; use C4::XISBN qw(get_xisbns get_biblionumber_from_isbn get_biblio_from_xisbn); use C4::External::Amazon; -use C4::External::Syndetics qw(get_syndetics_summary get_syndetics_toc get_syndetics_excerpt get_syndetics_reviews ); +use C4::External::Syndetics qw(get_syndetics_index get_syndetics_summary get_syndetics_toc get_syndetics_excerpt get_syndetics_reviews get_syndetics_anotes ); use C4::Review; use C4::Serials; use C4::Members; @@ -291,7 +291,21 @@ if ( C4::Context->preference("OPACAmazonContent") == 1 ) { $template->param( AMAZON_EDITORIAL_REVIEWS => $editorial_reviews ); } -if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("SyndeticsSummary") ) { +my $syndetics_elements; +if ( C4::Context->preference("SyndeticsEnabled") ) { + eval { + $syndetics_elements = &get_syndetics_index($xisbn); + for my $element (values %$syndetics_elements) { + $template->param("Syndetics$element"."Exists" => 1 ); + #warn "Exists: "."Syndetics$element"."Exists"; + } + }; + warn $@ if $@; +} + +if ( C4::Context->preference("SyndeticsEnabled") + && C4::Context->preference("SyndeticsSummary") + && $syndetics_elements->{'SUMMARY'} =~ /SUMMARY/) { eval { my $syndetics_summary = &get_syndetics_summary($xisbn); $template->param( SYNDETICS_SUMMARY => $syndetics_summary ); @@ -300,7 +314,9 @@ if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("Syn } -if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("SyndeticsTOC") ) { +if ( C4::Context->preference("SyndeticsEnabled") + && C4::Context->preference("SyndeticsTOC") + && $syndetics_elements->{'TOC'} =~ /TOC/) { eval { my $syndetics_toc = &get_syndetics_toc($xisbn); $template->param( SYNDETICS_TOC => $syndetics_toc ); @@ -308,7 +324,9 @@ if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("Syn warn $@ if $@; } -if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("SyndeticsExcerpt") ) { +if ( C4::Context->preference("SyndeticsEnabled") + && C4::Context->preference("SyndeticsExcerpt") + && $syndetics_elements->{'DBCHAPTER'} =~ /DBCHAPTER/ ) { eval { my $syndetics_excerpt = &get_syndetics_excerpt($xisbn); $template->param( SYNDETICS_EXCERPT => $syndetics_excerpt ); @@ -316,14 +334,25 @@ if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("Syn warn $@ if $@; } -if ( C4::Context->preference("SyndeticsEnabled") && C4::Context->preference("SyndeticsReviews") ) { +if ( C4::Context->preference("SyndeticsEnabled") + && C4::Context->preference("SyndeticsReviews")) { eval { - my $syndetics_reviews = &get_syndetics_reviews($xisbn); + my $syndetics_reviews = &get_syndetics_reviews($xisbn,$syndetics_elements); $template->param( SYNDETICS_REVIEWS => $syndetics_reviews ); }; warn $@ if $@; } +if ( C4::Context->preference("SyndeticsEnabled") + && C4::Context->preference("SyndeticsAuthorNotes") + && $syndetics_elements->{'ANOTES'} =~ /ANOTES/ ) { + eval { + my $syndetics_anotes = &get_syndetics_anotes($xisbn); + $template->param( SYNDETICS_ANOTES => $syndetics_anotes ); + }; + warn $@ if $@; +} + # Shelf Browser Stuff if (C4::Context->preference("OPACShelfBrowser")) { # pick the first itemnumber unless one was selected by the user -- 2.20.1