Files
MatchLiveTv/docs/MULTI_SPORT.md
Emiliano Frascaro 585332e32e 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>
2026-06-14 21:37:32 +02:00

52 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.