New user preference to force enable or disable common HDR and Dolby Vision formats (#1644)

Description
Adding per-format HDR override preferences (HDR10, HDR10+, Dolby Vision
Profile 5/7/8) to control device compatibility information sent to the
Jellyfin server, so users can force specific formats on or off
independently instead of disabling Dolby Vision as a whole.

Related issues
This is a common problem across the Jellyfin ecosystem, but there isn't
a specific issue for Wholphin. My experience is the issue is FireTV
(model and generation) + TV dependent + media dependent. I tested videos
from
https://kodi.wiki/view/Samples with the same DOVIWithHDR10 flag that
worked while other movies I have with It is a very frustrating user
experience and the current workaround of setting the bitrate really low
to force a transcode is sub-optimal IMO as it lowers the video quality.
This allows the user to maintain full quality while disabling only the
specific format(s) causing problems.

https://github.com/jellyfin/jellyfin-androidtv/issues/4021
https://github.com/jellyfin/jellyfin-androidtv/issues/4892
https://github.com/nova-video-player/aos-AVP/issues/1503

https://www.reddit.com/r/jellyfin/comments/12jqoxh/dolby_vision_video_not_working_on_fire_stick_4k/

Testing

<!-- Describe how this change was tested and on what device(s) -->
FireTV 4K (gen 1) + Vizio
FireTV 4K Max (gen 1) + LG
FireTV 4K Max (gen 2) + Vizio
FireTV (gen 1) + Olevia


AI or LLM usage
Claude code assisted and wrote much of the code in this PR. I've
reviewed it all and run the pre-commit linting and formatting.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
This commit is contained in:
Jeff Whiting 2026-10-13 13:41:53 -06:00 • committed by GitHub
parent f01c5d367c
commit 9f557416ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 468 additions and 37 deletions

View file

@ -54,10 +54,15 @@ message PlaybackOverrides{
bool direct_play_ass = 3 [deprecated = true];
bool direct_play_pgs = 4;
MediaExtensionStatus media_extensions_enabled = 5;
bool direct_play_dolby_vision_e_l = 6;
bool direct_play_dolby_vision_e_l = 6 [deprecated = true];
bool decode_av1 = 7;
AssPlaybackMode ass_playback_mode = 8;
int32 max_resolution = 9;
HdrOverrideMode dovi_profile_5_override = 10;
HdrOverrideMode dovi_profile_7_override = 11;
HdrOverrideMode dovi_profile_8_override = 12;
HdrOverrideMode hdr10_override = 13;
HdrOverrideMode hdr10_plus_override = 14;
}
message PlaybackPreferences {
@ -224,6 +229,12 @@ message MusicPreferences {
bool show_backdrop = 4;
}
enum HdrOverrideMode{
HDR_OVERRIDE_AUTO = 0;
HDR_OVERRIDE_ENABLE = 1;
HDR_OVERRIDE_DISABLE = 2;
}
message ExperimentalPreferences {
bool enabled = 1;
bool video_tunneling_enabled = 2;