Repository navigation
feat: onboard additional IIIF libraries through a shared provider architecture #105
Copy link
Copy link
Closed
Labels
status:triageNeeds triage refinementNeeds triage refinement
Milestone
Description
Summary
Onboard additional libraries through the shared provider architecture. Includes IIIF-native providers AND non-IIIF Italian providers accessible via MAG/XML API.
Depends on #104. → #104 CLOSED ✅
🟢 IIIF nativo — confermato live
Tier A — implementazione eccellente, alta priorità
| Biblioteca | Paese | Endpoint | Note |
|---|---|---|---|
| Bayerische Staatsbibliothek (BSB) | 🇩🇪 | api.digitale-sammlungen.de/iiif/presentation/v2/{id}/manifest |
v2 verificato. Enorme collezione, molti manoscritti italiani. SRU+OAI per ricerca. |
| Österr. Nationalbibliothek (ÖNB) | 🇦🇹 | api.onb.ac.at/iiif/presentation/v3/manifest/{id} |
v3 verificato. Codici medievali e archivi imperiali. |
| Wellcome Collection | 🇬🇧 | wellcomelibrary.org/iiif/{id}/manifest |
v2. Search API integrata. Focus medicina/scienza. |
| UB Leipzig | 🇩🇪 | iiif.ub.uni-leipzig.de/{id}/manifest.json |
v2 verificato. Manoscritti medievali, public domain. |
Tier B — spike breve prima di implementare
- Estense Digital Library (Modena) — IIIF nativo probabile, endpoint da trovare
- Handschriftenportal HSP (Germania) — aggrega tutte le biblioteche tedesche
- National Library of Scotland
- BVMM / IRHT-CNRS (manoscritti miniati francesi)
- e-manuscripta.ch (Zurigo, Basilea, Berna)
DSpace/GLAM (un resolver parametrizzato per tutti)
- Digital Library Pavia
- Biblioteca Civica Rovereto
🇮🇹 Provider italiani — Internet Culturale (MAG/XML API)
Scoperta chiave: le grandi biblioteche italiane (BML, Marciana, BNCF, BNCR) non espongono IIIF, ma Internet Culturale (ICCU) ha una API XML pubblica (formato MAG) che le copre tutte.
API
# Lista pagine con URL immagini:
GET https://www.internetculturale.it/jmms/magparser?id={oai_id}&teca={teca}&mode=all&offset=0&pag={n}
# Immagine singola:
GET https://www.internetculturale.it/jmms/thumbnail?type=normal&id={oai_id}&teca={teca}&page={n}
# Ricerca:
GET https://www.internetculturale.it/it/16/search?q={query}&instance=magindice&searchType=avanzato&channel__typeTipo=Manoscritto
Biblioteche coperte (un resolver unico)
| Biblioteca | teca_id | Verifica |
|---|---|---|
| Biblioteca Nazionale Marciana (Venezia) | marciana |
✅ live |
| Biblioteca Medicea Laurenziana (Firenze) | Laurenziana - FI |
✅ live |
| BNCF (Firenze) | da trovare | 🔍 |
| BNCR (Roma) | da trovare | 🔍 |
| + ~50 istituzioni partner ICCU | vari | — |
Limitazione: immagini JPEG ~1500-2000px, non tile IIIF. Qualità inferiore ma accettabile.
Fuori portata
- Biblioteca Ambrosiana — viewer proprietario
- MLOL (Gazzetta Parma, Fondo Canova) — login richiesto
Ordine di implementazione suggerito
- BSB — IIIF v2, massimo valore immediato
- ÖNB — IIIF v3
- Internet Culturale — sblocca BML + Marciana + BNCF in un colpo solo
- Estense — spike + implementazione se confermato
- Wellcome — IIIF v2 con search API
- DSpace (Pavia, Rovereto) — resolver parametrizzato
- HSP, NLS, BVMM, e-manuscripta — spike + implementazione
Acceptance Criteria
- Ogni provider risolve pagine/manifesti validi in Discovery e CLI.
- La ricerca è opzionale; direct-resolution-first accettabile dove search pubblica è debole.
- Provider esistenti non regrediscono.
- Issue Aggiungere librerie IIIF #26 superseded da questa epic.
Metadata
Metadata
Assignees
Labels
status:triageNeeds triage refinementNeeds triage refinement
Activity
nikazzio commentedon Apr 19, 2026
Stato avanzamento — sessione aperta (branch
feat/iccu-internetculturale-provider)Aggiornamento dello stato dopo il lavoro su ICCU e lo spike Estense.
✅ Internet Culturale (ICCU) — funzionante end-to-end
Resolver + search + download implementati e verificati live:
InternetCulturaleResolverconcan_resolveper URLviewresource/magparser/iccuviewere OAI ID raw (inferenza teca)mag_parser.py) con URL immagini dal reale attributosrcdelle<page>(verificato: il param?page=Ndell'endpoint/jmms/thumbnailè ignorato dal server → pagine duplicate; il pathcacheman/normal/{teca}/.../N.jpgfunziona)pag=N, nonpaginate_pageNum)UI integration:
/jmms/iccuviewer/iccu.jsp?id=...&mode=all&teca=...(il vecchioviewresourceera pagina bianca per alcune teche es. BNCF)get_jsonfalliva sempre)fetch_manifest_dictICCU-aware per 5 call site UI (add_to_library, add_and_download, reader Studio, refresh_metadata, pdf_capability)/api/iccu/manifest?url=...per servire il manifest convertito a Mirador (origin-CORS friendly)_PAGINATABLE_STRATEGIESesteso) con propagazioneic_typefilterbuild_viewer_urlnel provider registry usandoextract_oai_and_teca_from_urlper ricostruire URL esternoDownload resilience:
allow_partial_finalizeautomatico sui manifest con_iccumarker → i record "teaser" (XML dichiara N pagine ma solo M<N sono servite, es. BNCF CFIE004771 "Marozzo") finalizzano le M disponibili invece di non finalizzare nullaresource.@iddiretto (non-IIIF service):PageDownloader._locate_direct_image_url+_fetch_directTest: 12 test unit in
test_iccu_unit.py+ fixtureiccu_mag_sample.xml; regressione complessiva 85/85 green.File toccati (uncommitted):
internetculturale.it/iiif/image/2.1/{id_b64}/full/full/0/default.jpg) ma è solo fullsize statica — nessun tile/zoom lato serverAccess-Control-Allow-Origin(ok per<img>, rompe fetch/XHR di Mirador quando fa tile requests — ma con canvas no-service Mirador carica static image senza problemi)_OAI_PREFIX_TO_TECAcopre solo Marciana + BML; BNCF/BNCR/altre ~50 teche non risolvono da OAI raw (ok da URL magparser completo)🔍 Spike Estense completato — IIIF nativo reale disponibile
Scoperta: EDL ha backend Jarvis (
jarvis.edl.beniculturali.it) con IIIF completo, NON solo MLOL come suggerisce la issue.GET /meta/culturalItems/search/findBySgttOrAutnOrPressmark?text=...&page=0&size=20(Spring Pageable, includetotalElements+totalPages)Pattern URL:
Search test live: query "dante" → 79 risultati, primo hit Vita nuova. Autografo di Muratori (pressmark
A.M.02.12.A), manifest già cliccabile in Mirador.Implementazione stimata: ~3-4 file (resolver + search handler + registrazione provider + test). Significativamente più semplice di ICCU perché il downloader IIIF standard esistente funziona senza modifiche.
Open item: mapping
edl.beniculturali.it/beu/{public_id} → Jarvis UUIDnon documentato pubblicamente. La SPA lo risolve client-side via XHR non ispezionabile da CLI. Workaround: provider usa solo URL Jarvis diretti + search (che restituisce già gli UUID); per input utente/beu/{id}eventuale fallback scraping o via EuropeanadataProvider="Estense University Library".📌 Per la prossima sessione
Punto di ripartenza suggerito:
feat/iccu-internetculturale-providere aprire PRfeat/estense-jarvis-providerper EDL: resolver riconosce hostjarvis.edl.beniculturali.it, search usafindBySgttOrAutnOrPressmark, integrazione provider registry consearch_mode="search_first"e paginazione nativa SpringNota architetturale: Estense sarà il primo test del codice per manifest IIIF v3 nel codebase (ora supportiamo solo v2 esplicitamente). Il manifest v2 di Jarvis è già funzionante ma vale la pena spingere su v3 per future-proofing.
nikazzio commentedon Apr 19, 2026
Update — chiusura come integrazione di prodotto
Chiuso il secondo giro sui blocchi non-code individuati dopo la review:
Network policy (backend)
src/universal_iiif_core/network_policy.py: aggiunti alias (internet culturale,internet culturale (iccu),iccu,internetculturale→internet_culturale), la chiave inLIBRARY_KEYS, e i default policy conservativi per il provider:use_custom_policytrueworkers_per_jobmin_delay_s/max_delay_sretry_max_attemptsbackoff_base_s/backoff_cap_scooldown_on_403_s/cooldown_on_429_sburst_window_s/burst_max_requestsVerificato live:
normalize_library_key("ICCU") → "internet_culturale",resolve_library_network_policyrestituisce il nuovo bundle.Settings UI
src/studio_ui/components/settings/panes/network.py: aggiunti tab button "Internet Culturale" e card override (use_custom_policy / workers / delay / retry / backoff / retry-after) coerente con gli altri provider esistenti.Docs
docs/reference/provider-support.md: ICCU in registry, matrix, dedicated note (MAG/XML, partial finalize, viewer JSP canonico, note su ICCU Image API level 0 e sul separato provider Estense futuro), provider filter elencatodocs/reference/configuration.md: chiaveinternet_culturalenel set di library supportate + rationale dei default conservatividocs/CONFIG_REFERENCE.md:internet_culturaleaggiunto alla lista library supportate;internetculturaleinserito tra i provider paginabili insettings.discovery; nota sul page size fisso upstream (20/pag)docs/guides/discovery-and-library.md: paragrafo dedicato a ICCU in "Search Pagination And Provider Behavior" (aggregatore ~50 biblioteche italiane, "Mostrati X di Y", partial records)Paginazione end-to-end verificata
search_internetculturale("dante", page=1)→ 20 risultati,_search_total_results=2408,_search_total_pages=121resolve_provider_input("Internet Culturale", "dante", filters={"page": 2})→ 20 risultati distintiic_typepropagato inload_more_resultse sopravvive alla paginationProssimi passi invariati
feat/iccu-internetculturale-provider+ PRfeat/estense-jarvis-provider— resolver IIIF v2/v3 nativo sfruttando l'endpointjarvis.edl.beniculturali.it/meta/iiif/{uuid}/manifestscoperto nello spikefeat(iccu): first-class Internet Culturale provider
docs(iccu): document Internet Culturale provider, pagination and netw…
fix(iccu): keep "Carica altri" visible when max_results differs from …
chore(iccu): flag Internet Culturale as BETA and move to end of provi…
feat(iccu): first-class Internet Culturale provider (#159)
feat(estense): add Biblioteca Estense (Jarvis) as a native IIIF provider
feat(estense): add Jarvis provider and discovery wording cleanup (#160)
nikazzio commentedon Apr 20, 2026
Update — Estense provider mergiato (PR #160)
Secondo provider italiano integrato, questa volta nativo IIIF.
Estense in produzione (PR #160 merged)
https://jarvis.edl.beniculturali.it/meta/iiif/{uuid}/manifest(v2) + v3, Mirador wrapper URLs, UUID nudi (8-4-4-4-12).GET /meta/culturalItems/search/findBySgttOrAutnOrPressmark?text=...&size=20&page=0— copre short title / autore / pressmark in una chiamata. Spring Pageable (0-based), esponetotalElementsetotalPages→ UI mostra "Mostrati X di Y" e "Carica altri".Lezione dallo spike
EDL (
edl.cultura.gov.it) è un portal MLOL aggregatore, non solo Estense. Solo i ~126k record genuinamente digitalizzati dalla Biblioteca Estense di Modena sono in Jarvis. Record di altra provenienza (es. Marozzo della Rosenwald Collection LoC) sono indicizzati da MLOL su edl.cultura.gov.it ma puntano ai manifest delle biblioteche originali (LoC, BSB, ecc.).Conseguenza: il nostro provider
Estensecopre correttamente il catalogo Jarvis. Chi vuole un Marozzo LoC usa il provider Library of Congress con l'URLloc.gov/item/75229023/manifest.json. Integrare MLOL come provider richiederebbe analisi API separata e non è in scope di questo epic.Stato epic
Prossimi step suggeriti (nessuno in sessione corrente)