[open-ils-commits] r20344 - trunk/Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent (dbs)

svn at svn.open-ils.org svn at svn.open-ils.org
Wed Apr 27 11:54:51 EDT 2011


Author: dbs
Date: 2011-04-27 11:54:48 -0400 (Wed, 27 Apr 2011)
New Revision: 20344

Modified:
   trunk/Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/OpenLibrary.pm
Log:
Teach OpenLibrary.pm how to extract ebook links from OpenLibrary results

If the Internet Archive has an available ebook, then OpenLibrary will
provide links to it in various formats. For now, we return the results
as a plain set of <div> elements with class attributes denoting what
kind of ebook was returned; i18n will have to take care of providing
an actual label. Oh, and I guess we want to turn these into actual
<a> links...

Signed-off-by: Dan Scott <dscott at laurentian.ca>


Modified: trunk/Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/OpenLibrary.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/OpenLibrary.pm	2011-04-27 15:51:40 UTC (rev 20343)
+++ trunk/Open-ILS/src/perlmods/lib/OpenILS/WWW/AddedContent/OpenLibrary.pm	2011-04-27 15:54:48 UTC (rev 20344)
@@ -1,6 +1,6 @@
 # ---------------------------------------------------------------
 # Copyright (C) 2009 David Christensen <david.a.christensen at gmail.com>
-# Copyright (C) 2009 Dan Scott <dscott at laurentian.ca>
+# Copyright (C) 2009-2011 Dan Scott <dscott at laurentian.ca>
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -30,7 +30,13 @@
 
 # These URLs are always the same for OpenLibrary, so there's no advantage to
 # pulling from opensrf.xml; we hardcode them here
-my $base_url = 'http://openlibrary.org/api/books?details=true&bibkeys=ISBN:';
+
+# jscmd=details is unstable but includes goodies such as Table of Contents
+my $base_url_details = 'http://openlibrary.org/api/books?format=json&jscmd=details&bibkeys=ISBN:';
+
+# jscmd=data is stable and contains links to ebooks, excerpts, etc
+my $base_url_data = 'http://openlibrary.org/api/books?format=json&jscmd=data&bibkeys=ISBN:';
+
 my $cover_base_url = 'http://covers.openlibrary.org/b/isbn/';
 
 sub new {
@@ -60,6 +66,62 @@
 
 # --------------------------------------------------------------------------
 
+sub ebooks_html {
+    my( $self, $key ) = @_;
+    my $book_data_json = $self->fetch_data_response($key)->content();
+
+    $logger->debug("$key: " . $book_data_json);
+
+    my $ebook_html;
+    
+    my $book_data = OpenSRF::Utils::JSON->JSON2perl($book_data_json);
+    my $book_key = (keys %$book_data)[0];
+
+    # We didn't find a matching book; short-circuit our response
+    if (!$book_key) {
+        $logger->debug("$key: no found book");
+        return 0;
+    }
+
+    my $ebooks_json = $book_data->{$book_key}->{ebooks};
+
+    # No ebooks are available for this book; short-circuit
+    if (!$ebooks_json or !scalar(@$ebooks_json)) {
+        $logger->debug("$key: no ebooks");
+        return 0;
+    }
+
+    # Check the availability of the ebooks
+    my $available = $ebooks_json->[0]->{'availability'} || '';
+    if (!$available) {
+        $logger->debug("$key: no available ebooks");
+        return 0;
+    }
+
+    # Build a basic list of available ebook types and their URLs
+    # ebooks appears to be an array containing one element - a hash
+
+    # First element of the hash is 'read_url' which is a URL to
+    # Internet Archive online reader
+    my $stream_url = $ebooks_json->[0]->{'read_url'} || '';
+    if ($stream_url) {
+        $ebook_html .= "<div class='ebook_stream'>$stream_url</div>\n";
+        $logger->debug("$key: stream URL = $stream_url");
+    }
+
+    my $ebook_formats = $ebooks_json->[0]->{'formats'} || '';
+    # Next elements are various ebook formats that are available
+    foreach my $ebook (keys %{$ebook_formats}) {
+        if ($ebook_formats->{$ebook} eq 'read_url') {
+            next;
+        }
+        $ebook_html .= "<div class='$ebook'>" . 
+            $ebook_formats->{$ebook}->{'url'} . "</div>\n";
+    }
+
+    $logger->debug("$key: $ebook_html");
+    $self->send_html("<div class='ebooks'>$ebook_html</div>");
+}
 =head1
 
 OpenLibrary returns a JSON hash of zero or more book responses matching our
@@ -74,13 +136,8 @@
 
 sub toc_html {
     my( $self, $key ) = @_;
-    my $book_details_json = $self->fetch_response($key)->content();
+    my $book_details_json = $self->fetch_details_response($key)->content();
 
-
-    # Trim the "var _OlBookInfo = " declaration that makes this
-    # invalid JSON
-    $book_details_json =~ s/^.+?({.*?});$/$1/s;
-
     $logger->debug("$key: " . $book_details_json);
 
     my $toc_html;
@@ -127,7 +184,7 @@
 sub toc_json {
     my( $self, $key ) = @_;
     my $toc = $self->send_json(
-        $self->fetch_response($key)
+        $self->fetch_details_response($key)
     );
 }
 
@@ -167,12 +224,19 @@
 }
 
 # returns the HTTP response object from the URL fetch
-sub fetch_response {
+sub fetch_data_response {
     my( $self, $key ) = @_;
-    my $url = $base_url . "$key";
+    my $url = $base_url_data . "$key";
     my $response = $AC->get_url($url);
     return $response;
 }
+# returns the HTTP response object from the URL fetch
+sub fetch_details_response {
+    my( $self, $key ) = @_;
+    my $url = $base_url_details . "$key";
+    my $response = $AC->get_url($url);
+    return $response;
+}
 
 # returns the HTTP response object from the URL fetch
 sub fetch_cover_response {



More information about the open-ils-commits mailing list