L'onglet restait vide alors que le guide beIN annonçait des matchs : une
diffusion n'était prise en compte que si sa chaîne beIN était reliée à
un flux de la règle (liste vide si la détection avait échoué à la
création, ou nom différent chez le revendeur).
- Toute diffusion en direct du guide beIN est rapprochée et affichée ;
seul l'enregistrement exige un flux IPTV (sinon « absente de la
playlist », bouton inactif, aucun enregistrement créé).
- Les beIN FR de la playlist sont redétectées à chaque passage et
complètent les flux choisis dans la règle.
- Plus besoin de playlist pour afficher le programme.
- Diagnostic par règle (source, directs au guide, chaînes reliées ou
absentes, matchs rapprochés) renvoyé par l'API et affiché quand la
liste est vide.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Programme officiel beIN Sports France (api/opta, ~8 jours) comme
source : chaîne exacte et direct/rediffusion explicites, recoupés avec
le coup d'envoi ESPN (un faux « direct » du guide est écarté). Repli sur
l'EPG IPTV si le site est injoignable. Seuls les matchs annoncés en
direct sur beIN sont affichés.
- Plus aucun enregistrement automatique : seul un « Enregistrer »
explicite programme un match ; les programmations sans choix sont
annulées.
- Un seul flux IPTV : un match qui chevauche un match choisi ou un autre
enregistrement est refusé (409) et affiché « Créneau pris » ; la liste
est relue après chaque choix et les boutons sont figés pendant la
requête.
- Interrupteurs lisibles (curseur et piste distincts), boutons
Enregistrer / Choisi à la place des interrupteurs par match.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Une règle désactivée ne programme plus rien : la réconciliation relit
l'état en base et, en pause, supprime les enregistrements encore
planifiés (un enregistrement en cours n'est pas coupé).
- Index unique (user_id, kind) : deux activations concurrentes ne créent
plus deux règles NBA ; le conflit répond 409.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le calendrier NBA (API ESPN, 21 jours) annonce les matchs à l'avance ;
l'EPG des beIN Sports françaises confirme la chaîne ~48 h avant. Seule la
diffusion qui démarre avec le coup d'envoi est retenue : les rediffusions
sont ignorées, sans dépendre des titres. Le CDN nba.com refuse les
requêtes serveur (403), d'où ESPN.
- Serveur : tables auto_rules / nba_games (migration v3 : source_rule_id),
réconciliation toutes les 30 min, marges, filtre d'équipes, conflits de
créneaux, rétention, API /api/auto-rules (oui/non par match).
- Détection des beIN FR (hors MENA, TR, ES…), meilleure qualité par chaîne.
- XMLTV : sous-titre, catégories, drapeaux live/new/premiere/
previously-shown, horizon EPG_HORIZON_HOURS.
- Plex/Jellyfin : vignette et affiche avec logos des équipes, .nfo,
pochette intégrée au MKV, nom de fichier lisible.
- UI : onglet « Auto NBA » et pastille sur les enregistrements.
- Docker : fonts-dejavu-core (texte des vignettes) et tzdata.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le serveur Dart (bin/) est remplacé par un serveur Rust (server/) :
tokio + axum, reqwest/rustls, SQLite embarqué via rusqlite. Même API,
mêmes routes et mêmes réponses : le front Flutter ne change pas.
La base de production est reprise telle quelle : schéma, migrations et
formats de dates (DateTime.toIso8601String de Dart) sont reproduits à
l'identique, les sessions et hachages existants restent valides.
Comportement conservé : cascade de routage, anti-SSRF, logs masqués,
rate limits, transcodage HLS/turbo.ts avec repli GPU, quotas fournisseur,
enregistrements (reprise, relances, fusion), season passes, EPG, logos de
repli, arrêt gracieux sur SIGTERM. Tests Dart portés (132 tests Rust) ;
la CI exécute fmt, test et clippy -D warnings, l'image Docker compile le
serveur dans un étage rust:1.98.1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>