This release includes breaking changes for platform teams planning a safe upgrade.
Published 1mo
Media Servers
✓ No known CVEs patched
✓ No known CVEs patched in this version
Topics
kometa
Affected surfaces
deps
Summary
AI summaryUpdates last, legacy, and collected across a mixed release.
Full changelog
Added
- Add jsonschema 4.23.0.
- Add letterboxdpy 6.5.0.
- Report deactivated Trakt accounts [Trakt returns a 410].
- Add E4 to network overlay and show network collection. #2975
- Adds new
text_filebuilder. - Initial support for SIMKL.com; trending lists and dvd-releases list.
- Add Apprise as a webhook notification provider.
- Added
languageparameter tomass_poster_updateandmass_background_updateoperations to override TMDb language for image fetching (e.g.xxfor textless posters). - Added
plex_csmandplex_csm0sources tomass_content_rating_update(reads CSM age rating from Plex's own cachedcommonSenseMedia.ageRatings, no external API key required). - Add Plex square art support: upload
square.extassets for movies, shows, seasons, albums, and playlists viafind_and_upload_assets. Extends metadata file items and library operations. - Add comprehensive config validation with
--validate,--validate-level,--validate-schema, and--schema-pathCLI flags. Supports syntax, structure, full, and schema-level validation with a gap report showing missing/extra fields. - Add
--validate-fileand--validate-dirCLI flags for standalone and batch YAML validation against auto-detected schema types (config, collection, metadata, overlay, playlist). Output written tovalidate.log. - Add
modules/validator.pywithConfigValidator(multi-level config validation) andFileSetValidator(standalone/batch YAML validation with schema type detection). - Expand
json-schema/config-schema.jsonwith full coverage and add per-type schemas:collection-schema.json,metadata-schema.json,overlay-schema.json,playlist-schema.json. - Add
appriseandschedule_overlaysto the config JSON schema. - Add
auto_sort_hubsglobal/library setting to sort Recommendation Hub rows on the Plex home screen after all collections are processed. Acceptssort_title,sort_title.desc,alpha,alpha.desc,configured,configured.desc, orrandom. - Add
hub_priorityper-collection attribute to pin a collection's hub row to a specific position (lower number = higher up). Collections withhub_priorityare sorted first; the remainder follow inauto_sort_hubsorder. - Add
monthly(last)schedule option: fires on the last day of every month regardless of its length (Feb 28/29, Apr/Jun/Sep/Nov 30, or the 31st in 31-day months). - Add
hub_priorityandhub_priority_<<key>>template variables to the shared default templates so collections can set hub row priority from templates. - Add
hub_priorityto the collection config schema so the new template variable validates correctly. - Add support for boxd.it urls, used for letterboxd share lists.
- Allow metadata updates to proceed on existing collections even if the builder returns 0 items.
- Add new operations attributes
respect_ignore_idsto skip operations processing items inignore_idsorignore_imdb_ids, andignore_labelsto skip operations processing items with the specified label(s). - Add new TMDb release date types for
mass_originally_available_updateandmass_added_at_updateoperations:tmdb_premiere,tmdb_theatrical,tmdb_theatricallimited,tmdb_digital,tmdb_physical,tmdb_tv.
Changed
- Bump lxml to 6.0.4.
- Bump packaging to 26.1.
- Bump gitpython to 3.1.50.
- Bump letterboxdpy to 6.5.7.
- Bump lxml to 6.1.1.
- Bump packaging to 26.2.
- Bump plexapi to 4.18.1.
- Bump python-dotenv to 1.2.2.
- Bump pillow to 12.2.0.
- Bump pywin32 to 312.
- Bump requests to 2.34.2.
- Bump setuptools to 82.0.1.
- Bump prek to 0.4.5.
- Switch to GraphQL for IMDb charts retrieval, with a fallback to the old method if the GraphQL request fails. #3006
- Replace Kometa's internal Letterboxd scraping with a letterboxdpy-backed adapter while preserving existing Letterboxd builder names.
- Process collection alterations [add/remove] in batches of 100 to avoid "400 Bad Request" on mile-long URLs.
- Exit early if more than one of the
--SOMETHING-onlyflags are set. - Cache people data for media items since it's unlikely to change.
- The
tmdb_discoverYAML validator now enforces: unknown keys are rejected, value types are checked,certification_country/certificationmust co-occur,watch_regionmust accompany any watch-provider or monetization key, and movie-only and TV-only parameters are mutually exclusive. Note:with_watch_providersandwithout_watch_providersnow requirewatch_regionat validation time (the TMDb Discover API requires this), which is stricter than the runtime check inbuilder.py. --validatenow implies immediate run (like--run-libraries).- Use the SQLite cache for TMDb queries in
check_filtersandcheck_missing_filtersinstead of bypassing it withignore_cache=True. - Only force-reload Plex items in the overlay loop when
reapply_overlaysis set; reuse the session cache on normal runs. - Use set lookup instead of list scan when checking collection membership in
add_to_collectionandrun_collections_again, reducing complexity from O(n×m) to O(n). - Extend default "Metacritic Must See" collection to work with TV.
- Improve JSON schemas and add prototype YAML configuration files for all builders.
- Add translations for Genre Defaults posters.
- Updates to Quickstart docs about limitations.
- Updates to Trakt and MAL flow pages.
- Update Letterboxd builder docs to reflect letterboxdpy-backed filtering, ordering, and incremental behavior.
- Document the valid
font_stylevalues for the default Inter font and note that valid styles are font-specific. #2925 - Call out the schema file as supporting only
config.ymlexplicitly. - Sync
pyproject.tomlpinned dependencies to matchrequirements.txt(lxml, requests, pillow, packaging, gitpython, pywin32; add letterboxdpy). - Align Black
target-versionto["py312"]inpyproject.tomlto match the project's existingrequires-python = ">=3.12". - Standardise GitHub Actions checkout version to
@v6inspellcheck.ymlandlint.yml. - Fix
lint.ymltarget paths fromsrc/tomodules/to reflect actual codebase structure. - Sync
.pre-commit-config.yamlhook revisions to matchdev-requirements.txt(black 26.5.1, isort 8.0.1, flake8 7.3.0). - Fix
.dockerignoreentryCHANGELOG→CHANGELOG.mdafter changelog file rename. - Normalise
AGENTS.mdand.dockerignoreline endings from CRLF to LF. - Remove stale
Dockerfile.lxmlentry from.dockerignore(file was removed from the repo long ago). - Update
CLAUDE.mdtest file list to reflect all current test files intests/. - Add "Chore" PR type option to pull request template to match the project's existing
chore/branch convention. - Remove
reciperr_listfromcollection-schema.json(Reciperr builder was removed). - Update spellcheck configuration: exclude
docs/kometa/acknowledgements.md(credits file) and update wordlist. - Add spellcheck to pre-commit configuration.
Removed
- Reciperr builder removed; the Reciperr site has been unresponsive for an extended period.
Fixed
- Dynamic collection titles with unresolved template variables in
title_format(e.g.<<limit>>from a templatedefault:block, or<<key>>from per-key dynamic variables) no longer causedelete_collections: configured: trueto incorrectly treat those collections as unconfigured and delete them. #1904 - When
run_orderplacesoperationsbeforecollections, configured collections are no longer incorrectly reported as unconfigured byshow_unconfiguredor targeted bydelete_collections: configured: true. #1968 - Fix "Movies Removed" report entries missing release year; titles now match the "Movies Missing" format e.g.
The Grapes of Wrath (1939). Fixes #2028 - Invalidate cached Plex items after each batch edit in operations so that the overlay phase reads post-operations values (e.g. updated ratings) rather than stale pre-operations values. Fixes rating overlays not updating when
mass_critic_rating_update(or audience/user equivalents) runs before overlays in the same Kometa pass. #2357 - Overlay backdrops with
back_line_colorset but noback_line_widthno longer crash;back_line_widthnow defaults to 1 in that case. #2645 - Fix
monthly(N)schedule: values greater than the current month's last day (e.g.monthly(31)in November) no longer fire on the last day of the month as a fallback.monthly(N)now only triggers when today is exactly day N. A warning is logged when a configured day does not exist in the current month, directing users to the newmonthly(last)option. Fixes #2884 - Streaming default's
run_definitionnow honorsuse_all: false; previously dynamic keys without an explicituse_<key>ran regardless. #2922 - Catch KeyError on Plex NFO build.
- Fixing "list index out of range" error when processing IMDb charts. #3006
- TMDB language now reflected in
mass_poster_update; cache extension. - Reduce size of FILMIN logo.
- Reduce size of FILMIN white logo.
- Replace top-ten-pirated default list with an updated, Kometa-controlled one.
- Align Kometa's AniList season translation from
currentto match AniList. - Fix an issue where
tvdb_to_imdbwrites the wrong IMDb ID when a TVDb movie ID collides with a TVDb series ID. - Update Letterboxd list/watchlist parser for the React-based
LazyPostermarkup, which replaced thedata-film-idnodes theletterboxd_list,letterboxd_user_films, andletterboxd_user_reviewsbuilders relied on. - Update Letterboxd URL parsing to handle unlisted lists and shuffle argument in the URL.
- Restore support for Letterboxd
/detail/list views and/USERNAME/films/reviews/URLs. - Update Letterboxd Top 100 Western to use official list.
- Fix
imdb_awardsfailing when any one of theaward_filtersorcategory_filtersdoes not exist; this now produces a warning and the builder will only fail if all of theaward_filtersor all of thecategory_filtersdo not exist. - Fix
imdb_watchlistrejecting the new IMDb user ID format (p.xxxxxxx). Now accepts bothur########(legacy) andp.xxxxxxxformats, as a bare ID or full watchlist URL. - TVDb 4xx responses (series/movie removed or merged on TVDb) now raise a dedicated
tvdb.NotFoundso the missing-show iteration and TVDb-filter paths log them at debug instead of error. Stale TVDb IDs returned by TMDbexternal_idsno longer spam logs or trigger webhook failure notifications. #3047 - Replace
mass_imdb_parental_labelsHTML scrape of/parentalguidewith IMDb's GraphQL API, which is not WAF-gated and returns structured parental guide data directly. Fixes silent label failures caused by IMDb's CloudFront WAF returning HTTP 202 (empty body) to scraper requests. #3053 - Fix trakt_chart watched/collected URLs to use
/movies(shows)/watched(collected)/{period}and default period to "weekly"; fix recommended to use/recommendations/movies(shows). #3057 - TMDb collection requests that 404 (collection deleted upstream — TMDb now only permits collections for true movie sequels) now raise a dedicated
tmdb.NotFound. When the ID was auto-discovered by a default (e.g. thefranchisedefault scanningtmdb_collectionIDs from the library), the collection is skipped as "Ignored" instead of failing with a critical error and webhook notification. IDs in user-authored config files still raise as before. - TMDb collection, movie, and show 404 responses now raise a dedicated
tmdb.NotFound(mirroring the existingtvdb.NotFoundpattern);validate_tmdb_idslogs an actionable hint for stale collection IDs pointing franchise-default users to theexcludetemplate variable. - Fix MDBList Sync Progress percentage overflowing for lists over 1000 items (e.g.
6378/378 (1687%)). Fetch list metadata upfront to get the true total item count. #3157 - Fix
ZeroDivisionErrorcrash inplex_update_in_batcheswhen runningmass_genre_updateormass_imdb_parental_labels(and any operation producing multiple label/genre groups per item). Cache eviction introduced by #3156 is now scoped to rating updates only via anevict_cacheparameter; a defensive guard prevents any future empty-list crash. #3163 - Guard against
_graph_requestreturningNonefor items with no IMDb record (e.g.Looney Tunes); previously the unguarded.get()call raised anAttributeErrorthat escaped theexcept Failedhandler inoperations.pyand aborted processing for the entire library. #3165 - Fix
mass_imdb_parental_labelscrash when IMDb GraphQL returnsnullfor the title node (e.g. items whose only Plex GUIDs aretmdb://ortvdb://, such asLooney Tunes);.get("title", {})returnsNonewhen the key exists with a null value, causingAttributeErroron the next.get()call. Replaced the chained one-liner with explicit variable extraction usingor {}at each level. Added a pre-call guard inoperations.pyto skip items with no IMDb ID entirely. #3165 delete_collections: configured: falseno longer incorrectly deletes configured Kometa-managed collections whenrun_orderplacesoperationsbeforecollections. The check previously relied onlibrary.collections(populated during the collection run), which is always empty when operations executes first — so every managed collection appeared unconfigured and was deleted. The fix usescollection_names(pre-populated from config before the run-order loop) expanded with English-translated titles, so default collections whose YAML key differs from their Plex title (e.g.award/spirit→Spirit Best Feature Winners) are also correctly recognised as configured. #3168- Addresses edge case where missing
settings:minimum_itemswould make Kometa redact1in the log. - Hide some traceback errors for "known good" errors that don't require a full trace.
- Fix an issue where collections would not be recognised as configured if they were not scheduled to run.
- Fix an issue where Plex would fail to update collections if the casing of the collection name did not match the YAML (e.g. "Dogs And Cats" vs "Dogs and Cats").
- Fix shared
ignore_idsandignore_imdb_idstemplate variables for builders that resolve PlexratingKeys first. - Fix dynamic collection sync loop when
translation_keyandtitle_format/name_formatare both set —meta.pysync key now follows the same name-resolution priority asbuilder.py(name_format→ translation →title_format), eliminating the orphan-delete loop on every run. If the translation name still contains unresolvable library-context variables (e.g.<<library_translationU>>),meta.pyfalls back totitle_format(which has<<library_typeU>>pre-resolved) to ensure the sync key matches whatbuilder.pywrites to Plex. #3189 - Fix
title_formatfallback value inaward/sag.ymlto match its translation name (Screen Actors Guild Awards <<key_name>>); fix accent typo inaward/cesar.yml(César <<key_name>>). #3189 - Fix inconsistent asset poster selection and overlay cache invalidation when replacing local asset files. #3196
- Fix
audio_language/subtitle_languageplex_searchon show libraries returning fewer results than expected when Plex returns regional language codes (e.g.en-US) instead of base codes (en). #2777 - Sanitize PR branch names in CI workflows (
validate-pull.yml,increment-build.yml,tag-cleanup.yml) by replacing non-Docker-safe characters with-; branch names containing/(e.g.feature/my-fix) previously caused Docker Hub tag pushes and deletes to fail. #3207 - Fix
tag-cleanup.ymloutput key mismatch (tag_namevstag-name) that caused the Docker Hub tag DELETE to always target an empty tag name, leaving stale tester tags behind. #3207 - Fix sync-based collections with
minimum_items: 1anddelete_below_minimum: trueso they remove the last stale item and delete the collection when the source list drops to zero items. #3209 - Invalidate cached Plex items after batched edits in operations so metadata files can override values in the same run instead of flip-flopping on later runs. #3211
- Fix
other_namein dynamic collections:<<library_type>>and<<library_typeU>>placeholders are now resolved (they were applied totitle_formatbut not toother_name). Also fix a long-standing copy-paste bug whereother_namesupplied viatemplate_variableswas read fromself.temp_vars["remove_suffix"]instead ofself.temp_vars["other_name"]. #3215 - Fix an issue with AniList search date modifiers not working. #3220
- Fix Studio Defaults capitalization issues. #3221
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Kometa
Python script to update metadata information for items in plex as well as automatically build collections and playlists. The Wiki Documentation is linked below.
Related context
Related tools
Beta — feedback welcome: [email protected]