adding xisbn support
authorJoshua Ferraro <jmf@liblime.com>
Sat, 17 Nov 2007 00:49:38 +0000 (18:49 -0600)
committerJoshua Ferraro <jmf@liblime.com>
Sat, 17 Nov 2007 16:49:30 +0000 (10:49 -0600)
Signed-off-by: Chris Cormack <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
C4/XISBN.pm [new file with mode: 0755]
admin/systempreferences.pl
catalogue/detail.pl
koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
misc/cronjobs/services_throttle.pl [new file with mode: 0755]

diff --git a/C4/XISBN.pm b/C4/XISBN.pm
new file mode 100755 (executable)
index 0000000..ac5a2b7
--- /dev/null
@@ -0,0 +1,165 @@
+package C4::XISBN;
+# Copyright (C) 2007 LibLime
+# Joshua Ferraro <jmf@liblime.com>
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use XML::Simple;
+use LWP::Simple;
+use C4::Biblio;
+
+use LWP::UserAgent;
+use HTTP::Request::Common;
+
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+$VERSION = 3.0;
+=head1 NAME
+
+C4::XISBN - Functions for retrieving XISBN content in Koha
+
+=head1 FUNCTIONS
+
+This module provides facilities for retrieving XISBN, ThingISBN and XISBN content in Koha
+
+=cut
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(
+  &get_xisbns
+  &get_biblio_from_xisbn
+);
+
+sub get_biblio_from_xisbn {
+       my $xisbn_data = shift;
+       my $dbh = C4::Context->dbh;
+       my $query = "SELECT biblionumber FROM biblioitems WHERE isbn=?";
+       my $sth = $dbh->prepare($query);
+       $sth->execute($xisbn_data->{content});
+       my $xbib_data =  $sth->fetchrow_hashref();
+       my $xbiblio;
+       if ($xbib_data->{biblionumber}) {
+               $xbiblio = GetBiblioData($xbib_data->{biblionumber});
+               $xbiblio->{items} = GetItemsByBiblioitemnumber($xbib_data->{biblionumber});
+               use Data::Dumper;
+               warn Dumper($xbiblio->{items});
+       }
+       return ($xbiblio);
+
+}
+=head1 get_xisbns($isbn);
+
+=head2 $isbn is an ISBN string
+
+=cut
+
+sub get_xisbns {
+    my ( $isbn ) = @_;
+
+    my ($response,$thing_response,$xisbn_response,$gapines_response);
+    # THINGISBN
+    if ( C4::Context->preference('ThingISBN') ) {
+        my $url = "http://www.librarything.com/api/thingISBN/".$isbn;
+        $thing_response = _get_url($url,'thingisbn');
+    }
+
+    # XISBN
+    if ( C4::Context->preference('XISBN') ) {
+        my $affiliate_id=C4::Context->preference('OCLCAffiliateID');
+               my $limit = C4::Context->preference('XISBNDailyLimit') || 499;
+        my $reached_limit = _service_throttle('xisbn',$limit);
+        my $url = "http://xisbn.worldcat.org/webservices/xid/isbn/".$isbn."?method=getEditions&format=xml&fl=form,year,lang,ed";
+               $url.="&ai=".$affiliate_id if $affiliate_id;
+               unless ($reached_limit) {
+               $xisbn_response = _get_url($url,'xisbn');
+               }
+    }
+
+    # PINES ISBN
+    if ( C4::Context->preference('PINESISBN') ) {
+        my $url = "http://www.librarything.com/api/thingISBN/".$isbn;
+        $gapines_response = _get_url($url,'thingisbn');
+    }
+       $response->{isbn} = [ @{ $xisbn_response->{isbn} or [] }, @{ $thing_response->{isbn} or [] }, @{ $gapines_response->{isbn} or [] } ];
+       my @xisbns;
+       my $unique_xisbns; # a hashref
+       # loop through each ISBN and scope to the local collection
+       for my $response_data( @{ $response->{ isbn } } ) {
+               next if $unique_xisbns->{ $response_data->{content} };
+               $unique_xisbns->{ $response_data->{content} }++;
+               my $xbiblio= get_biblio_from_xisbn($response_data);
+               push @xisbns, $xbiblio if $xbiblio; #response_data->{xbiblio}; #->{biblionumber}; # if $xbiblionumber;
+        
+       }
+       return \@xisbns;
+
+}
+
+sub _get_url {
+    my ($url,$service_type) = @_;
+       my $ua = LWP::UserAgent->new(
+               timeout => 2
+               );
+
+       my $response = $ua->get($url);
+       if ($response->is_success) {
+       warn "WARNING could not retrieve $service_type $url" unless $response;
+       if ($response) {
+               my $xmlsimple = XML::Simple->new();
+               my $content = $xmlsimple->XMLin(
+            $response->content,
+            ForceArray => [ qw(isbn) ],
+            ForceContent => 1,
+            );
+                       return $content;
+       }
+       } else {
+        warn "WARNING: URL Request Failed " . $response->status_line . "\n";
+    }
+
+}
+
+
+# Throttle services to the specified amount
+sub _service_throttle {
+    my ($service_type,$daily_limit) = @_;
+       my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("SELECT service_count FROM services_throttle WHERE service_type=?");
+    $sth->execute($service_type);
+    my $count = 1;
+
+    while (my $counter = $sth->fetchrow_hashref()) {
+        $count = $counter->{service_count} if $counter->{service_count};
+    }
+
+    # we're over the limit
+    return 1 if $count >= $daily_limit;
+
+    # not over the limit
+    $count++;
+    $sth = $dbh->do("UPDATE services_throttle SET service_count=$count WHERE service_type='xisbn'");
+    return undef;
+}
+
+=head1 NOTES
+
+=head1 AUTHOR
+
+Joshua Ferraro <jmf@liblime.com>
+=cut
index 71e2efe..6f3bf7d 100755 (executable)
@@ -142,6 +142,13 @@ my %tabsysprefs;
     $tabsysprefs{NoReturnSetLost}="Members";
     $tabsysprefs{MaxFine}="Members";
     $tabsysprefs{NotifyBorrowerDeparture}="Members";
