]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/ContentCafe.pm
Make Evergreen Perl modules installable via Module::Build to match OpenSRF
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / WWW / AddedContent / ContentCafe.pm
1 package OpenILS::WWW::AddedContent::ContentCafe;
2 use strict; use warnings;
3 use OpenSRF::Utils::Logger qw/$logger/;
4 use OpenSRF::Utils::SettingsParser;
5 use OpenSRF::Utils::JSON;
6 use OpenSRF::EX qw/:try/;
7 use OpenILS::WWW::AddedContent;
8 use XML::LibXML;
9 use MIME::Base64;
10
11 my $AC = 'OpenILS::WWW::AddedContent';
12
13 my $base_url = 'http://contentcafe2.btol.com/ContentCafe/ContentCafe.asmx/Single';
14 my $cover_base_url = 'http://contentcafe2.btol.com/ContentCafe/Jacket.aspx';
15
16 sub new {
17     my( $class, $args ) = @_;
18     $class = ref $class || $class;
19     return bless($args, $class);
20 }
21
22 sub userid {
23     my $self = shift;
24     return $self->{ContentCafe}->{userid};
25 }
26
27 sub password {
28     my $self = shift;
29     return $self->{ContentCafe}->{password};
30 }
31
32 sub return_behavior_on_no_jacket_image {
33     my $self = shift;
34     return $self->{ContentCafe}->{return_behavior_on_no_jacket_image};
35 }
36
37 # --------------------------------------------------------------------------
38 sub jacket_small {
39     my( $self, $key ) = @_;
40     return $self->send_img(
41         $self->fetch_cover_response('S', $key));
42 }
43
44 sub jacket_medium {
45     my( $self, $key ) = @_;
46     return $self->send_img(
47         $self->fetch_cover_response('M', $key));
48
49 }
50 sub jacket_large {
51     my( $self, $key ) = @_;
52     return $self->send_img(
53         $self->fetch_cover_response('L', $key));
54 }
55
56 # --------------------------------------------------------------------------
57
58 sub toc_html {
59     my( $self, $key ) = @_;
60     my $xml = $self->fetch_content('TocDetail', $key);
61     my $doc = XML::LibXML->new->parse_string($xml);
62     $doc->documentElement->setNamespace('http://ContentCafe2.btol.com', 'cc');
63     my $html = '';
64     my @nodes = $doc->findnodes('//cc:Toc');
65     return 0 if (scalar(@nodes) < 1);
66     foreach my $node ( @nodes ) {
67         $html .= $node->textContent . '</P></P>';
68     }
69     return $self->send_html($html);
70 }
71
72 sub toc_xml {
73     my( $self, $key ) = @_;
74     return $self->send_xml(
75         $self->fetch_content('TocDetail', $key));
76 }
77
78 sub toc_json {
79     my( $self, $key ) = @_;
80     return $self->send_json(
81         $self->fetch_content('TocDetail', $key));
82 }
83
84 # --------------------------------------------------------------------------
85
86 sub anotes_html {
87     my( $self, $key ) = @_;
88     my $xml = $self->fetch_content('BiographyDetail', $key);
89     my $doc = XML::LibXML->new->parse_string($xml);
90     $doc->documentElement->setNamespace('http://ContentCafe2.btol.com', 'cc');
91     my $html = '';
92     my @nodes = $doc->findnodes('//cc:Biography');
93     return 0 if (scalar(@nodes) < 1);
94     foreach my $node ( @nodes ) {
95         $html .= '<P class="biography">' . $node->textContent . '</P>';
96     }
97     return $self->send_html($html);
98 }
99
100 sub anotes_xml {
101     my( $self, $key ) = @_;
102     return $self->send_xml(
103         $self->fetch_content('BiographyDetail', $key));
104 }
105
106 sub anotes_json {
107     my( $self, $key ) = @_;
108     return $self->send_json(
109         $self->fetch_content('BiographyDetail', $key));
110 }
111
112
113 # --------------------------------------------------------------------------
114
115 sub excerpt_html {
116     my( $self, $key ) = @_;
117     my $xml = $self->fetch_content('ExcerptDetail', $key);
118     my $doc = XML::LibXML->new->parse_string($xml);
119     $doc->documentElement->setNamespace('http://ContentCafe2.btol.com', 'cc');
120     my $html = '';
121     my @nodes = $doc->findnodes('//cc:Excerpt');
122     return 0 if (scalar(@nodes) < 1);
123     foreach my $node ( @nodes ) {
124         $html .= $node->textContent;
125     }
126     return $self->send_html($html);
127 }
128
129 sub excerpt_xml {
130     my( $self, $key ) = @_;
131     return $self->send_xml(
132         $self->fetch_content('ExcerptDetail', $key));
133 }
134
135 sub excerpt_json {
136     my( $self, $key ) = @_;
137     return $self->send_json(
138         $self->fetch_content('ExcerptDetail', $key));
139 }
140
141 # --------------------------------------------------------------------------
142
143 sub reviews_html {
144     my( $self, $key ) = @_;
145     my $xml = $self->fetch_content('ReviewDetail', $key);
146     my $doc = XML::LibXML->new->parse_string($xml);
147     $doc->documentElement->setNamespace('http://ContentCafe2.btol.com', 'cc');
148     my $html = '<ul>';
149     my @nodes = $doc->findnodes('//cc:ReviewItem');
150     return 0 if (scalar(@nodes) < 1);
151     foreach my $node ( @nodes ) {
152         my @s_nodes = $node->findnodes('./cc:Supplier');
153         my @p_nodes = $node->findnodes('./cc:Publication');
154         my @i_nodes = $node->findnodes('./cc:Issue');
155         my @r_nodes = $node->findnodes('./cc:Review');
156         $html .= '<li><b>' . (scalar(@p_nodes) ? $p_nodes[0]->textContent : '') . '</b>';
157         if (scalar(@i_nodes) && scalar(@p_nodes)) { $html .= ' : '; }
158         $html .= (scalar(@i_nodes) ? $i_nodes[0]->textContent : '') . '<br/>';
159         $html .= (scalar(@r_nodes) ? $r_nodes[0]->textContent : '') . '</li>';
160     }
161     $html .= '</ul>';
162     return $self->send_html($html);
163 }
164
165 sub reviews_xml {
166     my( $self, $key ) = @_;
167     return $self->send_xml(
168         $self->fetch_content('ReviewDetail', $key));
169 }
170
171 sub reviews_json {
172     my( $self, $key ) = @_;
173     return $self->send_json(
174         $self->fetch_content('ReviewDetail', $key));
175 }
176
177 # --------------------------------------------------------------------------
178
179 sub summary_html {
180     my( $self, $key ) = @_;
181     my $xml = $self->fetch_content('AnnotationDetail', $key);
182     my $doc = XML::LibXML->new->parse_string($xml);
183     $doc->documentElement->setNamespace('http://ContentCafe2.btol.com', 'cc');
184     my $html = '<ul>';
185     my @nodes = $doc->findnodes('//cc:AnnotationItem');
186     return 0 if (scalar(@nodes) < 1);
187     foreach my $node ( @nodes ) {
188         my @s_nodes = $node->findnodes('./cc:Supplier');
189         my @a_nodes = $node->findnodes('./cc:Annotation');
190         $html .= '<li><b>' . (scalar(@s_nodes) ? $s_nodes[0]->textContent : '') . '</b><br/>';
191         $html .= (scalar(@a_nodes) ? $a_nodes[0]->textContent : '') . '</li>';
192     }
193     $html .= '</ul>';
194     return $self->send_html($html);
195 }
196
197 sub summary_xml {
198     my( $self, $key ) = @_;
199     return $self->send_xml(
200         $self->fetch_content('AnnotationDetail', $key));
201 }
202
203 sub summary_json {
204     my( $self, $key ) = @_;
205     return $self->send_json(
206         $self->fetch_content('AnnotationDetail', $key));
207 }
208
209
210 # --------------------------------------------------------------------------
211
212
213 sub data_exists {
214     my( $self, $data ) = @_;
215     return 0 if $data =~ m/<title>error<\/title>/iog;
216     return 1;
217 }
218
219
220 sub send_json {
221     my( $self, $xml ) = @_;
222     return 0 unless $self->data_exists($xml);
223     my $doc;
224
225     try {
226         $doc = XML::LibXML->new->parse_string($xml);
227     } catch Error with {
228         my $err = shift;
229         $logger->error("added content XML parser error: $err\n\n$xml");
230         $doc = undef;
231     };
232
233     return 0 unless $doc;
234     my $perl = OpenSRF::Utils::SettingsParser::XML2perl($doc->documentElement);
235     my $json = OpenSRF::Utils::JSON->perl2JSON($perl);
236     return { content_type => 'text/plain', content => $json };
237 }
238
239 sub send_xml {
240     my( $self, $xml ) = @_;
241     return 0 unless $self->data_exists($xml);
242     return { content_type => 'application/xml', content => $xml };
243 }
244
245 sub send_html {
246     my( $self, $content ) = @_;
247     return 0 unless $self->data_exists($content);
248
249     # Hide anything that might contain a link since it will be broken
250     my $HTML = <<"    HTML";
251         <div>
252             <style type='text/css'>
253                 div.ac input, div.ac a[href],div.ac img, div.ac button { display: none; visibility: hidden }
254             </style>
255             <div class='ac'>
256                 $content
257             </div>
258         </div>
259     HTML
260
261     return { content_type => 'text/html', content => $HTML };
262 }
263
264 sub send_img {
265     my($self, $response) = @_;
266     return { 
267         content_type => $response->header('Content-type'),
268         content => $response->content, 
269         binary => 1 
270     };
271 }
272
273 # returns the raw content returned from the URL fetch
274 sub fetch_content {
275     my( $self, $contentType, $key ) = @_;
276     return $self->fetch_response($contentType, $key)->content;
277 }
278
279 # returns the HTTP response object from the URL fetch
280 sub fetch_response {
281     my( $self, $contentType, $key ) = @_;
282     my $userid = $self->userid;
283     my $password = $self->password;
284     my $url = $base_url . "?UserID=$userid&Password=$password&Key=$key&Content=$contentType";
285     return $AC->get_url($url);
286 }
287
288 # returns the HTTP response object from the URL fetch
289 sub fetch_cover_response {
290     my( $self, $size, $key ) = @_;
291     my $userid = $self->userid;
292     my $password = $self->password;
293     my $return = $self->return_behavior_on_no_jacket_image;
294     my $url = $cover_base_url . "?UserID=$userid&Password=$password&Return=$return&Type=$size&Value=$key";
295     return $AC->get_url($url);
296 }
297
298
299 1;