Podes prosjektblogg

Eksterne data inn i katalogen – “mashin”?

Postet den 4. December 2009 | Skrevet av Magnus | Ingen kommentarer

Pode har jobbet mye med å lage mashups der katalogdata blandes med data fra andre kilder i frittstående applikasjoner, nærmere bestemt Reiseplanleggeren og Musikkmashupen. Men hvor vanskelig er det å gå andre veien, dvs hente data fra eksterne kilder inn i katalogen?

For å undersøke dette har vi gjort et forsøk på å hente data fra Last.fm inn i vår egen Koha-installasjon. Du kan se et par eksempler på resultatet her: Metallica: Death magnetic og Deep Purple: Machine head. Data fra Last.fm for artisten og albumet vises i høyre kolonne på siden.

Løsningen som ligger bak består av to deler: litt JavaScript og litt PHP – det vi ikke har gjort er å endre selve koden til Koha.

JavaScript

Koha har en systempreferanse som heter opacuserjs, som gjør det mulig for de som har de riktige rettighetene i Koha å putte hva som helst av JavaScript inn på samtlige sider i Koha. Koden blir skrevet ut inne i en <script>-tagg i hodet på alle HTML-sidene. Vi har benyttet denne muligheten til å inkludere følgende kodesnutt:

jQuery(document).ready(function () {
  var id = $(".unapi-id").attr("title");
  $.get("/~magnus/mashin/mashin.php", { id: id },
    function(text){
      $("#action").after(text);
    }
  );
});

Her benytter vi oss av det faktum at Koha allerede inkluderer JavaScript-”biblioteket” jQuery, og den funksjonaliteten som tilbys derfra. For å ta det trinnvis:

jQuery(document).ready(function () {

Funksjonen ready() sørger for at koden vår utføres etter at elle eksterne JavaScript-filer er lastet inn.

var id = $(".unapi-id").attr("title");

Alle Koha-sider som er en postvisning inneholder følgende HTML-snutt:

<abbr class="unapi-id" title="koha:biblionumber:142213"/>

Med JavaScript-koden ovenfor henter vi ut verdien av title-attributtet fra det elementet på side som har class = “unapi-id”, dvs strengen “koha:biblionumber:142213“, og denne strengen lagrer vi i variabelen id. Så benytter vi oss av AJAX-funksjonaliteten i jQuery til å hente informasjon fra et PHP-skript på serveren:

$.get("/~magnus/mashin/mashin.php", { id: id },

Funksjonen get() kaller opp skriptet som befinner seg på adressen /~magnus/mashin/mashin.php – i vårt tilfelle tilsvarer dette den fulle URLen http://dev.bibpode.no/~magnus/mashin/mashin.php. I tillegg legges det til et argument til URLen, som får verdien fra id-variabelen, slik at den fulle forespørselen blir seende slik ut: http://dev.bibpode.no/~magnus/mashin/mashin.php?id=koha:biblionumber:142213. Denne URLen returnerer et HTML-fragment som blir gjort tilgjengelig for resten av skriptet vårt i variabelen “text”. Innholdet i denne variabelen putter vi så inn i HTML-siden, etter elementet med id = “action”, med after()-funksjonen:

$("#action").after(text);

Vi har nå sendt en identifikator til et skript og fått tilbake et HTML-fragment med informasjon som er relevant i forhold til posten identifikatoren peker til. Dette fragmentet har vi så gjort til en del av HTML-siden. Skriptet bestemmer hva som kommer i retur, basert på identifikatoren. Dersom skriptet ikke finner noen relevant informasjon sendes det et “tomt” dokument tilbake og ingen ekstra informasjon vises til brukeren.

PHP

De mest spennende delene av det vi har gjort foregår i PHP-skriptet som sender informasjon til HTML-siden, basert på en indikator. Dette skriptet kunne vært skrevet i et hvilket som helst programmeringsspråk, men vi valgte PHP, fordi vi da kunne gjenbruke en del elementer fra tidligere arbeid, blant annet med mashupene. Skriptet mashin.php kan studere på GitHub, pent formatert (har en tendens til å kutte lange linjer) eller i rå-format. Dette skriptet gjør følgende:

1. id-argumentet hentes ut fra URLen og “koha:biblionumber:” fjernes, slik at vi sitter igjen med et rent biblionumber.

2. Skriptet konstruerer en SRU-URL og benytter denne til å be Koha om å få hele MARC-posten biblionummeret tilsvarer, i MARCXML-format.

3. MARCXMLen som kommer i retur tolkes med PHP/PEAR-modulen File_MARC. Skriptet kan nå treffe beslutninger basert på inneholdet i MARC-posten. Dersom posten inneholder et ISBN-nummer kunne man feks hente forsidebildet fra Bokkilden (via deres dynamiske uttrekk), eller man kunne søkt etter forfatternavn i et utall av eksterne databaser. Vi har imidlertid valgt å satse på musikk, og gjør følgende:

4. Dersom MARC-felt 245$h = “lydopptak” regner vi med at dette er et album. Vi henter ut artistnavn fra 100$a, 110$a, 700$a eller 710$a og gjør et søk etter informasjon knyttet til det første navnet vi finner i Last.fm (nærmere bestemt API-kallet artist.getInfo).

5. Med informasjon fra 245$a gjør vi så et tilsvarende kall mot album.getInfo.

6. Infomasjonen fra Last.fm returneres i JSON-format og konverteres til PHP datastrukturer.Herfra henter vi ut den informasjonen vi er interessert i, formaterer den med litt HTML-koder og returnerer den JavaScript-oppkalleren vår.

Utviklingsmuligheter

Som antydet over står man med denne fremgangsmåten fritt til å gjøre nær sagt hva som helst, basert på dataene som foreligger i MARC-postene man får tilgang til. Det er derfor bare fantasien som setter grenser for hvilken informasjon man kan dra nytte av, og hvilke tjenester man kan koble seg opp mot, og hente informasjon fra.

Denne fremgangsmåten krever minimalt av inngrep i OPACen, og det blir særdeles enkelt i Koha, i og med at vi der har en systemvariabel som gir oss muligheten til å putte fritt valgt JavaScript-kode inn på sidene i OPACen. Så lenge vi kan identifisere ulike elementer på siden ved help av id- og/eller class-attributter har vi også stor frihet med tanke på hvor på siden vi ønsker å vise informasjonen vi henter inn – at vi valgte høyre kolonne var nærmest en tilfeldighet.

Vi valgte for enkelhets skyld å hente MARC-poster med SRU, men kunne like gjerne benyttet Z39.50.

Kommentarer

Legg igjen en kommentar