From 628f43dad0210f8964ba7ffc9b6a3f7d588cc19f Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Wed, 30 Aug 2023 12:44:23 +0200 Subject: [PATCH] Bug 34527: Enhance the Openlibrary book cover retrieval to use OLID --- C4/Search.pm | 10 +++ .../bootstrap/en/modules/opac-detail.tt | 8 +-- .../bootstrap/en/modules/opac-results.tt | 6 +- .../bootstrap/en/modules/opac-shelves.tt | 2 +- .../opac-tmpl/bootstrap/js/openlibrary.js | 69 +++++++++++-------- opac/opac-detail.pl | 9 +++ 6 files changed, 66 insertions(+), 38 deletions(-) diff --git a/C4/Search.pm b/C4/Search.pm index e2de36571e2..4bd47dd3249 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -1744,6 +1744,16 @@ sub searchResults { $oldbiblio->{normalized_ean} = GetNormalizedEAN( $marcrecord,$marcflavour); $oldbiblio->{normalized_oclc} = GetNormalizedOCLCNumber($marcrecord,$marcflavour); $oldbiblio->{normalized_isbn} = GetNormalizedISBN($oldbiblio->{isbn},$marcrecord,$marcflavour); # Use existing ISBN from record if we got one + + if ( C4::Context->preference('OpenLibraryCovers') ) { + for my $field ( $marcrecord->field('024') ) { + if ( $field->subfield('2') eq 'openlib' ) { + $oldbiblio->{olid} = $field->subfield('a'); + last; + } + } + } + $oldbiblio->{content_identifier_exists} = 1 if ($oldbiblio->{normalized_isbn} or $oldbiblio->{normalized_oclc} or $oldbiblio->{normalized_ean} or $oldbiblio->{normalized_upc}); # edition information, if any diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt index 8449cc3b864..37f925a73d3 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt @@ -114,7 +114,7 @@ [% IF OpenLibraryCovers %]
-
+
Image from OpenLibrary
[% END %] @@ -1834,7 +1834,7 @@ [% END %] [% IF OpenLibraryCovers %] - KOHA.OpenLibrary.GetCoverFromIsbn(); + KOHA.OpenLibrary.GetCover(); [% END %] [% IF ( NovelistSelectProfile && ( normalized_isbn || normalized_upc ) ) %] @@ -1887,7 +1887,7 @@ KOHA.coce.getURL('[% Koha.Preference('CoceHost') | html %]', '[% Koha.Preference('CoceProviders') | html %]', $("#bibliodescriptions")); [% END %] [% IF OpenLibraryCovers %] - KOHA.OpenLibrary.GetCoverFromIsbn(); + KOHA.OpenLibrary.GetCover(); [% END %] [% IF OPACLocalCoverImages %] KOHA.LocalCover.GetCoverFromBibnumber(true); @@ -1913,7 +1913,7 @@ KOHA.coce.getURL('[% Koha.Preference('CoceHost') | html %]', '[% Koha.Preference('CoceProviders') | html %]', $("#bibliodescriptions")); [% END %] [% IF OpenLibraryCovers %] - KOHA.OpenLibrary.GetCoverFromIsbn(); + KOHA.OpenLibrary.GetCover(); [% END %] [% IF OPACLocalCoverImages %] KOHA.LocalCover.GetCoverFromBibnumber(true); diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt index 875bf71e2bc..a508dd3bdc8 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt @@ -389,8 +389,8 @@ [% END %] [% IF OpenLibraryCovers %] - [% IF SEARCH_RESULT.normalized_isbn %] - + [% IF SEARCH_RESULT.normalized_isbn || SEARCH_RESULT.olid %] + [% ELSE %] No cover image available [% END %] @@ -896,7 +896,7 @@ }); [% END # /IF TagsInputEnabled && loggedinusername %] - [% IF OpenLibraryCovers %]KOHA.OpenLibrary.GetCoverFromIsbn();[% END %] + [% IF OpenLibraryCovers %]KOHA.OpenLibrary.GetCover();[% END %] [% IF OPACLocalCoverImages %]KOHA.LocalCover.GetCoverFromBibnumber(false);[% END %] [% IF ( GoogleJackets ) %]KOHA.Google.GetCoverFromIsbn();[% END %] [% IF ( Koha.Preference('OpacCoce') && Koha.Preference('CoceProviders') ) %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt index 2220bf124a9..83af8e1fbdd 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt @@ -1008,7 +1008,7 @@ $(function() { return false; }); [% END %] - [% IF OpenLibraryCovers %]KOHA.OpenLibrary.GetCoverFromIsbn();[% END %] + [% IF OpenLibraryCovers %]KOHA.OpenLibrary.GetCover();[% END %] [% IF OPACLocalCoverImages %]KOHA.LocalCover.GetCoverFromBibnumber(false);[% END %] [% IF ( GoogleJackets ) %]KOHA.Google.GetCoverFromIsbn();[% END %] [% IF ( Koha.Preference('OpacCoce') && Koha.Preference('CoceProviders') ) %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js index 41dcfb9fab3..591324df1cc 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js +++ b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js @@ -9,17 +9,18 @@ KOHA.OpenLibrary = new function() { /** * Search all: - *
- * or - *
- * and run a search with all collected isbns to Open Library Book Search. + *
+ * and run a search with all collected isbns and olids to Open Library Book Search. * The result is asynchronously returned by OpenLibrary and catched by * olCallBack(). */ - this.GetCoverFromIsbn = function() { + this.GetCover = function() { var bibkeys = []; $("[id^=openlibrary-thumbnail]").each(function(i) { - bibkeys.push("ISBN:" + $(this).attr("class")); // id=isbn + let isbn = $(this).data("isbn"); + if ( isbn ) bibkeys.push("ISBN:" + isbn); + let olid = $(this).data("olid"); + if ( olid ) bibkeys.push("OLID:" + olid); }); bibkeys = bibkeys.join(','); var scriptElement = document.createElement("script"); @@ -38,32 +39,40 @@ KOHA.OpenLibrary = new function() { this.olCallBack = function(booksInfo) { for (id in booksInfo) { var book = booksInfo[id]; - var isbn = id.substring(5); - $("[id^=openlibrary-thumbnail]."+isbn).each(function() { - var a = document.createElement("a"); - a.href = booksInfo.url; - if (book.cover) { - if ( $(this).data('use-data-link') ) { - var a = document.createElement("a"); - a.href = book.cover.large; - var img = document.createElement("img"); - img.src = book.cover.medium; - img.setAttribute('data-link', book.cover.large); - a.append(img) - $(this).empty().append(a); - } else { - var img = document.createElement("img"); - img.src = book.cover.medium; - img.height = '110'; - $(this).append(img); - } - } else { - var message = document.createElement("span"); - $(message).attr("class","no-image"); - $(message).html(NO_OL_JACKET); - $(this).append(message); + let isbn; let olid; + id.split(';').forEach((e) => { + let identifier = e.split(':') + if ( identifier[0] == 'ISBN' ) { + isbn = identifier[1]; + } else if ( identifier[0] == 'OLID' ) { + olid = identifier[1]; } }); + + let elt = isbn ? $("[id^=openlibrary-thumbnail][data-isbn=%s]".format(isbn)) : $('*[data-olid="%s"]'.format(olid)); + var a = document.createElement("a"); + a.href = booksInfo.url; + if (book.cover) { + if ( $(elt).data('use-data-link') ) { + var a = document.createElement("a"); + a.href = book.cover.large; + var img = document.createElement("img"); + img.src = book.cover.medium; + img.setAttribute('data-link', book.cover.large); + a.append(img) + $(elt).empty().append(a); + } else { + var img = document.createElement("img"); + img.src = book.cover.medium; + img.height = '110'; + $(elt).append(img); + } + } else { + var message = document.createElement("span"); + $(message).attr("class","no-image"); + $(message).html(NO_OL_JACKET); + $(elt).append(message); + } } this.done = 1; } diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index 52e161205a8..b94de36cad9 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -1243,4 +1243,13 @@ if ( C4::Context->preference('OPACAuthorIdentifiers') ) { $template->param( author_identifiers => \@author_identifiers ); } +if ( C4::Context->preference('OpenLibraryCovers') && $record ) { + for my $field ( $record->field('024') ) { + if ( $field->subfield('2') eq 'openlib' ) { + $template->param( olid => $field->subfield('a') ); + last; + } + } +} + output_html_with_http_headers $query, $cookie, $template->output; -- 2.25.1