+# FRBA
+       $tabsysprefs{FRBRizeEditions}="FRBR";
+       $tabsysprefs{XISBN}="FRBR";
+       $tabsysprefs{OCLCAffiliateID}="FRBR";
+       $tabsysprefs{XISBNDailyLimit}="FRBR";
+       $tabsysprefs{PINESISBN}="FRBR";
+    $tabsysprefs{ThingISBN}="FRBR";
 
 # OPAC
     $tabsysprefs{AmazonAssocTag}="OPAC";
index 998ab1e..d41d090 100755 (executable)
@@ -24,6 +24,7 @@ use C4::Serials;    #uses getsubscriptionfrom biblionumber
 use C4::Output;
 use C4::Biblio;
 use C4::Serials;
+use C4::XISBN qw(get_xisbns);
 
 my $query = new CGI;
 my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
@@ -101,4 +102,17 @@ $template->param(
     subscriptiontitle   => $dat->{title},
 );
 
+# XISBN Stuff
+if (C4::Context->preference("FRBRizeEditions")==1) {
+       eval {
+               my $xisbn=$dat->{'isbn'};
+               $xisbn =~ s/(p|-|:| )//g;
+               $template->param(
+                       xisbn => $xisbn,
+                       XISBNS => get_xisbns($xisbn)
+               );
+       };
+       if ($@) { warn "XISBN Failed $@"; }
+}
+
 output_html_with_http_headers $query, $cookie, $template->output;
index 82f2090..4df48c3 100644 (file)
 <!-- TMPL_ELSE -->
     <p>No physical items for this record</p>
 <!-- /TMPL_IF -->
+
+<!-- TMPL_IF NAME="XISBNS" -->
+<p>Editions</p>
+<ul>
+<!-- TMPL_LOOP NAME="XISBNS" -->
+<li><img src="/opac-tmpl/prog/itemtypeimg/<!-- TMPL_VAR NAME="itemtype" -->.gif" title="<!-- TMPL_VAR NAME="itemtype" -->" />
+<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->"><!-- TMPL_VAR NAME="title" --></a> by <!-- TMPL_VAR NAME="author" --> &copy;<!-- TMPL_VAR NAME="copyrightdate" --></li>
+
+       <!-- TMPL_LOOP NAME=items -->
+       <!-- TMPL_IF NAME="itype" --><img src="/opac-tmpl/prog/itemtypeimg/<!-- TMPL_VAR NAME="itype" -->.gif" title="<!-- TMPL_VAR NAME="itype" -->" /><!-- /TMPL_IF -->
+       barcode:<!-- TMPL_VAR NAME="barcode" -->
+       <!-- /TMPL_LOOP -->
+
+<!-- /TMPL_LOOP -->
+</ul>
+<!-- /TMPL_IF -->
+
 </div>
 
 <!-- TMPL_IF name="subscriptionsnumber" -->
diff --git a/misc/cronjobs/services_throttle.pl b/misc/cronjobs/services_throttle.pl
new file mode 100755 (executable)
index 0000000..39bf269
--- /dev/null
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+#run nightly -- resets the services throttle
+
+use strict; use warnings;
+
+use C4::Context;
+my $dbh=C4::Context->dbh;
+my $fixit="UPDATE services_throttle SET service_count=0 WHERE service_type='xisbn'";
+my $sth=$dbh->prepare($fixit);
+my $res = $sth->execute() or die "can't execute";
+print "$res\n"; #did it work?
+$dbh->disconnect();