Stabilizza live YouTube/RTMP e fix crash rotazione mobile.
Pipeline YouTube con relay, overlay e publisher sync lato backend; fix GL pauseGlDuringRotation su Android per evitare crash in rotazione durante lo streaming Flutter. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -47,7 +47,7 @@ Poi tocca la card o conferma dal foglio: si apre il wizard (Partita → Trasmiss
|
||||
|
||||
1. Nel wizard, seleziona **YouTube Live** (se il piano lo consente e il canale è pronto)
|
||||
2. Completa i passi → **Camera**
|
||||
3. Il telefono invia RTMP a MediaMTX; il server inoltra su YouTube
|
||||
3. Il telefono invia RTMP a MediaMTX; il server avvia **automaticamente** overlay (tabellone + logo) e RTMPS verso YouTube — nessun intervento manuale
|
||||
|
||||
## Sviluppo locale
|
||||
|
||||
@@ -55,6 +55,10 @@ Poi tocca la card o conferma dal foglio: si apre il wizard (Partita → Trasmiss
|
||||
- Invito deep link: `matchlivetv://join/TOKEN` oppure incolla token aprendo `/login?invite=TOKEN`
|
||||
- OAuth: utente in **Utenti di test** Google Cloud
|
||||
|
||||
## Checklist test (dopo aggiornamento server/app)
|
||||
|
||||
Vedi [YOUTUBE_MORNING_CHECKLIST.md](./YOUTUBE_MORNING_CHECKLIST.md) — APK **1.2.10+13**, test server `bin/rails youtube:e2e`.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Problema | Soluzione |
|
||||
@@ -63,6 +67,9 @@ Poi tocca la card o conferma dal foglio: si apre il wizard (Partita → Trasmiss
|
||||
| YouTube disabilitato | Premium Light o Full |
|
||||
| YouTube non selezionabile | Token canale Match Live TV sul server (`admin` → YouTube piattaforma) |
|
||||
| OAuth «app non verificata» | Utente di test Google + Avanzate |
|
||||
| Live non su YouTube | Verifica relay ffmpeg / `stream_key` in sessione |
|
||||
| YouTube «tra X minuti» / COPERTINA | Relay ffmpeg verso YouTube non attivo o ingest `inactive`. Dopo deploy, riavvia la diretta dall’app; la live dovrebbe partire entro ~30s con segnale su `_air`. |
|
||||
| YouTube resta in «waiting» | Verifica su server `log/youtube_relay_<session_id>.log` nel container **sidekiq**; attendi che `streamStatus` diventi `active` (il job ritenta l’attivazione per ~6 min). |
|
||||
| Live non su YouTube | Pipeline automatica (`Youtube::LivePipeline`): overlay → ingest active → activate. Controlla `docker logs infra-sidekiq-1` per `[OverlayRelay] started` e `[YoutubeBroadcastActivate]`. |
|
||||
| YouTube «In programma» / copertina | Nessun intervento manuale: entro ~20–90s il server avvia overlay (tee RTMPS) e attiva la broadcast quando ingest è `active`. |
|
||||
| YouTube resta in «waiting» | `log/overlay_relay_<session_id>.log` in **sidekiq**; poll ogni 5s (`StreamPublisherSyncJob`). Attivazione ritenta ~6 min. |
|
||||
| Banner «sync limitata: Cannot add event after closing» | APK aggiornato: il wizard non apre un secondo WebSocket `controller` dopo la camera. |
|
||||
| Timer «IN DIRETTA» sbagliato (es. 10:33 subito) | `started_at` arriva dal server al primo frame RTMP; fino ad allora il timer resta a 0. |
|
||||
| App 0 Mbps / 0 fps ma LIVE | RTMP non pubblica: controlla permessi camera, messaggio «Connessione RTMP»; relay YouTube non parte finché il telefono non è online su MediaMTX. |
|
||||
|
||||
56
docs/YOUTUBE_MORNING_CHECKLIST.md
Normal file
56
docs/YOUTUBE_MORNING_CHECKLIST.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# YouTube Live — verificato ✅ (5 giu 2026)
|
||||
|
||||
## Test completato automaticamente
|
||||
|
||||
Pipeline end-to-end **funzionante** sul server di produzione:
|
||||
|
||||
| Step | Esito |
|
||||
|------|--------|
|
||||
| Setup broadcast + stream_key | ✅ |
|
||||
| Overlay ffmpeg con tee RTMPS YouTube | ✅ |
|
||||
| Copertina / tabellone su YouTube | ✅ |
|
||||
| RTMP simulato (test pattern) | ✅ |
|
||||
| Broadcast `lifecycle=live` | ✅ |
|
||||
|
||||
**Prova visiva:** https://www.youtube.com/watch?v=0WmCsW_Luik
|
||||
(Titolo: *Tigers Volley vs Avversario prova* — sessione di test, ora terminata)
|
||||
|
||||
## APK da installare sul telefono
|
||||
|
||||
```bash
|
||||
# Sul PC (già compilato):
|
||||
mobile/build/app/outputs/flutter-apk/app-release.apk
|
||||
# Versione: 1.2.10+13 — API https://www.matchlivetv.it
|
||||
```
|
||||
|
||||
Installa sul Redmi (sostituisce versioni precedenti).
|
||||
|
||||
## Avvio diretta dall’app (2 minuti)
|
||||
|
||||
1. Partita → **YouTube Live** → wizard → **Camera**
|
||||
2. Attendi sul passo rete che compaia il link YouTube (poll automatico, fino a 3 min)
|
||||
3. Avvia: entro ~90s su YouTube compare **copertina**, poi video con tabellone quando il telefono pubblica RTMP
|
||||
|
||||
## Test server senza telefono
|
||||
|
||||
```bash
|
||||
ssh eminux@192.168.1.146
|
||||
docker exec infra-rails-1 bin/rails youtube:e2e
|
||||
docker exec infra-sidekiq-1 pgrep -a ffmpeg # deve contenere rtmps://...youtube.com/live2
|
||||
```
|
||||
|
||||
## Se qualcosa non va
|
||||
|
||||
| Sintomo | Cosa fare |
|
||||
|---------|-----------|
|
||||
| «YouTube temporaneamente occupato» | Attendi 15–20 min (rate limit Google). **Non** creare molte sessioni di fila. |
|
||||
| Pagina YouTube vuota | `docker logs infra-sidekiq-1 \| grep OverlayRelay` — manca `stream_key` o tee RTMPS |
|
||||
| App errore avvio diretta | APK 1.2.10+13; controlla rete verso matchlivetv.it |
|
||||
|
||||
## Fix deployati (server)
|
||||
|
||||
- Retry setup broadcast su rate limit (fino a 15 tentativi)
|
||||
- Un solo job setup per sessione (lock Redis)
|
||||
- Throttle API YouTube globale
|
||||
- Riavvio overlay quando arriva `stream_key` dopo start senza tee
|
||||
- Activate solo con overlay attivo + broadcast pronta
|
||||
Reference in New Issue
Block a user