1 package C4::External::Syndetics;
2 # Copyright (C) 2006 LibLime
3 # <jmf at liblime dot com>
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA 02111-1307 USA
23 use HTTP::Request::Common;
28 use vars qw($VERSION @ISA @EXPORT);
36 &get_syndetics_summary
38 &get_syndetics_editions
39 &get_syndetics_excerpt
40 &get_syndetics_reviews
47 C4::External::Syndetics - Functions for retrieving Syndetics content in Koha
51 This module provides facilities for retrieving Syndetics.com content in Koha
53 =head2 get_syndetics_summary
57 my $syndetics_summary= &get_syndetics_summary( $xisbn );
61 Get Summary data from Syndetics
65 sub get_syndetics_index {
69 $isbn = _normalize_match_point ($isbn);
71 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
72 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
74 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/INDEX.XML&client=$syndetics_client_code&type=xw10";
75 my $ua = LWP::UserAgent->new;
78 my $response = $ua->get($url);
79 unless ($response->content_type =~ /xml/) {
83 my $content = $response->content;
84 warn "could not retrieve $url" unless $content;
85 my $xmlsimple = XML::Simple->new();
86 $response = $xmlsimple->XMLin(
90 my $syndetics_elements;
91 for my $available_type ('SUMMARY','TOC','FICTION','AWARDS1','SERIES1','SPSUMMARY','SPREVIEW','AVSUMMARY','DBCHAPTER','LJREVIEW','PWREVIEW','SLJREVIEW','CHREVIEW','BLREVIEW','HBREVIEW','KIREVIEW','CRITICASREVIEW','ANOTES') {
92 if (exists $response->{$available_type} && $response->{$available_type} =~ /$available_type/) {
93 $syndetics_elements->{$available_type} = $available_type;
94 #warn "RESPONSE: $available_type : $response->{$available_type}";
97 return $syndetics_elements if $syndetics_elements;
100 sub get_syndetics_summary {
104 $isbn = _normalize_match_point ($isbn);
106 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
107 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
109 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/SUMMARY.XML&client=$syndetics_client_code&type=xw10";
110 my $ua = LWP::UserAgent->new;
113 my $response = $ua->get($url);
114 unless ($response->content_type =~ /xml/) {
118 my $content = $response->content;
120 warn "could not retrieve $url" unless $content;
121 my $xmlsimple = XML::Simple->new();
122 $response = $xmlsimple->XMLin(
124 forcearray => [ qw(Fld520) ],
126 # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
128 $summary = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response;
129 return $summary if $summary;
132 sub get_syndetics_toc {
136 $isbn = _normalize_match_point ($isbn);
138 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
139 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
141 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/TOC.XML&client=$syndetics_client_code&type=xw10";
142 my $ua = LWP::UserAgent->new;
146 my $response = $ua->get($url);
147 unless ($response->content_type =~ /xml/) {
151 my $content = $response->content;
152 warn "could not retrieve $url" unless $content;
153 my $xmlsimple = XML::Simple->new();
154 $response = $xmlsimple->XMLin(
156 forcearray => [ qw(Fld970) ],
158 # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
160 $toc = \@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld970}} if $response;
164 sub get_syndetics_excerpt {
168 $isbn = _normalize_match_point ($isbn);
170 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
171 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
173 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/DBCHAPTER.XML&client=$syndetics_client_code&type=xw10";
174 my $ua = LWP::UserAgent->new;
177 my $response = $ua->get($url);
178 unless ($response->content_type =~ /xml/) {
182 my $content = $response->content;
183 warn "could not retrieve $url" unless $content;
184 my $xmlsimple = XML::Simple->new();
185 $response = $xmlsimple->XMLin(
187 forcearray => [ qw(Fld520) ],
189 # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
191 $excerpt = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response;
192 return XMLout($excerpt) if $excerpt;
195 sub get_syndetics_reviews {
196 my ( $isbn, $syndetics_elements ) = @_;
199 $isbn = _normalize_match_point ($isbn);
201 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
202 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
204 my $review_sources = [
205 {title => 'Library Journal Review', file => 'LJREVIEW.XML', element => 'LJREVIEW'},
206 {title => 'Publishers Weekly Review', file => 'PWREVIEW.XML', element => 'PWREVIEW'},
207 {title => 'School Library Journal Review', file => 'SLJREVIEW.XML', element => 'SLJREVIEW'},
208 {title => 'CHOICE Review', file => 'CHREVIEW.XML', element => 'CHREVIEW'},
209 {title => 'Booklist Review', file => 'BLREVIEW.XML', element => 'BLREVIEW'},
210 {title => 'Horn Book Review', file => 'HBREVIEW.XML', element => 'HBREVIEW'},
211 {title => 'Kirkus Book Review', file => 'KIREVIEW.XML', element => 'KIREVIEW'},
212 {title => 'Criticas Review', file => 'CRITICASREVIEW.XML', element => 'CRITICASREVIEW'},
213 {title => 'Spanish Review', file => 'SPREVIEW.XML', element => 'SPREVIEW'},
216 for my $source (@$review_sources) {
217 if ($syndetics_elements->{$source->{element}} and $source->{element} =~ $syndetics_elements->{$source->{element}}) {
220 #warn "Skipping $source->{element} doesn't match $syndetics_elements->{$source->{element}} \n";
223 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/$source->{file}&client=$syndetics_client_code&type=xw10";
225 my $ua = LWP::UserAgent->new;
229 my $response = $ua->get($url);
230 unless ($response->content_type =~ /xml/) {
234 my $content = $response->content;
235 warn "could not retrieve $url" unless $content;
236 my $xmlsimple = XML::Simple->new();
238 $response = $xmlsimple->XMLin(
241 forcearray => [ qw(Fld520) ]
245 for my $subfield_a (@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}}) {
247 # this is absurd, but sometimes this data serializes differently
248 if(ref($subfield_a->{a}->{content}) eq 'ARRAY') {
249 for my $content (@{$subfield_a->{a}->{content}}) {
250 push @content, {content => $content};
254 push @content, {content => $subfield_a->{a}->{content}};
256 push @reviews, {title => $source->{title}, reviews => \@content};
262 sub get_syndetics_editions {
266 $isbn = _normalize_match_point ($isbn);
268 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
269 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
271 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/FICTION.XML&client=$syndetics_client_code&type=xw10";
272 my $ua = LWP::UserAgent->new;
276 my $response = $ua->get($url);
277 unless ($response->content_type =~ /xml/) {
281 my $content = $response->content;
283 warn "could not retrieve $url" unless $content;
284 my $xmlsimple = XML::Simple->new();
285 $response = $xmlsimple->XMLin(
287 forcearray => [ qw(Fld020) ],
289 # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
291 $similar_items = \@{$response->{VarFlds}->{VarDFlds}->{NumbCode}->{Fld020}} if $response;
292 return $similar_items if $similar_items;
295 sub get_syndetics_anotes {
299 $isbn = _normalize_match_point ($isbn);
301 # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
302 my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
304 my $url = "http://syndetics.com/index.aspx?isbn=$isbn/ANOTES.XML&client=$syndetics_client_code&type=xw10";
305 my $ua = LWP::UserAgent->new;
309 my $response = $ua->get($url);
310 unless ($response->content_type =~ /xml/) {
314 my $content = $response->content;
316 warn "could not retrieve $url" unless $content;
317 my $xmlsimple = XML::Simple->new();
318 $response = $xmlsimple->XMLin(
320 forcearray => [ qw(Fld980) ],
324 for my $fld980 (@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld980}}) {
325 # this is absurd, but sometimes this data serializes differently
326 if(ref($fld980->{a}->{content}) eq 'ARRAY') {
327 for my $content (@{$fld980->{a}->{content}}) {
328 push @anotes, {content => $content};
333 push @anotes, {content => $fld980->{a}->{content}};
339 sub _normalize_match_point {
340 my $match_point = shift;
341 (my $normalized_match_point) = $match_point =~ /([\d-]*[X]*)/;
342 $normalized_match_point =~ s/-//g;
344 return $normalized_match_point;
354 Joshua Ferraro <jmf@liblime.com>