Kommandozeilen Tool um OAI-PMH `verb=ListSets` abzufragen?

HI,
ich würde gerne versuchen, https://www.canal-u.tv/oai?verb=ListSets
abzufragen, um alle Sets auszulesen.

Ein einfache HTML-Abfrage geht nicht, da ich paginieren muss. Metafacture und metha können, wenn ich es richtig sehe, keine verbs außer ListRecords.

Hat jemand einen Tipp für mich, wie ich das am besten umgesetzt bekomme, um eine oai-pmh Schnittstelle ListSets abzufragen.

Beste Grüße
Tobias

Ich glaube Catmandu kann das, siehe „Harvest sets“ in der Synopsis von GitHub - LibreCat/Catmandu-OAI: Catmandu modules for working with OAI repositories (kann das nicht testen, weil ich Catmandu nicht installiert habe).

Sonst vielleicht mit einem Bash-Skript? Ich hab mal ein vorhandenes Skript angepasst:

#/usr/bin/env bash

fetch_token() {
	file=$1 ; count=$2
	if [ $verb == "ListSets" ]
	then
		tee >(xmlstarlet sel -t -v "//_:setName" >> "$file-set-names.txt") | xmlstarlet sel -t -v "//_:resumptionToken"
	else
		tee >(xmlstarlet fo - > "$file-$(printf "%04d" $count).xml") | xmlstarlet sel -N oai="http://www.openarchives.org/OAI/2.0/" --template --match "/oai:OAI-PMH/oai:${verb}/oai:resumptionToken" --value-of "."
	fi
}

server=$1
verb=$2
file=$(echo $server | sed -E 's/^https?:\/\///; s/[\.:\/]/-/g')
count=1
token=$(curl -s -g "$server?verb=${verb}" -H 'Accept: application/xml' | fetch_token $file $count)

while [ $token ] ; do
	((count++))
	token=$(curl -s -g "$server?verb=${verb}&resumptionToken=$token" -H 'Accept: application/xml' | fetch_token $file $count)
done

Wenn Du das als oai.sh speicherst und so bash oai.sh https://www.canal-u.tv/oai ListSets ausführst, dann schreibt es die Namen der Sets in eine txt-Datei.

Das XML wird mit xmlstarlet verarbeitet, ggf. vorher installieren: sudo apt install xmlstarlet. User guide: XmlStarlet Command Line XML Toolkit User's Guide

Wenn Du das Skript mit einem anderen Verb ausführst, dann speichert es das gesamte XML in eine Datei pro resumptionToken request.

Catmandu sollte es eigentlich können:

$ catmandu convert OAI --url  https://www.canal-u.tv/oai/ --listSets 1
Use of uninitialized value $ns in string eq at /usr/local/share/perl/5.38.2/Catmandu/Importer/OAI.pm line 114.
Use of uninitialized value $ns in string eq at /usr/local/share/perl/5.38.2/Catmandu/Importer/OAI.pm line 119.
Use of uninitialized value $ns in string eq at /usr/local/share/perl/5.38.2/Catmandu/Importer/OAI.pm line 124.
[{"setSpec":"chaine","_id":"chaine","setDescription":[],"setName":"Toutes les chaines"},{"setSpec":"discipline","setName":"Toutes les disciplines","_id":"discipline","setDescription":[]}Oops! Can't locate object method "read" via package "XML::LibXML::Text" at /usr/lib/x86_64-linux-gnu/perl5/5.38/XML/LibXML/Reader.pm line 138.

Ich versuche mal dein stricpt

$ metha-id https://www.canal-u.tv/oai

Dieses Kommando liefert ein JSON Dokument zurück mit Informationen über unterstützte Formate, Sets, etc.

$ metha-id https://www.canal-u.tv/oai | jq '.identify'
{
  "repositoryName": "Canal-U",
  "baseURL": "https://www.canal-u.tv/oai",
  "protocolVersion": "2.0",
  "adminEmail": [
    "webmestre@canal-u.tv"
  ],
  "earliestDatestamp": "1900-01-01",
  "deletedRecord": "no",
  "granularity": "YYYY-MM-DD",
  "description": [
    {
      "Body": "..."
    }
  ]
}

Oder auch sets, mit automatischer Paginierung (ich finde 853 Sets für den Endpunkt).

$ metha-id https://www.canal-u.tv/oai | jq -rc '.sets[].setName' | head
Toutes les chaines
Toutes les disciplines
Académie de Rennes
ADBU
AFRINUM
Agreenium
Ambiances Architectures Urbanités
anatomie 3D Lyon1
A.P.D.E.N. (ex FADBEN) - Association des professeurs documentalistes de l’Éducation nationale
Archéorient - Environnements et sociétés de l'Orient ancien
3 „Gefällt mir“

Danke! Genau das habe ich gebraucht. Ich hatte mir zwar schon metha angeschaut, aber beim durchsuchen der Man Page und der Readme nichts zu ListSets gefunden.
Mit dem Ergebnis kann ich gut arbeiten.

1 „Gefällt mir“