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: