Syndetics and Amazon bugfix enhancements
[koha.git] / C4 / External / Syndetics.pm
1 package C4::External::Syndetics;
2 # Copyright (C) 2006 LibLime
3 # <jmf at liblime dot com>
4 #
5 # This file is part of Koha.
6 #
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
10 # version.
11 #
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.
15 #
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
19
20 use XML::Simple;
21 use LWP::Simple;
22 use LWP::UserAgent;
23 use HTTP::Request::Common;
24
25 use strict;
26 use warnings;
27
28 use vars qw($VERSION @ISA @EXPORT);
29
30 BEGIN {
31     require Exporter;
32     $VERSION = 0.03;
33     @ISA = qw(Exporter);
34     @EXPORT = qw(
35         &get_syndetics_index
36         &get_syndetics_summary
37         &get_syndetics_toc
38         &get_syndetics_editions
39         &get_syndetics_excerpt
40         &get_syndetics_reviews
41         &get_syndetics_anotes
42     );
43 }
44
45 =head1 NAME
46
47 C4::External::Syndetics - Functions for retrieving Syndetics content in Koha
48
49 =head1 FUNCTIONS
50
51 This module provides facilities for retrieving Syndetics.com content in Koha
52
53 =head2 get_syndetics_summary
54
55 =over 4
56
57 my $syndetics_summary= &get_syndetics_summary( $isbn );
58
59 =back
60
61 Get Summary data from Syndetics
62
63 =cut
64
65 sub get_syndetics_index {
66     my ( $isbn,$upc,$oclc ) = @_;
67
68     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
69     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
70
71     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/INDEX.XML&client=$syndetics_client_code&type=xw10";
72     my $ua = LWP::UserAgent->new;
73     $ua->timeout(10);
74     $ua->env_proxy;
75     my $response = $ua->get($url);
76     unless ($response->content_type =~ /xml/) {
77         return;
78     }
79
80     my $content = $response->content;
81     warn "could not retrieve $url" unless $content;
82     my $xmlsimple = XML::Simple->new();
83     $response = $xmlsimple->XMLin(
84         $content,
85     ) unless !$content;
86
87     my $syndetics_elements;
88     for my $available_type ('SUMMARY','TOC','FICTION','AWARDS1','SERIES1','SPSUMMARY','SPREVIEW','AVSUMMARY','DBCHAPTER','LJREVIEW','PWREVIEW','SLJREVIEW','CHREVIEW','BLREVIEW','HBREVIEW','KIREVIEW','CRITICASREVIEW','ANOTES') {
89         if (exists $response->{$available_type} && $response->{$available_type} =~ /$available_type/) {
90             $syndetics_elements->{$available_type} = $available_type;
91             #warn "RESPONSE: $available_type : $response->{$available_type}";
92         }
93     }
94     return $syndetics_elements if $syndetics_elements;
95 }
96
97 sub get_syndetics_summary {
98     my ( $isbn,$upc,$oclc ) = @_;
99
100     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
101     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
102
103     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/SUMMARY.XML&client=$syndetics_client_code&type=xw10";
104     my $ua = LWP::UserAgent->new;
105     $ua->timeout(10);
106     $ua->env_proxy;
107     my $response = $ua->get($url);
108     unless ($response->content_type =~ /xml/) {
109         return;
110     }  
111
112     my $content = $response->content;
113
114     warn "could not retrieve $url" unless $content;
115     my $xmlsimple = XML::Simple->new();
116     $response = $xmlsimple->XMLin(
117         $content,
118         forcearray => [ qw(Fld520) ],
119     ) unless !$content;
120     # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
121     my $summary;
122     $summary = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response;
123     return $summary if $summary;
124 }
125
126 sub get_syndetics_toc {
127     my ( $isbn,$upc,$oclc ) = @_;
128
129     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
130     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
131
132     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/TOC.XML&client=$syndetics_client_code&type=xw10";
133     my $ua = LWP::UserAgent->new;
134     $ua->timeout(10);
135     $ua->env_proxy;
136         
137     my $response = $ua->get($url);
138     unless ($response->content_type =~ /xml/) {
139         return;
140     }  
141
142     my $content = $response->content;
143     warn "could not retrieve $url" unless $content;
144     my $xmlsimple = XML::Simple->new();
145     $response = $xmlsimple->XMLin(
146         $content,
147         forcearray => [ qw(Fld970) ],
148     ) unless !$content;
149     # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
150     my $toc;
151     $toc = \@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld970}} if $response;
152     return $toc if $toc;
153 }
154
155 sub get_syndetics_excerpt {
156     my ( $isbn,$upc,$oclc ) = @_;
157
158     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
159     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
160
161     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/DBCHAPTER.XML&client=$syndetics_client_code&type=xw10";
162     my $ua = LWP::UserAgent->new;
163     $ua->timeout(10);
164     $ua->env_proxy;
165     my $response = $ua->get($url);
166     unless ($response->content_type =~ /xml/) {
167         return;
168     }  
169         
170     my $content = $response->content;
171     warn "could not retrieve $url" unless $content;
172     my $xmlsimple = XML::Simple->new();
173     $response = $xmlsimple->XMLin(
174         $content,
175         forcearray => [ qw(Fld520) ],
176     ) unless !$content;
177     # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
178     my $excerpt;
179     $excerpt = \@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}} if $response;
180     return XMLout($excerpt) if $excerpt;
181 }
182
183 sub get_syndetics_reviews {
184     my ( $isbn,$upc,$oclc,$syndetics_elements ) = @_;
185
186     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
187     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
188     my @reviews;
189     my $review_sources = [
190     {title => 'Library Journal Review', file => 'LJREVIEW.XML', element => 'LJREVIEW'},
191     {title => 'Publishers Weekly Review', file => 'PWREVIEW.XML', element => 'PWREVIEW'},
192     {title => 'School Library Journal Review', file => 'SLJREVIEW.XML', element => 'SLJREVIEW'},
193     {title => 'CHOICE Review', file => 'CHREVIEW.XML', element => 'CHREVIEW'},
194     {title => 'Booklist Review', file => 'BLREVIEW.XML', element => 'BLREVIEW'},
195     {title => 'Horn Book Review', file => 'HBREVIEW.XML', element => 'HBREVIEW'},
196     {title => 'Kirkus Book Review', file => 'KIREVIEW.XML', element => 'KIREVIEW'},
197     {title => 'Criticas Review', file => 'CRITICASREVIEW.XML', element => 'CRITICASREVIEW'},
198     {title => 'Spanish Review', file => 'SPREVIEW.XML', element => 'SPREVIEW'},
199     ];
200
201     for my $source (@$review_sources) {
202         if ($syndetics_elements->{$source->{element}} and $source->{element} =~ $syndetics_elements->{$source->{element}}) {
203
204         } else {
205             #warn "Skipping $source->{element} doesn't match $syndetics_elements->{$source->{element}} \n";
206             next;
207         }
208         my $url = "http://syndetics.com/index.aspx?isbn=$isbn/$source->{file}&client=$syndetics_client_code&type=xw10";
209
210         my $ua = LWP::UserAgent->new;
211         $ua->timeout(10);
212         $ua->env_proxy;
213  
214         my $response = $ua->get($url);
215         unless ($response->content_type =~ /xml/) {
216             next;
217         }
218
219         my $content = $response->content;
220         warn "could not retrieve $url" unless $content;
221         my $xmlsimple = XML::Simple->new();
222         eval {
223         $response = $xmlsimple->XMLin(
224             $content,
225             ForceContent => 1,
226             forcearray => [ qw(Fld520) ]
227         ) unless !$content;
228         };
229             
230         for my $subfield_a (@{$response->{VarFlds}->{VarDFlds}->{Notes}->{Fld520}}) {
231             my @content;
232             # this is absurd, but sometimes this data serializes differently
233             if(ref($subfield_a->{a}->{content}) eq 'ARRAY') {
234                 for my $content (@{$subfield_a->{a}->{content}}) {
235                     push @content, {content => $content};
236                 }
237             }
238             else {
239                 push @content, {content => $subfield_a->{a}->{content}};
240             }
241             push @reviews, {title => $source->{title}, reviews => \@content};
242         }
243     }
244     return \@reviews;
245 }
246
247 sub get_syndetics_editions {
248     my ( $isbn,$upc,$oclc ) = @_;
249
250     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
251     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
252
253     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/FICTION.XML&client=$syndetics_client_code&type=xw10";
254     my $ua = LWP::UserAgent->new;
255     $ua->timeout(10);
256     $ua->env_proxy;
257
258     my $response = $ua->get($url);
259     unless ($response->content_type =~ /xml/) {
260         return;
261     }  
262
263     my $content = $response->content;
264
265     warn "could not retrieve $url" unless $content;
266     my $xmlsimple = XML::Simple->new();
267     $response = $xmlsimple->XMLin(
268         $content,
269         forcearray => [ qw(Fld020) ],
270     ) unless !$content;
271     # manipulate response USMARC VarFlds VarDFlds Notes Fld520 a
272     my $similar_items;
273     $similar_items = \@{$response->{VarFlds}->{VarDFlds}->{NumbCode}->{Fld020}} if $response;
274     return $similar_items if $similar_items;
275 }
276
277 sub get_syndetics_anotes {
278     my ( $isbn,$upc,$oclc) = @_;
279
280     # grab the AWSAccessKeyId: mine is '0V5RRRRJZ3HR2RQFNHR2'
281     my $syndetics_client_code = C4::Context->preference('SyndeticsClientCode');
282
283     my $url = "http://syndetics.com/index.aspx?isbn=$isbn/ANOTES.XML&client=$syndetics_client_code&type=xw10";
284     my $ua = LWP::UserAgent->new;
285     $ua->timeout(10);
286     $ua->env_proxy;
287
288     my $response = $ua->get($url);
289     unless ($response->content_type =~ /xml/) {
290         return;
291     }
292
293     my $content = $response->content;
294
295     warn "could not retrieve $url" unless $content;
296     my $xmlsimple = XML::Simple->new();
297     $response = $xmlsimple->XMLin(
298         $content,
299         forcearray => [ qw(Fld980) ],
300         ForceContent => 1,
301     ) unless !$content;
302     my @anotes;
303     for my $fld980 (@{$response->{VarFlds}->{VarDFlds}->{SSIFlds}->{Fld980}}) {
304         # this is absurd, but sometimes this data serializes differently
305         if(ref($fld980->{a}->{content}) eq 'ARRAY') {
306             for my $content (@{$fld980->{a}->{content}}) {
307                 push @anotes, {content => $content};
308                 
309             }
310         }
311         else {
312             push @anotes, {content => $fld980->{a}->{content}};
313         }
314     }
315     return \@anotes;
316 }
317
318 1;
319 __END__
320
321 =head1 NOTES
322
323 =head1 AUTHOR
324
325 Joshua Ferraro <jmf@liblime.com>
326
327 =cut