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