CI Report:
https://ci-tests.linuxserver.io/linuxserver/kometa/v2.4.7-ls112/index.html
LinuxServer Changes:
Full Changelog: v2.4.6-ls111...v2.4.7-ls112
Remote Changes:
Added
- Added a fallback Trakt Client ID for "public" mode if the current Trakt credentials are invalid
- Add a Floppy connector with
floppy_list,floppy_list_detailsandfloppy_trackedbuilders, optional API-token authentication for private lists, andsync_tagssupport for applying Floppy list tags as Plex item labels. - Add Floppy as a movie, show, and episode mass-rating source for Plex audience, critic, or user rating fields.
- Add
floppyas a direct Defaults ratings-overlay source for movies, shows, and episodes. - Add Tracearr connector support with history-based collection and playlist builders for popular, watched, trending, rewatched, completed, binged, most transcoded, watch time, in-progress, and full history views, including user-specific and playback-quality filters, direct movie provider-ID matching, v2 capability detection with v1 fallback, and in-run history reuse.
- Add Serializd as a connector
- Add
serializdas a genre source for shows and episodes for the mass metadata update operation, includes nanogenres. - Add
serializdas a source for show and episode audience, critic, and user mass metadata updates, andserializd_userfor episodes only. - Add
sync_watchlist_to_serializdshow-library operation to mark the Plex server owner's watched episodes as watched in Serializd. - Add builders:
serializd_list,serializd_watchlist,serializd_trending,serializd_popular, andserializd_featured - Add
serializdas a direct rating source for show and episode-level Ratings Defaults overlays.
Fixed
- Sort IMDb award years and multi-edition year values before resolving
starting/endingranges, so out-of-order repository entries do not causelatestranges to include the wrong years. - Refresh an item's in-run Plex state after
mass_poster_updateremoves itsOverlaylabel, ensuring the following overlay pass detects the reset poster and reapplies its overlays instead of incorrectly skipping it. - Redact registered secrets from critical-error webhook messages before sending them to Discord, Slack, Notifiarr, or other webhook destinations. #3472
- Make nightly Docker builds wait for, and use, the matching base image after dependency changes.
- Accept all successful Trakt API responses so
sync_to_trakt_listhandles the201 Createdreturned when adding list items instead of marking the collection build as failed. #3453 - Add
pyinstrumenttorequirements.txt(it was only indev-requirements.txt), soKOMETA_PROFILE=pyinstrumentactually works in a normal/Docker install instead of silently no-opping. - Fix
folder_location/folder_location.notsmart_filter matching for show libraries, which previously failed withplex_search attribute: folder_location not supported(or, forbuilder_level: episode,Unknown filter field "location") because the filter was being resolved against Plex'sshowlibtype, which doesn't expose a folder filter; it's now resolved against theepisodelibtype instead, matching how Plex exposes it for shows. #3483 - Lock the poster, background, logo, and square art fields after resetting them from a source, and check the logo's actual Plex field name (
clearLogo, notlogo), so subsequent runs withignore_locked: trueskip re-resetting instead of looping forever. #3487
Changed
- Document Trakt's free connected-app limitation and identify which Trakt builders and account features require OAuth/VIP access versus public API access.
- Migrate Trakt authentication documentation and shipped configuration examples from the legacy PIN/OAuth callback flow to Device Code Flow, including headless-server guidance and the optional
webhooks.trakt_pinnotification. - Batch Plex writes that were previously one API call per item: label/genre sync,
item_critic/audience/user_ratingupdates, and title-parentheses removal now merge into sharedsaveMultiEdits()/batchMultiEdits()calls (respectingplex_bulk_edit_batch_size) instead of oneedit_tags()/editField()/editTitle()call per item; label/genre and rating writes for the same item are further merged into a single PUT instead of one per attribute type, grouped by library and media type so mixed-library/mixed-type playlists route through the correct Plex connection. The overlayOverlaylabel add is batched the same way, flushing everyplex_bulk_edit_batch_sizeitems instead of only once at the very end of the run. - Reduce repeated in-run Plex/API lookups via caching:
modules/cache.py's ID-map queries (query_tmdb_to_tvdb_mapand siblings,query_guid_map/update_guid_map) are memoized in-process;check_filtermemoizes plain item-attribute reads (excluding writable fields), media-derived number filters (channels/height/width/aspect/versions/audio_language/subtitle_language/duration), and per-item seasons/episodes/albums/tracks sub-item listings, the last of which is now reused viacached_item_subitemsat every remaining call site (includingoverlays.py's runtime/total_runtime lookups) instead of re-querying Plex each time. - Reduce redundant network/image work:
Requests.get_image()is memoized by URL for the run; validate-only image URL checks use HEAD instead of GET; validate-only checks are skipped entirely for Kometa's own GitHub-hosted assets; and fresh local overlay images are reused instead of being re-fetched from GitHub on every call. modules/request.py: read-only file/URL YAML loads (that are never saved back) now use ruamel's safe loader, skipping comment/formatting-preservation bookkeeping that was pure overhead for these loads.- Dedupe forced Plex reloads for tag filters checked back-to-back in
check_filters; snapshot the overlay backup folder once per run instead of callingos.path.exists()per item; buffer log file writes instead of flushing after every line (WARNINGand above still flush immediately, and handler removal/close force a final flush so the file is always complete); early-exitcheck_for_var's variable-resolution loop once a pass makes no substitutions, and skip its redundant second pass when no arithmetic<<var+N>>syntax is present. - Improve
audio_language/subtitle_languageplex_searchmatching (including the defaultlanguages.ymlflag overlays) to recognize every locale- or region-tagged variant of a language that actually exists in the library (e.g.es-419,en-US,spa) instead of only an exact 2-letter match. A singlees/it/zhfilter now matches every variant Plex reports for that language, resolved with one lightweight, cached lookup of the library's language filter choices rather than a separate Plex query per variant.