Completa modulo Replay: S3, retention, sync YouTube e gestione società.

Streaming chunked da Garage, purge con delete YouTube, privacy sincronizzata,
archivio club migliorato, retention 30/90 separata da stato abbonamento.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-08 09:33:59 +02:00
parent ae36d17adb
commit 74eee24293
17 changed files with 385 additions and 34 deletions

View File

@@ -32,10 +32,15 @@ MediaMTX registra **solo mentre il telefono pubblica** (RTMP connesso). In pausa
- Contatore visualizzazioni su ogni play (`view_count`)
### 5. Visibilità
Pubblico / Privato (unlisted), modificabile dalladmin società.
- **Pubblico** (`public`): compare in `/replay`, indicizzabile, YouTube `public`
- **Privato** (`unlisted`): non in catalogo pubblico, accessibile solo con link diretto, `noindex`, YouTube `unlisted`
Modificabile dallarchivio società (`/clubs/:id/replays`). Il cambio privacy sincronizza automaticamente il VOD YouTube se presente (`Recordings::SyncYoutubePrivacyJob`).
### 6. Eliminazione anticipata
`Recordings::Delete`DB + video + thumbnail su storage.
`Recordings::Delete`elimina video YouTube collegato, oggetti S3/Garage (MP4 + thumbnail) e soft-delete DB.
Stesso comportamento alla scadenza retention (`PurgeExpiredJob` alle 03:00).
### 7. Dashboard KPI
Replay disponibili, in scadenza (7 gg), spazio occupato, **visualizzazioni totali**.
@@ -115,6 +120,22 @@ Per ridimensionare dopo:
bash scripts/garage_set_capacity.sh 85G # oppure senza argomento: calcolo automatico
```
## Piattaforme live e replay
| Origine diretta | Copia Garage/S3 | Player sito `/replay/:id` | YouTube VOD |
|-----------------|-----------------|----------------------------|-------------|
| `matchlivetv` | Sì (Premium) | MP4 via proxy Rails | Manuale (Premium Full) |
| `youtube` | Sì (Premium) | MP4 via proxy Rails | Auto se Premium Full + diretta YouTube |
Se il file S3 non è disponibile ma esiste `youtube_video_id`, la pagina replay mostra embed YouTube.
## Retention e abbonamento
- `expires_at` viene impostato alla fine diretta: **30 giorni** (Premium Light), **90 giorni** (Premium Full)
- `expires_at` **non cambia** al cambio piano successivo
- **Nuove registrazioni** richiedono abbonamento attivo (`can_create_recordings?`)
- **Archivio esistente** resta accessibile fino a `expires_at` anche se labbonamento scade (`can_access_recordings?`)
## API mobile
- `GET /teams/:id/recordings` — lista con thumbnail, views, download_enabled