cinema-watch
Docker app from PilaScat's Repository
Overview
Readme
View on GitHubCinema Watch
Cacce ai biglietti dei cinema italiani, con avvisi su Telegram e la pianta della sala.
Cosa fa
- Cacce: un film (anche non ancora in programmazione, cercato per titolo), uno o più cinema, i formati di sala (IMAX, XL, Infinity Vision…) e le date, con filtri facoltativi per orario (anche diverso per ogni giorno della settimana), giorni della settimana e lingua.
- Avvisi su Telegram: nuovi spettacoli, posti liberati, ultimi posti, spettacoli annullati o spostati, con la pianta della sala e i migliori posti liberi.
- Zona buona: le file e i posti che vanno bene, relativi alla sala o fissati cliccando sulla pianta, con il numero di posti vicini richiesto.
- Pulsanti nel messaggio: Acquista, Apri sala, Aggiorna ora, Silenzia 24 h e Acquistato, con Riattiva e Ripristina per tornare indietro;
/aggiornarilegge tutte le cacce. - Cinema: UCI Cinemas, i 35 The Space Cinema, circa 300 cinema che vendono con Webtic (Notorious, Cinelandia, Movie Planet e molti indipendenti) e i cinema 18Tickets, ordinabili per distanza da casa; un cinema 18Tickets che manca si aggiunge nelle Impostazioni.
- Web UI: cacce, programmazione, pagina dello spettacolo con la pianta dal vivo e l'andamento dei posti, ricerca di un film anche con un errore di battitura; si installa come app dietro HTTPS.
La pianta su Telegram, le cacce e i cinema per distanza da una casa d'esempio a Milano.
Stack
- Node 24 e TypeScript
- Hono, con JSX lato server
- Tailwind v4, compilato in fase di build
- resvg per i PNG delle piante
- zod per validare configurazione e risposte delle API
- dati in file JSON e JSONL, nessun database
- immagine
ghcr.io/pilascat/cinema-watchper amd64 e arm64, circa 157 MB, utente 99:100, compatibile con--read-only; a riposo il processo usa circa 50 MiB di memoria propria (misurati su Unraid il 18/10/2026;docker statsmostra di più perché conta anche la cache dei file)
Avvio rapido
Su Unraid
- Aprire la scheda Apps, cercare
cinema-watche premere Install. - Il template propone già la cartella dei dati
/mnt/user/appdata/cinema-watchePUID99 /PGID100: basta premere Apply.
I dettagli (percorso, proprietario, rete) sono in docs/operations.md.
Con Docker
docker run -d --name cinema-watch \
-p 8790:8790 \
-v /percorso/dati:/data \
-e PUID=1000 -e PGID=1000 \
--read-only --tmpfs /tmp \
--security-opt=no-new-privileges \
--restart unless-stopped \
ghcr.io/pilascat/cinema-watch:latest
PUID e PGID sono l'utente e il gruppo a cui va la cartella dei dati (id li mostra; su Unraid 99 e 100). All'avvio il container dà loro la cartella e fa girare l'app con quell'utente, quindi non serve nessun chown a mano.
Con Docker Compose
Il file docker-compose.yml è un esempio con le stesse opzioni, con i dati in ./data:
mkdir cinema-watch && cd cinema-watch
wget https://raw.githubusercontent.com/PilaScat/cinema-watch/main/docker-compose.yml
docker compose up -d
Se id non dà 1000, prima dell'avvio vanno cambiati PUID e PGID nel file.
Primi passi
- Aprire
http://IP:8790. - In Impostazioni, sezione Telegram, inserire il token del bot e la chat principale (come ottenerli), salvare e premere Invia prova.
- Premere Aggiungi caccia e compilare film, cinema, formati e date.
- Facoltativo: in Impostazioni, sezione Casa e distanza, impostare la posizione di casa ("lat, lon" da Google Maps, oppure "Usa la mia posizione" aprendo l'app in HTTPS) e un raggio massimo. Cinema, ricerca e scelta dei cinema nelle cacce si ordinano allora per distanza.
Sviluppo in locale
npm ci
npm run build
DATA_DIR=./data node dist/server.js
I quattro controlli da far passare prima di consegnare:
npm test
npx tsc --noEmit
npm run lint
npm run build
Altri comandi:
node dist/server.js --dry-runesegue un giro contro le API vere. Messaggi e piante finiscono inDATA_DIR/dry-rune non viene inviato nulla a Telegram.sh scripts/smoke.shprova il container: immagine, avvio in sola lettura,PUID/PGID, route, permessi, arresto, giro a secco. Il dettaglio è in docs/operations.md.
Rilascio e deploy
Un rilascio è un tag annotato vAAAA.MM.N, che fa partire release.yml: verifica, scansione, immagini amd64 e arm64, attestazione e Release su GitHub. Su Unraid si installa con il template cinema-watch.xml del repo unraid-templates. Tutti i passaggi sono in docs/operations.md.
Variabili d'ambiente
| Variabile | Predefinito | Significato |
|---|---|---|
PUID |
99 |
Utente a cui va la cartella dei dati e con cui gira l'app. |
PGID |
100 |
Gruppo a cui va la cartella dei dati e con cui gira l'app. |
PORT |
8790 |
Porta della web UI. |
DATA_DIR |
/data |
Cartella di configurazione, stato, piante, andamento e registro. |
UI_PASSWORD |
vuota | Password della web UI. Vuota: nessuna password. |
TRUST_PROXY |
vuota | Con 1 l'app si fida di X-Forwarded-For per il blocco dei tentativi di accesso per IP. Serve solo con la password. |
TELEGRAM_TOKEN |
vuota | Token del bot. Vale solo se il campo nelle Impostazioni è vuoto. |
TELEGRAM_CHAT_ID |
vuota | Chat principale. Vale solo se il campo nelle Impostazioni è vuoto. |
Le Impostazioni mostrano quando token o chat arrivano dall'ambiente.
Limiti
- Funziona con UCI Cinemas, The Space Cinema e i cinema che vendono i biglietti con Webtic o 18Tickets; altri circuiti no.
- I cinema 18Tickets non hanno coordinate e vanno in fondo all'ordine per distanza.
- L'elenco dei cinema Webtic si aggiorna con un controllo settimanale: al primo avvio si completa in circa mezz'ora.
- Le API usate sono pubbliche ma non ufficiali e possono cambiare senza preavviso.
- I posti si leggono senza login.
- L'acquisto resta a mano: il login UCI ha Cloudflare e captcha, Webtic, The Space e 18Tickets chiedono l'account, e l'app non li tocca.
Documentazione
| File | Argomento |
|---|---|
| docs/MEMORY.md | Decisioni e trappole del progetto. |
| docs/api.md | API di UCI e Webtic usate, API esposte dall'app. |
| docs/telegram.md | Bot, chat, avvisi, pulsanti e limiti di invio. |
| docs/homepage.md | Widget per gethomepage. |
| docs/operations.md | Deploy, aggiornamenti, backup, rilascio e smoke test. |
| docs/UI-COPY.md | Regole per i testi visibili. |
| docs/backlog.md | Cosa resta da decidere o da fare nei prossimi rilasci. |
| docs/best-practices.md | Risposte al questionario OpenSSF Best Practices. |
| CHANGELOG.md | Note di ogni versione. |
| SECURITY.md | Come segnalare una vulnerabilità. |
| CONTRIBUTING.md | Come segnalare un problema e proporre una modifica. |
Contribuire
Bug e proposte si aprono come issue; le vulnerabilità si segnalano in privato come spiega SECURITY.md. Come preparare una pull request e quali controlli deve passare è in CONTRIBUTING.md.
Licenza e crediti
Licenza MIT, vedi LICENSE; le note delle parti di terzi sono in NOTICE. Autore: Filippo Scatigna (PilaScat).
- KiraPC/italian-cinema-mcp (MIT): da qui viene l'API della programmazione UCI.
- Font Bebas Neue e Barlow (OFL).
- Icone Lucide (ISC).
Non affiliato a UCI Cinemas, a Webtic né ai cinema elencati.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/pilascat/cinema-watch:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8790]/- Network
bridge- Shell
sh- Privileged
- false
- Extra Params
--restart=unless-stopped --read-only --tmpfs /tmp --security-opt=no-new-privileges --log-opt max-size=10m --log-opt max-file=3
Template configuration
Web UI port.
- Target
- 8790
- Default
- 8790
- Value
- 8790
Configuration, state, seat maps, history and log. On start the container gives it to PUID:PGID.
- Target
- /data
- Default
- /mnt/user/appdata/cinema-watch
- Value
- /mnt/user/appdata/cinema-watch
User that owns the data folder and runs the app. 99 is nobody on Unraid.
- Default
- 99
- Value
- 99
Group that owns the data folder and runs the app. 100 is users on Unraid.
- Default
- 100
- Value
- 100
Web UI password. Empty: no password.
1 when a reverse proxy in front sets X-Forwarded-For. Only needed with a password, for the per-IP login lockout.
Bot token, if not set from the web UI. The web UI value wins.
Main chat, if not set from the web UI. The web UI value wins.