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>
3.9 KiB
3.9 KiB
Diretta YouTube dall’app (invito staff)
Percorso per il responsabile trasmissione invitato via email: accede in app e avvia la live su YouTube.
Prerequisiti (società)
- Piano Premium Light o Premium Full attivo
YOUTUBE_CLIENT_ID/YOUTUBE_CLIENT_SECRETconfigurati sul server- Partita programmata per la squadra
Canale usato
| Piano | Canale YouTube in diretta |
|---|---|
| Premium Light | Sempre Match Live TV (nessun OAuth società) |
| Premium Full, canale collegato | Canale della società |
| Premium Full, canale non collegato | Match Live TV (default, come Light) |
Il collegamento del canale società è opzionale su Full: si fa dal sito (pagina società → sezione YouTube Live) o in futuro da app; finché non c’è OAuth, l’app trasmette sul canale piattaforma.
1. Invito
- Il titolare società → Responsabili trasmissione → invita
tua@email.it - L’invitato apre il link (web o Apri invito nell’app)
- Registrazione / login con la stessa email dell’invito
- L’app accetta l’invito automaticamente dopo il login
API: GET /api/v1/invitations/:token, POST /api/v1/invitations/:token/accept
2. Collega canale YouTube (opzionale, Premium Full)
Solo se la società vuole il proprio canale invece di Match Live TV:
- Sul sito: pagina società (
/clubs/:id) → Collega il canale YouTube della società - Oppure (se abilitato) OAuth da app al tocco YouTube quando non c’è ancora canale piattaforma
3. Scegli la partita
Nella home app (Partite):
- Partita programmata — scegli dal calendario una gara già inserita (sito o app)
- Nuova partita — programma data/ora oppure Avvia subito senza orario
Poi tocca la card o conferma dal foglio: si apre il wizard (Partita → Trasmissione → …).
4. Avvia diretta
- Nel wizard, seleziona YouTube Live (se il piano lo consente e il canale è pronto)
- Completa i passi → Camera
- Il telefono invia RTMP a MediaMTX; il server avvia automaticamente overlay (tabellone + logo) e RTMPS verso YouTube — nessun intervento manuale
Sviluppo locale
- App:
flutter run --dart-define=API_BASE_URL=http://10.0.2.2:3000(emulatore) o IP LAN del PC (telefono) - Invito deep link:
matchlivetv://join/TOKENoppure 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 — APK 1.2.10+13, test server bin/rails youtube:e2e.
Troubleshooting
| Problema | Soluzione |
|---|---|
| Nessuna squadra in app | Accetta invito con email corretta |
| 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 | 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. |