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;
11 my $AC = 'OpenILS::WWW::AddedContent';
13 my $base_url = 'http://contentcafe2.btol.com/ContentCafe/ContentCafe.asmx/Single';
14 my $cover_base_url = 'http://contentcafe2.btol.com/ContentCafe/Jacket.aspx';
17 my( $class, $args ) = @_;
18 $class = ref $class || $class;
19 return bless($args, $class);
24 return $self->{ContentCafe}->{userid};
29 return $self->{ContentCafe}->{password};
32 sub return_behavior_on_no_jacket_image {
34 return $self->{ContentCafe}->{return_behavior_on_no_jacket_image};
37 # --------------------------------------------------------------------------
39 my( $self, $key ) = @_;
40 return $self->send_img(
41 $self->fetch_cover_response('S', $key));
45 my( $self, $key ) = @_;
46 return $self->send_img(
47 $self->fetch_cover_response('M', $key));
51 my( $self, $key ) = @_;
52 return $self->send_img(
53 $self->fetch_cover_response('L', $key));
56 # --------------------------------------------------------------------------
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');
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>';
69 return $self->send_html($html);
73 my( $self, $key ) = @_;
74 return $self->send_xml(
75 $self->fetch_content('TocDetail', $key));
79 my( $self, $key ) = @_;
80 return $self->send_json(
81 $self->fetch_content('TocDetail', $key));
84 # --------------------------------------------------------------------------
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');
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>';
97 return $self->send_html($html);
101 my( $self, $key ) = @_;
102 return $self->send_xml(
103 $self->fetch_content('BiographyDetail', $key));
107 my( $self, $key ) = @_;
108 return $self->send_json(
109 $self->fetch_content('BiographyDetail', $key));
113 # --------------------------------------------------------------------------
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');
121 my @nodes = $doc->findnodes('//cc:Excerpt');
122 return 0 if (scalar(@nodes) < 1);
123 foreach my $node ( @nodes ) {
124 $html .= $node->textContent;
126 return $self->send_html($html);
130 my( $self, $key ) = @_;
131 return $self->send_xml(
132 $self->fetch_content('ExcerptDetail', $key));
136 my( $self, $key ) = @_;
137 return $self->send_json(
138 $self->fetch_content('ExcerptDetail', $key));
141 # --------------------------------------------------------------------------
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');
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>';
162 return $self->send_html($html);
166 my( $self, $key ) = @_;
167 return $self->send_xml(
168 $self->fetch_content('ReviewDetail', $key));
172 my( $self, $key ) = @_;
173 return $self->send_json(
174 $self->fetch_content('ReviewDetail', $key));
177 # --------------------------------------------------------------------------
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');
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>';
194 return $self->send_html($html);
198 my( $self, $key ) = @_;
199 return $self->send_xml(
200 $self->fetch_content('AnnotationDetail', $key));
204 my( $self, $key ) = @_;
205 return $self->send_json(
206 $self->fetch_content('AnnotationDetail', $key));
210 # --------------------------------------------------------------------------
214 my( $self, $data ) = @_;
215 return 0 if $data =~ m/<title>error<\/title>/iog;
221 my( $self, $xml ) = @_;
222 return 0 unless $self->data_exists($xml);
226 $doc = XML::LibXML->new->parse_string($xml);
229 $logger->error("added content XML parser error: $err\n\n$xml");
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 };
240 my( $self, $xml ) = @_;
241 return 0 unless $self->data_exists($xml);
242 return { content_type => 'application/xml', content => $xml };
246 my( $self, $content ) = @_;
247 return 0 unless $self->data_exists($content);
249 # Hide anything that might contain a link since it will be broken
250 my $HTML = <<" HTML";
252 <style type='text/css'>
253 div.ac input, div.ac a[href],div.ac img, div.ac button { display: none; visibility: hidden }
261 return { content_type => 'text/html', content => $HTML };
265 my($self, $response) = @_;
267 content_type => $response->header('Content-type'),
268 content => $response->content,
273 # returns the raw content returned from the URL fetch
275 my( $self, $contentType, $key ) = @_;
276 return $self->fetch_response($contentType, $key)->content;
279 # returns the HTTP response object from the URL fetch
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);
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);