The most overengineered way to play Dolby Vision videos on an LG TV
Find a file
Katie Kloss 33149586db
Some checks failed
/ build (push) Failing after 17s
release: v3.3.1
2025-11-30 10:31:55 -05:00
.forgejo/workflows ci: add build workflow for Forgejo 2025-11-29 03:02:28 -05:00
.github/workflows Update release.yml 2025-05-18 08:43:40 -04:00
.vscode initial commit: new plugin 2025-04-23 09:25:04 -04:00
Jellyfin.Plugin.DoViRemux housekeeping: update Jellyfin to 10.11 and target .NET 9. 2025-11-28 16:11:07 -05:00
.gitignore initial commit: new plugin 2025-04-23 09:25:04 -04:00
global.json build: add global.json 2025-11-29 03:04:51 -05:00
jellyfin-plugin-doviremux.sln initial commit: new plugin 2025-04-23 09:25:04 -04:00
meta.yaml release: v3.3.1 2025-11-30 10:31:55 -05:00
README.md Update README.md 2025-05-16 09:38:18 -04:00

jellyfin-plugin-doviremux

A giant hack that remuxes my Dolby Vision videos from MKV to MP4, so that my WebOS-based LG TV can play them.

How to use

Warning

Make sure you have enough storage space first! Remuxed MP4s will be the same size as, and be placed in the same directory as, the original media.

Config options

  • Include Ancestor IDs
    • Used if you want to limit the plugin to a specific library/show/season/movie/whatever:
      • Update the "Include Ancestor IDs" config option with the ID of the parent item(s) you want to remux. Usually you can open its page in Jellyfin and take the value of the id parameter in the address bar.
      • If you later want to remux everything, leave that option completely empty.
  • Skip/cleanup items watched by
    • When set to a username, the plugin won't remux otherwise-eligible items that this user has already watched. It will also delete remuxes once the user has watched them.
    • The cleanup functionality can be triggered by running the "Clean up Dolby Vision remuxes" scheduled task, which is unscheduled by default (I have mine set to run every 6 hours).
  • Convert Profile 7.6 to Profile 8.1
    • Automatically converts 7.6 videos to 8.1 by removing their enhancement layer, which should cause negligible quality loss. This is required for some older LG TVs which have issues processing dual-layer video (usually heavy stuttering or outright freezing)
    • Requires two tools, the paths to which are required configuration options:
      • dovi_tool: used to extract the raw HEVC bitstream and convert it to 8.1
      • mp4box, part of GPAC: used to remux the 8.1 video into a correctly-tagged MP4.
    • Huge shoutout to this Reddit comment for the gory details

Roadmap

  • Generate remuxed MP4s
  • Merge remuxes into the original item (as a new "Version" in the Jellyfin UI) out of scope
  • Add a configuration page because XML sucks
  • Add some additional options for constraining what to remux
  • Delete remuxes once they've been watched
  • Remux profile 5 content
  • Use dovi_tool to convert profile 7.6 to 8.1, if your TV really sucks like mine

Contributing

I wanted this to have a very seamless F5-able dev experience when developing locally; not "build, then drag-and-drop the DLL into the plugins directory, then launch Jellyfin".

I hacked this together with launch.json and tasks.json in the .vscode directory. If you want to run this locally the same way that I do, you'll need to change the paths there to reflect your own machine.

The paths in question are anything that has "katie" along the way. Specifically:

  • launch.json: working directory for your jellyfin repo clone, your Jellyfin.Server build output, and jellyfin-web dist/ directory
  • tasks.json: path to the plugin folder within your Jellyfin's plugins/ directory (doesn't need to exist previously)

Make sure you've built both Jellyfin.Server and jellyfin-web before launching!