PM4K / PlexMod for Kodi
SOURCES
Code Repository
Issues (post bugs/issues here)
Discussions
Attention!
If you installed the latest stable or beta and have issues displaying posters, go to Settings > Network and enable “Force plex.direct mapping”.
Features (vs. official)
- Maintained.
- Very stable.
- AV1 support
- Compatible with Kodi 18, 19, 20, 21+ support (21/Omega is preferred)
- Directplay anything (as long as your setup and Kodi supports it)
- DirectStream support for every codec, not just AVC/MP3
- Passthrough audio enhancements (e.g. prefer or force AC3/DTS depending on channel config)
- Correctly identify and display video/audio streams (Atmos, DV, etc.)
- Support all (+historic) watched marker styles
- Add (auto-) intro/credits skipping
- Add auto recap skipping
- Modernized theme and assets
- High performance UI
- Chapters and virtual chapters in player
- Optional TV binge-mode
- Slow connection support (hotels for example)
- Local/LAN server discovery and option to prefer local servers instead of secure connections
- Real context-aware background images by default (not blurred to oblivion; configurable)
- Optional solid-color-background instead of images
- Optional post-play enhancements (via external addon settings)
- Forced-subtitle selection configurable (non-forced can be enforced)
- Improved photo playback/slideshow
- Better resume and pre-play dialog (HDR/DV support, show resume time)
- Add horizontal pagination for views
- Show mark unplayed even if video in progress
- Better/own PlayerProcessInfo (current stream info) implementation
- Add vertical round robining for dialogs
- Make background art blur and opacity configurable; display background art per item
- Own Estuary-based skin, “Plextuary”, to reduce OSD-hiding-times and remove blurry backdrop while player is paused (install from repository)
- Customizable player UI
- Support SDH subtitle streams
- Vastly improved music and photo handling
- Path mapping support (SMB/NFS/… instead of HTTP streaming)
- Automatic plex.direct domain handling (no need for DNS rebind exemption)
- Selective library hiding per user per server
- Selective hub hiding
- Watchlist support
(many older changes have been merged into the official addon; but we’ve departed from the official addon pretty massively)
KNOWN ISSUES
Album/Playlist-playback UI somewhat broken (skip-next in player doesn’t work); since Kodi 19; also in official addon; help neededMight be fixed from 0.5.4 onwards.On NVIDIA SHIELD standby Kodi loses its audio passthrough capabilities (SHIELD/Kodi issue). You can circumvent that by using the plugin “Sleepy Watchdog” from the Kodinerds repository to automatically exit Kodi after a timeout.PM4K now has built-in functionality to exit Kodi when the display goes to sleep. Look at the system options tab!Playing audio tracks directly from search results is broken- Multi-part media resume is somewhat broken (also see here for watch state issues)
NOTABLE CHANGES
2025
- Add watchlist support
- Achieve stability on CoreELEC
- Massive speedups when rendering huge libraries, collections, playlists
08/2024
- CoreELEC workarounds
- Templating engine
- 16:10, 4:3 support
05/2024:
- Use new common watched-states instead of unwatched
- Easy mapping
- Sections are now movable and hidable
04/2024:
- Fix DNS rebind issues for Kodi 19 and above
- Assets updated and player UI theme support
- Path mapping added (SMB/NFS/local mounts vs. HTTP)
- Hide all Kodi loading spinners when using 0.7.8 beta and Plextuary
03/2024:
- Fix any DNS rebind issues, hopefully
- Drastically improve performance
12/2024:
- Add Movie reviews
- Localization fixes for PMS API results (library names, (subtitle-) stream names)
- Full DirectStream capabilities including not burning in subtitles
Introduction
This is an unofficial partial rewrite and evolution of Plex4Kodi.
The original codebase has been abandoned by the company for years by now.
PM4K aims for a Plex-like user experience but doesn’t necessarily adhere to official guidelines. Its UX is directly based off of user feedback, while retaining the Plex optics.
It is still based off of the original P4K source and critical bugfixes might be PR’d back, depending on the severity.
Installation (recommended)
-
Add
https://pm4k.eu/(orhttps://pannal.github.io/dontpanickodi/) to your Kodi installation as a source in file manager (Hit Add source in File Manager, click on the selected “<None>” in the list, enterhttps://pm4k.eu, OK, down, enter a name, hit OK) -
Go to Settings->Addons, choose “Install from zip file”, choose the file source you added and install the repository
-
Install Plex via Settings->Addons->Install from repository->Don’t Panic->Video add-ons->Plex
-
Optional, recommended: Install Plextuary via Settings->Addons->Install from repository->Don’t Panic->Look and Feel->Skin->Plextuary
Installation (old stable only) - HEAVILY OUTDATED
- Install “PM4K for Kodi” from the official Kodi repository
- Install Plextuary skin using the above
Develop install:
- Checkout any branch of this GitHub repository and use as-is
Translation
You can help! Join the translation effort at POEditor (thanks for the free open source license, guys).
Changelog
1.3.19
Player / Playback
- Core/Player: Possibly regain compatibility with Audio Offset Manager
- Player: Adjust resume point by user setting
- Player: Embedded subtitles: Fix parsing mis-tagged Kodi subtitle offset (stream tagged as “pt (BR)” for example gets parsed by Kodi as “pt-”, which is invalid)
- Player: Avoid “skipping intro” blip when starting fresh with automatically skipping behind intro on start
- Player: After playback, wait 0.5s to allow for enough time for codec teardown (might hang with a black screen due to kodi dialogs otherwise)
- Player: Don’t error on close when seekdialog is already deleted
- Player: Only fix embedded subtitles by short seekback if we’re not CE p3i >= T2 (T2 fixes this issue already)
- Core/Player: Don’t end up with a broken UI when playback failed due to missing file (wait for the failure dialog to be dismissed by the user, for up to 10 seconds)
- Core/Player: Fix double pausing on Alternate Seek and edge case (both cosmetic)
- Core/Player: Only switch LAV modes if not already LAV Full or SB
Seek / SeekDialog
- CoreELEC/SeekFix: Store reported seek player time and use it, if it massively differs from what the player tells us
- CoreELEC/SeekFix: Stabilize fast seek fix (thanks @peaceoutt32)
- CoreELEC/SeekFix: Wait until player actually paused when pausing for seek
- CoreELEC/SeekFix: Prefer reported seek time over reported current player time if set and valid
- CoreELEC/Seek back on start/SeekDialog: Implement a blackout screen during seeking back on start
- Core/Player/Blackout: Show blackout until seek completely done
- Core/Player: SeekBackOnStart: Add delay between forward and backward seek to give decoders time to stabilize (fixes VC-1 24p HW stuttering at least); default: 500ms
- SeekDialog/Episodes/Movies: Increase scroll speed for too-long titles (5/15 to 35)
- SeekDialog: Don’t react to SELECT/ENTER events on skip marker buttons during seek
- SeekDialog: Allow pressing UP on the big seek chapter list with chapters disabled to access the skip marker button
- Player/Seekdialog: Pre-skip markers before the resume point to avoid race conditions with tick()
Seamless Branching / LAV / Codecs
- Core: Detect CE U3k builds above B9 that implement the alternative LAV filters for future auto-fixing of seamless branching titles
- Core/Player: Auto switch to LAV Full/SB if possible (CoreELEC U3k B9+ detected)
- Core/SB: Update seamless branching titles (thanks @Korbus)
- Core: Detect avdvplus as dynamic seamless branching fix enabled build, starting with R2
- Core: Detect CoreELEC p3i build as auto seamless branching fix capable build
- VideoInfo: Show seamless branching state on audio streams of affected videos
- Core/Codecs: Improve JOC audio detection substantially in some cases; lower JOC bitrate likelihood to 736kbit due to Plex server calculation bug (was 768)
Episodes
- Episodes: Fill episodes after deletion (thanks @andybkma)
- Episodes: Fix long scrolling episode titles cutting off remaining time pill
- Episodes: Fix deleting an episode created a pagination placeholder
- Episodes: Drastically improve initial loading time of episode view (> x10)
- Episodes: Reduce wait on initial episode select
- Episodes: Fix To Show and To Section in rare circumstances
- Episodes: Be more resilient against missing item data and hung connections when closing window
- Episodes: Delay initial busy state for 2.5 seconds
- Episodes: Use thread for changing background on initial load
- Episodes: Improve load times by batch fetching all to-be-reloaded episodes’ data in one go
- Episodes: Optimize task load order
- Episodes: Improve resilience against closing during initial load
- Episode: During initial load, wait up to 4 seconds before executing user actions and debounce other input during that time
Watchlist
- Watchlist: Adhere to new plex.tv watchlist limit of 100 items (was: 300; unannounced)
- Watchlist: Fix watchlisted shows “To Show” menu option error on other than current server
- Watchlist: Fix fully watched TV Shows not properly removed from Watchlist
- Core/Watchlist: Show notification once an item has been automatically successfully removed from the watchlist
- Core/Watchlist: Check for item watchlist existence before blindly trying to remove it
- Watchlist/Movies: Don’t attempt to set codec info on watchlist items
Home / Hubs
- Home: Resolve old fixme for update exit event
- Home/LibraryHubs: Use poster view for in progress TV/Movie library hubs (was 16x9 view)
- Home/LibraryHubs: Add “Remove from continue watching” option to TV/Movie library’s hubs in progress items as well
- Home/Main/UserSelect: Refresh home users when receiving a 401 from plex.tv when switching home users, as its protected bit might have changed (pin set), retry two times
- Home: Fix when entering a library quickly without showing its hubs, returning would show the wrong hubs
- Home: Reinitialize properly and update hubs when GoHome action was triggered by Home button bind
- Home: Consolidate multi list iteration for no reason
- Home: Fix hub stops paginating when returning from library hubs to home hubs without clean update
Library
- Library: Add PostersCompact and PostersSmallCompact views with no text (thanks @Rick_Williams)
- Library: Go home when screensaver is activated (saves CPU usage)
- LibraryWindow: Fix chunk callback edge case resulting in infinite recursion (rare case, when closing)
Movies
- Movies: Reload video info after clearing cache or refreshing metadata PMS-side
- Movies: Skip cache when reloading video info on reinit (returning from playback) (only when cache active)
Shows / Seasons
- Show/Seasons: Don’t show fully watched state when an on-deck episode is being re-watched
- Episodes/Movies/Shows: Include or exclude directors in cast lists
PostPlay
- PostPlay: Fix wrong next-up item after re-playing the previously played item (e.g. played EP2, replaying EP2 from post-play, EP4 will be next up)
Settings (AddonSettings / User Interface / Video)
- Settings: Fix ‘Video play completion behaviour’ options and translations
- AddonSettings: CoreELEC Resume Seek Wait: Unclamp further down to 10ms, actually set correct default of 100ms
- AddonSettings: Add “Use alternate seek” prefer reported time; default: On
- AddonSettings: Add “Use alternate seek” wait for valid player time; default: Off
- Settings: Add setting to blackout the screen while seeking back to start (Default: Off, CE/LG: On)
- Settings/User Interface: Add setting to include or exclude directors in cast lists (user-setting, default: On (include))
- Settings: Add “Ensure Kodi Addon position” (default: On)
- Settings: Add setting to return home when screensaver is activated on a library screen (default: on)
- Settings/Video: Add setting for auto seamless branching LAV mode fix
- Settings/Videoplayer: Add setting to adjust resume points negatively on resume, to avoid lost content due to keyframes/seek behaviour (default: -3.5s)
- AddonSettings: Add “Seamless branching LAV mode (CoreELEC U3k B9+)”, default: LAV SB
- AddonSettings: Allow specifying a custom background color (when dynamic backgrounds are disabled); overrides preset colors if set
- AddonSettings: Make Seek back on start delay configurable
- Main: Allow not showing any played/unplayed indicators at all
- Settings: Extend User Interface/Played indicators with option “None”
Core / Internal
- Core: Ensure we’re updating our lastused value by running our plugin endpoint with a stub value after exiting
- Plugin-Endpoint: Support stub-run
- Core: Do not update lastused value when ran from plugin endpoint initially
- Core: Re-jig waitForOpen
- Core/SignIn/Auth: Fix wonky first start of plugin (home shown briefly after device auth and user select)
- Core: Future-proof template engine (ibis) (thanks @tuffghost)
- Core: Fix compatibility with Python 3.14 (3.14.2) (might break certain assumptions) (U3k B10)
- Core/Mixins: Implement TasksMixin
- Core/AddonSettings: Reduce default requests cache expiry from 7 days to 3 (increasing sqlite db size could yield diminishing returns)
- Core/Plexobjects: On data retrieval error, clear cache for item(s)
- PlexObjects: ListItems() and reload(): Allow returning and using raw etree data instead of parsing elements
- Seasons/Episodes/Movies: Postpone less important tasks to speed up initial load
- Main/Core: Show busy background on user switch
Theme Music
- ThemeMusic: Only locally cache theme music if server is remote (not on local LAN nor plex.tv/watchlist)
- ThemeMusic: When fading, only use sync/wait on final setVolume value, not on the intermediates (reduces blocking)
Translations
- i18n: Update Spanish and Hungarian translations
–
1.0.5d
- Core/Plex.direct: Only check native resolving of hostnames containing plex.direct
- Core/Plex.direct: Reset mapped hosts if the user skips the confirmation dialog
- Core/Plex.direct: Fix long-existing issue with multiple servers in certain circumstances not triggering plex.direct host mapping check
- Core/Plex.direct: Force mapping if requested
- Core/GDM: GDM could still be reported as active under certain circumstances
- Core/MyPlex: Consider a device that is product=“Plex Media Server” as a server as well, even if it doesn’t provide the correct attributes (can happen; very rare)
- Core/PlexNet/CoreELEC: Properly report device and platform parameters to Plex.tv
- Player: Don’t throw away progress data during consecutive watch sessions; properly represent watched state in current video playlist during those
- Player: Honor “Never show Post Play” properly even when an episode has ended
- Player/Timeline: Never allow timeline reporting below 0 seconds
- Player: SeekBehind: Never allow seek target to be < 0
- Player/SeekDialog/AltSeekFix: Never react to seek attempts while we’re waiting for a seek to happen
- Player/MDE: If we don’t want a subtitle, report it properly to the Plex server (still bugged, probably server-side)
- Libraries: Move filter options out of the header area to fix overlapping music player and long filter descriptions
- Libraries: Unify and optimize play/filter/jumplist/scrollbar navigation
- Libraries/Listviews/Squares: Autoscroll long description texts
- Libraries/Photos: Fix PhotoDirectory browsing
- Library/Movies: Add filters for Writer, Producer, Editions, Audio Language, Subtitle Language, Folder Location (only if admin)
- Library/Shows: Add filters for Director, Writer, Producer; correctly separate Studio and Network filters
- Libraries: Store subfilter states
- Libraries: Re-select currently selected items in filter dropdowns
- Libraries: When re-opening applied filters, re-open all subfilter dropdowns until we reach our current one
- Libraries: Cache subfilter content
- Libraries: Depending on which “side” of the library view we are, when pressing “up”, select either the left buttons or the right buttons
- Libraries: Enable fast navigation through subfilter lists via scrollbar
- Library/Movies: Allow filtering by HDR and DOVI; allow multiple boolean filters at the same time
- Library/Photos: Fix filtering
- Libraries: Allow filter clearing for boolean filters
- Libraries/Movies: Add “year” and “progress” sort types
- Libraries: Shows/Movies use sort order from PlexWeb
- Libraries: Movies: Show current sort reference value if possible in addition to movie year
- Libraries: Photos: Properly implement PlexWeb sort; fix display
- Libraries/PosterSmall: Fix vertical cutoff
- Libraries/Posters/PostersSmall: Scale and position scrollbar appropriately when moving down
- Libraries: Re-select currently used item type and sort attribute in dropdowns
- Dropdown: Allow opening a sublist by pressing RIGHT
- Dropdown: Show scrollbar if a (child-)dropdown needs scrolling
- Dropdown: Fix shadow size; perfect shadow positioning
- PostPlay: Remove leftover bifurcation line
- SeekDialog: Be smarter about playerprocessinfo/playerdebug/PM4K stream info (press left/right)
- Settings: Make the combined continue watching/ondeck hub default enabled
- Settings: Add setting “Force plex.direct mapping” (default: False)
- Settings: Sanitize defaults (“Loop Theme Music” off vs on, “Home: Resume in-progress items” off vs on)
- Settings: Temporarily remove “custom” theme setting as it’s been broken for a while now
- Settings: Rename “Episodes: Skip Post Play screen” to “Episodes: Continuous playback” to make functionality clearer
- AddonSettings: widen maximum for “Use alternate seek” wait for seek to 5000 (was 2500)