diff --git a/CHANGELOG b/CHANGELOG index 154c451e..3e692f7e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,45 +1,5 @@ -# Requirements Update (requirements will need to be reinstalled) -Added tenacity requirement at 9.0.0 -Update lxml requirement to 5.3.0 -Update pathvalidate requirement to 3.2.1 -Update pillow requirement to 10.4.0 -Update PlexAPI requirement to 4.15.16 -Update psutil requirement to 6.0.0 -Update setuptools requirement to 74.0.0 -Update tmdbapis requirement to 1.2.21 - -# Removed Features - # New Features -Introducing the [Kometa Blog](https://blog.kometa.wiki) - a new home for all kometa-related news stories, ranging from showcasing our community creations to providing you with important updates. -Added [`letterboxd_user_lists`](https://kometa.wiki/en/latest/files/dynamic_types/#letterboxd-user-lists) Dynamic Collection Type -Added `item_analyze` item detail to analyze each item in a collection - -# Updates -F1 session naming improvements -Added new studios : Disney Television Animation, DisneyToon Studios, Dynamic Planning, Film4 Productions, Golden Harvest, Hungry Man, Screen Gems, Shaw Brothers, Studio Live, The Stone Quarry - -# Defaults -Fixed #2150; change xmen list to a new one -Added `A Quiet Place: Day One` to the `A Quiet Place` collection in the `franchise` Defaults file -Add `minimum_items_<>` to universe Default file -Added workaround to `Streaming` for TMDb issue with TMDb Discover +Added the `character` search option to the `imdb_search` builder # Bug Fixes -Fixed multiple anime `int()` Errors -Fixed #2100 `verify_ssl` wasn't working when downloading images -Fixed an issue with `delete_collections` where items were being deleted if they only matched one criteria vs all criteria -Fixed `imdb_watchlist` -Fixes #2135 AniDB Builder type conversion error -Fixed #2169 Add handling for blank secrets -Fixed #2176 `clean_bundles`, `optimize`, and `empty_trash` not working as global attributes -Fixed #2186 `total_runtime` will now trigger an overlay update -Fixed #2195 an image on the docs was a dead link -Fixes sort order of resolution collections -Fixes #2228 ".any" not accepted for a variety of imdb_search parameters -Fixes `streaming` defaults adding and removing items randomly -Fixes missing TMDb Discover parameters -Fixes `imdb_chart` error when using `trending_india` -Adds error information to help with #2201 -Added warning to TMDb Discover builder regarding ongoing bug with using `popularity.desc` as sort order -Various other Minor Fixes +Fixed the `cast` search option for the `imdb_search` builder \ No newline at end of file diff --git a/VERSION b/VERSION index 7ec1d6db..1b6b5187 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.0 +2.1.0-build1 diff --git a/docs/files/builders/imdb.md b/docs/files/builders/imdb.md index fa62b3b5..f9c6ef50 100644 --- a/docs/files/builders/imdb.md +++ b/docs/files/builders/imdb.md @@ -276,6 +276,7 @@ The `sync_mode: sync` and `collection_order: custom` Setting are recommended sin | `cast` | Item must have all the given cast members. Can be a comma-separated list.
**Options:** Any IMDb Person ID (ex. `nm0000138`) | | `cast.any` | Item must have any of the given cast members. Can be a comma-separated list.
**Options:** Any IMDb Person ID (ex. `nm0000138`) | | `cast.not` | Item must not have any of the given cast members. Can be a comma-separated list.
**Options:** Any IMDb Person ID (ex. `nm0000138`) | +| `character` | Item must have any of the given character listed in its credits. Can be a comma-separated list.
**Options:** Any String | | `runtime.gte` | Item must have a Runtime greater than or equal to the given number.
**Options:** Any Integer greater than `0`
**Example:** `1000` | | `runtime.lte` | Item must have a Runtime less than or equal to the given number.
**Options:** Any Integer greater than `0`
**Example:** `1000` | | `adult` | Include adult titles in the search results.
**Options:** `true`/`false` | diff --git a/modules/builder.py b/modules/builder.py index 8d050530..16d579a0 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -1629,7 +1629,7 @@ class CollectionBuilder: countries.append(str(country)) if countries: new_dictionary[lower_method] = countries - elif search_attr in ["keyword", "language", "alternate_version", "crazy_credit", "location", "goof", "plot", "quote", "soundtrack", "trivia"]: + elif search_attr in ["keyword", "language", "alternate_version", "crazy_credit", "location", "goof", "plot", "quote", "soundtrack", "trivia", "character"]: new_dictionary[lower_method] = util.parse(self.Type, search_method, search_data, datatype="lowerlist", parent=method_name) elif search_attr == "cast": casts = [] diff --git a/modules/imdb.py b/modules/imdb.py index 1e30faf4..bde2080e 100644 --- a/modules/imdb.py +++ b/modules/imdb.py @@ -69,7 +69,8 @@ imdb_search_attributes = [ "series", "series.not", "list", "list.any", "list.not", "language", "language.any", "language.not", "language.primary", - "popularity.gte", "popularity.lte", + "popularity.gte", "popularity.lte", + "character", "cast", "cast.any", "cast.not", "runtime.gte", "runtime.lte", "adult", @@ -303,7 +304,7 @@ class IMDb: "first": data["limit"] if "limit" in data and 0 < data["limit"] < page_limit else page_limit, } - def check_constraint(bases, mods, constraint, lower="", translation=None, range_name=None): + def check_constraint(bases, mods, constraint, lower="", translation=None, range_name=None, obj_name=None): if not isinstance(bases, list): bases = [bases] if range_name and not isinstance(range_name, list): @@ -318,6 +319,8 @@ class IMDb: if full_attr in data: if range_name is not None: range_data[imdb_mod] = data[full_attr] + elif obj_name is not None: + out[constraint][f"{imdb_mod}{lower}"] = [{obj_name: d} for d in data[full_attr]] elif translation is None: out[constraint][f"{imdb_mod}{lower}"] = data[full_attr] elif isinstance(translation, tuple): @@ -392,7 +395,8 @@ class IMDb: check_constraint("country", [("", "all"), ("any", "any"), ("not", "exclude"), ("origin", "anyPrimary")], "originCountryConstraint", lower="Countries") check_constraint("keyword", [("", "all"), ("any", "any"), ("not", "exclude")], "keywordConstraint", lower="Keywords", translation=(" ", "-")) check_constraint("language", [("", "all"), ("any", "any"), ("not", "exclude"), ("primary", "anyPrimary")], "languageConstraint", lower="Languages") - check_constraint("cast", [("", "all"), ("any", "any"), ("not", "exclude")], "creditedNameConstraint", lower="NameIds") + check_constraint("cast", [("", "all"), ("any", "any"), ("not", "exclude")], "titleCreditsConstraint", lower="Credits", obj_name="nameId") + check_constraint("character", [("", "any")], "characterConstraint", lower="CharacterNames") check_constraint("runtime", [("gte", "min"), ("lte", "max")], "runtimeConstraint", range_name="runtimeRangeMinutes") if "adult" in data and data["adult"]: