libmpv on Windows (DR-237):
- The builder image carries zhongfly's LGPL libmpv-2.dll, pinned by
asset name and sha256, plus an MSVC mpv.lib generated from the DLL's
own mpv_* exports (the archive ships only a MinGW .dll.a). LGPL, not
the GPL builds: no x264/x265, mpv -Dgpl=false; FFmpeg is version3, so
LGPL-3.0. THIRD_PARTY_NOTICES.md records it.
- build-windows-cross.sh stages both files into src-tauri/windows-libs/;
build.rs links mpv.lib from there and tauri.windows.conf.json bundles
the DLL beside jellytau.exe from there, with the licence texts under
licenses/. One directory, so the DLL shipped is the one linked.
- Workflows move to builder image 2026.09.1.
Windows audio:
- MpvBackend replaces WebviewAudioBackend on Windows (ao=wasapi), so
volume, EQ, normalization and gapless work there as on Linux. Local
files are passed to mpv as native paths, not file:// URLs.
Fixes found on the way:
- player_play_item decided "does the backend render video" with
cfg!(not(linux)), true on Windows, while get_player_status sent
Windows video to the <video> element. With mpv as the backend that
would decode every film's soundtrack twice. All three callers now
ask video_renders_natively() (UT-273).
- confine_queued_path rebuilt paths with PathBuf::push, so on Windows
a queued `downloads/x` was stored as `downloads\x`, no longer the
spelling the app built. It now keeps the caller's separator (UT-205,
which only ever ran on Linux, failed under Windows).
Verified: jellytau.exe imports libmpv-2.dll; the full unit suite
cross-compiled for Windows passes under wine against the shipped DLL
(943/943, including the mpv injection and TLS tests); the NSIS
installer contains the DLL and licence texts. Not yet run on real
Windows hardware.
Android ships no AC-3, E-AC-3, DTS or TrueHD decoders; they are licensed
codecs, present only where a vendor paid for them. The ROD2-W09 tablet has a
vendor DTS decoder and no AC-3/E-AC-3 at all. So every film with Dolby audio
was re-encoded by the server, for streaming and for download alike, and a
transcoded download has no Content-Length and ignores Range: ~1 MB/s,
restarting from byte zero on every network blip.
ExoPlayer now carries Jellyfin's media3 FFmpeg audio decoder in extension
mode ON (platform decoders first, FFmpeg for what they lack), and
CodecDetector reports its codecs so the device profile and the download
policy agree with what actually decodes. The download policy judges audio
against the renderer that will play the file (renderer_can_decode_audio)
instead of the webview's list, so Android downloads are always the direct
copy — a 910 MB E-AC-3 5.1 episode downloaded in 94 s and played offline.
The webview video path is removed on Android: it decodes none of these
codecs, so a stored "native video off" would play every original-file
download silent. Rust reports webview_video_fallback (false on Android, true
only beside mpv native video on Linux); Settings offers the switch and the
player honours it only then. Linux keeps the fallback and, with it, the
server transcode for undecodable audio.
The decoder is GPL-3.0; the distributed APK carries its terms and the source
stays MIT (THIRD_PARTY_NOTICES.md). The on-device remux spec this replaces is
folded into 05-platform-backends.md and deleted.
DR-293, UT-259, UT-262.