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>
52 lines
1.9 KiB
Markdown
52 lines
1.9 KiB
Markdown
# Multi-sport — Match Live TV
|
||
|
||
## Concetti
|
||
|
||
| Concetto | Descrizione |
|
||
|----------|-------------|
|
||
| `sport_key` | Disciplina (pallavolo, basket, tennis…) — sulla squadra e snapshot sulla partita |
|
||
| `board_type` | Macro-tabellone **implicito** dal catalogo (`volley`, `basket`, `timed`, `racket`, `timer`, `generic`) |
|
||
| `overlay_kind` | Layout video sulla partita (`none`, `timer`, `volley`, `basket`, `timed`, `racket`) |
|
||
| `scoring_rules` | Regole effettive della partita (override sui default del catalogo) |
|
||
|
||
## Catalogo
|
||
|
||
Definito in [`backend/config/sports.yml`](../backend/config/sports.yml), caricato da `Sports::Catalog`.
|
||
|
||
- Nessuna tabella `sports` in DB
|
||
- API: `GET /api/v1/sports`
|
||
|
||
## Scoring
|
||
|
||
`Scoring::Engine.for(match)` seleziona l'engine:
|
||
|
||
| Board | Engine | Azioni principali |
|
||
|-------|--------|-------------------|
|
||
| volley | VolleyEngine | +1, −1, chiudi set |
|
||
| racket | RacketEngine | come volley (fase 1) |
|
||
| generic | GenericEngine | +1, −1 (nessuna chiusura set) |
|
||
| basket | BasketEngine | +1/+2/+3, quarti, cronometro |
|
||
| timed | TimedEngine | +1, −1, tempi, cronometro |
|
||
| timer | TimerEngine | solo cronometro |
|
||
|
||
`score_states.data` (JSONB) per basket/timed/timer.
|
||
|
||
## Overlay
|
||
|
||
Scelto per partita (`overlay_kind`), limitato da `allowed_overlays` dello sport.
|
||
|
||
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
|
||
|
||
- `teams.sport` → `sport_key` (`volleyball` → `pallavolo`)
|
||
- `matches.sport` → `sport_key`
|
||
- `matches.overlay_kind` (nullable)
|
||
- `score_states.board_type`, `score_states.data`
|
||
|
||
## Regia web
|
||
|
||
Partial per board in `app/views/public/regia/_*.html.erb`, `data-board` su `#regia-app`.
|