From: Joshua Ferraro Date: Sat, 17 Nov 2007 00:49:38 +0000 (-0600) Subject: adding xisbn support X-Git-Tag: v3.00.00-alpha~844 X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=commitdiff_plain;h=55f34444293e491aaa0fcdb3caca0b64461b9af5;p=koha-ffzg.git adding xisbn support Signed-off-by: Chris Cormack Signed-off-by: Joshua Ferraro --- diff --git a/C4/XISBN.pm b/C4/XISBN.pm new file mode 100755 index 0000000000..ac5a2b7db6 --- /dev/null +++ b/C4/XISBN.pm @@ -0,0 +1,165 @@ +package C4::XISBN; +# Copyright (C) 2007 LibLime +# Joshua Ferraro +# +# 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 +=cut diff --git a/admin/systempreferences.pl b/admin/systempreferences.pl index 71e2efea51..6f3bf7d525 100755 --- a/admin/systempreferences.pl +++ b/admin/systempreferences.pl @@ -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"; diff --git a/catalogue/detail.pl b/catalogue/detail.pl index 998ab1e24f..d41d090671 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -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; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl index 82f2090fa4..4df48c318b 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl @@ -195,6 +195,23 @@

No physical items for this record

+ + +

Editions

+
    + +
  • .gif" title="" /> +"> by ©
  • + + + .gif" title="" /> + barcode: + + + +
+ + diff --git a/misc/cronjobs/services_throttle.pl b/misc/cronjobs/services_throttle.pl new file mode 100755 index 0000000000..39bf2696bc --- /dev/null +++ b/misc/cronjobs/services_throttle.pl @@ -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();