[1] Update `imdb_search` (#2259)

pull/2260/head
meisnate12 2 months ago committed by GitHub Action
parent 726b0d7a16
commit 5fb7cf3c22

@ -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 # 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 the `character` search option to the `imdb_search` builder
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_<<key>>` to universe Default file
Added workaround to `Streaming` for TMDb issue with TMDb Discover
# Bug Fixes # Bug Fixes
Fixed multiple anime `int()` Errors Fixed the `cast` search option for the `imdb_search` builder
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

@ -1 +1 @@
2.1.0 2.1.0-build1

@ -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.<br>**Options:** Any IMDb Person ID (ex. `nm0000138`) | | `cast` | Item must have all the given cast members. Can be a comma-separated list.<br>**Options:** Any IMDb Person ID (ex. `nm0000138`) |
| `cast.any` | Item must have any of the given cast members. Can be a comma-separated list.<br>**Options:** Any IMDb Person ID (ex. `nm0000138`) | | `cast.any` | Item must have any of the given cast members. Can be a comma-separated list.<br>**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.<br>**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.<br>**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.<br>**Options:** Any String |
| `runtime.gte` | Item must have a Runtime greater than or equal to the given number.<br>**Options:** Any Integer greater than `0`<br>**Example:** `1000` | | `runtime.gte` | Item must have a Runtime greater than or equal to the given number.<br>**Options:** Any Integer greater than `0`<br>**Example:** `1000` |
| `runtime.lte` | Item must have a Runtime less than or equal to the given number.<br>**Options:** Any Integer greater than `0`<br>**Example:** `1000` | | `runtime.lte` | Item must have a Runtime less than or equal to the given number.<br>**Options:** Any Integer greater than `0`<br>**Example:** `1000` |
| `adult` | Include adult titles in the search results.<br>**Options:** `true`/`false` | | `adult` | Include adult titles in the search results.<br>**Options:** `true`/`false` |

@ -1629,7 +1629,7 @@ class CollectionBuilder:
countries.append(str(country)) countries.append(str(country))
if countries: if countries:
new_dictionary[lower_method] = 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) new_dictionary[lower_method] = util.parse(self.Type, search_method, search_data, datatype="lowerlist", parent=method_name)
elif search_attr == "cast": elif search_attr == "cast":
casts = [] casts = []

@ -70,6 +70,7 @@ imdb_search_attributes = [
"list", "list.any", "list.not", "list", "list.any", "list.not",
"language", "language.any", "language.not", "language.primary", "language", "language.any", "language.not", "language.primary",
"popularity.gte", "popularity.lte", "popularity.gte", "popularity.lte",
"character",
"cast", "cast.any", "cast.not", "cast", "cast.any", "cast.not",
"runtime.gte", "runtime.lte", "runtime.gte", "runtime.lte",
"adult", "adult",
@ -303,7 +304,7 @@ class IMDb:
"first": data["limit"] if "limit" in data and 0 < data["limit"] < page_limit else page_limit, "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): if not isinstance(bases, list):
bases = [bases] bases = [bases]
if range_name and not isinstance(range_name, list): if range_name and not isinstance(range_name, list):
@ -318,6 +319,8 @@ class IMDb:
if full_attr in data: if full_attr in data:
if range_name is not None: if range_name is not None:
range_data[imdb_mod] = data[full_attr] 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: elif translation is None:
out[constraint][f"{imdb_mod}{lower}"] = data[full_attr] out[constraint][f"{imdb_mod}{lower}"] = data[full_attr]
elif isinstance(translation, tuple): 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("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("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("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") check_constraint("runtime", [("gte", "min"), ("lte", "max")], "runtimeConstraint", range_name="runtimeRangeMinutes")
if "adult" in data and data["adult"]: if "adult" in data and data["adult"]:

Loading…
Cancel
Save