Web App

Mediateca.Manager

Online PersonaleImmagine Docker

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.

2progetti uniti in uno
3supporti video in tre bit
2sincronizzazioni con Plex in un servizio

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

Un riepilogo al mese, solo per le sezioni che scegli

Le sezioni da ricevere

Ti arriva un'email per confermare. Niente tracciamento, ti disiscrivi con un clic. Privacy