FOXA-3243 : un flux changé n'hérite plus du nom de fichier du flux de lancement #1009

Merged
foXaCe merged 1 commit from passe-20261018-173000-fluxnom into main 2026-10-18 14:16:20 +02:00
Owner

Résumé

FOXA-3243 — un flux changé n'hérite plus du nom de fichier du flux de lancement.

  • 973cce33a FOXA-3243 : un flux changé n'hérite plus du nom de fichier du flux de lancement

currentFilename n'est pas décoratif : il pilote la recherche de sous-titres, la clé du cache de
fréquence d'images, les indices Hi10p/VC-1 et le lien de flux sauvegardé.

Pourquoi

Le chemin épisode calculait le bon nom, puis appelait applySelectedStreamState, qui le
remplaçait par celui du lancement :

// PlayerRuntimeControllerStreamsEpisodes — calculait
currentFilename = stream.behaviorHints?.filename
    ?: url.substringBefore('?').substringAfterLast('/', "").takeIf { … }

// PlayerRuntimeControllerStreams — écrasait
currentFilename = stream.behaviorHints?.filename ?: navigationArgs.filename

Deux écritures de la même règle, et la seconde écrasait la première : le calcul du chemin épisode
était perdu à chaque changement d'épisode ou de source. Garder le nom de la release précédente fait
chercher les sous-titres du mauvais fichier, et rien ne le dit.

La règle vit maintenant une fois, dans nomDeFichierDepuisLUrl(url), et les deux chemins
l'appellent. Le repli sur navigationArgs.filename disparaît : un flux sans
behaviorHints.filename prend le nom tiré de son URL, ou null.

⚠ Le nom de lancement reste posé à l'initialisation (PlayerRuntimeController.kt:249) : c'est son
rôle. Ce qui change est qu'il ne ressuscite plus à chaque changement de flux.

Ce qui a été mesuré

6 tests :

ce qui est mesuré comment
le nom vient de l'URL …/Ma.Release.2026.1080p.mkv → ce nom
la chaîne de requête est retirée film.mkv?token=abc → film.mkv
une URL sans fichier ne fabrique rien …/stream/ → null
un segment sans extension ne fabrique rien …/live/chaine → null
le chemin commun ne retombe plus sur le lancement la source ne contient plus ?: navigationArgs.filename
les deux chemins appellent la même règle l'expression recopiée a disparu du chemin épisode
./gradlew :app:testFullDebugUnitTest -Pnuvio.android.distribution=full \
    --tests '*LeFluxChangeNHeritePasDuNomDeLancementTest*'
BUILD SUCCESSFUL — 6 tests, 0 échec

Porte jouée par la forge, pas sur le poste : « Porte / porte* » est le seul contexte qu'exige la
protection de main, et la fusion attend son vert.

Scope boundaries

Le nom de lancement à l'initialisation n'est pas touché (PlayerRuntimeController.kt:249). Aucun
autre usage de currentFilename n'est modifié : la recherche de sous-titres, le cache de fréquence
d'images et les indices lisent la même propriété, ils héritent donc du correctif sans changement.

## Résumé FOXA-3243 — un flux changé n'hérite plus du nom de fichier du flux de lancement. - 973cce33a FOXA-3243 : un flux changé n'hérite plus du nom de fichier du flux de lancement `currentFilename` n'est pas décoratif : il pilote la recherche de sous-titres, la clé du cache de fréquence d'images, les indices Hi10p/VC-1 et le lien de flux sauvegardé. ## Pourquoi Le chemin épisode **calculait** le bon nom, puis appelait `applySelectedStreamState`, qui le **remplaçait** par celui du lancement : ```kotlin // PlayerRuntimeControllerStreamsEpisodes — calculait currentFilename = stream.behaviorHints?.filename ?: url.substringBefore('?').substringAfterLast('/', "").takeIf { … } // PlayerRuntimeControllerStreams — écrasait currentFilename = stream.behaviorHints?.filename ?: navigationArgs.filename ``` Deux écritures de la même règle, et la seconde écrasait la première : le calcul du chemin épisode était perdu à chaque changement d'épisode ou de source. Garder le nom de la release précédente fait chercher les sous-titres du **mauvais fichier**, et rien ne le dit. La règle vit maintenant **une fois**, dans `nomDeFichierDepuisLUrl(url)`, et les deux chemins l'appellent. Le repli sur `navigationArgs.filename` disparaît : un flux sans `behaviorHints.filename` prend le nom tiré de **son** URL, ou `null`. ⚠ Le nom de lancement reste posé à l'initialisation (`PlayerRuntimeController.kt:249`) : c'est son rôle. Ce qui change est qu'il ne **ressuscite** plus à chaque changement de flux. ## Ce qui a été mesuré 6 tests : | ce qui est mesuré | comment | |---|---| | le nom vient de l'URL | `…/Ma.Release.2026.1080p.mkv` → ce nom | | la chaîne de requête est retirée | `film.mkv?token=abc` → `film.mkv` | | une URL sans fichier ne fabrique rien | `…/stream/` → `null` | | un segment sans extension ne fabrique rien | `…/live/chaine` → `null` | | le chemin commun ne retombe plus sur le lancement | la source ne contient plus `?: navigationArgs.filename` | | les deux chemins appellent la même règle | l'expression recopiée a disparu du chemin épisode | ``` ./gradlew :app:testFullDebugUnitTest -Pnuvio.android.distribution=full \ --tests '*LeFluxChangeNHeritePasDuNomDeLancementTest*' BUILD SUCCESSFUL — 6 tests, 0 échec ``` Porte jouée par la forge, pas sur le poste : « Porte / porte* » est le seul contexte qu'exige la protection de `main`, et la fusion attend son vert. ## Scope boundaries Le nom de lancement à l'initialisation n'est pas touché (`PlayerRuntimeController.kt:249`). Aucun autre usage de `currentFilename` n'est modifié : la recherche de sous-titres, le cache de fréquence d'images et les indices lisent la même propriété, ils héritent donc du correctif sans changement.
FOXA-3243 : un flux changé n'hérite plus du nom de fichier du flux de lancement
All checks were successful
PR Template Check / validate_pr_body (pull_request) Successful in 0s
Porte / porte (pull_request) Successful in 13m39s
973cce33af
`currentFilename` n'est pas décoratif : il pilote la recherche de sous-titres, la clé du cache de
fréquence d'images, les indices Hi10p/VC-1 et le lien de flux sauvegardé. Garder le nom de la release
précédente fait chercher les sous-titres du **mauvais fichier**, et rien ne le dit.

## Le défaut, tel qu'il était écrit

Le chemin épisode **calculait** le bon nom, puis appelait `applySelectedStreamState`, qui le
**remplaçait** :

```kotlin
// PlayerRuntimeControllerStreamsEpisodes — calculait
currentFilename = stream.behaviorHints?.filename
    ?: url.substringBefore('?').substringAfterLast('/', "").takeIf { … }

// PlayerRuntimeControllerStreams — écrasait
currentFilename = stream.behaviorHints?.filename ?: navigationArgs.filename
```

Deux écritures de la même règle, et la seconde écrasait la première : le calcul du chemin épisode
était perdu à chaque changement d'épisode ou de source.

## Le correctif

La règle vit maintenant **une fois**, dans `nomDeFichierDepuisLUrl(url)`, et les deux chemins
l'appellent. Le repli sur `navigationArgs.filename` disparaît : un flux sans
`behaviorHints.filename` prend le nom tiré de **son** URL, ou `null`.

⚠ Le nom de lancement reste posé à l'initialisation (`PlayerRuntimeController.kt:249`) : c'est son
rôle. Ce qui change est qu'il ne **ressuscite** plus à chaque changement de flux.

## Les preuves

6 tests :

| ce qui est mesuré | comment |
|---|---|
| le nom vient de l'URL | `…/Ma.Release.2026.1080p.mkv` → ce nom |
| la chaîne de requête est retirée | `film.mkv?token=abc` → `film.mkv` |
| une URL sans fichier ne fabrique rien | `…/stream/` → `null` |
| un segment sans extension ne fabrique rien | `…/live/chaine` → `null` |
| le chemin commun ne retombe plus sur le lancement | la source ne contient plus `?: navigationArgs.filename` |
| les deux chemins appellent la même règle | l'expression recopiée a disparu du chemin épisode |

    ./gradlew :app:testFullDebugUnitTest -Pnuvio.android.distribution=full \
        --tests '*LeFluxChangeNHeritePasDuNomDeLancementTest*'
    BUILD SUCCESSFUL, 6 tests, 0 échec
foXaCe merged commit cde1186d6e into main 2026-10-18 14:16:20 +02:00
foXaCe deleted branch passe-20261018-173000-fluxnom 2026-10-18 14:16:20 +02:00
Sign in to join this conversation.
No reviewers
No labels
montee-majeure
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
foXaCe/NuvioTV!1009
No description provided.