# 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_SECRET` configurati 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 1. Il titolare società → **Responsabili trasmissione** → invita `tua@email.it` 2. L’invitato apre il link (web o **Apri invito nell’app**) 3. Registrazione / login con **la stessa email** dell’invito 4. 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: 1. Sul sito: pagina società (`/clubs/:id`) → **Collega il canale YouTube della società** 2. 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 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 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/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 | |----------|-----------| | 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_.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. |