diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml index 45ae18c4..7aa99740 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -49,6 +49,4 @@ body: label: Logs description: > Please share the relevant log file with the error on [Gist](https://gist.github.com). - placeholder: "https://gist.github.com" - validations: - required: true \ No newline at end of file + placeholder: "https://gist.github.com" \ No newline at end of file diff --git a/VERSION b/VERSION index 8da9bbfb..b6732bc6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.18.0-develop64 +1.18.0-develop65 diff --git a/docs/metadata/builders/tmdb.md b/docs/metadata/builders/tmdb.md index b63383f5..db069f85 100644 --- a/docs/metadata/builders/tmdb.md +++ b/docs/metadata/builders/tmdb.md @@ -23,7 +23,7 @@ You can find items using the features of [TheMovieDb.org](https://www.themoviedb | Attribute | Description | Works with Movies | Works with Shows | Works with Playlists and Custom Sort | |:----------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------|:-----------------:|:----------------:|:------------------------------------:| | [`tmdb_collection_details`](#tmdb-collection) | Finds every item in the TMDb collection and updates the collection with the summary, poster, and background from the TMDb collection | ✅ | ❌ | ❌ | -| [`tmdb_list_details`](#tmdb-list) | Finds every item in the TMDb List and updates the collection with the description of the TMDb list | ✅ | ✅ | ❌ | +| [`tmdb_list_details`](#tmdb-list) | Finds every item in the TMDb List and updates the collection with the description and poster of the TMDb list | ✅ | ✅ | ❌ | | [`tmdb_actor_details`](#tmdb-actor) | Finds every item in the TMDb Person's Actor Credits with the biography and profile from the TMDb person | ✅ | ✅ | ❌ | | [`tmdb_crew_details`](#tmdb-crew) | Finds every item in the TMDb Person's Crew Credits with the biography and profile from the TMDb person | ✅ | ✅ | ❌ | | [`tmdb_director_details`](#tmdb-director) | Finds every item in the TMDb Person's Actor Credits with the biography and profile from the TMDb person | ✅ | ✅ | ❌ | @@ -116,7 +116,7 @@ collections: sync_mode: sync ``` -* You can update the collection details with the TMDb list's description by using `tmdb_list_details`. +* You can update the collection details with the TMDb list's description and poster by using `tmdb_list_details`. * You can specify multiple lists in `tmdb_list_details` but it will only use the first one to update the collection details. ```yaml diff --git a/docs/metadata/builders/tvdb.md b/docs/metadata/builders/tvdb.md index 829a9dd9..bb93463a 100644 --- a/docs/metadata/builders/tvdb.md +++ b/docs/metadata/builders/tvdb.md @@ -4,14 +4,14 @@ You can find items using the features of [TheTVDb.com](https://www.thetvdb.com/) No configuration is required for these builders. -| Attribute | Description | Works with Movies | Works with Shows | Works with Playlists and Custom Sort | -|:------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------:|:----------------:|:------------------------------------:| -| [`tvdb_list`](#tvdb-list) | Finds every item in a [TVDb List](https://www.thetvdb.com/lists) or [TVDb Userlist](https://www.thetvdb.com/lists/custom) | ✅ | ✅ | ✅ | -| [`tvdb_list_details`](#tvdb-list) | Finds every item in a [TVDb List](https://www.thetvdb.com/lists) or [TVDb Userlist](https://www.thetvdb.com/lists/custom) and updates the collection summary with the TVDb list description | ✅ | ✅ | ✅ | -| [`tvdb_show`](#tvdb-show) | Finds the series specified | ❌ | ✅ | ❌ | -| [`tvdb_show_details`](#tvdb-show) | Finds the series specified and updates the collection with the summary, poster, and background from the TVDb series | ❌ | ✅ | ❌ | -| [`tvdb_movie`](#tvdb-movie) | Finds the movie specified | ✅ | ❌ | ❌ | -| [`tvdb_movie_details`](#tvdb-movie) | Finds the movie specified and updates the collection with the summary, poster, and background from the TVDb movie | ✅ | ❌ | ❌ | +| Attribute | Description | Works with Movies | Works with Shows | Works with Playlists and Custom Sort | +|:------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------:|:----------------:|:------------------------------------:| +| [`tvdb_list`](#tvdb-list) | Finds every item in a [TVDb List](https://www.thetvdb.com/lists) or [TVDb Userlist](https://www.thetvdb.com/lists/custom) | ✅ | ✅ | ✅ | +| [`tvdb_list_details`](#tvdb-list) | Finds every item in a [TVDb List](https://www.thetvdb.com/lists) or [TVDb Userlist](https://www.thetvdb.com/lists/custom) and updates the collection summary and poster with the TVDb list metadata | ✅ | ✅ | ✅ | +| [`tvdb_show`](#tvdb-show) | Finds the series specified | ❌ | ✅ | ❌ | +| [`tvdb_show_details`](#tvdb-show) | Finds the series specified and updates the collection with the summary, poster, and background from the TVDb series | ❌ | ✅ | ❌ | +| [`tvdb_movie`](#tvdb-movie) | Finds the movie specified | ✅ | ❌ | ❌ | +| [`tvdb_movie_details`](#tvdb-movie) | Finds the movie specified and updates the collection with the summary, poster, and background from the TVDb movie | ✅ | ❌ | ❌ | ## TVDb List @@ -36,7 +36,7 @@ collections: sync_mode: sync ``` -* You can update the collection details with the TVDb list's description by using `tvdb_list_details`. +* You can update the collection details with the TVDb list's description and poster by using `tvdb_list_details`. * You can specify multiple lists in `tvdb_list_details` but it will only use the first one to update the collection details. ```yaml diff --git a/docs/metadata/details/metadata.md b/docs/metadata/details/metadata.md index 7dbc3b04..510c83fc 100644 --- a/docs/metadata/details/metadata.md +++ b/docs/metadata/details/metadata.md @@ -56,6 +56,7 @@ If no poster is specified the script will look in the library's [Image Asset Dir | `tmdb_list_poster` | **Description:** Changes poster to the TMDb List poster
**Values:** TMDb List ID | | `tmdb_profile` | **Description:** Changes poster to the TMDb Person's profile
**Values:** TMDb Person ID | | `tvdb_poster` | **Description:** Changes poster to the TVDb Movie poster for a movie library or the TVDb Show poster for a show library
**Values:** TVDb Movie/Show ID or URL | +| `tvdb_list_poster` | **Description:** Changes poster to the TVDb List poster
**Values:** TVDb List URL | | `file_poster` | **Description:** Changes poster to the image in the file system
**Values:** Path to image in the file system | ## Background Collection/Playlist Metadata Updates diff --git a/modules/builder.py b/modules/builder.py index 5c363682..f39e1841 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -857,7 +857,9 @@ class CollectionBuilder: elif method_name == "tvdb_summary": self.summaries[method_name] = self.config.TVDb.get_tvdb_obj(method_data, is_movie=self.library.is_movie).summary elif method_name == "tvdb_description": - self.summaries[method_name] = self.config.TVDb.get_list_description(method_data) + summary, _ = self.config.TVDb.get_list_description(method_data) + if summary: + self.summaries[method_name] = summary elif method_name == "trakt_description": self.summaries[method_name] = self.config.Trakt.list_description(self.config.Trakt.validate_list(method_data)[0]) elif method_name == "letterboxd_description": @@ -874,6 +876,12 @@ class CollectionBuilder: self.posters[method_name] = method_data except ConnectionError: logger.warning(f"{self.Type} Warning: No Poster Found at {method_data}") + elif method_name == "tmdb_list_poster": + self.posters[method_name] = self.config.TMDb.get_list(util.regex_first_int(method_data, "TMDb List ID")).poster_url + elif method_name == "tvdb_list_poster": + _, poster = self.config.TVDb.get_list_description(method_data) + if poster: + self.posters[method_name] = poster elif method_name == "tmdb_poster": self.posters[method_name] = self.config.TMDb.get_movie_show_or_collection(util.regex_first_int(method_data, 'TMDb ID'), self.library.is_movie).poster_url elif method_name == "tmdb_profile": @@ -1457,6 +1465,8 @@ class CollectionBuilder: item = self.config.TMDb.get_list(values[0]) if item.description: self.summaries[method_name] = item.description + if item.poster_url: + self.posters[method_name] = item.poster_url for value in values: self.builders.append((method_name[:-8] if method_name in tmdb.details_builders else method_name, value)) @@ -1512,7 +1522,11 @@ class CollectionBuilder: if item.poster_url: self.posters[method_name] = item.poster_url elif method_name.startswith("tvdb_list"): - self.summaries[method_name] = self.config.TVDb.get_list_description(values[0]) + description, poster = self.config.TVDb.get_list_description(values[0]) + if description: + self.summaries[method_name] = description + if poster: + self.posters[method_name] = poster for value in values: self.builders.append((method_name[:-8] if method_name.endswith("_details") else method_name, value)) @@ -2566,6 +2580,7 @@ class CollectionBuilder: logger.info("") if "summary" in self.summaries: summary = ("summary", self.summaries["summary"]) elif "tmdb_description" in self.summaries: summary = ("tmdb_description", self.summaries["tmdb_description"]) + elif "tvdb_description" in self.summaries: summary = ("tvdb_description", self.summaries["tvdb_description"]) elif "letterboxd_description" in self.summaries: summary = ("letterboxd_description", self.summaries["letterboxd_description"]) elif "tmdb_summary" in self.summaries: summary = ("tmdb_summary", self.summaries["tmdb_summary"]) elif "tvdb_summary" in self.summaries: summary = ("tvdb_summary", self.summaries["tvdb_summary"]) @@ -2574,6 +2589,7 @@ class CollectionBuilder: elif "tmdb_collection_details" in self.summaries: summary = ("tmdb_collection_details", self.summaries["tmdb_collection_details"]) elif "trakt_list_details" in self.summaries: summary = ("trakt_list_details", self.summaries["trakt_list_details"]) elif "tmdb_list_details" in self.summaries: summary = ("tmdb_list_details", self.summaries["tmdb_list_details"]) + elif "tvdb_list_details" in self.summaries: summary = ("tvdb_list_details", self.summaries["tvdb_list_details"]) elif "letterboxd_list_details" in self.summaries: summary = ("letterboxd_list_details", self.summaries["letterboxd_list_details"]) elif "icheckmovies_list_details" in self.summaries: summary = ("icheckmovies_list_details", self.summaries["icheckmovies_list_details"]) elif "tmdb_actor_details" in self.summaries: summary = ("tmdb_actor_details", self.summaries["tmdb_actor_details"]) diff --git a/modules/config.py b/modules/config.py index ea4721bd..9202ebf5 100644 --- a/modules/config.py +++ b/modules/config.py @@ -767,6 +767,7 @@ class ConfigFile: if lib and "template_variables" in lib and lib["template_variables"] and isinstance(lib["template_variables"], dict): lib_vars = lib["template_variables"] + params["metadata_path"] = [] try: if lib and "metadata_path" in lib: if not lib["metadata_path"]: @@ -777,8 +778,6 @@ class ConfigFile: params["metadata_path"] = files elif os.path.exists(os.path.join(default_dir, f"{library_name}.yml")): params["metadata_path"] = [("File", os.path.join(default_dir, f"{library_name}.yml"), lib_vars, None)] - else: - params["metadata_path"] = [] except Failed as e: logger.error(e) params["default_dir"] = default_dir diff --git a/modules/tvdb.py b/modules/tvdb.py index 99a42c28..5d6e4683 100644 --- a/modules/tvdb.py +++ b/modules/tvdb.py @@ -79,8 +79,8 @@ class TVDbObj: if not self.title: raise Failed(f"TVDb Error: Name not found from TVDb ID: {self.tvdb_id}") - self.poster_url = parse_page("(//h2[@class='mt-4' and text()='Posters']/following::div/a/@href)[1]") - self.background_url = parse_page("(//h2[@class='mt-4' and text()='Backgrounds']/following::div/a/@href)[1]") + self.poster_url = parse_page("//div[@id='artwork-posters']/div/div/a/@href") + self.background_url = parse_page("//div[@id='artwork-backgrounds']/div/div/a/@href") if is_movie: released = parse_page("//strong[text()='Released']/parent::li/span/text()[normalize-space()]") else: @@ -106,10 +106,6 @@ class TVDb: tvdb_id, _, _ = self.get_id_from_url(tvdb_url, is_movie=is_movie) return TVDbObj(self, tvdb_id, is_movie=is_movie) - def get_list_description(self, tvdb_url): - response = self.config.get_html(tvdb_url, headers=util.header(self.language)) - description = response.xpath("//div[@class='block']/div[not(@style='display:none')]/p/text()") - return description[0] if len(description) > 0 and len(description[0]) > 0 else "" @retry(stop_max_attempt_number=6, wait_fixed=10000, retry_on_exception=util.retry_if_not_failed) def get_request(self, tvdb_url): @@ -171,6 +167,14 @@ class TVDb: err_text = f"ID at the URL {tvdb_url}" raise Failed(f"TVDb Error: Could not find a TVDb {media_type} {err_text}") + def get_list_description(self, tvdb_url): + response = self.config.get_html(tvdb_url, headers=util.header(self.language)) + description = response.xpath("//div[@class='block']/div[not(@style='display:none')]/p/text()") + description = description[0] if len(description) > 0 and len(description[0]) > 0 else None + poster = response.xpath("//div[@id='artwork']/div/div/a/@href") + poster = poster[0] if len(poster) > 0 and len(poster[0]) > 0 else None + return description, poster + def _ids_from_url(self, tvdb_url): ids = [] tvdb_url = tvdb_url.strip() @@ -178,7 +182,7 @@ class TVDb: if tvdb_url.startswith((urls["list"], urls["alt_list"])): try: response = self.config.get_html(tvdb_url, headers=util.header(self.language)) - items = response.xpath("//div[@class='row']/div/div[@class='row']/div/h3/a") + items = response.xpath("//div[@id='general']//div/div/h3/a") for item in items: title = item.xpath("text()")[0] item_url = item.xpath("@href")[0] diff --git a/modules/util.py b/modules/util.py index c15187b8..18674465 100644 --- a/modules/util.py +++ b/modules/util.py @@ -199,6 +199,10 @@ def pick_image(title, images, prioritize_assets, download_url_assets, item_dir, final_attr = f"tmdb_{image_type}" elif "tmdb_profile" in images: final_attr = "tmdb_profile" + elif "tmdb_list_poster" in images: + final_attr = "tmdb_list_poster" + elif "tvdb_list_poster" in images: + final_attr = "tvdb_list_poster" elif f"tvdb_{image_type}" in images: final_attr = f"tvdb_{image_type}" elif "asset_directory" in images: @@ -219,6 +223,10 @@ def pick_image(title, images, prioritize_assets, download_url_assets, item_dir, final_attr = "tmdb_writer_details" elif "tmdb_movie_details" in images: final_attr = "tmdb_movie_details" + elif "tmdb_list_details" in images: + final_attr = "tmdb_list_details" + elif "tvdb_list_details" in images: + final_attr = "tvdb_list_details" elif "tvdb_movie_details" in images: final_attr = "tvdb_movie_details" elif "tvdb_show_details" in images: