/
/
# What does this implement/fix? Every nicovideo track fails to play, for two independent reasons. The watch API now returns `null` for `viewer.existence.prefecture`, which `niconico.py-ma` typed as a non-optional string. Pydantic rejected the whole watch response, so the provider reported every track as missing. Fixed in the library and released as 2.1.0.post3. Separately, nicovideo serves its HLS audio segments as CMAF (`.cmfa`), and whether FFmpeg accepts them depends on the build. The HLS demuxer's segment extension check (CVE-2023-6602) landed in 7.1.1 without whitelisting CMAF, and 7.1.2 whitelisted it precisely because the check broke nicovideo playback (https://trac.ffmpeg.org/ticket/11526). The Docker image (7.1.2) and anything older than 7.1.1 are unaffected; source and package installs sitting on 7.1.1 are the ones that cannot play nicovideo today. Rather than tie that to version numbers — git builds report a string that cannot be compared, and distributions backport freely — this asks the demuxer what it accepts, once at startup, the same way libsoxr support is detected. Turning `extension_picky` off is the only lever: alongside the `allowed_extensions` option the demuxer matches segment URLs against a hardcoded list that no option reaches. It lets every extension through rather than just CMAF, so it is opt-in per caller rather than applied to every HLS input — user-supplied radio playlists keep the check. ## Changes - Bump `niconico.py-ma` to 2.1.0.post3, which accepts a null prefecture. - Detect at startup whether FFmpeg's HLS demuxer refuses CMAF segments. This sits with the other FFmpeg capability probes in `helpers/ffmpeg.py`, next to the libsoxr one, since it describes the host's FFmpeg rather than anything about nicovideo. - Relax the extension check for nicovideo playlists only, and only on the builds that need it. - Regenerate the watch and stream fixtures, which had been frozen while the prefecture field failed to parse. - Added tests for the probe and the new helper; the regenerated fixtures cover the null prefecture. **Related issue (if applicable):** - https://github.com/music-assistant/support/issues/6104 ## Types of changes - [x] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [ ] Enhancement to an existing feature — `enhancement` - [ ] New music/player/metadata/plugin provider — `new-provider` - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change` - [ ] Refactor (no behaviour change) — `refactor` - [ ] Documentation only — `documentation` - [ ] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` ## Checklist - [x] The code change is tested and works locally. - [x] `pre-commit run --all-files` passes. - [x] `pytest` passes, and tests have been added/updated under `tests/` where applicable. - [ ] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [ ] For changes affecting the UI, the companion PR in `music-assistant/frontend` is linked. - [x] I have read and complied with the project's [AI Policy](https://github.com/music-assistant/.github/blob/main/AI_POLICY.md) for any AI-assisted contributions. - [ ] I have [raised a PR against the documentation repository](https://github.com/music-assistant/music-assistant.io/blob/main/CONTRIBUTING.md) targeting the main or beta branch as appropriate. --------- Co-authored-by: Shi-553 <[email protected]> Co-authored-by: Claude Opus 5 <[email protected]> Co-authored-by: OzGav <[email protected]>