Aggiunge app iOS nativa con parità multi-sport e test unitari.
Porting SwiftUI da Android (auth, hub, wizard, broadcast RTMP, overlay, scoring board-aware), reload hub al ritorno da diretta, decodifica score tollerante e documentazione allineata. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -35,7 +35,7 @@ Match Live TV è una piattaforma mobile-first per streaming di partite sportive
|
||||
| Ingest video | MediaMTX (RTMP :1935) |
|
||||
| Playback live | HLS (MediaMTX :8888) |
|
||||
| Replay | Garage (S3-compatible) + MP4 |
|
||||
| App mobile | Android nativo (Kotlin + Compose, RTMP) |
|
||||
| App mobile | Android nativo (Kotlin + Compose, RTMP); iOS nativo (SwiftUI + HaishinKit, RTMP) — parità UI/API |
|
||||
| Edge LAN | Nginx (`edge`) sulla porta host **3000** |
|
||||
| HTTPS pubblico | Nginx Proxy Manager (NPM) → `192.168.1.146:3000` |
|
||||
|
||||
|
||||
@@ -35,7 +35,9 @@ Definito in [`backend/config/sports.yml`](../backend/config/sports.yml), caricat
|
||||
|
||||
Scelto per partita (`overlay_kind`), limitato da `allowed_overlays` dello sport.
|
||||
|
||||
Rendering Android: `OverlayKind` in `OverlayState` → `ScoreboardElement`, `CompactScoreboardElement`, `TimerElement`.
|
||||
Rendering app mobile: `OverlayKind` in `OverlayState` → `ScoreboardElement` (volley/racket), `CompactScoreboardElement` (basket/timed), `WatermarkElement`. Il cronometro **non** è renderizzato sull'overlay video (solo in regia).
|
||||
|
||||
Percorsi: Android `native/android/.../streaming/overlay/`, iOS `native/ios/MatchLiveTv/Streaming/Overlay/`.
|
||||
|
||||
## Migrazione
|
||||
|
||||
|
||||
@@ -160,13 +160,13 @@ Definiti in `Sports::OverlayKind`: `none`, `volley`, `basket`, `timed`, `racket`
|
||||
|
||||
Esempio: il basket ammette `[basket, none]` — si può trasmettere con tabellone o solo watermark.
|
||||
|
||||
### Layout Android (pipeline video)
|
||||
### Layout app mobile (Android e iOS)
|
||||
|
||||
Sull’app nativa l’overlay è composito in GPU senza ricodifica aggiuntiva:
|
||||
|
||||
1. `BroadcastScreen` costruisce un `OverlayState` a partire da `effectiveOverlayKind` e `ScoreState`.
|
||||
2. `OverlayRenderer` → `OverlayCanvasRenderer` disegna gli elementi su bitmap trasparente.
|
||||
3. Il bitmap viene applicato come filtro OpenGL sul flusso RTMP.
|
||||
3. Il bitmap viene applicato come filtro sul flusso RTMP (OpenGL su Android, HaishinKit su iOS).
|
||||
|
||||
Elementi grafici (`OverlayCanvasRenderer`):
|
||||
|
||||
@@ -334,7 +334,9 @@ Questa separazione è intenzionale: il regolamento alimenta sempre il **modello
|
||||
| Modello partita | `backend/app/models/match.rb` |
|
||||
| Stato punteggio | `backend/app/models/score_state.rb` |
|
||||
| Overlay Android | `native/android/.../streaming/overlay/*` |
|
||||
| Schermata broadcast | `native/android/.../ui/broadcast/BroadcastScreen.kt` |
|
||||
| Overlay iOS | `native/ios/MatchLiveTv/Streaming/Overlay/*` |
|
||||
| Schermata broadcast Android | `native/android/.../ui/broadcast/BroadcastScreen.kt` |
|
||||
| Schermata broadcast iOS | `native/ios/MatchLiveTv/UI/Broadcast/BroadcastScreen.swift` |
|
||||
| Regia web | `backend/app/views/public/regia/_*.html.erb` |
|
||||
|
||||
Documento correlato: [`MULTI_SPORT.md`](./MULTI_SPORT.md) (panoramica più sintetica della migrazione multi-sport).
|
||||
|
||||
Reference in New Issue
Block a user