Liebe Kolleginnen und Kollegen,
im Rahmen des EFRE-Projektes "Cross Media Repository" wurde in den
letzten Monaten an der Unterstützung von
IIIF-Presentation-API-Manifesten (https://iiif.io/api/presentation/2.1/)
in Kitodo.Presentation gearbeitet. Die Arbeit ist inzwischen an einem
Punkt angekommen, an dem sich eine Übernahme der Ergebnisse in den
master-Branch lohnt. Nach Übernahme der Änderungen aus dem
Entwicklungszweig in den master-Branch wird Kitodo.Presentation in der
Lage sein, beliebige IIIF-Manifeste anzuzeigen. Eine recht umfangreiche
Unterstützung gibt es dabei vor allem für die IIIF Presentation API 2.0
/ 2.1, aber auch Manifeste der mittlerweile obsoleten IIIF Metadata API
1.0 sowie der demnächst erscheinenden IIIF Presentation API 3.0 können
schon jetzt grundlegend angezeigt werden. Für die Verwendung von
IIIF-Manifesten wird dabei fast komplett auf die bestehenden
Oberflächen-Plugins der Typo3-Extension zurückgegriffen wie zuvor schon
für METS/MODS-Dokumente. Lediglich im Toolbox-Plugin ist ein Werkzeug
zur Anzeige von IIIF-Annotationen hinzugekommen, für weitere Plugins
sowie für die Extension an sich gibt es teilweise geänderte und
erweiterte Konfigurationen.
Die IIIF-Presentation-API-Features werden auch nach Übernahme in den
Master noch weiterentwickelt werden und sollten noch nicht produktiv
eingesetzt oder erweitert werden, da weitere weitreichende Änderungen
noch nicht ausgeschlossen sind.
Die Änderungen sind derzeit im Feature-Branch unter
https://github.com/ubleipzig/kitodo-presentation/tree/cmr-3.2-iiif-manifests
verfügbar. Einige bereits in den Master gemergte Bugfixes an den
IIIF-Imageviewer-Features sind noch nicht im Branch enthalten, weswegen
sich zum ausprobieren aller IIIF-Features eher
(https://github.com/ubleipzig/kitodo-presentation/tree/cmr-3.2-with-master-f…,
Installation über Composer) empfiehlt.
Im folgenden gibt es einen groben Überblick über die hinzugekommenen
Funktionen, Hinweise auf wichtige Quellcodeänderungen und ein paar
Problemschilderungen. Über Feedback und Anregungen dazu (insbesondere zu
den Problemen) würde ich mich freuen.
## Technische Einzelheiten und unterstützte Features
* Angezeigt wird im Viewer jeweils das erste Bild pro Canvas für die
Canvases der Default-Sequenz. Die Unterstützung mehrerer
Bild-Annotationen pro Canvas steht noch aus. Nicht nur für den Zweck der
Anzeige mehrerer Bilder ist außerdem eine noch angedachte Unterstützung
der genauen Positionierung von Bildern z.B. per Fragment Identifier oder
Selector nötig (https://iiif.io/api/presentation/2.1/#segments).
* Für IIIF-Manifeste erhält das Metadaten-Plugin die Option, diese
komplett wie im Manifest angegeben anzuzeigen statt anhand einer
Metadaten-Konfiguration im Backend. Falls es um eine Darstellung von
Manifesten mit unbekannten Metadaten geht, entspricht eine derartige
Darstellung eher den Vorgaben der IIIF Presentation API. Der Name für
die TypoScript-Konfiguration ist "originalIiifMetadata"; über
"displayIiifDescription", "displayIiifRights" und "displayIiifLinks"
lässt sich dann einstellen, ob auch eine Beschreibung, rechtliche
Angaben und Verlinkungen gemeinsam mit den Metadaten angezeigt werden
sollen.
* Metadaten aus IIIF-Manifesten mit bekannter (Metadaten-) Struktur
können aber auch anhand einer Metadatenkonfiguration angezeigt sowie im
Backend und im Suchindex gespeichert werden; mehr dazu weiter unten.
* PDFs von vollständigen Werken sowie von Einzelseiten können über die
Eigenschaft "rendering" des Manifests oder der Default-Sequence (für das
Werk) oder des Canvas oder der Image-Annotation (für Einzelseiten)
angegeben werden. Damit der Eintrag als PDF-Variante der jeweiligen
Darstellung erkannt wird, muss für den "rendering"-Eintrag die "@id" die
Download-URL enthalten und als "format" "application/pdf" angegeben werden:
"rendering": [
{
"@id": "http://example.org/files/book1.pdf",
"format": "application/pdf"
},
...
]
* Volltext, der als ALTO-XML vorliegt, kann auch in IIIF-Manifesten
verwendet werden. Dazu wird das jeweilige ALTO-Dokument im
"seeAlso"-Feld des Canvas verlinkt. Um als ALTO erkannt zu werden, muss
entweder als "format" der (nicht offiziell registrierte) Media Type
"application/alto+xml" oder als "profil" die jeweilige
ALTO-Schema-Location angegeben sein (z.B.
"http://www.loc.gov/standards/alto/alto-v2.0.xsd"; entscheidend ist,
dass die URL mit "http://www.loc.gov/standards/alto/" beginnt).
"seeAlso": [
{
"@id": "http://example.org/fulltext/book1/alto-page1.xml",
"format": "application/alto+xml",
"profile": "http://www.loc.gov/standards/alto/alto-v2.0.xsd"
}
]
* Daneben kann Volltext auch in den Text-Annotations des Canvas
vorliegen. Da Text-Annotationen jedoch keine Informationen darüber
enthalten, ob sie nun den Volltext repräsentieren oder z.B. eine
Beschreibung des jeweiligen Canvas und seiner einzelnen Bereiche
enthalten, können sie nicht einfach als Volltext angeboten werden,
sondern werden über ein neues Annotations-Werkzeug ggf. zusätzlich zum
Volltext angeboten, verhalten sich aber diesem recht ähnlich. Bisher
werden nur Annotationen mit "motivation": "sc:painting" in der
Oberfläche angeboten, im weiteren Verlauf der Entwicklung ist auch eine
Auswahl aus allen Motivationen (neben "painting" vor allem "commenting")
denkbar. Im Backend kann konfiguriert werden, ob der Inhalt der
painting-Text-Annotationen als Volltext gespeichert werden soll.
* Für METS-MODS erwartet Kitodo.Presentation Vorschaubilder in einer
passenden "fileGrp". Ein Vorschaubild-Feature gibt es auch für
IIIF-Images aus IIIF-Manifesten; dort kann direkt in der
"thumbnail"-Property des Canvas, der Image-Annotation oder der
Content-Resource ein Vorschaubild angegeben werden. Falls dieses fehlt,
lassen sich für IIIF-Bilder problemlos Thumbnails in beliebiger Größe
generieren, sofern der angegebene Image-Service das unterstützt. In
Kitodo.Presentation kann die gewünschte Größe dieser Vorschaubilder über
die Einstellungen der Extension im Reiter "IIIF" gesteuert werden.
* Die Thumbnail- und Annotationsindizierungseinstellungen erfolgen
derzeit in den Einstellungen der Extension, denkbar wäre alternativ aber
auch eine Konfiguration im jeweiligen Systemordner.
## Wichtige Quellcode- und Datenbankschema-Änderungen
* Die bedeutendste Änderung im Quellcode ist die Abstrahierung der
Klasse tx_dlf_document und die Trennung der METS- und IIIF-spezifischen
Funktionen in tx_dlf_mets_document und tx_dlf_iiif_manifest, die jeweils
abstrakte Methoden der Klasse tx_dlf_document implementieren.
* In der Datenbank erfolgt die prinzipielle Unterscheidung zwischen
IIIF- und METS-Dokumenten anhand des neuen Feldes
tx_dlf_document.document_format mit den Werten 'METS' und 'IIIF'.
* IIIF-versionsspezifischer Code ist im Code von Kitodo.Presentation so
knapp wie nur möglich gehalten worden. Erreicht wird dies durch die
Auslagerung konkreter IIIF-Implementierungsdetails in eine eigens
entwickelte Bibliothek
(https://github.com/ubleipzig/php-iiif-prezi-reader), über deren
Interfaces alle IIIF-Versionen versionsunabhängig angesprochen werden
können. Das ermöglicht eine Unterstützung auch über die derzeit gültige
Presentation-API-Version 2.1 hinaus.
* Falls die Metadaten anhand einer vorgegeben Konfiguration verwendet
werden sollen, wie das vor allem für eine lokale Speicherung der
Dokumente nötig ist, kann diese für IIIF-Manifeste vorerst mit
JsonPath-Ausdrücken (https://goessner.net/articles/JsonPath/) erfolgen.
Andere Varianten (z.B. anhand des "label"s des "metadata"-Arrays (zu
unflexibel) oder anhand von SPARQL-Queries (neue, komplexe
Abhängigkeiten für ein vergleichsweise kleines Feature) wurden zunächst
als unpraktikabel erachtet; zugleich bleibt abzuwarten, ob sich JsonPath
für diesen Zweck tatsächlich praktisch bewährt. Alternativvorschläge und
Anregungen dazu sind herzlich willkommen!
* Die Metadatenkonfiguration wird wie schon für MODS und TEIDHR in
tx_dlf_metadataformat gespeichert. Neben MODS und TEIHDR sind dafür die
Formate IIIF1, IIIF2 und IIIF3 hinzugekommen. Für die Angabe der
JsonPath-Ausdrücke des jeweiligen IIIF-Formats werden die
Datenbank-Felder tx_dlf_metadataformat.xpath und
tx_dlf_metadataformat.xpath_sorting wiederverwendet. Um dem geänderten
Inhalt der Felder Rechnung zu tragen, werden diese in metadataquery und
metadataquery_sorting umbenannt.
* Im Gegensatz zu den via METS transportierten Formaten muss hier weder
eine Klasse zur extrahieren der Metadaten noch (offensichtlicherweise)
ein XML-Root-Element angegeben werden. Anstelle des Namespaces wird der
Context-IRI gespeichert. Die ursprüngliche Eingrenzung der Formate auf
XML wird dadurch umgangen, zugleich ist so aber eine gemeinsame
Konfiguration der Metadaten ohne eine Parallelstruktur für IIIF möglich.
Gleichzeitig wird die Formate-Tabelle aber auch bereits genutzt, um ALTO
als Format für Volltexte anzugeben, das zwar wiederum ein XML-Format,
aber kein Metadatenformat ist. Es wäre zu diskutieren, ob die Struktur
in der Form so weitergenutzt werden kann.
* Als JsonPath-Bibliothek wird zur Zeit
https://github.com/FlowCommunications/JSONPath verwendet.
## Probleme
* Eine IIIF-Unterstützung durch das OAI-PMH-Plugins erscheint nicht
sinnvoll. Die Metadaten in IIIF-Manifesten haben aus Sicht der API keine
semantische Bedeutung z.B. für maschinelle Verabreitung und sind auch
nicht für Discovery-Zwecke vorgesehen, sondern dienen lediglich der Anzeige.
* Im Zusammenhang mit OAI steht das Problem, dass jedes lokal indexierte
Dokument eine recordId benötigt, die den Datensatz eindeutig
identifiziert. Für IIIF-Manifeste bietet sich dafür die (auflösbare) ID
des Manifests selbst an. Im Metadaten-Plugin sowie in den betreffenden
Formularen in Backend zeigt Kitodo.Presentation diese Record-ID als
"OAI-Identifier" an, was irreführend ist, wenn die ID nicht tatsächlich
als OAI-Identifier dient. Es lassen sich natürlich auch andere Werte für
die Record-ID definieren, allerdings erscheint als Fallback nur der
@id-IRI des Manifests sinnvoll.
* Ein bekanntes Problem ist, dass die IIIF-Bibliothek (noch) keine
wiederholten IDs unterstützt. Derzeit können Resourcen von verschiedenem
Typ keine gleiche ID haben. Es gibt aber z.B. durchaus Manifeste, in
denen eine Image-Annotation und ein Canvas die gleiche ID haben bzw. aus
RDF-Perspektive die betreffende Ressource zwei verschiedene Typen hat
und als Canvas sich selbst zugleich als eine ihrer Annotationen hat:
{
"@context": "http://iiif.io/api/presentation/2/context.json",
"@id": "http://www.example.org/common-id",
"@type": "sc:Canvas",
"images": [
{
"@id": "http://www.example.org/common-id",
"@type": "oa:Annotation"
}
]
}
* Kitodo.Presentation bietet in der Klasse tx_dlf_document über die
magische __get()-Methode Zugriff auf einige protected properties, einige
davon METS-spezifisch. Das macht es schwierig, eine abstrakte Klasse zu
formulieren, die alle bisherigen Features tx_dlf_document unterstützt
und mit der erweiternder Code ohne Probleme läuft. Die Unterstützung
beschränkt sich auf die bisher existenten öffentlichen Methoden. Für
Extensions, die auf Kitodo.Presentation aufsetzen, bedeutet das, dass
Code angepasst werden muss, wo direkter Property-Zugriff erfolgt. Im
DFG-Viewer beispielsweise wird in Slub\Dfgviewer\Helpers\GetDoc direkt
auf tx_dlf_document->mets zugegriffen.
Ich freue mich auf Ihr Feedback!
Viele Grüße
Lutz Helm
--
Lutz Helm
Bereich Digitale Dienste
AG Anwendungsentwicklung
Universitätsbibliothek Leipzig
Beethovenstraße 6, 04107 Leipzig
T: +49 341 97 30566
helm(a)ub.uni-leipzig.de
https://www.ub.uni-leipzig.de/