Skip to content

feat(library): ricerca vera per Vaticana, Gallica ed e-codices - #453

Merged
nikazzio merged 6 commits into
mainfrom
feat/library-real-search
Aug 31, 2026
Merged

nikazzio merged 6 commits into
mainfrom
feat/library-real-search

Conversation

@nikazzio

@nikazzio nikazzio commented Aug 30, 2026 •

Copy link
Copy Markdown
Owner

Ultima della catena: si appoggia alla PR #452 (che ora contiene anche ordinamento e filtro workspace), che si appoggia alla #451, alla #450 e alla #449.

Cosa cambia

Di dodici biblioteche in elenco, finora solo Internet Archive cercava davvero: per tutte le altre l'unico modo di arrivare a un'opera era incollare l'indirizzo completo del manifesto, anche quando il campo suggeriva una segnatura. Tre biblioteche ora mantengono quella promessa: Vaticana, Gallica ed e-codices.

Riconoscimento (senza toccare la rete):

  • Vaticana: Urb. lat. 1779, urb lat 1779, urb-lat-1779, Urblat1779, MSS_Urb.lat.1779 portano tutte allo stesso manoscritto; funziona anche l'indirizzo della pagina di lettura;
  • Gallica: l'ARK riconosciuto ovunque stia nell'indirizzo (pagina, pagina singola, manifesto), più l'identificativo nudo;
  • e-codices: segnatura composta (bbb-0264), indirizzo di lettura (/en/bbb/0264) e indirizzo del manifesto.

Ricerca per parole: Gallica dal suo servizio SRU (interfaccia vera), Vaticana ed e-codices dalle loro pagine di ricerca.

Correzione: le tre biblioteche non erano raggiungibili dal menu

Il motore di ricerca era completo e testato, ma il menu a tendina del pannello di scoperta filtra i provider su un elenco scritto a mano (READY_DISCOVERY_PROVIDERS) rimasto fermo a generic e archive_org da prima di questa catena — nessun commit precedente lo toccava. Risultato: Vaticana, Gallica ed e-codices non comparivano mai come opzione selezionabile, quindi la ricerca vera non era raggiungibile da nessuna schermata, a prescindere da quanto fosse corretto il backend.

Aggiunte le tre chiavi mancanti all'elenco. Non si è usato il campo supportsSearch già esposto dal backend per pilotare il menu, perché è dichiarato vero anche per le nove biblioteche che non cercano ancora (dichiarazione preesistente, fuori scopo di questa PR) — usarlo avrebbe mostrato in menu anche provider che restituiscono sempre zero risultati.

Una decisione che vale la pena leggere

Il riconoscimento dichiara quanto è sicuro. Su Gallica una parola qualsiasi di sei lettere somiglia a un identificativo valido: trattarla come tale porterebbe a un manifesto inesistente invece che ai risultati. Perciò le biblioteche che cercano prima usano solo i riconoscimenti inequivocabili, e quello incerto resta come ultima risorsa quando la ricerca non ha trovato niente.

Note tecniche

  • riferimento di comportamento: Scriptoria, resolvers/{vatican,gallica,ecodices}.py e i rispettivi search/. Riscritti in Rust senza aggiungere librerie di regex o di parsing HTML: le forme da riconoscere sono poche e fisse;
  • gli indirizzi dei servizi di ricerca sono un valore iniettabile, così le prove li puntano a un server finto: 18 test nuovi, tutti offline;
  • il riconoscimento di Internet Archive è passato nello stesso modulo degli altri, senza cambiare comportamento;
  • le altre nove biblioteche restano come sono: indirizzo completo, come prima. Per loro non è cambiato niente.

Da testare

  1. Nel menu del pannello di scoperta, verifica che Vaticana, Gallica ed e-codices compaiano come opzioni selezionabili (prima di questo fix non c'erano).
  2. Vaticana per segnatura: scrivi Urb. lat. 1779 → si apre la scheda del manoscritto. Prova anche urb-lat-1779 e Urblat1779: stesso risultato.
  3. Vaticana per parole: scrivi vergilius → arrivano risultati dal catalogo della biblioteca, ognuno apribile e aggiungibile.
  4. Gallica per titolo: scrivi heures → arrivano risultati, con titolo, autore e data quando la biblioteca li dichiara.
  5. Gallica per identificativo: incolla un indirizzo Gallica in qualunque forma → si apre direttamente l'opera.
  6. e-codices: prova bbb-0264 e poi una parola come graduale.
  7. Le altre biblioteche: con l'indirizzo completo funzionano come prima; con una parola libera continuano a non trovare niente (è il lavoro che resta).
  8. Ricerca ripetuta: la stessa ricerca fatta due volte non ripassa dalla biblioteca (risultato conservato), e il comando di aggiornamento la rifà davvero.

Suite backend verde al momento del commit di funzione: 452 test (18 nuovi), clippy e formattazione puliti. Il fix del menu è un cambiamento frontend isolato, verificato con i 6 test esistenti del pannello di scoperta (nessuno richiedeva aggiornamento).

Issue

Parte di #397: copre tre dei provider candidati (Vaticana e Gallica in P2, e-codices in P2, secondo la tabella dell'issue). Gli altri restano da fare, quindi l'issue non si chiude. Non tocca #395 (ricerca simultanea su più biblioteche), che è un lavoro diverso.

Review risolta

  • e-codices cercava a vuoto: si dichiarava «solo riconoscimento», quindi la sua ricerca esisteva e non veniva mai chiamata. Ora la segnatura composta si riconosce come prima e tutto il resto passa dalla ricerca. C'è la prova che lo copre.
  • I titoli si troncavano alla prima e commerciale: la risposta arriva spezzata in più pezzi e si teneva solo il primo. Ora il testo si accumula e le entità si sciolgono, come già si fa per i documenti Word.
  • La copertina dava per scontata la parte numerica dell'identificativo Gallica: con un valore diverso si sarebbe aperta l'opera giusta con la copertina di nessuno. Ora si legge dall'identificativo.
  • Il riconoscimento di Gallica cercava in una stringa e tagliava in un'altra: regge finché sono lunghe uguali, e smette alla prima lettera accentata nell'indirizzo. Ora si lavora su una sola stringa.
  • Le tre biblioteche non erano raggiungibili dal menu di scoperta: il backend cercava correttamente ma nessuna interfaccia poteva chiamarlo con quel provider (v. sezione dedicata sopra).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Ci sono bug bloccanti/di correttezza (es. e-codices configurata SearchMode::Direct quindi la keyword search non parte, parsing ARK/thumbnail e unescape SRU) che possono impedire o degradare la ricerca reale descritta nella PR.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Questa PR completa il lavoro di “discovery” IIIF aggiungendo riconoscimento offline (segnature/ID/URL → manifest) e ricerca reale (keyword → risultati) per Vaticana, Gallica ed e-codices nel backend Tauri/Rust, con aggiornamenti di documentazione e architettura per riflettere il nuovo comportamento.

Changes:

  • Introdotti nuovi moduli Rust per resolver offline (strength strong/weak) e search per-provider (Gallica SRU XML; Vaticana/e-codices via pagine HTML).
  • Aggiornata la pipeline di discovery per usare riconoscimento + ricerca in base a SearchMode, con caching e gating già esistenti.
  • Aggiornate guide utente (IT/EN) e documentazione dev (ARCHITECTURE/ROADMAP) per descrivere input accettati e strategia “SearchFirst”.
File summaries
File Description
src-tauri/src/iiif/search.rs Nuova implementazione ricerca per Gallica/Vaticana/e-codices con parsing XML/HTML e test mirati offline.
src-tauri/src/iiif/resolvers.rs Nuovo resolver offline per Vaticana/Gallica/e-codices + Internet Archive, con strength strong/weak e test.
src-tauri/src/iiif/mod.rs Esporta i nuovi moduli resolvers e search.
src-tauri/src/iiif/discovery.rs Integra resolver+search nella discovery, introduce SearchEndpoints iniettabili e nuovi test.
docs/guides/library-discovery.md Guida IT aggiornata: cosa accetta ciascuna biblioteca e comportamento della ricerca.
docs/en/guides/library-discovery.md Guida EN aggiornata in parallelo alla IT.
docs-dev/ROADMAP_2_0.md Aggiornata data e backlog relativo al blocco Biblioteca/discovery.
docs-dev/ARCHITECTURE.md Documentata l’architettura “riconoscimento + ricerca” e la semantica strong/weak.
Review details
  • Files reviewed: 8/8 changed files
  • Comments generated: 4
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src-tauri/src/iiif/resolvers.rs Outdated
Comment on lines +162 to +164
let start = value.to_lowercase().find("ark:/")?;
let rest = &value[start + "ark:/".len()..];
let mut parts = rest.split('/');
Comment on lines +197 to +202
let identifier = record.identifier?;
let resolved = resolvers::resolve(ResolverKind::Gallica, &identifier)?;
let thumbnail = format!(
"https://gallica.bnf.fr/ark:/12148/{}.thumbnail",
resolved.doc_id
);
Comment thread src-tauri/src/iiif/search.rs Outdated
Comment on lines +153 to +157
let value = text.decode().map(|value| value.trim().to_string());
let Ok(value) = value else { continue };
if value.is_empty() {
continue;
}
Comment on lines +369 to +371
if matches!(provider.search_mode, SearchMode::Direct) {
return Ok(nothing());
}
@nikazzio
nikazzio force-pushed the feat/library-views-and-collections branch from b10318f to 4eb87a2 Compare August 30, 2026 11:47
@nikazzio
nikazzio force-pushed the feat/library-real-search branch from a8628e1 to 67d3155 Compare August 30, 2026 11:54
Fino a ora, di dodici biblioteche in elenco, solo Internet Archive cercava
davvero: per tutte le altre l'unico modo di arrivare a un'opera era incollare
l'indirizzo completo del manifesto, anche se il campo suggeriva una segnatura.

Ora tre biblioteche mantengono quella promessa.

- Riconoscimento: segnatura, identificativo o indirizzo diventano il manifesto
  senza toccare la rete. «Urb. lat. 1779», «urb-lat-1779» e «Urblat1779»
  portano allo stesso manoscritto; di Gallica si riconosce l'ARK ovunque stia
  nell'indirizzo; di e-codices sia la segnatura composta sia la pagina di
  lettura.
- Ricerca per parole: Gallica dal suo servizio SRU, Vaticana ed e-codices
  dalle loro pagine di ricerca.

Il riconoscimento dichiara anche quanto è sicuro. Su Gallica una parola
qualsiasi somiglia a un identificativo: trattarla come tale porterebbe a un
manifesto inesistente invece che ai risultati. Perciò le biblioteche che
cercano prima usano solo i riconoscimenti inequivocabili, e quello incerto
resta come ultima risorsa se la ricerca non trova niente.

Riferimento di comportamento: Scriptoria, resolvers e search delle tre
biblioteche. Riscritti qui senza aggiungere librerie di regex o di parsing
HTML: le forme da riconoscere sono poche e fisse.

Le altre nove biblioteche restano come sono: indirizzo completo, come prima.
…opertine sbagliate

Quattro osservazioni della review, verificate nel codice:

- e-codices si dichiarava «solo riconoscimento»: la sua ricerca esisteva e non
  veniva mai chiamata, quindi cercare una parola non dava mai niente. Ora la
  segnatura composta si riconosce come prima e tutto il resto passa dalla
  ricerca;
- il titolo si fermava al primo pezzo: una risposta con una e commerciale
  arrivava spezzata in più eventi, e «Heures & usages» diventava «Heures». Ora
  il testo di un campo si accumula e si consegna alla fine, con le entità
  sciolte come già si fa per i documenti Word;
- la copertina dava per scontata la parte numerica dell'identificativo Gallica:
  con un valore diverso si sarebbe aperta l'opera giusta con la copertina di
  nessuno. Ora si legge dall'identificativo;
- il riconoscimento di Gallica cercava in una stringa e tagliava in un'altra:
  finché sono lunghe uguali funziona, e smette alla prima lettera accentata
  nell'indirizzo, con un taglio a metà carattere. Ora si lavora su una sola
  stringa, con la prova che lo copre.
@nikazzio
nikazzio force-pushed the feat/library-views-and-collections branch from 4eb87a2 to 8b81295 Compare August 30, 2026 11:58
@nikazzio
nikazzio force-pushed the feat/library-real-search branch from 67d3155 to 029c4c9 Compare August 30, 2026 11:59
…aggiungibile dal menu

Il menu di scoperta filtrava i provider su un elenco scritto a mano che non
includeva le tre biblioteche appena collegate alla ricerca vera: la funzione
esisteva nel motore ma nessuna interfaccia poteva chiamarla con quel provider.
…i, Vaticana con sessione vera

Gallica cercava solo nel titolo (come il riferimento Scriptoria, corretto
anche lì): ora usa l'indice generale del sito, trova anche le opere dove il
termine compare come autore. Salvati e mostrati tutti i metadati che la
risposta della biblioteca porta già e prima si scartavano: altri
autori/traduttori, editore, diritti, descrizione fisica, fondo di
conservazione, collegamento al catalogo cartaceo — stesso contenitore dati
per tutte le fonti, vuoto per chi non li dichiara.

La ricerca libera sulla Vaticana falliva sempre: il sito rifiuta le
richieste che non sembrano un browser vero e non sono precedute da una
visita alla pagina normale del catalogo. Aggiunta l'una e l'altra. I
risultati di ricerca della Vaticana, poveri di dati (solo titolo e
copertina), si arricchiscono ora leggendo il manifesto di ciascuno — stesso
meccanismo che qualunque biblioteca povera di dati potrà riusare.

Corretta anche la sovrapposizione visiva nella scheda espansa dei risultati
di ricerca quando un'etichetta tradotta era più lunga del previsto.

Verificato che l'arricchimento extra non facesse uscire le prove automatiche
verso Internet vero (una regressione trovata e corretta durante questo
lavoro): l'indirizzo dei manifesti Vaticana è ora configurabile per le prove
come già lo erano gli indirizzi di ricerca.
…si come se dipendessero dal workspace attivo

Solo Traduzioni era riconosciuta come area globale (#210): entrando nelle
altre tre il titolo restava col nome del workspace da cui si veniva, e
cliccandoci sopra si tornava lì invece che alla radice dell'area. Ora tutte
e quattro le aree globali si comportano allo stesso modo.

Una prova esistente registrava il comportamento sbagliato come corretto:
corretta, aggiunte tre prove nuove (una per area globale).
Base automatically changed from feat/library-views-and-collections to main August 31, 2026 10:37
@nikazzio
nikazzio merged commit 93ecedd into main Aug 31, 2026
11 checks passed
@nikazzio
nikazzio deleted the feat/library-real-search branch August 31, 2026 10:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants