Changed
- Standardize collection-level Radarr and Sonarr definition setting names:
radarr_root_folder_path,radarr_minimum_availability,radarr_quality_profile,radarr_tags,sonarr_root_folder_path,sonarr_quality_profile,sonarr_language_profile,sonarr_series_type,sonarr_season_folder, andsonarr_tagsare now the preferred keys; the previous names remain supported as aliases. - Upgrade SIMKL authentication to AUTH V2 with access-token validation, refresh-on-failure, and an optional
force_refreshsetting. - Default
settings.threading.workersto 4 (was effectively single-threaded) andsettings.threading.prefetch_collection_childrentotrue, deferring a collection'ssync_collection"what to remove" lookup and PMS's comma-separated/library/metadata/{ids}batch-read to the shared thread pool instead of blocking the main collection loop; the cache is now RLock-guarded (_LockedConnection) so concurrent worker threads can share one SQLite connection safely. - Consolidate end-of-run log-summary routing and repeated high-volume item warnings, including metadata entries skipped because their titles were not found.
Added
- Add a
settings.threadingconfig block (workers,tmdb_pages,parallel_sources,prefetch_collection_children) backed by a sharedThreadPoolExecutor, used to defer non-Plexgather_idswork and Plex item-reload batching off the main collection loop. - Add a
--delete-collections-labelsCLI flag (no short form - would collide with-d/--divider) that deletes all collections, same as-dc, and for any deleted collection whose title matches an existing Plex label of the same name (the Smart Label default), batch-removes that one label from just the items that have it - instead of-dl's full library-wide, one-item-at-a-time label wipe. - Add WeTrakr as a tracker connector (
wetrakrconfig block, OAuth2 device-flow authorization via the Kometa Utilities website) withwetrakr_list,wetrakr_list_details,wetrakr_user_lists,wetrakr_tracking,wetrakr_favorites, andwetrakr_ratingsbuilders, plussync_to_wetrakr_list/sync_missing_to_wetrakr_listto sync a collection back to a WeTrakr list andwetrakr_useras a mass rating source; a list's description used as a collection summary (wetrakr_description,wetrakr_list/wetrakr_list_details) now carries a credit line linking back to WeTrakr, per their attribution terms.wetrakr_user_listsalso accepts a bare username or profile URL now, resolved to a numeric user id via WeTrakr's search API.
Fixed
- Avoid unnecessary Plex account and user lookups for owner-only playlists when user syncing and exclusions are disabled; playlist reporting still requires plex.tv access. #3687
- Log the Apprise delivery-failure warning again with Apprise 2, whose
notify()returns anAppriseResultobject instead ofFalse, so failed and partially failed notifications were silently ignored. - Accept YAML lists for schedules and scheduled visibility attributes across the config, collection, overlay, and playlist schemas, matching documented runtime OR semantics.
- Accept scalar values for the legacy
mass_content_rating_updateandmass_original_title_updateoperations in the config schema, matching runtime normalization and the other legacy mass metadata operations. - Evaluate
non_existingschedules against collection or playlist existence, preserving OR behavior in schedule lists while allowingall[...]to require absence alongside other conditions. #3675 - Allow
floppy_listandfloppy_list_detailsbuilders in episode-level collections, including exact episodes from public Floppy RSS feeds. - Group
STARZ,Starz Encore, andSTARZ Encorenetwork values into the canonicalStarzNetwork Default collection. - Honor per-collection
limit_<<key>>template variables across Defaults files, including Letterboxd charts, Based On collections, and Streaming collections. - Fix the
resolutionDefaults overlay file applying the-Dovetailvariant to every DV HDR10+ item at 4K and 1080P, even without an edition, by matching the Dovetail weights to their plain counterparts. #3654 - Normalize Letterboxd ratings returned by MDBList batch lookups to their native 0–5 scale, preventing doubled ratings in overlays and metadata updates. #3533
- Keep localized collections from scheduled-out collection files classified as configured during
delete_collectionsoperations. - Address the Docker image's managed virtual-environment interpreter directly at startup instead of depending on
PATH-based interpreter selection. #3656 - Replace a bare truthy check on a collection builder's Plex object with an explicit
is not Nonecheck, avoiding a silent full Plexitems()fetch throughCollection/Playlist.__len__on any falsy-looking-but-real collection. - Guard against
NonechildCounton blank/separator collections when computing the collection's starting item count. - Only fetch a parent item's
titleSortwhen building a display title if sorted output was actually requested, instead of unconditionally. - Report Jikan/MyAnimeList search and lookup errors (including Jikan returning an error body for an unreachable MyAnimeList backend) as service errors with recovery guidance instead of a traceback, and fix an
mal_searcherror that misidentified itself as an AniList error. - Read FlickList ratings once per run instead of once per library item, so
mass_user_rating_update: flicklist_userandflicklist_ratingsno longer exhaust FlickList's 1,000 requests/hour limit on larger libraries. - Validate that OMDb, IMDb service, and MDBList rating/search responses are the expected object shape before indexing into them, reporting a clean error instead of an unhandled traceback when one of those APIs answers with an unexpected body (e.g. an error payload shaped as a list); remove dead rating/image lookup code left over from the Trakt removal that referenced the no-longer-existing
config.Trakt. - Stop the retired-Trakt config cleanup from discarding unrelated attributes that merely mention "trakt" in a string value (e.g. an
mdblist_listURL whose slug references Trakt-sourced data, orsummaryprose) or an entire collection whose name contains "trakt", by matching only the actual Trakt builder/attribute key names instead of a substring check against every key and string value. - Report a
mass_*_rating_update/mass_*_episode_rating_updatevalue of the retiredtrakt,trakt_user, ormdb_traktoptions with the Trakt-removal message instead of a confusing "must be a number between 0 and 10" error from the generic numeric-rating parser. - Stop a
smart_labelcollection whose label isn't currently applied to any items in Plex from overwriting the existing collection's smart filter: the unresolved label filter URL isNone, andupdate_smart_collection()translated that into the bogus.../allNoneURI, loggingMetadata: Smart Collection updated to Noneand wiping the collection's real filter. An unresolved filter URL is now skipped, leaving the collection intact so the existingLabel: ... was not added to any items in the Libraryerror can report the problem.