Tiene il conto di film, serie e dischi che abbiamo in casa, su qualunque supporto: il DVD e il Blu-ray sullo scaffale, il CD e il vinile, la copia sul server di casa. I metadati arrivano da TMDB per film e serie, da Discogs e MusicBrainz per la musica. La libreria digitale si sincronizza da sola con Plex, e ognuno in casa ha i suoi voti e i suoi preferiti.
Perché esiste. La stessa collezione stava in tre posti che non si parlavano, e davanti a un titolo in negozio non sapevo dire se ce l'avevo già, e in che forma. Un foglio di calcolo quella domanda la regge finché le righe sono cento.
Da due progetti a uno. Fino a novembre 2026 erano due: Videodrome per film e serie, HiFi per i dischi. Il codice era quasi lo stesso, ma a ogni modifica i due prendevano strade diverse e ogni miglioria andava fatta due volte. Mediateca tiene un solo nucleo, e la musica ci è entrata come modulo, portata così com'era invece che riscritta: spostarla nelle tabelle comuni voleva dire rifare quasi tutte le query, con molto rischio e nessun guadagno.
I supporti sono bit, ma non per i dischi. Per film e serie la risposta da manuale sarebbe una tabella di collegamento fra titoli e supporti. Ma i supporti sono tre e non cambiano, e con i bit la domanda «quali ho in Blu-ray» diventa un confronto invece di una giunzione. Per la musica vale il contrario: un disco non è un attributo dell'album ma una copia, di un'edizione precisa, con il suo formato e il suo numero di catalogo. Lì una riga per copia è la scelta giusta. Il digitale invece resta un attributo: se l'album è su Plex, c'è per tutta la casa.
Plex manda, il catalogo non va a chiedere. Un servizio sul NAS legge la libreria ogni ora e, se è cambiata, la spedisce all'API, film e serie da una parte e musica dall'altra. I titoli nuovi finiscono in coda per i metadati, così la richiesta risponde subito. L'abbinamento è per identificativo TMDB o MusicBrainz e non per titolo, perché lo stesso film sul disco si chiama in venti modi diversi. Una sincronizzazione che toglierebbe di colpo molti film viene rifiutata: è più probabile una sezione di Plex vuota per errore che una collezione svuotata davvero. Per la musica il resto passa e si saltano solo le rimozioni.
Cosa è stato tolto con l'unione. Le liste dei desideri, i prestiti, lo stato visto o da vedere con gli episodi, le condizioni dei dischi: cose che in casa non usava nessuno. Le note private sono diventate un commento che vede tutta la casa, ma quelle vecchie non sono state convertite, perché chi le aveva scritte non pensava a un pubblico. Ogni rimozione è una migrazione, e prima di ognuna il database si copia da solo.
Piattaforma
- Backend
- .NET 10, ASP.NET Core, Entity Framework Core
- Frontend
- Angular 22 senza librerie di componenti, CSS scritto a mano, prima il telefono, installabile
- Database
- SQLite in WAL, migrazioni applicate all'avvio dopo una copia del file; se la copia fallisce, l'avvio si ferma
- Confezionamento
- un container per API e interfaccia, build a tre stadi, utente non-root, al massimo 2 CPU e 1 GB
Catalogo
- Film e serie
- una classe astratta e due sottoclassi
- Musica
- album, edizioni e copie, nelle tabelle portate da HiFi così com'erano
- Supporti video
- tre bit di un numero: DVD 1, Blu-ray 2, Plex 4
- Supporti musica
- un formato per edizione: CD, LP, 7 e 10 pollici, cassetta, cofanetto; Plex sta sull'album
- Viste
- griglia o elenco, filtri per formato, tag e genere, ricerca e filtri nell'indirizzo, selezione multipla
- Ricerca
- una sola, su film, serie e musica insieme
- Aggiunta dei dischi
- codice a barre letto dal telefono, numero di catalogo, ricerca nelle fonti o a mano
Casa
- Per persona
- preferito e voto da 1 a 5, sul server
- Commento
- uno per titolo e persona, visibile a tutta la casa
- Consigliati
- i titoli che agli altri sono piaciuti, con un voto da 4 in su, e che io non ho ancora votato
- Notifiche
- in tempo reale con Server-Sent Events, e Web Push sul telefono raggruppate per persona e tipo
Servizi esterni
- TMDB
- ricerca e metadati in italiano per film e serie, tre tentativi sugli errori transitori, cache di dieci minuti
- Discogs e MusicBrainz
- interrogati in parallelo per la musica, Discogs come fonte principale; copertine anche da Cover Art Archive, ridotte in WebP
- Plex
- un servizio in Python sul NAS legge la libreria ogni ora e la manda solo se è cambiata, video e musica separati
- Protezione
- video: una sezione vuota, o che toglierebbe più di 5 titoli e più del 10%, viene rifiutata; musica: si accetta, ma le rimozioni si saltano
Accesso
- Sessione
- cookie con scadenza scorrevole di sette giorni, sessioni registrate sul server: Esci chiude davvero
- CSRF
- token su header a ogni richiesta che scrive
- Limiti di frequenza
- 300 al minuto a persona, 30 sulla sincronizzazione, 5 su login e cambio password
- Login
- dopo 5 errori una pausa di un minuto, che raddoppia fino a 15
Rilascio
- Pipeline
- quattro stadi: test bloccanti, build e push, aggiornamento via SSH, promozione a latest
- Immagini
- Docker Hub, tag con lo SHA del commit; latest si sposta solo dopo un rilascio sano
- Verifica
- healthcheck del container, con i log in chiaro se non diventa verde
- Ritorno indietro
- automatico: se l'healthcheck non diventa verde torna l'immagine sana di prima
Stack
- Tecnologie
- C#.NETAngularSQLitePythonTMDBDiscogsMusicBrainzWeb Push
