diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-31 04:42:09 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-31 04:42:09 +0000 |
commit | f8833c9a95236c9dc75c1924af2e7ad1797f9536 (patch) | |
tree | 1ea5d7fb743fe72ff62d77c0d20fe303c828096a | |
parent | 9dc7c0f4b01207f74c758c6bde2cab497b2854e7 (diff) |
automatic import of python-jellyfin-mpv-shim
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-jellyfin-mpv-shim.spec | 2129 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 2131 insertions, 0 deletions
@@ -0,0 +1 @@ +/jellyfin-mpv-shim-2.6.0.tar.gz diff --git a/python-jellyfin-mpv-shim.spec b/python-jellyfin-mpv-shim.spec new file mode 100644 index 0000000..903be9c --- /dev/null +++ b/python-jellyfin-mpv-shim.spec @@ -0,0 +1,2129 @@ +%global _empty_manifest_terminate_build 0 +Name: python-jellyfin-mpv-shim +Version: 2.6.0 +Release: 1 +Summary: Cast media from Jellyfin Mobile and Web apps to MPV. +License: GPLv3 +URL: https://github.com/jellyfin/jellyfin-mpv-shim +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/e7/bf/e59af46495947728548cf82aafcc283c7e9f7df4e47f1bdbb8cb890abfde/jellyfin-mpv-shim-2.6.0.tar.gz +BuildArch: noarch + +Requires: python3-jellyfin-apiclient-python +Requires: python3-mpv +Requires: python3-mpv-jsonipc +Requires: python3-requests +Requires: python3-Jinja2 +Requires: python3-pillow +Requires: python3-pypresence +Requires: python3-pystray +Requires: python3-pywebview +Requires: python3-pypresence +Requires: python3-pillow +Requires: python3-pystray +Requires: python3-Jinja2 +Requires: python3-pywebview + +%description +# Jellyfin MPV Shim + +[](https://github.com/jellyfin/jellyfin-mpv-shim/releases) +[](https://pypi.org/project/jellyfin-mpv-shim/) +[](https://translate.jellyfin.org/projects/jellyfin/jellyfin-mpv-shim/) +[](https://github.com/psf/black) + +Jellyfin MPV Shim is a cross-platform cast client for Jellyfin. +It has support for all your advanced media files without transcoding, as well as tons of +features which set it apart from other multimedia clients: + + - Direct play most media using MPV. + - Watch videos with friends using SyncPlay. + - Offers a shim mode which runs in the background. + - The Jellyfin mobile apps can fully control the client. + - [Reconfigure subtitles](https://github.com/jellyfin/jellyfin-mpv-shim#menu) for an entire season at once. + - Supports all of the [MPV keyboard shortcuts](https://github.com/jellyfin/jellyfin-mpv-shim#keyboard-shortcuts). + - Enhance your video with [Shader Packs](https://github.com/jellyfin/jellyfin-mpv-shim#menu) and [SVP Integration](https://github.com/jellyfin/jellyfin-mpv-shim#svp-integration). + - Optionally share your media activity with friends using Discord Rich Presence. + - Most features, as well as MPV itself, [can be extensively configured](https://github.com/jellyfin/jellyfin-mpv-shim#configuration). + - You can configure the player to use an [external MPV player](https://github.com/jellyfin/jellyfin-mpv-shim#external-mpv) of your choice. + - Enable a chromecast-like experience with [Display Mirroring](https://github.com/jellyfin/jellyfin-mpv-shim#display-mirroring). + - You can [trigger commands to run](https://github.com/jellyfin/jellyfin-mpv-shim#shell-command-triggers) when certain events happen. + +To learn more, keep reading. This README explains everything, including [configuration](https://github.com/jellyfin/jellyfin-mpv-shim#configuration), [tips & tricks](https://github.com/jellyfin/jellyfin-mpv-shim#tips-and-tricks), and [development information](https://github.com/jellyfin/jellyfin-mpv-shim#development). + +## Getting Started + +If you are on Windows, simply [download the binary](https://github.com/jellyfin/jellyfin-mpv-shim/releases). +If you are using Linux, you can [install via flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim) or [install via pip](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation). If you are on macOS, see the [macOS Installation](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#osx-installation) +section below. + +To use the client, simply launch it and log into your Jellyfin server. You’ll need to enter the +URL to your server, for example `http://server_ip:8096` or `https://secure_domain`. Make sure to +include the subdirectory and port number if applicable. You can then cast your media +from another Jellyfin application. + +The application runs with a notification icon by default. You can use this to edit the server settings, +view the application log, open the config folder, and open the application menu. Unlike Plex MPV Shim, +authorization tokens for your server are stored on your device, but you are able to cast to the player +regardless of location. + +Note: Due to the huge number of questions and issues that have been submitted about URLs, I now tolerate +bare IP addresses and not specifying the port by default. If you want to connect to port 80 instead of +8096, you must add the `:80` to the URL because `:8096` is now the default. + +## Limitations + + - Music playback and Live TV are not supported. + - The client can’t be shared seamlessly between multiple users on the same server. ([Link to issue.](https://features.jellyfin.org/posts/319/mark-device-as-shared)) + +### Known Issues + +Please also note that the on-screen controller for MPV (if available) cannot change the +audio and subtitle track configurations for transcoded media. It also cannot load external +subtitles. You must either [use the menu](https://github.com/jellyfin/jellyfin-mpv-shim#menu) or the application you casted from. + +Please note the following issues with controlling SyncPlay: + - If you attempt to join a SyncPlay group when casting to MPV Shim, it will play the media but it will not activate SyncPlay. + - You can, however, proceed to activate SyncPlay [using the menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - If you would like to create a group or join a group for currently playing media, [use menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - SyncPlay as of 10.7.0 is new and kind of fragile. You may need to rejoin or even restart the client. Please report any issues you find. + +Music playback sort-of works, but repeat, shuffle, and gapless playback have not been implemented and +would require major changes to the application to properly support, as it was built for video. + +The shader packs feature is sensitive to graphics hardware. It may simply just not work on your computer. +You may be able to use the log files to get some more diagnostic information. If you're really unlucky, +you'll have to disable the feature by pressing `k` to restore basic functionality. +If you find the solution for your case, *please* send me any information you can provide, as every test case helps. + +## Advanced Features + +### Menu + +To open the menu, press **c** on your computer or use the navigation controls +in the mobile/web app. + +The menu enables you to: + - Adjust video transcoding quality. + - Change the default transcoder settings. + - Change subtitles or audio, while knowing the track names. + - Change subtitles or audio for an entire series at once. + - Mark the media as unwatched and quit. + - Enable and disable SyncPlay. + - Configure shader packs and SVP profiles. + - Take screenshots. + +On your computer, use the mouse or arrow keys, enter, and escape to navigate. +On your phone, use the arrow buttons, ok, back, and home to navigate. + +### Shader Packs + +Shader packs are a recent feature addition that allows you to easily use advanced video +shaders and video quality settings. These usually require a lot of configuration to use, +but MPV Shim's default shader pack comes with [FSRCNNX](https://github.com/igv/FSRCNN-TensorFlow) +and [Anime4K](https://github.com/bloc97/Anime4K) preconfigured. Try experimenting with video +profiles! It may greatly improve your experience. + +Shader Packs are ready to use as of the most recent MPV Shim version. To use, simply +navigate to the **Video Playback Profiles** option and select a profile. + +For details on the shader settings, please see [default-shader-pack](https://github.com/iwalton3/default-shader-pack). +If you would like to customize the shader pack, there are details in the configuration section. + +### SVP Integration + +SVP integration allows you to easily configure SVP support, change profiles, and enable/disable +SVP without having to exit the player. It is not enabled by default, please see the configuration +instructions for instructions on how to enable it. + +### Display Mirroring + +This feature allows media previews to show on your display before you cast the media, +similar to Chromecast. It is not enabled by default. To enable it, do one of the following: + + - Using the systray icon, click "Application Menu". Go to preferences and enable display mirroring. + - Use the arrow keys, escape, and enter to navigate the menu. + - Cast media to the player and press `c`. Go to preferences and enable display mirroring. + - In the config file (see below), change `display_mirroring` to `true`. + +Then restart the application for the change to take effect. To quit the application on Windows with +display mirroring enabled, press Alt+F4. + +### Keyboard Shortcuts + +This program supports most of the [keyboard shortcuts from MPV](https://mpv.io/manual/stable/#interactive-control). The custom keyboard shortcuts are: + + - < > to skip episodes + - q to close player + - w to mark watched and skip + - u to mark unwatched and quit + - c to open the menu + - k disable shader packs + +Here are the notable MPV keyboard shortcuts: + + - space - Pause/Play + - left/right - Seek by 5 seconds + - up/down - Seek by 1 minute + - s - Take a screenshot + - S - Take a screenshot without subtitles + - f - Toggle fullscreen + - ,/. - Seek by individual frames + - \[/\] - Change video speed by 10% + - {/} - Change video speed by 50% + - backspace - Reset speed + - m - Mute + - d - Enable/disable deinterlace + - Ctrl+Shift+Left/Right - Adjust subtitle delay. + +## Configuration + +The configuration file is located in different places depending on your platform. You can also open the +configuration folder using the systray icon if you are using the shim version. When you launch the program +on Linux or macOS from the terminal, the location of the config file will be printed. The locations are: + - Windows - `%appdata%\jellyfin-mpv-shim\conf.json` + - Linux - `~/.config/jellyfin-mpv-shim/conf.json` + - Linux (Flatpak) - `~/.var/app/com.github.iwalton3.jellyfin-mpv-shim/config/jellyfin-mpv-shim/conf.json` + - macOS - `~/Library/Application Support/jellyfin-mpv-shim/conf.json` + - CygWin - `~/.config/jellyfin-mpv-shim/conf.json` + +You can specify a custom configuration folder with the `--config` option. + +### Transcoding + +You can adjust the basic transcoder settings via the menu. + +- `always_transcode` - This will tell the client to always transcode. Default: `false` + - This may be useful if you are using limited hardware that cannot handle advanced codecs. + - Please note that Jellyfin may still direct play files that meet the transcode profile + requirements. There is nothing I can do on my end to disable this, but you can reduce + the bandwidth setting to force a transcode. +- `transcode_hdr` - Force transcode HDR videos to SDR. Default: `false` +- `transcode_dolby_vision` - Force transcode Dolby Vision videos to SDR. Default: `true` + - If your computer can handle it, you can get tone mapping to work for this using `vo=gpu-next`. + - Note that `vo=gpu-next` is considered experimental by MPV at this time. +- `transcode_hi10p` - Force transcode 10 bit color videos to 8 bit color. Default: `false` +- `remote_kbps` - Bandwidth to permit for remote streaming. Default: `10000` +- `local_kbps` - Bandwidth to permit for local streaming. Default: `2147483` +- `direct_paths` - Play media files directly from the SMB or NFS source. Default: `false` + - `remote_direct_paths` - Apply this even when the server is detected as remote. Default: `false` +- `allow_transcode_to_h265` - Allow the server to transcode media *to* `hevc`. Default: `false` + - If you enable this, it'll allow remuxing to HEVC but it'll also break force transcoding of Dolby Vision and HDR content if those settings are used. (See [this bug](https://github.com/jellyfin/jellyfin/issues/9313).) +- `prefer_transcode_to_h265` - Requests the server to transcode media *to* `hevc` as the default. Default: `false` +- `transcode_warning` - Display a warning the first time media transcodes in a session. Default: `true` +- `force_video_codec` - Force a specified video codec to be played. Default: `null` + - This can be used in tandem with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + - This will override `transcode_to_h265`, `transcode_h265` and `transcode_hi10p`. +- `force_audio_codec` - Force a specified audio codec to be played. Default: `null` + - This can be used in tandeom with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + +### Features + +You can use the config file to enable and disable features. + + - `fullscreen` - Fullscreen the player when starting playback. Default: `true` + - `enable_gui` - Enable the system tray icon and GUI features. Default: `true` + - `enable_osc` - Enable the MPV on-screen controller. Default: `true` + - It may be useful to disable this if you are using an external player that already provides a user interface. + - `media_key_seek` - Use the media next/prev keys to seek instead of skip episodes. Default: `false` + - `use_web_seek` - Use the seek times set in Jellyfin web for arrow key seek. Default: `false` + - `display_mirroring` - Enable webview-based display mirroring (content preview). Default: `false` + - `screenshot_menu` - Allow taking screenshots from menu. Default: `true` + - `check_updates` - Check for updates via GitHub. Default: `true` + - This requests the GitHub releases page and checks for a new version. + - Update checks are performed when playing media, once per day. + - `notify_updates` - Display update notification when playing media. Default: `true` + - Notification will only display once until the application is restarted. + - `discord_presence` - Enable Discord rich presence support. Default: `false` + - `menu_mouse` - Enable mouse support in the menu. Default: `true` + - This requires MPV to be compiled with lua support. + +### Shell Command Triggers + +You can execute shell commands on media state using the config file: + + - `media_ended_cmd` - When all media has played. + - `pre_media_cmd` - Before the player displays. (Will wait for finish.) + - `stop_cmd` - After stopping the player. + - `idle_cmd` - After no activity for `idle_cmd_delay` seconds. + - `idle_when_paused` - Consider the player idle when paused. Default: `false` + - `stop_idle` - Stop the player when idle. (Requires `idle_when_paused`.) Default: `false` + - `play_cmd` - After playback starts. + - `idle_ended_cmd` - After player stops being idle. + +### Subtitle Visual Settings + +These settings may not works for some subtitle codecs or if subtitles are being burned in +during a transcode. You can configure custom styled subtitle settings through the MPV config file. + + - `subtitle_size` - The size of the subtitles, in percent. Default: `100` + - `subtitle_color` - The color of the subtitles, in hex. Default: `#FFFFFFFF` + - `subtitle_position` - The position (top, bottom, middle). Default: `bottom` + +### External MPV + +The client now supports using an external copy of MPV, including one that is running prior to starting +the client. This may be useful if your distribution only provides MPV as a binary executable (instead +of as a shared library), or to connect to MPV-based GUI players. Please note that SMPlayer exhibits +strange behaviour when controlled in this manner. External MPV is currently the only working backend +for media playback on macOS. + +- `mpv_ext` - Enable usage of the external player by default. Default: `false` + - The external player may still be used by default if `libmpv1` is not available. +- `mpv_ext_path` - The path to the `mpv` binary to use. By default it uses the one in the PATH. Default: `null` + - If you are using Windows, make sure to use two backslashes. Example: `C:\\path\\to\\mpv.exe` +- `mpv_ext_ipc` - The path to the socket to control MPV. Default: `null` + - If unset, the socket is a randomly selected temp file. + - On Windows, this is just a name for the socket, not a path like on Linux. +- `mpv_ext_start` - Start a managed copy of MPV with the client. Default: `true` + - If not specified, the user must start MPV prior to launching the client. + - MPV must be launched with `--input-ipc-server=[value of mpv_ext_ipc]`. +- `mpv_ext_no_ovr` - Disable built-in mpv configuration files and use user defaults. + - Please note that some scripts and settings, such as ones to keep MPV open, may break + functionality in MPV Shim. + +### Keyboard Shortcuts + +You can reconfigure the custom keyboard shortcuts. You can also set them to `null` to disable the shortcut. Please note that disabling keyboard shortcuts may make some features unusable. Additionally, if you remap `q`, using the default shortcut will crash the player. + + - `kb_stop` - Stop playback and close MPV. (Default: `q`) + - `kb_prev` - Go to the previous video. (Default: `<`) + - `kb_next` - Go to the next video. (Default: `>`) + - `kb_watched` - Mark the video as watched and skip. (Default: `w`) + - `kb_unwatched` - Mark the video as unwatched and quit. (Default: `u`) + - `kb_menu` - Open the configuration menu. (Default: `c`) + - `kb_menu_esc` - Leave the menu. Exits fullscreen otherwise. (Default: `esc`) + - `kb_menu_ok` - "ok" for menu. (Default: `enter`) + - `kb_menu_left` - "left" for menu. Seeks otherwise. (Default: `left`) + - `kb_menu_right` - "right" for menu. Seeks otherwise. (Default: `right`) + - `kb_menu_up` - "up" for menu. Seeks otherwise. (Default: `up`) + - `kb_menu_down` - "down" for menu. Seeks otherwise. (Default: `down`) + - `kb_pause` - Pause. Also "ok" for menu. (Default: `space`) + - `kb_fullscreen` - Toggle fullscreen. (Default: `f`) + - `kb_debug` - Trigger `pdb` debugger. (Default: `~`) + - `kb_kill_shader` - Disable shader packs. (Default: `k`) + - `seek_up` - Time to seek for "up" key. (Default: `60`) + - `seek_down` - Time to seek for "down" key. (Default: `-60`) + - `seek_right` - Time to seek for "right" key. (Default: `5`) + - `seek_left` - Time to seek for "left" key. (Default: `-5`) + - `media_keys` - Enable binding of MPV to media keys. Default: `true` + - `seek_v_exact` - Use exact seek for up/down keys. Default: `false` + - `seek_h_exact` - Use exact seek for left/right keys. Default: `false` + +### Shader Packs + +Shader packs allow you to import MPV config and shader presets into MPV Shim and easily switch +between them at runtime through the built-in menu. This enables easy usage and switching of +advanced MPV video playback options, such as video upscaling, while being easy to use. + +If you select one of the presets from the shader pack, it will override some MPV configurations +and any shaders manually specified in `mpv.conf`. If you would like to customize the shader pack, +use `shader_pack_custom`. + + - `shader_pack_enable` - Enable shader pack. (Default: `true`) + - `shader_pack_custom` - Enable to use a custom shader pack. (Default: `false`) + - If you enable this, it will copy the default shader pack to the `shader_pack` config folder. + - This initial copy will only happen if the `shader_pack` folder didn't exist. + - This shader pack will then be used instead of the built-in one from then on. + - `shader_pack_remember` - Automatically remember the last used shader profile. (Default: `true`) + - `shader_pack_profile` - The default profile to use. (Default: `null`) + - If you use `shader_pack_remember`, this will be updated when you set a profile through the UI. + - `shader_pack_subtype` - The profile group to use. The default pack contains `lq` and `hq` groups. Use `hq` if you have a fancy graphics card. + +### Trickplay Thumbnails + +MPV will automatically display thumbnail previews. By default it uses the Jellyfin chapter images +but it can also use JellyScrub as the source. Please note that this feature will download and +uncompress all of the chapter images before it becomes available for a video. For a 4 hour movie this +causes disk usage of about 250 MB, but for the average TV episode it is around 40 MB. It also requires +overriding the default MPV OSC, which may conflict with some custom user script. Trickplay is compatible +with any OSC that uses [thumbfast](https://github.com/po5/thumbfast), as I have added a [compatibility layer](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/jellyfin_mpv_shim/thumbfast.lua). + + - `thumbnail_enable` - Enable thumbnail feature. (Default: `true`) + - `thumbnail_jellyscrub` - Use JellyScrub as the thumbnail source instead of chapter images. (Default: `false`) + - `thumbnail_osc_builtin` - Disable this setting if you want to use your own custom osc but leave trickplay enabled. (Default: `true`) + - `thumbnail_preferred_size` - The ideal size for thumbnails. (Default: `320`) + +### SVP Integration + +To enable SVP integration, set `svp_enable` to `true` and enable "External control via HTTP" within SVP +under Settings > Control options. Adjust the `svp_url` and `svp_socket` settings if needed. + + - `svp_enable` - Enable SVP integration. (Default: `false`) + - `svp_url` - URL for SVP web API. (Default: `http://127.0.0.1:9901/`) + - `svp_socket` - Custom MPV socket to use for SVP. + - Default on Windows: `mpvpipe` + - Default on other platforms: `/tmp/mpvsocket` + +Currently on Windows the built-in MPV does not work with SVP. You must download MPV yourself. + + - Download the latest MPV build [from here](https://sourceforge.net/projects/mpv-player-windows/files/64bit/). + - Follow the [vapoursynth instructions](https://github.com/shinchiro/mpv-winbuild-cmake/wiki/Setup-vapoursynth-for-mpv). + - Make sure to use the latest Python, not Python 3.7. + - In the config file, set `mpv_ext` to `true` and `mpv_ext_path` to the path to `mpv.exe`. + - Make sure to use two backslashes per each backslash in the path. + +### SyncPlay + +You probably don't need to change these, but they are defined here in case you +need to. + + - `sync_max_delay_speed` - Delay in ms before changing video speed to sync playback. Default: `50` + - `sync_max_delay_skip` - Delay in ms before skipping through the video to sync playback. Default: `300` + - `sync_method_thresh` - Delay in ms before switching sync method. Default: `2000` + - `sync_speed_time` - Duration in ms to change playback speed. Default: `1000` + - `sync_speed_attempts` - Number of attempts before speed changes are disabled. Default: `3` + - `sync_attempts` - Number of attempts before disabling sync play. Default: `5` + - `sync_revert_seek` - Attempt to revert seek via MPV OSC. Default: `true` + - This could break if you use revert-seek markers or scripts that use it. + - `sync_osd_message` - Write syncplay status messages to OSD. Default: `true` + +### Debugging + +These settings assist with debugging. You will often be asked to configure them when reporting an issue. + + - `log_decisions` - Log the full media decisions and playback URLs. Default: `false` + - `mpv_log_level` - Log level to use for mpv. Default: `info` + - Options: fatal, error, warn, info, v, debug, trace + - `sanitize_output` - Prevent the writing of server auth tokens to logs. Default: `true` + - `write_logs` - Write logs to the config directory for debugging. Default: `false` + +### Other Configuration Options + +Other miscellaneous configuration options. You probably won't have to change these. + + - `player_name` - The name of the player that appears in the cast menu. Initially set from your hostname. + - `client_uuid` - The identifier for the client. Set to a random value on first run. + - `audio_output` - Currently has no effect. Default: `hdmi` + - `playback_timeout` - Timeout to wait for MPV to start loading video in seconds. Default: `30` + - If you're hitting this, it means files on your server probably got corrupted or deleted. + - It could also happen if you try to play an unsupported video format. These are rare. + - `lang` - Allows overriding system locale. (Enter a language code.) Default: `null` + - MPV Shim should use your OS language by default. + - `ignore_ssl_cert` - Ignore SSL certificates. Default: `false` + - Please consider getting a certificate from Let's Encrypt instead of using this. + - `connect_retry_mins` - Number of minutes to retry connecting before showing login window. Default: `0` + - This only applies for when you first launch the program. + - `lang_filter` - Limit track selection to desired languages. Default: `und,eng,jpn,mis,mul,zxx` + - Note that you need to turn on the options below for this to actually do something. + - If you remove `und` from the list, it will ignore untagged items. + - Languages are typically in [ISO 639-2/B](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), + but if you have strange files this may not be the case. + - `lang_filter_sub` - Apply the language filter to subtitle selection. Default: `False` + - `lang_filter_audio` - Apply the language filter to audio selection. Default: `False` + - `screenshot_dir` - Sets where screenshots go. + - Default is the desktop on Windows and unset (current directory) on other platforms. + - `force_set_played` - This forcibly sets items as played when MPV playback finished. + - If you have files with malformed timestamps that don't get marked as played, enable this. + - `raise_mpv` - Windows only. Disable this if you are fine with MPV sometimes appearing behind other windows when playing. + - `health_check_interval` - The number of seconds between each client health check. Null disables it. Default: `300` + +### Skip Intro Support + +This functionality is considered experimental and requires the third-party [SkipIntro server plugin](https://github.com/ConfusedPolarBear/intro-skipper). It works the same ways as it did on MPV Shim for Plex. + + - `skip_intro_always` - Always skip intros, without asking. Default: `false` + - `skip_intro_prompt` - Prompt to skip intro via seeking. Default: `false` + +### MPV Configuration + +You can configure mpv directly using the `mpv.conf` and `input.conf` files. (It is in the same folder as `conf.json`.) +This may be useful for customizing video upscaling, keyboard shortcuts, or controlling the application +via the mpv IPC server. + +### Authorization + +The `cred.json` file contains the authorization information. If you are having problems with the client, +such as the Now Playing not appearing or want to delete a server, you can delete this file and add the +servers again. + +## Tips and Tricks + +Various tips have been found that allow the media player to support special +functionality, albeit with more configuration required. + +### Open on Specific Monitor (#19) + +Please note: Edits to the `mpv.conf` will not take effect until you restart the application. You can open the config directory by using the menu option in the system tray icon. + +**Option 1**: Select fullscreen output screen through MPV. +Determine which screen you would like MPV to show up on. + - If you are on Windows, right click the desktop and select "Display Settings". Take the monitor number and subtract one. + - If you are on Linux, run `xrandr`. The screen number is the number you want. If there is only one proceed to **Option 2**. + +Add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration), replacing `0` with the number from the previous step: +``` +fs=yes +fs-screen=0 +``` + +**Option 2**: (Linux Only) If option 1 does not work, both of your monitors are likely configured as a single "screen". + +Run `xrandr`. It should look something like this: + +``` +Screen 0: minimum 8 x 8, current 3520 x 1080, maximum 16384 x 16384 +VGA-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm + 1920x1080 60.00*+ + 1680x1050 59.95 + 1440x900 59.89 + 1280x1024 75.02 60.02 + 1280x960 60.00 + 1280x800 59.81 + 1280x720 60.00 + 1152x864 75.00 + 1024x768 75.03 70.07 60.00 + 800x600 75.00 72.19 60.32 56.25 + 640x480 75.00 59.94 +LVDS-0 connected 1600x900+1920+180 (normal left inverted right x axis y axis) 309mm x 174mm + 1600x900 59.98*+ +``` + +If you want MPV to open on VGA-0 for instance, add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration): +``` +fs=yes +geometry=1920x1080+0+0 +``` +**Option 3**: (Linux Only) If your window manager supports it, you can tell the window manager to always open on a specific screen. + + - For OpenBox: https://forums.bunsenlabs.org/viewtopic.php?id=1199 + - For i3: https://unix.stackexchange.com/questions/96798/i3wm-start-applications-on-specific-workspaces-when-i3-starts/363848#363848 + +### Control Volume with Mouse Wheel (#48) + +Add the following to `input.conf`: +``` +WHEEL_UP add volume 5 +WHEEL_DOWN add volume -5 +``` + +### MPRIS Plugin (#54) + +Set `mpv_ext` to `true` in the config. Add `script=/path/to/mpris.so` to `mpv.conf`. + +### Run Multiple Instances (#45) + +You can pass `--config /path/to/folder` to run another copy of the player. Please +note that running multiple copies of the desktop client is currently not supported. + +### Audio Passthrough + +You can edit `mpv.conf` to support audio passthrough. A [user on Reddit](https://reddit.com/r/jellyfin/comments/fru6xo/new_cross_platform_desktop_client_jellyfin_mpv/fns7vyp) had luck with this config: +``` +audio-spdif=ac3,dts,eac3 # (to use the passthrough to receiver over hdmi) +audio-channels=2 # (not sure this is necessary, but i keep it in because it works) +af=scaletempo,lavcac3enc=yes:640:3 # (for aac 5.1 tracks to the receiver) +``` + +### MPV Crashes with "The sub-scale option must be a floating point number or a ratio" + +Run the jellyfin-mpv-shim program with LC_NUMERIC=C. + +### Use with gnome-mpv/celluloid (#61) + +You can use `gnome-mpv` with MPV Shim, but you must launch `gnome-mpv` separately before MPV Shim. (`gnome-mpv` doesn't support the MPV command options directly.) + +Configure MPV Shim with the following options (leave the other ones): +```json +{ + "mpv_ext": true, + "mpv_ext_ipc": "/tmp/gmpv-socket", + "mpv_ext_path": null, + "mpv_ext_start": false, + "enable_osc": false +} +``` +Then within `gnome-mpv`, click the application icon (top left) > Preferences. Configure the following Extra MPV Options: +``` +--idle --input-ipc-server=/tmp/gmpv-socket +``` + +### Heavy Memory Usage + +A problem has been identified where MPV can use a ton of RAM after media has been played, +and this RAM is not always freed when the player goes into idle mode. Some users have +found that using external MPV lessens the memory leak. To enable external MPV on Windows: + + - [Download a copy of MPV](https://sourceforge.net/projects/mpv-player-windows/files/64bit/) + - Unzip it with 7zip. + - Configure `mpv_ext` to `true`. (See the config section.) + - Configure `mpv_ext_path` to `C:\\replace\\with\\path\\to\\mpv.exe`. (Note usage of two `\\`.) + - Run the program and wait. (You'll probably have to use it for a while.) + - Let me know if the high memory usage is with `mpv.exe` or the shim itself. + +On Linux, the process is similar, except that you don't need to set the `mpv_ext_path` variable. +On macOS, external MPV is already the default and is the only supported player mode. + +In the long term, I may look into a method of terminating MPV when not in use. This will require +a lot of changes to the software. + +### Player Sizing (#91) + +MPV by default may force the window size to match the video aspect ratio, instead of allowing +resizing and centering the video accordingly. Add the following to `mpv.conf` to enable resizing +of the window freely, if desired: +``` +no-keepaspect-window +``` + +## Development + +If you'd like to run the application without installing it, run `./run.py`. +The project is written entirely in Python 3. There are no closed-source +components in this project. It is fully hackable. + +The project is dependent on `python-mpv`, `python-mpv-jsonipc`, and `jellyfin-apiclient-python`. If you are +using Windows and would like mpv to be maximize properly, `pywin32` is also needed. The GUI +component uses `pystray` and `tkinter`, but there is a fallback cli mode. The mirroring dependencies +are `Jinja2` and `pywebview`, along with platform-specific dependencies. (See the installation and building +guides for details on platform-specific dependencies for display mirroring.) + +This project is based Plex MPV Shim, which is based on https://github.com/wnielson/omplex, which +is available under the terms of the MIT License. The project was ported to python3, modified to +use mpv as the player, and updated to allow all features of the remote control api for video playback. + +The Jellyfin API client comes from [Jellyfin for Kodi](https://github.com/jellyfin/jellyfin-kodi/tree/master/jellyfin_kodi). +The API client was originally forked for this project and is now a [separate package](https://github.com/iwalton3/jellyfin-apiclient-python). + +The css file for desktop mirroring is from [jellyfin-chromecast](https://github.com/jellyfin/jellyfin-chromecast/tree/5194d2b9f0120e0eb8c7a81fe546cb9e92fcca2b) and is subject to GPL v2.0. + +The shaders included in the shader pack are also available under verious open source licenses, +[which you can read about here](https://github.com/iwalton3/default-shader-pack/blob/master/LICENSE.md). + +### Local Dev Installation + +If you are on Windows there are additional dependencies. Please see the Windows Build Instructions. + +1. Install the dependencies: `sudo pip3 install --upgrade python-mpv jellyfin-apiclient-python pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - If you run `./gen_pkg.sh --install`, it will also fetch these for you. +2. Clone this repository: `git clone https://github.com/jellyfin/jellyfin-mpv-shim` + - You can also download a zip build. +3. `cd` to the repository: `cd jellyfin-mpv-shim` +4. Run prepare script: `./gen_pkg.sh` + - To do this manually, download the web client, shader pack, and build the language files. +5. Ensure you have a copy of `libmpv1` or `mpv` available. +6. Install any platform-specific dependencies from the respective install tutorials. +7. You should now be able to run the program with `./run.py`. Installation is possible with `sudo pip3 install .`. + - You can also install the package with `./gen_pkg.sh --install`. + +### Translation + +This project uses gettext for translation. The current template language file is `base.pot` in `jellyfin_mpv_shim/messages/`. + +To regenerate `base.pot` and update an existing translation with new strings: +```bash +./regen_pot.sh +``` + +To compile all `*.po` files to `*.mo`: +```bash +./gen_pkg.sh --skip-build +``` + +## Linux Installation + +You can [install the software from flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim). The pip installation is less integrated but takes up less space if you're not already using flatpak. + +If you are on Linux, you can install via pip. You'll need [libmpv1](https://github.com/Kagami/mpv.js/blob/master/README.md#get-libmpv) or `mpv` installed. +```bash +sudo pip3 install --upgrade jellyfin-mpv-shim +``` +If you would like the GUI and systray features, also install `pystray` and `tkinter`: +```bash +sudo pip3 install pystray +sudo apt install python3-tk +``` +If you would like display mirroring support, install the mirroring dependencies: +```bash +sudo apt install python3-jinja2 python3-webview +# -- OR -- +sudo pip3 install jellyfin-mpv-shim[mirror] +sudo apt install gir1.2-webkit2-4.0 +``` +Discord rich presence support: +```bash +sudo pip3 install jellyfin-mpv-shim[discord] +``` +You can build mpv from source to get better codec support. Execute the following: +```bash +sudo pip3 install --upgrade python-mpv +sudo apt install autoconf automake libtool libharfbuzz-dev libfreetype6-dev libfontconfig1-dev libx11-dev libxrandr-dev libvdpau-dev libva-dev mesa-common-dev libegl1-mesa-dev yasm libasound2-dev libpulse-dev libuchardet-dev zlib1g-dev libfribidi-dev git libgnutls28-dev libgl1-mesa-dev libsdl2-dev cmake wget python g++ libluajit-5.1-dev +git clone https://github.com/mpv-player/mpv-build.git +cd mpv-build +echo --enable-libmpv-shared > mpv_options +./rebuild -j4 +sudo ./install +sudo ldconfig +``` + +## <h2 id="osx-installation">macOS Installation</h2> +Currently on macOS only the external MPV backend seems to be working. I cannot test on macOS, so please report any issues you find. + +To install the CLI version: + +1. Install brew. ([Instructions](https://brew.sh/)) +2. Install python3 and mpv. `brew install python mpv` +3. Install jellyfin-mpv-shim. `pip3 install --upgrade jellyfin-mpv-shim` +4. Run `jellyfin-mpv-shim`. + +If you'd like to install the GUI version, you need a working copy of tkinter. + +1. Install pyenv. ([Instructions](https://medium.com/python-every-day/python-development-on-macos-with-pyenv-2509c694a808)) +2. Install TK and mpv. `brew install tcl-tk mpv` +3. Install python3 with TK support. `FLAGS="-I$(brew --prefix tcl-tk)/include" pyenv install 3.8.1` +4. Set this python3 as the default. `pyenv global 3.8.1` +5. Install jellyfin-mpv-shim and pystray. `pip3 install --upgrade 'jellyfin-mpv-shim[gui]'` +6. Run `jellyfin-mpv-shim`. + +Display mirroring is not tested on macOS, but may be installable with 'pip3 install --upgrade 'jellyfin-mpv-shim[mirror]'`. + +## Building on Windows + +There is a prebuilt version for Windows in the releases section. When +following these directions, please take care to ensure both the python +and libmpv libraries are either 64 or 32 bit. (Don't mismatch them.) + +If you'd like to build the installer, please install [Inno Setup](https://jrsoftware.org/isinfo.php) to build +the installer. If you'd like to build a 32 bit version, download the 32 bit version of mpv-1.dll and +copy it into a new folder called mpv32. You'll also need [WebBrowserInterop.x86.dll](https://github.com/r0x0r/pywebview/blob/master/webview/lib/WebBrowserInterop.x86.dll?raw=true). +You may also need to edit the batch file for 32 bit builds to point to the right python executable. + +1. Install Git for Windows. Open Git Bash and run `git clone https://github.com/jellyfin/jellyfin-mpv-shim; cd jellyfin-mpv-shim`. + - You can update the project later with `git pull`. +2. Install [Python3](https://www.python.org/downloads/) with PATH enabled. Install [7zip](https://ninite.com/7zip/). +3. After installing python3, open `cmd` as admin and run `pip install --upgrade pyinstaller python-mpv jellyfin-apiclient-python pywin32 pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - Details: https://github.com/pyinstaller/pyinstaller/issues/4346 +4. Download [libmpv](https://sourceforge.net/projects/mpv-player-windows/files/libmpv/). +5. Extract the `mpv-2.dll` from the file and move it to the `jellyfin-mpv-shim` folder. +6. Open a regular `cmd` prompt. Navigate to the `jellyfin-mpv-shim` folder. +7. Run `get_pywebview_natives.py`. +8. Run `./gen_pkg.sh --skip-build` using the Git for Windows console. + - This builds the translation files and downloads the shader packs. +9. Run `build-win.bat`. + + + + +%package -n python3-jellyfin-mpv-shim +Summary: Cast media from Jellyfin Mobile and Web apps to MPV. +Provides: python-jellyfin-mpv-shim +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-jellyfin-mpv-shim +# Jellyfin MPV Shim + +[](https://github.com/jellyfin/jellyfin-mpv-shim/releases) +[](https://pypi.org/project/jellyfin-mpv-shim/) +[](https://translate.jellyfin.org/projects/jellyfin/jellyfin-mpv-shim/) +[](https://github.com/psf/black) + +Jellyfin MPV Shim is a cross-platform cast client for Jellyfin. +It has support for all your advanced media files without transcoding, as well as tons of +features which set it apart from other multimedia clients: + + - Direct play most media using MPV. + - Watch videos with friends using SyncPlay. + - Offers a shim mode which runs in the background. + - The Jellyfin mobile apps can fully control the client. + - [Reconfigure subtitles](https://github.com/jellyfin/jellyfin-mpv-shim#menu) for an entire season at once. + - Supports all of the [MPV keyboard shortcuts](https://github.com/jellyfin/jellyfin-mpv-shim#keyboard-shortcuts). + - Enhance your video with [Shader Packs](https://github.com/jellyfin/jellyfin-mpv-shim#menu) and [SVP Integration](https://github.com/jellyfin/jellyfin-mpv-shim#svp-integration). + - Optionally share your media activity with friends using Discord Rich Presence. + - Most features, as well as MPV itself, [can be extensively configured](https://github.com/jellyfin/jellyfin-mpv-shim#configuration). + - You can configure the player to use an [external MPV player](https://github.com/jellyfin/jellyfin-mpv-shim#external-mpv) of your choice. + - Enable a chromecast-like experience with [Display Mirroring](https://github.com/jellyfin/jellyfin-mpv-shim#display-mirroring). + - You can [trigger commands to run](https://github.com/jellyfin/jellyfin-mpv-shim#shell-command-triggers) when certain events happen. + +To learn more, keep reading. This README explains everything, including [configuration](https://github.com/jellyfin/jellyfin-mpv-shim#configuration), [tips & tricks](https://github.com/jellyfin/jellyfin-mpv-shim#tips-and-tricks), and [development information](https://github.com/jellyfin/jellyfin-mpv-shim#development). + +## Getting Started + +If you are on Windows, simply [download the binary](https://github.com/jellyfin/jellyfin-mpv-shim/releases). +If you are using Linux, you can [install via flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim) or [install via pip](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation). If you are on macOS, see the [macOS Installation](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#osx-installation) +section below. + +To use the client, simply launch it and log into your Jellyfin server. You’ll need to enter the +URL to your server, for example `http://server_ip:8096` or `https://secure_domain`. Make sure to +include the subdirectory and port number if applicable. You can then cast your media +from another Jellyfin application. + +The application runs with a notification icon by default. You can use this to edit the server settings, +view the application log, open the config folder, and open the application menu. Unlike Plex MPV Shim, +authorization tokens for your server are stored on your device, but you are able to cast to the player +regardless of location. + +Note: Due to the huge number of questions and issues that have been submitted about URLs, I now tolerate +bare IP addresses and not specifying the port by default. If you want to connect to port 80 instead of +8096, you must add the `:80` to the URL because `:8096` is now the default. + +## Limitations + + - Music playback and Live TV are not supported. + - The client can’t be shared seamlessly between multiple users on the same server. ([Link to issue.](https://features.jellyfin.org/posts/319/mark-device-as-shared)) + +### Known Issues + +Please also note that the on-screen controller for MPV (if available) cannot change the +audio and subtitle track configurations for transcoded media. It also cannot load external +subtitles. You must either [use the menu](https://github.com/jellyfin/jellyfin-mpv-shim#menu) or the application you casted from. + +Please note the following issues with controlling SyncPlay: + - If you attempt to join a SyncPlay group when casting to MPV Shim, it will play the media but it will not activate SyncPlay. + - You can, however, proceed to activate SyncPlay [using the menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - If you would like to create a group or join a group for currently playing media, [use menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - SyncPlay as of 10.7.0 is new and kind of fragile. You may need to rejoin or even restart the client. Please report any issues you find. + +Music playback sort-of works, but repeat, shuffle, and gapless playback have not been implemented and +would require major changes to the application to properly support, as it was built for video. + +The shader packs feature is sensitive to graphics hardware. It may simply just not work on your computer. +You may be able to use the log files to get some more diagnostic information. If you're really unlucky, +you'll have to disable the feature by pressing `k` to restore basic functionality. +If you find the solution for your case, *please* send me any information you can provide, as every test case helps. + +## Advanced Features + +### Menu + +To open the menu, press **c** on your computer or use the navigation controls +in the mobile/web app. + +The menu enables you to: + - Adjust video transcoding quality. + - Change the default transcoder settings. + - Change subtitles or audio, while knowing the track names. + - Change subtitles or audio for an entire series at once. + - Mark the media as unwatched and quit. + - Enable and disable SyncPlay. + - Configure shader packs and SVP profiles. + - Take screenshots. + +On your computer, use the mouse or arrow keys, enter, and escape to navigate. +On your phone, use the arrow buttons, ok, back, and home to navigate. + +### Shader Packs + +Shader packs are a recent feature addition that allows you to easily use advanced video +shaders and video quality settings. These usually require a lot of configuration to use, +but MPV Shim's default shader pack comes with [FSRCNNX](https://github.com/igv/FSRCNN-TensorFlow) +and [Anime4K](https://github.com/bloc97/Anime4K) preconfigured. Try experimenting with video +profiles! It may greatly improve your experience. + +Shader Packs are ready to use as of the most recent MPV Shim version. To use, simply +navigate to the **Video Playback Profiles** option and select a profile. + +For details on the shader settings, please see [default-shader-pack](https://github.com/iwalton3/default-shader-pack). +If you would like to customize the shader pack, there are details in the configuration section. + +### SVP Integration + +SVP integration allows you to easily configure SVP support, change profiles, and enable/disable +SVP without having to exit the player. It is not enabled by default, please see the configuration +instructions for instructions on how to enable it. + +### Display Mirroring + +This feature allows media previews to show on your display before you cast the media, +similar to Chromecast. It is not enabled by default. To enable it, do one of the following: + + - Using the systray icon, click "Application Menu". Go to preferences and enable display mirroring. + - Use the arrow keys, escape, and enter to navigate the menu. + - Cast media to the player and press `c`. Go to preferences and enable display mirroring. + - In the config file (see below), change `display_mirroring` to `true`. + +Then restart the application for the change to take effect. To quit the application on Windows with +display mirroring enabled, press Alt+F4. + +### Keyboard Shortcuts + +This program supports most of the [keyboard shortcuts from MPV](https://mpv.io/manual/stable/#interactive-control). The custom keyboard shortcuts are: + + - < > to skip episodes + - q to close player + - w to mark watched and skip + - u to mark unwatched and quit + - c to open the menu + - k disable shader packs + +Here are the notable MPV keyboard shortcuts: + + - space - Pause/Play + - left/right - Seek by 5 seconds + - up/down - Seek by 1 minute + - s - Take a screenshot + - S - Take a screenshot without subtitles + - f - Toggle fullscreen + - ,/. - Seek by individual frames + - \[/\] - Change video speed by 10% + - {/} - Change video speed by 50% + - backspace - Reset speed + - m - Mute + - d - Enable/disable deinterlace + - Ctrl+Shift+Left/Right - Adjust subtitle delay. + +## Configuration + +The configuration file is located in different places depending on your platform. You can also open the +configuration folder using the systray icon if you are using the shim version. When you launch the program +on Linux or macOS from the terminal, the location of the config file will be printed. The locations are: + - Windows - `%appdata%\jellyfin-mpv-shim\conf.json` + - Linux - `~/.config/jellyfin-mpv-shim/conf.json` + - Linux (Flatpak) - `~/.var/app/com.github.iwalton3.jellyfin-mpv-shim/config/jellyfin-mpv-shim/conf.json` + - macOS - `~/Library/Application Support/jellyfin-mpv-shim/conf.json` + - CygWin - `~/.config/jellyfin-mpv-shim/conf.json` + +You can specify a custom configuration folder with the `--config` option. + +### Transcoding + +You can adjust the basic transcoder settings via the menu. + +- `always_transcode` - This will tell the client to always transcode. Default: `false` + - This may be useful if you are using limited hardware that cannot handle advanced codecs. + - Please note that Jellyfin may still direct play files that meet the transcode profile + requirements. There is nothing I can do on my end to disable this, but you can reduce + the bandwidth setting to force a transcode. +- `transcode_hdr` - Force transcode HDR videos to SDR. Default: `false` +- `transcode_dolby_vision` - Force transcode Dolby Vision videos to SDR. Default: `true` + - If your computer can handle it, you can get tone mapping to work for this using `vo=gpu-next`. + - Note that `vo=gpu-next` is considered experimental by MPV at this time. +- `transcode_hi10p` - Force transcode 10 bit color videos to 8 bit color. Default: `false` +- `remote_kbps` - Bandwidth to permit for remote streaming. Default: `10000` +- `local_kbps` - Bandwidth to permit for local streaming. Default: `2147483` +- `direct_paths` - Play media files directly from the SMB or NFS source. Default: `false` + - `remote_direct_paths` - Apply this even when the server is detected as remote. Default: `false` +- `allow_transcode_to_h265` - Allow the server to transcode media *to* `hevc`. Default: `false` + - If you enable this, it'll allow remuxing to HEVC but it'll also break force transcoding of Dolby Vision and HDR content if those settings are used. (See [this bug](https://github.com/jellyfin/jellyfin/issues/9313).) +- `prefer_transcode_to_h265` - Requests the server to transcode media *to* `hevc` as the default. Default: `false` +- `transcode_warning` - Display a warning the first time media transcodes in a session. Default: `true` +- `force_video_codec` - Force a specified video codec to be played. Default: `null` + - This can be used in tandem with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + - This will override `transcode_to_h265`, `transcode_h265` and `transcode_hi10p`. +- `force_audio_codec` - Force a specified audio codec to be played. Default: `null` + - This can be used in tandeom with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + +### Features + +You can use the config file to enable and disable features. + + - `fullscreen` - Fullscreen the player when starting playback. Default: `true` + - `enable_gui` - Enable the system tray icon and GUI features. Default: `true` + - `enable_osc` - Enable the MPV on-screen controller. Default: `true` + - It may be useful to disable this if you are using an external player that already provides a user interface. + - `media_key_seek` - Use the media next/prev keys to seek instead of skip episodes. Default: `false` + - `use_web_seek` - Use the seek times set in Jellyfin web for arrow key seek. Default: `false` + - `display_mirroring` - Enable webview-based display mirroring (content preview). Default: `false` + - `screenshot_menu` - Allow taking screenshots from menu. Default: `true` + - `check_updates` - Check for updates via GitHub. Default: `true` + - This requests the GitHub releases page and checks for a new version. + - Update checks are performed when playing media, once per day. + - `notify_updates` - Display update notification when playing media. Default: `true` + - Notification will only display once until the application is restarted. + - `discord_presence` - Enable Discord rich presence support. Default: `false` + - `menu_mouse` - Enable mouse support in the menu. Default: `true` + - This requires MPV to be compiled with lua support. + +### Shell Command Triggers + +You can execute shell commands on media state using the config file: + + - `media_ended_cmd` - When all media has played. + - `pre_media_cmd` - Before the player displays. (Will wait for finish.) + - `stop_cmd` - After stopping the player. + - `idle_cmd` - After no activity for `idle_cmd_delay` seconds. + - `idle_when_paused` - Consider the player idle when paused. Default: `false` + - `stop_idle` - Stop the player when idle. (Requires `idle_when_paused`.) Default: `false` + - `play_cmd` - After playback starts. + - `idle_ended_cmd` - After player stops being idle. + +### Subtitle Visual Settings + +These settings may not works for some subtitle codecs or if subtitles are being burned in +during a transcode. You can configure custom styled subtitle settings through the MPV config file. + + - `subtitle_size` - The size of the subtitles, in percent. Default: `100` + - `subtitle_color` - The color of the subtitles, in hex. Default: `#FFFFFFFF` + - `subtitle_position` - The position (top, bottom, middle). Default: `bottom` + +### External MPV + +The client now supports using an external copy of MPV, including one that is running prior to starting +the client. This may be useful if your distribution only provides MPV as a binary executable (instead +of as a shared library), or to connect to MPV-based GUI players. Please note that SMPlayer exhibits +strange behaviour when controlled in this manner. External MPV is currently the only working backend +for media playback on macOS. + +- `mpv_ext` - Enable usage of the external player by default. Default: `false` + - The external player may still be used by default if `libmpv1` is not available. +- `mpv_ext_path` - The path to the `mpv` binary to use. By default it uses the one in the PATH. Default: `null` + - If you are using Windows, make sure to use two backslashes. Example: `C:\\path\\to\\mpv.exe` +- `mpv_ext_ipc` - The path to the socket to control MPV. Default: `null` + - If unset, the socket is a randomly selected temp file. + - On Windows, this is just a name for the socket, not a path like on Linux. +- `mpv_ext_start` - Start a managed copy of MPV with the client. Default: `true` + - If not specified, the user must start MPV prior to launching the client. + - MPV must be launched with `--input-ipc-server=[value of mpv_ext_ipc]`. +- `mpv_ext_no_ovr` - Disable built-in mpv configuration files and use user defaults. + - Please note that some scripts and settings, such as ones to keep MPV open, may break + functionality in MPV Shim. + +### Keyboard Shortcuts + +You can reconfigure the custom keyboard shortcuts. You can also set them to `null` to disable the shortcut. Please note that disabling keyboard shortcuts may make some features unusable. Additionally, if you remap `q`, using the default shortcut will crash the player. + + - `kb_stop` - Stop playback and close MPV. (Default: `q`) + - `kb_prev` - Go to the previous video. (Default: `<`) + - `kb_next` - Go to the next video. (Default: `>`) + - `kb_watched` - Mark the video as watched and skip. (Default: `w`) + - `kb_unwatched` - Mark the video as unwatched and quit. (Default: `u`) + - `kb_menu` - Open the configuration menu. (Default: `c`) + - `kb_menu_esc` - Leave the menu. Exits fullscreen otherwise. (Default: `esc`) + - `kb_menu_ok` - "ok" for menu. (Default: `enter`) + - `kb_menu_left` - "left" for menu. Seeks otherwise. (Default: `left`) + - `kb_menu_right` - "right" for menu. Seeks otherwise. (Default: `right`) + - `kb_menu_up` - "up" for menu. Seeks otherwise. (Default: `up`) + - `kb_menu_down` - "down" for menu. Seeks otherwise. (Default: `down`) + - `kb_pause` - Pause. Also "ok" for menu. (Default: `space`) + - `kb_fullscreen` - Toggle fullscreen. (Default: `f`) + - `kb_debug` - Trigger `pdb` debugger. (Default: `~`) + - `kb_kill_shader` - Disable shader packs. (Default: `k`) + - `seek_up` - Time to seek for "up" key. (Default: `60`) + - `seek_down` - Time to seek for "down" key. (Default: `-60`) + - `seek_right` - Time to seek for "right" key. (Default: `5`) + - `seek_left` - Time to seek for "left" key. (Default: `-5`) + - `media_keys` - Enable binding of MPV to media keys. Default: `true` + - `seek_v_exact` - Use exact seek for up/down keys. Default: `false` + - `seek_h_exact` - Use exact seek for left/right keys. Default: `false` + +### Shader Packs + +Shader packs allow you to import MPV config and shader presets into MPV Shim and easily switch +between them at runtime through the built-in menu. This enables easy usage and switching of +advanced MPV video playback options, such as video upscaling, while being easy to use. + +If you select one of the presets from the shader pack, it will override some MPV configurations +and any shaders manually specified in `mpv.conf`. If you would like to customize the shader pack, +use `shader_pack_custom`. + + - `shader_pack_enable` - Enable shader pack. (Default: `true`) + - `shader_pack_custom` - Enable to use a custom shader pack. (Default: `false`) + - If you enable this, it will copy the default shader pack to the `shader_pack` config folder. + - This initial copy will only happen if the `shader_pack` folder didn't exist. + - This shader pack will then be used instead of the built-in one from then on. + - `shader_pack_remember` - Automatically remember the last used shader profile. (Default: `true`) + - `shader_pack_profile` - The default profile to use. (Default: `null`) + - If you use `shader_pack_remember`, this will be updated when you set a profile through the UI. + - `shader_pack_subtype` - The profile group to use. The default pack contains `lq` and `hq` groups. Use `hq` if you have a fancy graphics card. + +### Trickplay Thumbnails + +MPV will automatically display thumbnail previews. By default it uses the Jellyfin chapter images +but it can also use JellyScrub as the source. Please note that this feature will download and +uncompress all of the chapter images before it becomes available for a video. For a 4 hour movie this +causes disk usage of about 250 MB, but for the average TV episode it is around 40 MB. It also requires +overriding the default MPV OSC, which may conflict with some custom user script. Trickplay is compatible +with any OSC that uses [thumbfast](https://github.com/po5/thumbfast), as I have added a [compatibility layer](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/jellyfin_mpv_shim/thumbfast.lua). + + - `thumbnail_enable` - Enable thumbnail feature. (Default: `true`) + - `thumbnail_jellyscrub` - Use JellyScrub as the thumbnail source instead of chapter images. (Default: `false`) + - `thumbnail_osc_builtin` - Disable this setting if you want to use your own custom osc but leave trickplay enabled. (Default: `true`) + - `thumbnail_preferred_size` - The ideal size for thumbnails. (Default: `320`) + +### SVP Integration + +To enable SVP integration, set `svp_enable` to `true` and enable "External control via HTTP" within SVP +under Settings > Control options. Adjust the `svp_url` and `svp_socket` settings if needed. + + - `svp_enable` - Enable SVP integration. (Default: `false`) + - `svp_url` - URL for SVP web API. (Default: `http://127.0.0.1:9901/`) + - `svp_socket` - Custom MPV socket to use for SVP. + - Default on Windows: `mpvpipe` + - Default on other platforms: `/tmp/mpvsocket` + +Currently on Windows the built-in MPV does not work with SVP. You must download MPV yourself. + + - Download the latest MPV build [from here](https://sourceforge.net/projects/mpv-player-windows/files/64bit/). + - Follow the [vapoursynth instructions](https://github.com/shinchiro/mpv-winbuild-cmake/wiki/Setup-vapoursynth-for-mpv). + - Make sure to use the latest Python, not Python 3.7. + - In the config file, set `mpv_ext` to `true` and `mpv_ext_path` to the path to `mpv.exe`. + - Make sure to use two backslashes per each backslash in the path. + +### SyncPlay + +You probably don't need to change these, but they are defined here in case you +need to. + + - `sync_max_delay_speed` - Delay in ms before changing video speed to sync playback. Default: `50` + - `sync_max_delay_skip` - Delay in ms before skipping through the video to sync playback. Default: `300` + - `sync_method_thresh` - Delay in ms before switching sync method. Default: `2000` + - `sync_speed_time` - Duration in ms to change playback speed. Default: `1000` + - `sync_speed_attempts` - Number of attempts before speed changes are disabled. Default: `3` + - `sync_attempts` - Number of attempts before disabling sync play. Default: `5` + - `sync_revert_seek` - Attempt to revert seek via MPV OSC. Default: `true` + - This could break if you use revert-seek markers or scripts that use it. + - `sync_osd_message` - Write syncplay status messages to OSD. Default: `true` + +### Debugging + +These settings assist with debugging. You will often be asked to configure them when reporting an issue. + + - `log_decisions` - Log the full media decisions and playback URLs. Default: `false` + - `mpv_log_level` - Log level to use for mpv. Default: `info` + - Options: fatal, error, warn, info, v, debug, trace + - `sanitize_output` - Prevent the writing of server auth tokens to logs. Default: `true` + - `write_logs` - Write logs to the config directory for debugging. Default: `false` + +### Other Configuration Options + +Other miscellaneous configuration options. You probably won't have to change these. + + - `player_name` - The name of the player that appears in the cast menu. Initially set from your hostname. + - `client_uuid` - The identifier for the client. Set to a random value on first run. + - `audio_output` - Currently has no effect. Default: `hdmi` + - `playback_timeout` - Timeout to wait for MPV to start loading video in seconds. Default: `30` + - If you're hitting this, it means files on your server probably got corrupted or deleted. + - It could also happen if you try to play an unsupported video format. These are rare. + - `lang` - Allows overriding system locale. (Enter a language code.) Default: `null` + - MPV Shim should use your OS language by default. + - `ignore_ssl_cert` - Ignore SSL certificates. Default: `false` + - Please consider getting a certificate from Let's Encrypt instead of using this. + - `connect_retry_mins` - Number of minutes to retry connecting before showing login window. Default: `0` + - This only applies for when you first launch the program. + - `lang_filter` - Limit track selection to desired languages. Default: `und,eng,jpn,mis,mul,zxx` + - Note that you need to turn on the options below for this to actually do something. + - If you remove `und` from the list, it will ignore untagged items. + - Languages are typically in [ISO 639-2/B](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), + but if you have strange files this may not be the case. + - `lang_filter_sub` - Apply the language filter to subtitle selection. Default: `False` + - `lang_filter_audio` - Apply the language filter to audio selection. Default: `False` + - `screenshot_dir` - Sets where screenshots go. + - Default is the desktop on Windows and unset (current directory) on other platforms. + - `force_set_played` - This forcibly sets items as played when MPV playback finished. + - If you have files with malformed timestamps that don't get marked as played, enable this. + - `raise_mpv` - Windows only. Disable this if you are fine with MPV sometimes appearing behind other windows when playing. + - `health_check_interval` - The number of seconds between each client health check. Null disables it. Default: `300` + +### Skip Intro Support + +This functionality is considered experimental and requires the third-party [SkipIntro server plugin](https://github.com/ConfusedPolarBear/intro-skipper). It works the same ways as it did on MPV Shim for Plex. + + - `skip_intro_always` - Always skip intros, without asking. Default: `false` + - `skip_intro_prompt` - Prompt to skip intro via seeking. Default: `false` + +### MPV Configuration + +You can configure mpv directly using the `mpv.conf` and `input.conf` files. (It is in the same folder as `conf.json`.) +This may be useful for customizing video upscaling, keyboard shortcuts, or controlling the application +via the mpv IPC server. + +### Authorization + +The `cred.json` file contains the authorization information. If you are having problems with the client, +such as the Now Playing not appearing or want to delete a server, you can delete this file and add the +servers again. + +## Tips and Tricks + +Various tips have been found that allow the media player to support special +functionality, albeit with more configuration required. + +### Open on Specific Monitor (#19) + +Please note: Edits to the `mpv.conf` will not take effect until you restart the application. You can open the config directory by using the menu option in the system tray icon. + +**Option 1**: Select fullscreen output screen through MPV. +Determine which screen you would like MPV to show up on. + - If you are on Windows, right click the desktop and select "Display Settings". Take the monitor number and subtract one. + - If you are on Linux, run `xrandr`. The screen number is the number you want. If there is only one proceed to **Option 2**. + +Add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration), replacing `0` with the number from the previous step: +``` +fs=yes +fs-screen=0 +``` + +**Option 2**: (Linux Only) If option 1 does not work, both of your monitors are likely configured as a single "screen". + +Run `xrandr`. It should look something like this: + +``` +Screen 0: minimum 8 x 8, current 3520 x 1080, maximum 16384 x 16384 +VGA-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm + 1920x1080 60.00*+ + 1680x1050 59.95 + 1440x900 59.89 + 1280x1024 75.02 60.02 + 1280x960 60.00 + 1280x800 59.81 + 1280x720 60.00 + 1152x864 75.00 + 1024x768 75.03 70.07 60.00 + 800x600 75.00 72.19 60.32 56.25 + 640x480 75.00 59.94 +LVDS-0 connected 1600x900+1920+180 (normal left inverted right x axis y axis) 309mm x 174mm + 1600x900 59.98*+ +``` + +If you want MPV to open on VGA-0 for instance, add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration): +``` +fs=yes +geometry=1920x1080+0+0 +``` +**Option 3**: (Linux Only) If your window manager supports it, you can tell the window manager to always open on a specific screen. + + - For OpenBox: https://forums.bunsenlabs.org/viewtopic.php?id=1199 + - For i3: https://unix.stackexchange.com/questions/96798/i3wm-start-applications-on-specific-workspaces-when-i3-starts/363848#363848 + +### Control Volume with Mouse Wheel (#48) + +Add the following to `input.conf`: +``` +WHEEL_UP add volume 5 +WHEEL_DOWN add volume -5 +``` + +### MPRIS Plugin (#54) + +Set `mpv_ext` to `true` in the config. Add `script=/path/to/mpris.so` to `mpv.conf`. + +### Run Multiple Instances (#45) + +You can pass `--config /path/to/folder` to run another copy of the player. Please +note that running multiple copies of the desktop client is currently not supported. + +### Audio Passthrough + +You can edit `mpv.conf` to support audio passthrough. A [user on Reddit](https://reddit.com/r/jellyfin/comments/fru6xo/new_cross_platform_desktop_client_jellyfin_mpv/fns7vyp) had luck with this config: +``` +audio-spdif=ac3,dts,eac3 # (to use the passthrough to receiver over hdmi) +audio-channels=2 # (not sure this is necessary, but i keep it in because it works) +af=scaletempo,lavcac3enc=yes:640:3 # (for aac 5.1 tracks to the receiver) +``` + +### MPV Crashes with "The sub-scale option must be a floating point number or a ratio" + +Run the jellyfin-mpv-shim program with LC_NUMERIC=C. + +### Use with gnome-mpv/celluloid (#61) + +You can use `gnome-mpv` with MPV Shim, but you must launch `gnome-mpv` separately before MPV Shim. (`gnome-mpv` doesn't support the MPV command options directly.) + +Configure MPV Shim with the following options (leave the other ones): +```json +{ + "mpv_ext": true, + "mpv_ext_ipc": "/tmp/gmpv-socket", + "mpv_ext_path": null, + "mpv_ext_start": false, + "enable_osc": false +} +``` +Then within `gnome-mpv`, click the application icon (top left) > Preferences. Configure the following Extra MPV Options: +``` +--idle --input-ipc-server=/tmp/gmpv-socket +``` + +### Heavy Memory Usage + +A problem has been identified where MPV can use a ton of RAM after media has been played, +and this RAM is not always freed when the player goes into idle mode. Some users have +found that using external MPV lessens the memory leak. To enable external MPV on Windows: + + - [Download a copy of MPV](https://sourceforge.net/projects/mpv-player-windows/files/64bit/) + - Unzip it with 7zip. + - Configure `mpv_ext` to `true`. (See the config section.) + - Configure `mpv_ext_path` to `C:\\replace\\with\\path\\to\\mpv.exe`. (Note usage of two `\\`.) + - Run the program and wait. (You'll probably have to use it for a while.) + - Let me know if the high memory usage is with `mpv.exe` or the shim itself. + +On Linux, the process is similar, except that you don't need to set the `mpv_ext_path` variable. +On macOS, external MPV is already the default and is the only supported player mode. + +In the long term, I may look into a method of terminating MPV when not in use. This will require +a lot of changes to the software. + +### Player Sizing (#91) + +MPV by default may force the window size to match the video aspect ratio, instead of allowing +resizing and centering the video accordingly. Add the following to `mpv.conf` to enable resizing +of the window freely, if desired: +``` +no-keepaspect-window +``` + +## Development + +If you'd like to run the application without installing it, run `./run.py`. +The project is written entirely in Python 3. There are no closed-source +components in this project. It is fully hackable. + +The project is dependent on `python-mpv`, `python-mpv-jsonipc`, and `jellyfin-apiclient-python`. If you are +using Windows and would like mpv to be maximize properly, `pywin32` is also needed. The GUI +component uses `pystray` and `tkinter`, but there is a fallback cli mode. The mirroring dependencies +are `Jinja2` and `pywebview`, along with platform-specific dependencies. (See the installation and building +guides for details on platform-specific dependencies for display mirroring.) + +This project is based Plex MPV Shim, which is based on https://github.com/wnielson/omplex, which +is available under the terms of the MIT License. The project was ported to python3, modified to +use mpv as the player, and updated to allow all features of the remote control api for video playback. + +The Jellyfin API client comes from [Jellyfin for Kodi](https://github.com/jellyfin/jellyfin-kodi/tree/master/jellyfin_kodi). +The API client was originally forked for this project and is now a [separate package](https://github.com/iwalton3/jellyfin-apiclient-python). + +The css file for desktop mirroring is from [jellyfin-chromecast](https://github.com/jellyfin/jellyfin-chromecast/tree/5194d2b9f0120e0eb8c7a81fe546cb9e92fcca2b) and is subject to GPL v2.0. + +The shaders included in the shader pack are also available under verious open source licenses, +[which you can read about here](https://github.com/iwalton3/default-shader-pack/blob/master/LICENSE.md). + +### Local Dev Installation + +If you are on Windows there are additional dependencies. Please see the Windows Build Instructions. + +1. Install the dependencies: `sudo pip3 install --upgrade python-mpv jellyfin-apiclient-python pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - If you run `./gen_pkg.sh --install`, it will also fetch these for you. +2. Clone this repository: `git clone https://github.com/jellyfin/jellyfin-mpv-shim` + - You can also download a zip build. +3. `cd` to the repository: `cd jellyfin-mpv-shim` +4. Run prepare script: `./gen_pkg.sh` + - To do this manually, download the web client, shader pack, and build the language files. +5. Ensure you have a copy of `libmpv1` or `mpv` available. +6. Install any platform-specific dependencies from the respective install tutorials. +7. You should now be able to run the program with `./run.py`. Installation is possible with `sudo pip3 install .`. + - You can also install the package with `./gen_pkg.sh --install`. + +### Translation + +This project uses gettext for translation. The current template language file is `base.pot` in `jellyfin_mpv_shim/messages/`. + +To regenerate `base.pot` and update an existing translation with new strings: +```bash +./regen_pot.sh +``` + +To compile all `*.po` files to `*.mo`: +```bash +./gen_pkg.sh --skip-build +``` + +## Linux Installation + +You can [install the software from flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim). The pip installation is less integrated but takes up less space if you're not already using flatpak. + +If you are on Linux, you can install via pip. You'll need [libmpv1](https://github.com/Kagami/mpv.js/blob/master/README.md#get-libmpv) or `mpv` installed. +```bash +sudo pip3 install --upgrade jellyfin-mpv-shim +``` +If you would like the GUI and systray features, also install `pystray` and `tkinter`: +```bash +sudo pip3 install pystray +sudo apt install python3-tk +``` +If you would like display mirroring support, install the mirroring dependencies: +```bash +sudo apt install python3-jinja2 python3-webview +# -- OR -- +sudo pip3 install jellyfin-mpv-shim[mirror] +sudo apt install gir1.2-webkit2-4.0 +``` +Discord rich presence support: +```bash +sudo pip3 install jellyfin-mpv-shim[discord] +``` +You can build mpv from source to get better codec support. Execute the following: +```bash +sudo pip3 install --upgrade python-mpv +sudo apt install autoconf automake libtool libharfbuzz-dev libfreetype6-dev libfontconfig1-dev libx11-dev libxrandr-dev libvdpau-dev libva-dev mesa-common-dev libegl1-mesa-dev yasm libasound2-dev libpulse-dev libuchardet-dev zlib1g-dev libfribidi-dev git libgnutls28-dev libgl1-mesa-dev libsdl2-dev cmake wget python g++ libluajit-5.1-dev +git clone https://github.com/mpv-player/mpv-build.git +cd mpv-build +echo --enable-libmpv-shared > mpv_options +./rebuild -j4 +sudo ./install +sudo ldconfig +``` + +## <h2 id="osx-installation">macOS Installation</h2> +Currently on macOS only the external MPV backend seems to be working. I cannot test on macOS, so please report any issues you find. + +To install the CLI version: + +1. Install brew. ([Instructions](https://brew.sh/)) +2. Install python3 and mpv. `brew install python mpv` +3. Install jellyfin-mpv-shim. `pip3 install --upgrade jellyfin-mpv-shim` +4. Run `jellyfin-mpv-shim`. + +If you'd like to install the GUI version, you need a working copy of tkinter. + +1. Install pyenv. ([Instructions](https://medium.com/python-every-day/python-development-on-macos-with-pyenv-2509c694a808)) +2. Install TK and mpv. `brew install tcl-tk mpv` +3. Install python3 with TK support. `FLAGS="-I$(brew --prefix tcl-tk)/include" pyenv install 3.8.1` +4. Set this python3 as the default. `pyenv global 3.8.1` +5. Install jellyfin-mpv-shim and pystray. `pip3 install --upgrade 'jellyfin-mpv-shim[gui]'` +6. Run `jellyfin-mpv-shim`. + +Display mirroring is not tested on macOS, but may be installable with 'pip3 install --upgrade 'jellyfin-mpv-shim[mirror]'`. + +## Building on Windows + +There is a prebuilt version for Windows in the releases section. When +following these directions, please take care to ensure both the python +and libmpv libraries are either 64 or 32 bit. (Don't mismatch them.) + +If you'd like to build the installer, please install [Inno Setup](https://jrsoftware.org/isinfo.php) to build +the installer. If you'd like to build a 32 bit version, download the 32 bit version of mpv-1.dll and +copy it into a new folder called mpv32. You'll also need [WebBrowserInterop.x86.dll](https://github.com/r0x0r/pywebview/blob/master/webview/lib/WebBrowserInterop.x86.dll?raw=true). +You may also need to edit the batch file for 32 bit builds to point to the right python executable. + +1. Install Git for Windows. Open Git Bash and run `git clone https://github.com/jellyfin/jellyfin-mpv-shim; cd jellyfin-mpv-shim`. + - You can update the project later with `git pull`. +2. Install [Python3](https://www.python.org/downloads/) with PATH enabled. Install [7zip](https://ninite.com/7zip/). +3. After installing python3, open `cmd` as admin and run `pip install --upgrade pyinstaller python-mpv jellyfin-apiclient-python pywin32 pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - Details: https://github.com/pyinstaller/pyinstaller/issues/4346 +4. Download [libmpv](https://sourceforge.net/projects/mpv-player-windows/files/libmpv/). +5. Extract the `mpv-2.dll` from the file and move it to the `jellyfin-mpv-shim` folder. +6. Open a regular `cmd` prompt. Navigate to the `jellyfin-mpv-shim` folder. +7. Run `get_pywebview_natives.py`. +8. Run `./gen_pkg.sh --skip-build` using the Git for Windows console. + - This builds the translation files and downloads the shader packs. +9. Run `build-win.bat`. + + + + +%package help +Summary: Development documents and examples for jellyfin-mpv-shim +Provides: python3-jellyfin-mpv-shim-doc +%description help +# Jellyfin MPV Shim + +[](https://github.com/jellyfin/jellyfin-mpv-shim/releases) +[](https://pypi.org/project/jellyfin-mpv-shim/) +[](https://translate.jellyfin.org/projects/jellyfin/jellyfin-mpv-shim/) +[](https://github.com/psf/black) + +Jellyfin MPV Shim is a cross-platform cast client for Jellyfin. +It has support for all your advanced media files without transcoding, as well as tons of +features which set it apart from other multimedia clients: + + - Direct play most media using MPV. + - Watch videos with friends using SyncPlay. + - Offers a shim mode which runs in the background. + - The Jellyfin mobile apps can fully control the client. + - [Reconfigure subtitles](https://github.com/jellyfin/jellyfin-mpv-shim#menu) for an entire season at once. + - Supports all of the [MPV keyboard shortcuts](https://github.com/jellyfin/jellyfin-mpv-shim#keyboard-shortcuts). + - Enhance your video with [Shader Packs](https://github.com/jellyfin/jellyfin-mpv-shim#menu) and [SVP Integration](https://github.com/jellyfin/jellyfin-mpv-shim#svp-integration). + - Optionally share your media activity with friends using Discord Rich Presence. + - Most features, as well as MPV itself, [can be extensively configured](https://github.com/jellyfin/jellyfin-mpv-shim#configuration). + - You can configure the player to use an [external MPV player](https://github.com/jellyfin/jellyfin-mpv-shim#external-mpv) of your choice. + - Enable a chromecast-like experience with [Display Mirroring](https://github.com/jellyfin/jellyfin-mpv-shim#display-mirroring). + - You can [trigger commands to run](https://github.com/jellyfin/jellyfin-mpv-shim#shell-command-triggers) when certain events happen. + +To learn more, keep reading. This README explains everything, including [configuration](https://github.com/jellyfin/jellyfin-mpv-shim#configuration), [tips & tricks](https://github.com/jellyfin/jellyfin-mpv-shim#tips-and-tricks), and [development information](https://github.com/jellyfin/jellyfin-mpv-shim#development). + +## Getting Started + +If you are on Windows, simply [download the binary](https://github.com/jellyfin/jellyfin-mpv-shim/releases). +If you are using Linux, you can [install via flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim) or [install via pip](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#linux-installation). If you are on macOS, see the [macOS Installation](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/README.md#osx-installation) +section below. + +To use the client, simply launch it and log into your Jellyfin server. You’ll need to enter the +URL to your server, for example `http://server_ip:8096` or `https://secure_domain`. Make sure to +include the subdirectory and port number if applicable. You can then cast your media +from another Jellyfin application. + +The application runs with a notification icon by default. You can use this to edit the server settings, +view the application log, open the config folder, and open the application menu. Unlike Plex MPV Shim, +authorization tokens for your server are stored on your device, but you are able to cast to the player +regardless of location. + +Note: Due to the huge number of questions and issues that have been submitted about URLs, I now tolerate +bare IP addresses and not specifying the port by default. If you want to connect to port 80 instead of +8096, you must add the `:80` to the URL because `:8096` is now the default. + +## Limitations + + - Music playback and Live TV are not supported. + - The client can’t be shared seamlessly between multiple users on the same server. ([Link to issue.](https://features.jellyfin.org/posts/319/mark-device-as-shared)) + +### Known Issues + +Please also note that the on-screen controller for MPV (if available) cannot change the +audio and subtitle track configurations for transcoded media. It also cannot load external +subtitles. You must either [use the menu](https://github.com/jellyfin/jellyfin-mpv-shim#menu) or the application you casted from. + +Please note the following issues with controlling SyncPlay: + - If you attempt to join a SyncPlay group when casting to MPV Shim, it will play the media but it will not activate SyncPlay. + - You can, however, proceed to activate SyncPlay [using the menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - If you would like to create a group or join a group for currently playing media, [use menu within MPV](https://github.com/jellyfin/jellyfin-mpv-shim#menu). + - SyncPlay as of 10.7.0 is new and kind of fragile. You may need to rejoin or even restart the client. Please report any issues you find. + +Music playback sort-of works, but repeat, shuffle, and gapless playback have not been implemented and +would require major changes to the application to properly support, as it was built for video. + +The shader packs feature is sensitive to graphics hardware. It may simply just not work on your computer. +You may be able to use the log files to get some more diagnostic information. If you're really unlucky, +you'll have to disable the feature by pressing `k` to restore basic functionality. +If you find the solution for your case, *please* send me any information you can provide, as every test case helps. + +## Advanced Features + +### Menu + +To open the menu, press **c** on your computer or use the navigation controls +in the mobile/web app. + +The menu enables you to: + - Adjust video transcoding quality. + - Change the default transcoder settings. + - Change subtitles or audio, while knowing the track names. + - Change subtitles or audio for an entire series at once. + - Mark the media as unwatched and quit. + - Enable and disable SyncPlay. + - Configure shader packs and SVP profiles. + - Take screenshots. + +On your computer, use the mouse or arrow keys, enter, and escape to navigate. +On your phone, use the arrow buttons, ok, back, and home to navigate. + +### Shader Packs + +Shader packs are a recent feature addition that allows you to easily use advanced video +shaders and video quality settings. These usually require a lot of configuration to use, +but MPV Shim's default shader pack comes with [FSRCNNX](https://github.com/igv/FSRCNN-TensorFlow) +and [Anime4K](https://github.com/bloc97/Anime4K) preconfigured. Try experimenting with video +profiles! It may greatly improve your experience. + +Shader Packs are ready to use as of the most recent MPV Shim version. To use, simply +navigate to the **Video Playback Profiles** option and select a profile. + +For details on the shader settings, please see [default-shader-pack](https://github.com/iwalton3/default-shader-pack). +If you would like to customize the shader pack, there are details in the configuration section. + +### SVP Integration + +SVP integration allows you to easily configure SVP support, change profiles, and enable/disable +SVP without having to exit the player. It is not enabled by default, please see the configuration +instructions for instructions on how to enable it. + +### Display Mirroring + +This feature allows media previews to show on your display before you cast the media, +similar to Chromecast. It is not enabled by default. To enable it, do one of the following: + + - Using the systray icon, click "Application Menu". Go to preferences and enable display mirroring. + - Use the arrow keys, escape, and enter to navigate the menu. + - Cast media to the player and press `c`. Go to preferences and enable display mirroring. + - In the config file (see below), change `display_mirroring` to `true`. + +Then restart the application for the change to take effect. To quit the application on Windows with +display mirroring enabled, press Alt+F4. + +### Keyboard Shortcuts + +This program supports most of the [keyboard shortcuts from MPV](https://mpv.io/manual/stable/#interactive-control). The custom keyboard shortcuts are: + + - < > to skip episodes + - q to close player + - w to mark watched and skip + - u to mark unwatched and quit + - c to open the menu + - k disable shader packs + +Here are the notable MPV keyboard shortcuts: + + - space - Pause/Play + - left/right - Seek by 5 seconds + - up/down - Seek by 1 minute + - s - Take a screenshot + - S - Take a screenshot without subtitles + - f - Toggle fullscreen + - ,/. - Seek by individual frames + - \[/\] - Change video speed by 10% + - {/} - Change video speed by 50% + - backspace - Reset speed + - m - Mute + - d - Enable/disable deinterlace + - Ctrl+Shift+Left/Right - Adjust subtitle delay. + +## Configuration + +The configuration file is located in different places depending on your platform. You can also open the +configuration folder using the systray icon if you are using the shim version. When you launch the program +on Linux or macOS from the terminal, the location of the config file will be printed. The locations are: + - Windows - `%appdata%\jellyfin-mpv-shim\conf.json` + - Linux - `~/.config/jellyfin-mpv-shim/conf.json` + - Linux (Flatpak) - `~/.var/app/com.github.iwalton3.jellyfin-mpv-shim/config/jellyfin-mpv-shim/conf.json` + - macOS - `~/Library/Application Support/jellyfin-mpv-shim/conf.json` + - CygWin - `~/.config/jellyfin-mpv-shim/conf.json` + +You can specify a custom configuration folder with the `--config` option. + +### Transcoding + +You can adjust the basic transcoder settings via the menu. + +- `always_transcode` - This will tell the client to always transcode. Default: `false` + - This may be useful if you are using limited hardware that cannot handle advanced codecs. + - Please note that Jellyfin may still direct play files that meet the transcode profile + requirements. There is nothing I can do on my end to disable this, but you can reduce + the bandwidth setting to force a transcode. +- `transcode_hdr` - Force transcode HDR videos to SDR. Default: `false` +- `transcode_dolby_vision` - Force transcode Dolby Vision videos to SDR. Default: `true` + - If your computer can handle it, you can get tone mapping to work for this using `vo=gpu-next`. + - Note that `vo=gpu-next` is considered experimental by MPV at this time. +- `transcode_hi10p` - Force transcode 10 bit color videos to 8 bit color. Default: `false` +- `remote_kbps` - Bandwidth to permit for remote streaming. Default: `10000` +- `local_kbps` - Bandwidth to permit for local streaming. Default: `2147483` +- `direct_paths` - Play media files directly from the SMB or NFS source. Default: `false` + - `remote_direct_paths` - Apply this even when the server is detected as remote. Default: `false` +- `allow_transcode_to_h265` - Allow the server to transcode media *to* `hevc`. Default: `false` + - If you enable this, it'll allow remuxing to HEVC but it'll also break force transcoding of Dolby Vision and HDR content if those settings are used. (See [this bug](https://github.com/jellyfin/jellyfin/issues/9313).) +- `prefer_transcode_to_h265` - Requests the server to transcode media *to* `hevc` as the default. Default: `false` +- `transcode_warning` - Display a warning the first time media transcodes in a session. Default: `true` +- `force_video_codec` - Force a specified video codec to be played. Default: `null` + - This can be used in tandem with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + - This will override `transcode_to_h265`, `transcode_h265` and `transcode_hi10p`. +- `force_audio_codec` - Force a specified audio codec to be played. Default: `null` + - This can be used in tandeom with `always_transcode` to force the client to transcode into + the specified format. + - This may have the same limitations as `always_transcode`. + +### Features + +You can use the config file to enable and disable features. + + - `fullscreen` - Fullscreen the player when starting playback. Default: `true` + - `enable_gui` - Enable the system tray icon and GUI features. Default: `true` + - `enable_osc` - Enable the MPV on-screen controller. Default: `true` + - It may be useful to disable this if you are using an external player that already provides a user interface. + - `media_key_seek` - Use the media next/prev keys to seek instead of skip episodes. Default: `false` + - `use_web_seek` - Use the seek times set in Jellyfin web for arrow key seek. Default: `false` + - `display_mirroring` - Enable webview-based display mirroring (content preview). Default: `false` + - `screenshot_menu` - Allow taking screenshots from menu. Default: `true` + - `check_updates` - Check for updates via GitHub. Default: `true` + - This requests the GitHub releases page and checks for a new version. + - Update checks are performed when playing media, once per day. + - `notify_updates` - Display update notification when playing media. Default: `true` + - Notification will only display once until the application is restarted. + - `discord_presence` - Enable Discord rich presence support. Default: `false` + - `menu_mouse` - Enable mouse support in the menu. Default: `true` + - This requires MPV to be compiled with lua support. + +### Shell Command Triggers + +You can execute shell commands on media state using the config file: + + - `media_ended_cmd` - When all media has played. + - `pre_media_cmd` - Before the player displays. (Will wait for finish.) + - `stop_cmd` - After stopping the player. + - `idle_cmd` - After no activity for `idle_cmd_delay` seconds. + - `idle_when_paused` - Consider the player idle when paused. Default: `false` + - `stop_idle` - Stop the player when idle. (Requires `idle_when_paused`.) Default: `false` + - `play_cmd` - After playback starts. + - `idle_ended_cmd` - After player stops being idle. + +### Subtitle Visual Settings + +These settings may not works for some subtitle codecs or if subtitles are being burned in +during a transcode. You can configure custom styled subtitle settings through the MPV config file. + + - `subtitle_size` - The size of the subtitles, in percent. Default: `100` + - `subtitle_color` - The color of the subtitles, in hex. Default: `#FFFFFFFF` + - `subtitle_position` - The position (top, bottom, middle). Default: `bottom` + +### External MPV + +The client now supports using an external copy of MPV, including one that is running prior to starting +the client. This may be useful if your distribution only provides MPV as a binary executable (instead +of as a shared library), or to connect to MPV-based GUI players. Please note that SMPlayer exhibits +strange behaviour when controlled in this manner. External MPV is currently the only working backend +for media playback on macOS. + +- `mpv_ext` - Enable usage of the external player by default. Default: `false` + - The external player may still be used by default if `libmpv1` is not available. +- `mpv_ext_path` - The path to the `mpv` binary to use. By default it uses the one in the PATH. Default: `null` + - If you are using Windows, make sure to use two backslashes. Example: `C:\\path\\to\\mpv.exe` +- `mpv_ext_ipc` - The path to the socket to control MPV. Default: `null` + - If unset, the socket is a randomly selected temp file. + - On Windows, this is just a name for the socket, not a path like on Linux. +- `mpv_ext_start` - Start a managed copy of MPV with the client. Default: `true` + - If not specified, the user must start MPV prior to launching the client. + - MPV must be launched with `--input-ipc-server=[value of mpv_ext_ipc]`. +- `mpv_ext_no_ovr` - Disable built-in mpv configuration files and use user defaults. + - Please note that some scripts and settings, such as ones to keep MPV open, may break + functionality in MPV Shim. + +### Keyboard Shortcuts + +You can reconfigure the custom keyboard shortcuts. You can also set them to `null` to disable the shortcut. Please note that disabling keyboard shortcuts may make some features unusable. Additionally, if you remap `q`, using the default shortcut will crash the player. + + - `kb_stop` - Stop playback and close MPV. (Default: `q`) + - `kb_prev` - Go to the previous video. (Default: `<`) + - `kb_next` - Go to the next video. (Default: `>`) + - `kb_watched` - Mark the video as watched and skip. (Default: `w`) + - `kb_unwatched` - Mark the video as unwatched and quit. (Default: `u`) + - `kb_menu` - Open the configuration menu. (Default: `c`) + - `kb_menu_esc` - Leave the menu. Exits fullscreen otherwise. (Default: `esc`) + - `kb_menu_ok` - "ok" for menu. (Default: `enter`) + - `kb_menu_left` - "left" for menu. Seeks otherwise. (Default: `left`) + - `kb_menu_right` - "right" for menu. Seeks otherwise. (Default: `right`) + - `kb_menu_up` - "up" for menu. Seeks otherwise. (Default: `up`) + - `kb_menu_down` - "down" for menu. Seeks otherwise. (Default: `down`) + - `kb_pause` - Pause. Also "ok" for menu. (Default: `space`) + - `kb_fullscreen` - Toggle fullscreen. (Default: `f`) + - `kb_debug` - Trigger `pdb` debugger. (Default: `~`) + - `kb_kill_shader` - Disable shader packs. (Default: `k`) + - `seek_up` - Time to seek for "up" key. (Default: `60`) + - `seek_down` - Time to seek for "down" key. (Default: `-60`) + - `seek_right` - Time to seek for "right" key. (Default: `5`) + - `seek_left` - Time to seek for "left" key. (Default: `-5`) + - `media_keys` - Enable binding of MPV to media keys. Default: `true` + - `seek_v_exact` - Use exact seek for up/down keys. Default: `false` + - `seek_h_exact` - Use exact seek for left/right keys. Default: `false` + +### Shader Packs + +Shader packs allow you to import MPV config and shader presets into MPV Shim and easily switch +between them at runtime through the built-in menu. This enables easy usage and switching of +advanced MPV video playback options, such as video upscaling, while being easy to use. + +If you select one of the presets from the shader pack, it will override some MPV configurations +and any shaders manually specified in `mpv.conf`. If you would like to customize the shader pack, +use `shader_pack_custom`. + + - `shader_pack_enable` - Enable shader pack. (Default: `true`) + - `shader_pack_custom` - Enable to use a custom shader pack. (Default: `false`) + - If you enable this, it will copy the default shader pack to the `shader_pack` config folder. + - This initial copy will only happen if the `shader_pack` folder didn't exist. + - This shader pack will then be used instead of the built-in one from then on. + - `shader_pack_remember` - Automatically remember the last used shader profile. (Default: `true`) + - `shader_pack_profile` - The default profile to use. (Default: `null`) + - If you use `shader_pack_remember`, this will be updated when you set a profile through the UI. + - `shader_pack_subtype` - The profile group to use. The default pack contains `lq` and `hq` groups. Use `hq` if you have a fancy graphics card. + +### Trickplay Thumbnails + +MPV will automatically display thumbnail previews. By default it uses the Jellyfin chapter images +but it can also use JellyScrub as the source. Please note that this feature will download and +uncompress all of the chapter images before it becomes available for a video. For a 4 hour movie this +causes disk usage of about 250 MB, but for the average TV episode it is around 40 MB. It also requires +overriding the default MPV OSC, which may conflict with some custom user script. Trickplay is compatible +with any OSC that uses [thumbfast](https://github.com/po5/thumbfast), as I have added a [compatibility layer](https://github.com/jellyfin/jellyfin-mpv-shim/blob/master/jellyfin_mpv_shim/thumbfast.lua). + + - `thumbnail_enable` - Enable thumbnail feature. (Default: `true`) + - `thumbnail_jellyscrub` - Use JellyScrub as the thumbnail source instead of chapter images. (Default: `false`) + - `thumbnail_osc_builtin` - Disable this setting if you want to use your own custom osc but leave trickplay enabled. (Default: `true`) + - `thumbnail_preferred_size` - The ideal size for thumbnails. (Default: `320`) + +### SVP Integration + +To enable SVP integration, set `svp_enable` to `true` and enable "External control via HTTP" within SVP +under Settings > Control options. Adjust the `svp_url` and `svp_socket` settings if needed. + + - `svp_enable` - Enable SVP integration. (Default: `false`) + - `svp_url` - URL for SVP web API. (Default: `http://127.0.0.1:9901/`) + - `svp_socket` - Custom MPV socket to use for SVP. + - Default on Windows: `mpvpipe` + - Default on other platforms: `/tmp/mpvsocket` + +Currently on Windows the built-in MPV does not work with SVP. You must download MPV yourself. + + - Download the latest MPV build [from here](https://sourceforge.net/projects/mpv-player-windows/files/64bit/). + - Follow the [vapoursynth instructions](https://github.com/shinchiro/mpv-winbuild-cmake/wiki/Setup-vapoursynth-for-mpv). + - Make sure to use the latest Python, not Python 3.7. + - In the config file, set `mpv_ext` to `true` and `mpv_ext_path` to the path to `mpv.exe`. + - Make sure to use two backslashes per each backslash in the path. + +### SyncPlay + +You probably don't need to change these, but they are defined here in case you +need to. + + - `sync_max_delay_speed` - Delay in ms before changing video speed to sync playback. Default: `50` + - `sync_max_delay_skip` - Delay in ms before skipping through the video to sync playback. Default: `300` + - `sync_method_thresh` - Delay in ms before switching sync method. Default: `2000` + - `sync_speed_time` - Duration in ms to change playback speed. Default: `1000` + - `sync_speed_attempts` - Number of attempts before speed changes are disabled. Default: `3` + - `sync_attempts` - Number of attempts before disabling sync play. Default: `5` + - `sync_revert_seek` - Attempt to revert seek via MPV OSC. Default: `true` + - This could break if you use revert-seek markers or scripts that use it. + - `sync_osd_message` - Write syncplay status messages to OSD. Default: `true` + +### Debugging + +These settings assist with debugging. You will often be asked to configure them when reporting an issue. + + - `log_decisions` - Log the full media decisions and playback URLs. Default: `false` + - `mpv_log_level` - Log level to use for mpv. Default: `info` + - Options: fatal, error, warn, info, v, debug, trace + - `sanitize_output` - Prevent the writing of server auth tokens to logs. Default: `true` + - `write_logs` - Write logs to the config directory for debugging. Default: `false` + +### Other Configuration Options + +Other miscellaneous configuration options. You probably won't have to change these. + + - `player_name` - The name of the player that appears in the cast menu. Initially set from your hostname. + - `client_uuid` - The identifier for the client. Set to a random value on first run. + - `audio_output` - Currently has no effect. Default: `hdmi` + - `playback_timeout` - Timeout to wait for MPV to start loading video in seconds. Default: `30` + - If you're hitting this, it means files on your server probably got corrupted or deleted. + - It could also happen if you try to play an unsupported video format. These are rare. + - `lang` - Allows overriding system locale. (Enter a language code.) Default: `null` + - MPV Shim should use your OS language by default. + - `ignore_ssl_cert` - Ignore SSL certificates. Default: `false` + - Please consider getting a certificate from Let's Encrypt instead of using this. + - `connect_retry_mins` - Number of minutes to retry connecting before showing login window. Default: `0` + - This only applies for when you first launch the program. + - `lang_filter` - Limit track selection to desired languages. Default: `und,eng,jpn,mis,mul,zxx` + - Note that you need to turn on the options below for this to actually do something. + - If you remove `und` from the list, it will ignore untagged items. + - Languages are typically in [ISO 639-2/B](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), + but if you have strange files this may not be the case. + - `lang_filter_sub` - Apply the language filter to subtitle selection. Default: `False` + - `lang_filter_audio` - Apply the language filter to audio selection. Default: `False` + - `screenshot_dir` - Sets where screenshots go. + - Default is the desktop on Windows and unset (current directory) on other platforms. + - `force_set_played` - This forcibly sets items as played when MPV playback finished. + - If you have files with malformed timestamps that don't get marked as played, enable this. + - `raise_mpv` - Windows only. Disable this if you are fine with MPV sometimes appearing behind other windows when playing. + - `health_check_interval` - The number of seconds between each client health check. Null disables it. Default: `300` + +### Skip Intro Support + +This functionality is considered experimental and requires the third-party [SkipIntro server plugin](https://github.com/ConfusedPolarBear/intro-skipper). It works the same ways as it did on MPV Shim for Plex. + + - `skip_intro_always` - Always skip intros, without asking. Default: `false` + - `skip_intro_prompt` - Prompt to skip intro via seeking. Default: `false` + +### MPV Configuration + +You can configure mpv directly using the `mpv.conf` and `input.conf` files. (It is in the same folder as `conf.json`.) +This may be useful for customizing video upscaling, keyboard shortcuts, or controlling the application +via the mpv IPC server. + +### Authorization + +The `cred.json` file contains the authorization information. If you are having problems with the client, +such as the Now Playing not appearing or want to delete a server, you can delete this file and add the +servers again. + +## Tips and Tricks + +Various tips have been found that allow the media player to support special +functionality, albeit with more configuration required. + +### Open on Specific Monitor (#19) + +Please note: Edits to the `mpv.conf` will not take effect until you restart the application. You can open the config directory by using the menu option in the system tray icon. + +**Option 1**: Select fullscreen output screen through MPV. +Determine which screen you would like MPV to show up on. + - If you are on Windows, right click the desktop and select "Display Settings". Take the monitor number and subtract one. + - If you are on Linux, run `xrandr`. The screen number is the number you want. If there is only one proceed to **Option 2**. + +Add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration), replacing `0` with the number from the previous step: +``` +fs=yes +fs-screen=0 +``` + +**Option 2**: (Linux Only) If option 1 does not work, both of your monitors are likely configured as a single "screen". + +Run `xrandr`. It should look something like this: + +``` +Screen 0: minimum 8 x 8, current 3520 x 1080, maximum 16384 x 16384 +VGA-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm + 1920x1080 60.00*+ + 1680x1050 59.95 + 1440x900 59.89 + 1280x1024 75.02 60.02 + 1280x960 60.00 + 1280x800 59.81 + 1280x720 60.00 + 1152x864 75.00 + 1024x768 75.03 70.07 60.00 + 800x600 75.00 72.19 60.32 56.25 + 640x480 75.00 59.94 +LVDS-0 connected 1600x900+1920+180 (normal left inverted right x axis y axis) 309mm x 174mm + 1600x900 59.98*+ +``` + +If you want MPV to open on VGA-0 for instance, add the following to your `mpv.conf` in the [config directory](https://github.com/jellyfin/jellyfin-mpv-shim#mpv-configuration): +``` +fs=yes +geometry=1920x1080+0+0 +``` +**Option 3**: (Linux Only) If your window manager supports it, you can tell the window manager to always open on a specific screen. + + - For OpenBox: https://forums.bunsenlabs.org/viewtopic.php?id=1199 + - For i3: https://unix.stackexchange.com/questions/96798/i3wm-start-applications-on-specific-workspaces-when-i3-starts/363848#363848 + +### Control Volume with Mouse Wheel (#48) + +Add the following to `input.conf`: +``` +WHEEL_UP add volume 5 +WHEEL_DOWN add volume -5 +``` + +### MPRIS Plugin (#54) + +Set `mpv_ext` to `true` in the config. Add `script=/path/to/mpris.so` to `mpv.conf`. + +### Run Multiple Instances (#45) + +You can pass `--config /path/to/folder` to run another copy of the player. Please +note that running multiple copies of the desktop client is currently not supported. + +### Audio Passthrough + +You can edit `mpv.conf` to support audio passthrough. A [user on Reddit](https://reddit.com/r/jellyfin/comments/fru6xo/new_cross_platform_desktop_client_jellyfin_mpv/fns7vyp) had luck with this config: +``` +audio-spdif=ac3,dts,eac3 # (to use the passthrough to receiver over hdmi) +audio-channels=2 # (not sure this is necessary, but i keep it in because it works) +af=scaletempo,lavcac3enc=yes:640:3 # (for aac 5.1 tracks to the receiver) +``` + +### MPV Crashes with "The sub-scale option must be a floating point number or a ratio" + +Run the jellyfin-mpv-shim program with LC_NUMERIC=C. + +### Use with gnome-mpv/celluloid (#61) + +You can use `gnome-mpv` with MPV Shim, but you must launch `gnome-mpv` separately before MPV Shim. (`gnome-mpv` doesn't support the MPV command options directly.) + +Configure MPV Shim with the following options (leave the other ones): +```json +{ + "mpv_ext": true, + "mpv_ext_ipc": "/tmp/gmpv-socket", + "mpv_ext_path": null, + "mpv_ext_start": false, + "enable_osc": false +} +``` +Then within `gnome-mpv`, click the application icon (top left) > Preferences. Configure the following Extra MPV Options: +``` +--idle --input-ipc-server=/tmp/gmpv-socket +``` + +### Heavy Memory Usage + +A problem has been identified where MPV can use a ton of RAM after media has been played, +and this RAM is not always freed when the player goes into idle mode. Some users have +found that using external MPV lessens the memory leak. To enable external MPV on Windows: + + - [Download a copy of MPV](https://sourceforge.net/projects/mpv-player-windows/files/64bit/) + - Unzip it with 7zip. + - Configure `mpv_ext` to `true`. (See the config section.) + - Configure `mpv_ext_path` to `C:\\replace\\with\\path\\to\\mpv.exe`. (Note usage of two `\\`.) + - Run the program and wait. (You'll probably have to use it for a while.) + - Let me know if the high memory usage is with `mpv.exe` or the shim itself. + +On Linux, the process is similar, except that you don't need to set the `mpv_ext_path` variable. +On macOS, external MPV is already the default and is the only supported player mode. + +In the long term, I may look into a method of terminating MPV when not in use. This will require +a lot of changes to the software. + +### Player Sizing (#91) + +MPV by default may force the window size to match the video aspect ratio, instead of allowing +resizing and centering the video accordingly. Add the following to `mpv.conf` to enable resizing +of the window freely, if desired: +``` +no-keepaspect-window +``` + +## Development + +If you'd like to run the application without installing it, run `./run.py`. +The project is written entirely in Python 3. There are no closed-source +components in this project. It is fully hackable. + +The project is dependent on `python-mpv`, `python-mpv-jsonipc`, and `jellyfin-apiclient-python`. If you are +using Windows and would like mpv to be maximize properly, `pywin32` is also needed. The GUI +component uses `pystray` and `tkinter`, but there is a fallback cli mode. The mirroring dependencies +are `Jinja2` and `pywebview`, along with platform-specific dependencies. (See the installation and building +guides for details on platform-specific dependencies for display mirroring.) + +This project is based Plex MPV Shim, which is based on https://github.com/wnielson/omplex, which +is available under the terms of the MIT License. The project was ported to python3, modified to +use mpv as the player, and updated to allow all features of the remote control api for video playback. + +The Jellyfin API client comes from [Jellyfin for Kodi](https://github.com/jellyfin/jellyfin-kodi/tree/master/jellyfin_kodi). +The API client was originally forked for this project and is now a [separate package](https://github.com/iwalton3/jellyfin-apiclient-python). + +The css file for desktop mirroring is from [jellyfin-chromecast](https://github.com/jellyfin/jellyfin-chromecast/tree/5194d2b9f0120e0eb8c7a81fe546cb9e92fcca2b) and is subject to GPL v2.0. + +The shaders included in the shader pack are also available under verious open source licenses, +[which you can read about here](https://github.com/iwalton3/default-shader-pack/blob/master/LICENSE.md). + +### Local Dev Installation + +If you are on Windows there are additional dependencies. Please see the Windows Build Instructions. + +1. Install the dependencies: `sudo pip3 install --upgrade python-mpv jellyfin-apiclient-python pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - If you run `./gen_pkg.sh --install`, it will also fetch these for you. +2. Clone this repository: `git clone https://github.com/jellyfin/jellyfin-mpv-shim` + - You can also download a zip build. +3. `cd` to the repository: `cd jellyfin-mpv-shim` +4. Run prepare script: `./gen_pkg.sh` + - To do this manually, download the web client, shader pack, and build the language files. +5. Ensure you have a copy of `libmpv1` or `mpv` available. +6. Install any platform-specific dependencies from the respective install tutorials. +7. You should now be able to run the program with `./run.py`. Installation is possible with `sudo pip3 install .`. + - You can also install the package with `./gen_pkg.sh --install`. + +### Translation + +This project uses gettext for translation. The current template language file is `base.pot` in `jellyfin_mpv_shim/messages/`. + +To regenerate `base.pot` and update an existing translation with new strings: +```bash +./regen_pot.sh +``` + +To compile all `*.po` files to `*.mo`: +```bash +./gen_pkg.sh --skip-build +``` + +## Linux Installation + +You can [install the software from flathub](https://flathub.org/apps/details/com.github.iwalton3.jellyfin-mpv-shim). The pip installation is less integrated but takes up less space if you're not already using flatpak. + +If you are on Linux, you can install via pip. You'll need [libmpv1](https://github.com/Kagami/mpv.js/blob/master/README.md#get-libmpv) or `mpv` installed. +```bash +sudo pip3 install --upgrade jellyfin-mpv-shim +``` +If you would like the GUI and systray features, also install `pystray` and `tkinter`: +```bash +sudo pip3 install pystray +sudo apt install python3-tk +``` +If you would like display mirroring support, install the mirroring dependencies: +```bash +sudo apt install python3-jinja2 python3-webview +# -- OR -- +sudo pip3 install jellyfin-mpv-shim[mirror] +sudo apt install gir1.2-webkit2-4.0 +``` +Discord rich presence support: +```bash +sudo pip3 install jellyfin-mpv-shim[discord] +``` +You can build mpv from source to get better codec support. Execute the following: +```bash +sudo pip3 install --upgrade python-mpv +sudo apt install autoconf automake libtool libharfbuzz-dev libfreetype6-dev libfontconfig1-dev libx11-dev libxrandr-dev libvdpau-dev libva-dev mesa-common-dev libegl1-mesa-dev yasm libasound2-dev libpulse-dev libuchardet-dev zlib1g-dev libfribidi-dev git libgnutls28-dev libgl1-mesa-dev libsdl2-dev cmake wget python g++ libluajit-5.1-dev +git clone https://github.com/mpv-player/mpv-build.git +cd mpv-build +echo --enable-libmpv-shared > mpv_options +./rebuild -j4 +sudo ./install +sudo ldconfig +``` + +## <h2 id="osx-installation">macOS Installation</h2> +Currently on macOS only the external MPV backend seems to be working. I cannot test on macOS, so please report any issues you find. + +To install the CLI version: + +1. Install brew. ([Instructions](https://brew.sh/)) +2. Install python3 and mpv. `brew install python mpv` +3. Install jellyfin-mpv-shim. `pip3 install --upgrade jellyfin-mpv-shim` +4. Run `jellyfin-mpv-shim`. + +If you'd like to install the GUI version, you need a working copy of tkinter. + +1. Install pyenv. ([Instructions](https://medium.com/python-every-day/python-development-on-macos-with-pyenv-2509c694a808)) +2. Install TK and mpv. `brew install tcl-tk mpv` +3. Install python3 with TK support. `FLAGS="-I$(brew --prefix tcl-tk)/include" pyenv install 3.8.1` +4. Set this python3 as the default. `pyenv global 3.8.1` +5. Install jellyfin-mpv-shim and pystray. `pip3 install --upgrade 'jellyfin-mpv-shim[gui]'` +6. Run `jellyfin-mpv-shim`. + +Display mirroring is not tested on macOS, but may be installable with 'pip3 install --upgrade 'jellyfin-mpv-shim[mirror]'`. + +## Building on Windows + +There is a prebuilt version for Windows in the releases section. When +following these directions, please take care to ensure both the python +and libmpv libraries are either 64 or 32 bit. (Don't mismatch them.) + +If you'd like to build the installer, please install [Inno Setup](https://jrsoftware.org/isinfo.php) to build +the installer. If you'd like to build a 32 bit version, download the 32 bit version of mpv-1.dll and +copy it into a new folder called mpv32. You'll also need [WebBrowserInterop.x86.dll](https://github.com/r0x0r/pywebview/blob/master/webview/lib/WebBrowserInterop.x86.dll?raw=true). +You may also need to edit the batch file for 32 bit builds to point to the right python executable. + +1. Install Git for Windows. Open Git Bash and run `git clone https://github.com/jellyfin/jellyfin-mpv-shim; cd jellyfin-mpv-shim`. + - You can update the project later with `git pull`. +2. Install [Python3](https://www.python.org/downloads/) with PATH enabled. Install [7zip](https://ninite.com/7zip/). +3. After installing python3, open `cmd` as admin and run `pip install --upgrade pyinstaller python-mpv jellyfin-apiclient-python pywin32 pystray Jinja2 pywebview python-mpv-jsonipc pypresence`. + - Details: https://github.com/pyinstaller/pyinstaller/issues/4346 +4. Download [libmpv](https://sourceforge.net/projects/mpv-player-windows/files/libmpv/). +5. Extract the `mpv-2.dll` from the file and move it to the `jellyfin-mpv-shim` folder. +6. Open a regular `cmd` prompt. Navigate to the `jellyfin-mpv-shim` folder. +7. Run `get_pywebview_natives.py`. +8. Run `./gen_pkg.sh --skip-build` using the Git for Windows console. + - This builds the translation files and downloads the shader packs. +9. Run `build-win.bat`. + + + + +%prep +%autosetup -n jellyfin-mpv-shim-2.6.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-jellyfin-mpv-shim -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 2.6.0-1 +- Package Spec generated @@ -0,0 +1 @@ +7c6fc09a1cd5da654cd19e9b826cd899 jellyfin-mpv-shim-2.6.0.tar.gz |