Repository navigation
Releases: PilaScat/cinema-watch
Releases · PilaScat/cinema-watch
Release list
v2026.10.9
Novità
- The Space Cinema: i 35 cinema del circuito entrano nella pagina Cinema, con regione e distanza, nella ricerca e nelle cacce. Programmazione, pianta e posti presi vengono dalle API del sito di The Space, e il pulsante Acquista apre lo spettacolo su thespacecinema.it. L'elenco dei cinema si aggiorna una volta a settimana.
Interno
- Ogni circuito ha un adapter in
src/circuits/; chiavi di spettacolo e di sala portano il circuito (space-…), e la pagina di uno spettacolo è/showings/<chiave>. I link già inviati su Telegram (/performances/…) portano alla pagina nuova; stato e storico passano da soli alla versione 2.
Commit
- feat(space): region from the postal code when the address has no province (2811f85)
- docs: The Space API, traps and changelog v2026.10.9 (fa37abb)
- feat(space): The Space in the web UI (77dd643)
- feat(space): The Space cinemas in hunts, catalog and search (d863c6e)
- feat(space): client and parsers for The Space (f3a393d)
- Docs: chiavi stringa, circuiti, migrazione dello stato e link Apri sala (e2200cc)
- Chiavi e circuiti: tipi a chiave, stato v2, registro dei circuiti, route /showings/:key (44d4495)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.9 (amd64, arm64)
v2026.10.8
Progetto
- La descrizione del progetto parla dei cinema italiani, con la copertura di oggi: UCI Cinemas e i cinema che vendono con Webtic.
- I testi della web UI non nominano più un circuito solo: la pagina Cinema dice "I cinema" e l'etichetta di ogni scheda ne indica il circuito; l'avviso della ricerca parla di "catalogo dei film".
- Badge OpenSSF Best Practices, livello passing (progetto 15670). Le risposte stanno in
docs/best-practices.mdescripts/best-practices-fill.mjscompila il modulo.
Commit
- Backlog: Scorecard 7,7 col lavoro a pull request, testi generali fatti (4e2a7ef)
- Docs: testi generali sui cinema e sui circuiti (7c32416)
- UI: testi che non nominano un circuito solo (9ab504a)
- Docs: su main si entra con una pull request, CI verde e merge con rebase (1eb315a)
- ESLint: globali del browser per lo script e2e, che esegue funzioni nella pagina (54beedb)
- e2e: i dati passano come argomenti a Runtime.callFunctionOn, non dentro il codice (e6b8e03)
- Backlog: descrizione del progetto fatta, restano testi della UI, docs e circuiti (51c1099)
- Badge OpenSSF Best Practices passing nel README, backlog e CHANGELOG v2026.10.8 (c3ab3a3)
- Best Practices: know_secure_design e know_common_errors valutati da Filippo (ed49eb2)
- Best Practices: dati del progetto 15670 e script che compila il modulo (52c2eaa)
- Descrizione: cacce ai biglietti dei cinema italiani, con la copertura di oggi (d4c2b08)
- Docs: Release completata a mano se fallisce solo l'ultimo job, nome del file della provenienza (96cd237)
- Release: nome del file della provenienza con i due punti, come lo scrive gh su Linux (10e880e)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.8 (amd64, arm64)
v2026.10.7
Progetto
- Ogni Release allega la provenienza firmata dell'immagine,
cinema-watch-<tag>.intoto.jsonl. LICENSEcontiene il solo testo MIT; le note delle parti di terzi passano inNOTICE, copiato anche nell'immagine.- README con la sezione "Cosa fa", un riassunto in inglese, screenshot nuovi e la sezione Contribuire; nuovo
CONTRIBUTING.md.
Commit
- Backlog: tutti i cinema italiani, a partire da The Space (fb78985)
- Docs: risposte al questionario Best Practices, backlog, CHANGELOG v2026.10.7 (4bada50)
- README: Cosa fa, riassunto in inglese, screenshot nuovi, Contribuire; CONTRIBUTING.md (9ab8fd0)
- Release: provenienza firmata allegata a ogni Release (4da03de)
- Licenza: LICENSE col solo testo MIT, note di terzi in NOTICE (8c4c319)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.7 (amd64, arm64)
v2026.10.6
Novità
- Annullo da Telegram: dopo Silenzia 24 h il bot manda "silenziata fino alle HH:MM" con il pulsante Riattiva, e dopo Acquistato "caccia archiviata" con il pulsante Ripristina. Valgono solo dalla chat principale. Se le date fisse della caccia sono finite, Ripristina non la riattiva e rimanda alla pagina della caccia.
Commit
- Docs: annullo da Telegram, CHANGELOG v2026.10.6 (d3515b4)
- Telegram: Riattiva dopo Silenzia e Ripristina dopo Acquistato (07b9c61)
- Mutation anche su webtic-direct.ts e venues.ts (1470e3a)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.6 (amd64, arm64)
v2026.10.5
Novità
- Cinema Webtic: oltre a UCI, l'app segue i cinema che vendono con Webtic, fra cui Notorious, Cinelandia, Movie Planet, Starplex e molti indipendenti. Compaiono nella pagina Cinema con l'etichetta Webtic, per regione o per distanza da casa, e si scelgono nel form della caccia come quelli UCI.
- Le cacce sui cinema Webtic funzionano come quelle UCI: nuovi spettacoli, posti liberati, ultimi posti, annullati e spostati, con la pianta della sala su Telegram. "Acquista" apre lo spettacolo su Webtic dopo il login.
- La pagina Cerca trova anche i film proiettati solo nei cinema Webtic, e "Cinema con …" elenca i cinema dei due circuiti. I film dei cinema Webtic seguiti da una caccia si aggiornano a ogni giro.
- Il formato Infinity Vision vale anche per Webtic, dove l'edizione sta nel titolo.
- L'elenco dei cinema Webtic si aggiorna una volta a settimana in background. Al primo avvio la pagina Cinema avvisa che il controllo è in corso e mostra i cinema man mano che li trova.
Commit
- Docs: film Webtic aggiornati dai giri delle cacce (9ff45f5)
- Cerca: i film dei cinema Webtic si aggiornano coi giri delle cacce (2a47c16)
- CHANGELOG: la sezione dei cinema Webtic è v2026.10.5 (a706f45)
- Docs: cinema Webtic, CHANGELOG v2026.11.1 (65beea9)
- Web UI: cinema Webtic in Cinema, Cerca, form e pagina dello spettacolo (1e8408e)
- Cacce e servizi sui cinema Webtic, controllo delle sedi nel watcher (e38aa1c)
- Controllo settimanale dei cinema Webtic (f2807c1)
- Webtic diretto: client per sedi, programmazione, pianta e occupazione (9a9e357)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.5 (amd64, arm64)
v2026.10.4
Novità
- Distanza da casa: nelle Impostazioni, sezione Casa e distanza, si imposta la posizione di
casa (incollando "lat, lon" da Google Maps, oppure con "Usa la mia posizione" quando l'app è
aperta in HTTPS) e un raggio massimo facoltativo. - Con la casa impostata, la pagina Cinema e i cinema di un film nella pagina Cerca sono ordinati
dal più vicino con i km accanto; quelli oltre il raggio si vedono con "Mostra anche i lontani".
Nel form della caccia i cinema vicini stanno in un gruppo "Vicino a casa" in cima. - La configurazione passa alla versione 2: le configurazioni salvate ed esportate prima si
aggiornano da sole.
Commit
- Backlog: README e punteggio OpenSSF Scorecard da migliorare (e445bac)
- Docs: casa e distanza, CHANGELOG v2026.10.4 (6548c3f)
- e2e: casa salvata dalle Impostazioni e cinema ordinati per distanza (6b9de0f)
- Pagina Cinema: descrizione giusta quando l'ordine è per distanza (eba2885)
- Cinema, Cerca e form della caccia ordinati per distanza da casa (fcc43a6)
- Distanza: coordinate dei cinema UCI e calcolo dei km (fcf4efb)
- Impostazioni: casa e raggio massimo (configurazione v2) (e4112c0)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.4 (amd64, arm64)
v2026.10.3
Novità
- Cerca senza il titolo esatto: la pagina Cerca usa il catalogo UCI e trova i film anche da
una parte del titolo ("avenger", "dun parte") o con un piccolo errore di battitura
("avangers"). Mostra i risultati con locandina, formati e date; cliccando un film si vedono i
cinema che lo proiettano. Se il catalogo non risponde, si cerca il titolo esatto come prima. - Formato Infinity Vision nelle cacce: segue tutte le sale Infinity Vision (XL, 2D, iSense,
ScreenX) e non quelle normali. Il formato XL continua a prendere anche l'XL Infinity Vision.
Commit
- Docs: catalogo UCI, edizione dei formati e CHANGELOG v2026.10.3 (ca82fb1)
- e2e: ricerca con una parte del titolo e cinema del film scelto (c953dad)
- Pagina Cerca: film da una parte del titolo, anche con un refuso (82781e1)
- Catalogo UCI e ricerca dei film senza il nome esatto (f2db46c)
- Formato Infinity Vision: l'edizione della sala come formato della caccia (2f3c5e8)
- Template Unraid: --restart=unless-stopped (113b18c)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.3 (amd64, arm64)
v2026.10.2
Correzioni
- I form della web UI aperta da
http://IP:portarispondevano "Forbidden": con
Referrer-Policy: no-referreril browser mandavaOrigin: nulle il controllo CSRF li
rifiutava. Ora la policy èsame-origin: il referrer resta nascosto ai siti esterni. - Il messaggio d'errore giornaliero su Telegram rispetta Silenzia 24 h.
- Senza token il riepilogo delle 20:00 non si ritenta più ogni 30 secondi riempiendo il log.
Cross-Origin-Opener-Policysolo quando la pagina arriva in HTTPS: dahttp://IPil browser
lo ignorava e lo segnalava in console.
Novità
- Ripristina per le cacce archiviate, fra le Archiviate e nella pagina della caccia. Se le
date fisse sono finite, chiede prima le date nuove.
Sicurezza
- Anche le chiamate a Telegram passano dalla guardia di uscita: solo HTTPS verso gli host
consentiti, nessun redirect seguito. - Il rilascio scansiona con Trivy l'immagine pubblicata di ogni piattaforma, arm64 compresa.
- Dependabot aspetta 7 giorni prima di proporre una versione nuova (gli aggiornamenti di
sicurezza restano immediati) e non propone le major di TypeScript e di Node. SECURITY.mdcon il link diretto alla segnalazione privata e la divulgazione coordinata.
Interno
watcher.tsdiviso: regole, registro, piante e manutenzione in moduli di funzioni pure, con
test diretti dei casi limite.hunts.tsxdiviso in form, schede di stato e pagina della zona.- Regex e chiavi comuni in
keys.ts;huntByIdetelegramConfigurednel watcher.
Commit
- Docs: Ripristina con le date finite (eb02c73)
- Rilascio: Trivy senza il token in variabili d'ambiente (f27ec6a)
- Watcher: giorno del riepilogo fissato prima dell'invio; log della release senza tag (7315824)
- Ripristina con le date finite: prima le date nuove, poi la caccia torna attiva (4f7e563)
- CHANGELOG v2026.10.2 e backlog svuotato (f3e89b4)
- e2e: salvataggio delle Impostazioni dal form (d2899e1)
- Test diretti delle regole del watcher, del registro e della manutenzione (24feeec)
- Watcher: regole, registro, piante e manutenzione in moduli loro (d61dfa3)
- Web: hunts.tsx diviso in form, stato e pagina della zona (7fa2d0f)
- Uscite: anche Telegram passa dalla guardia di http.ts (f59e79a)
- SECURITY.md: link diretto alla segnalazione e divulgazione coordinata (d985ebd)
- Rilascio: Trivy anche sull'immagine pubblicata di ogni piattaforma (841de67)
- Cacce archiviate: pulsante Ripristina (c9c2f8d)
- Chiavi e regex in keys.ts; huntById e telegramConfigured nel watcher (1c1c60e)
- Web: Cross-Origin-Opener-Policy solo quando la pagina arriva in HTTPS (5d72de7)
- Watcher: niente errore su Telegram a caccia silenziata; riepilogo solo col token (0e077c9)
- Dependabot: cooldown di 7 giorni e major di TypeScript ignorate (aef66d4)
- Docs: trappola del Referrer-Policy, backlog e CHANGELOG v2026.10.2 (72efa80)
- Web: Referrer-Policy same-origin, i form da http://IP non danno più Forbidden (8de6fba)
- Backlog: i due punti migliorabili di Scorecard (7/10) (63e785b)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.2 (amd64, arm64)
v2026.10.1
Primo rilascio.
Cacce
- Più cacce attive insieme, ognuna su uno o più cinema UCI, qualunque formato di sala, date fisse
o prossimi N giorni, con filtri facoltativi per orario, giorni della settimana e lingua. - Film scelto dal menu della programmazione, per slug quando non è ancora in programmazione, o per
parole del titolo con conferma di ogni film trovato. - Zona buona relativa (file e centro in percentuale) o ritoccata per sala cliccando sulla pianta,
con il numero di posti vicini richiesti. Se la pianta di una sala cambia, la zona ritoccata va
riconfermata. - Intervallo predefinito e per caccia, fascia silenziosa, ritardo casuale, cache condivisa fra le
cacce.
Avvisi su Telegram
- Nuovi spettacoli, posti liberati (con pausa di 30 minuti), ultimi posti (con soglia e isteresi),
spettacoli annullati o spostati, film comparsi, riepilogo giornaliero. - Le piante dei migliori spettacoli in un album, poi un riepilogo con Acquista, Apri sala,
Aggiorna ora, Silenzia 24 h e Acquistato. Migliori posti liberi e prezzo da in ogni messaggio. - Comando
/aggiorna, chat aggiuntive per caccia, code con i limiti di Telegram. - "Invia prova" verifica che Telegram accetti l'URL pubblico come pulsante; se no, i link vanno
nel testo. - Token e chat dalle Impostazioni o dalle variabili d'ambiente.
Web UI
- Cacce, cinema, ricerca di un film, programmazione, pagina dello spettacolo con la pianta dal
vivo e l'andamento dei posti, registro, impostazioni con esporta e importa. - Tema chiaro, scuro o automatico; installabile come PWA dietro HTTPS; password facoltativa.
/api/statusper il widget di Homepage e/healthper il controllo del container.
Container e sicurezza
- Immagine
ghcr.io/pilascat/cinema-watchper amd64 e arm64, utente 99:100, compatibile con
--read-onlye--cap-drop=ALL, con SBOM, provenance e attestazione. - CSP con nonce, CSRF, blocco dopo 5 tentativi di accesso, token mai nella pagina, nei log o
nell'esportazione senza token.
Commit
- Backlog: test di watcher.ts dopo la divisione (mutation 80%) (eb10481)
- Backlog dei prossimi rilasci (54cec1e)
- Test: host confrontati per hostname e tag script senza regex (b3fc091)
- Accesso: confronto della password con scrypt invece di SHA-256 (faf1233)
- Rilascio e Dependabot: tag stretto, latest solo dal tag, Node major ignorato (b28cd24)
- Smoke: film già in sala oggi e prossimi 14 giorni, senza date fisse (fc85cbb)
- Deploy: il template non sovrascrive i valori di Unraid; rete bridge (52b84f2)
- Avviso di versione: confronto dei tre numeri (7476d8e)
- operations.md: Acquistato anche dalla pagina della caccia (8b67ef1)
- CHANGELOG: note della v2026.10.1 (be0a451)
- README e docs per chi installa: API, Telegram, Homepage, operazioni (c87d651)
- Pagina della caccia: pulsante Acquistato (3182593)
- Avvisi: migliori posti anche per nuovi spettacoli e ultimi posti (00b5c44)
- Invia prova verifica che Telegram accetti l'URL pubblico (e6bf077)
- Pianta cambiata: la zona ritoccata della sala va riconfermata (36a88f4)
- Riepilogo e Nessuna novità: migliori posti e prezzo sotto ogni caccia (a49ab09)
- Rilascio: sezione del CHANGELOG trovata col tag esatto (527f0fa)
- Watcher: consegna per chat principale, errori redatti, giorni leggibili (c3619d6)
- Telegram: su un 400 i link vanno nel testo e i comandi restano (bf62bf4)
- Testi di validazione e di archivio raccolti in copy (65f6fb0)
- Avvisi: gli spettacoli di un giorno già controllato e vuoto avvisano (5a09110)
- Deploy su Unraid: template e script (e9ea142)
- Workflow: CI, CodeQL, Scorecard e rilascio; Dependabot sulle immagini (6908ddd)
- Immagine Docker multi-stage e smoke del container (b014544)
- Bot: l'arresto non aspetta l'attesa del riprovo (42f2e17)
- Caccia: film scelto dal menu della programmazione (ac0bda7)
- Impostazioni: token e chat dalle variabili d'ambiente (67b69c4)
- Limite dei test a 15 s; ESLint ignora i file scratch (a0fd806)
- Test dei casi limite di web UI, watcher, bot, Telegram e stato (fbdd4a5)
- Prova end-to-end della UI con Edge headless (da9dd5a)
- Web UI: cacce, zona sulla pianta, registro e impostazioni (47a0f29)
- Web UI: cinema, programmazione, ricerca e pagina dello spettacolo (8426aa2)
- Invia ora su Telegram, colori del grafico, programmazione completa nei test (032b1ab)
- Server: web UI sulla porta 8790 (b909ff5)
- Web UI: fondamenta, tema, sicurezza e pagina delle cacce (34d051e)
- Watcher: servizi per la web UI (856e82e)
- Logo (biglietto) e icone (1ab0620)
- Test: niente token Telegram letterali nel repo (d53e4c7)
- Errori di lettura spiegati in italiano; decisioni sugli avvisi nei docs (9da58a6)
- Bot: ripresa dopo un 409, offset per token, risposta subito ai pulsanti (ff2a77b)
- Telegram, compositore, store e guardia dei testi: correzioni della revisione (140b24e)
- Config e stato: una sola copia per contenuto, copia di uno stato più nuovo (5ee926f)
- Watcher: un'operazione alla volta, avvisi che non si perdono, errori isolati (d483296)
- diffRound e runner: niente annullati falsi, spostati sulla stessa chiave, giorni nuovi in silenzio (99048ba)
- Vitest 4 per far funzionare Stryker (7b8a756)
- Piante a 1280 px per Telegram; test dei tempi solo su Linux (d8d6921)
- Test del tempo di disegno saltato dentro Stryker (aa76a90)
- Test live delle API e mutation testing con Stryker (f445a14)
- Avvio del servizio e prova a secco (--dry-run) (3c55b0f)
- Bot Telegram: /aggiorna, pulsanti e polling (9679f00)
- Watcher: giri programmati e a mano, avvisi, registro e andamento (297b3f1)
- Configurazione: schema stretto, default, import/export, caricamento (d80cbae)
- Logger JSON con redazione dei segreti (ea3a77a)
- Store su file: scrittura atomica con fsync e mutex per file (841f599)
- Mondo finto per i test end-to-end: UCI, Webtic, Telegram e GitHub (3c4ca37)
- Compositore dei messaggi, formatter e testi Telegram (6c25da2)
- Trasporto Telegram: code per chat, limiti, retry e timeout (31078d8)
- ESLint: ignora i campi tolti con il rest; diffRound passa il lint (15018af)
- Cuore degli avvisi: diffRound da un giro agli eventi (51ab852)
- Pianta della sala in SVG e PNG con i font del repo (acad98c)
- Analisi dei posti: zona buona, posti vicini, migliori posti (1395098)
- Client Webtic: spettacolo, pianta in cache 7 giorni, occupazione (0e63d4b)
- Cache TTL con LRU e richieste deduplicate (36138a1)
- Programmazione UCI: cinema, film, spettacoli e filtri (79e60b2)
- Date nel fuso Europe/Rome con Intl (fa7d2e2)
- Client HTTP: host consentiti, timeout, backoff e coda per host (082cd4e)
- Tipi di dominio ed errori tipizzati (eec7ccb)
- Fixture vere di UCI e Webtic (15-16/10/2026) (bf9a36d)
- Impalcatura: TypeScript, Vitest, ESLint, guardie e licenze (908dbe0)
Immagine: ghcr.io/pilascat/cinema-watch:v2026.10.1 (amd64, arm64)