mirror of
https://github.com/meisnate12/Plex-Meta-Manager
synced 2024-11-22 04:23:08 +00:00
added more collection details
This commit is contained in:
parent
5156d92b7c
commit
17be256282
6 changed files with 47 additions and 40 deletions
|
@ -5,7 +5,9 @@ The original concept for Plex Meta Manager is [Plex Auto Collections](https://gi
|
|||
|
||||
The script can update many metadata fields for movies, shows, collections, seasons, and episodes and can act as a backup if your plex DB goes down. It can even update metadata the plex UI can't like Season Names. If the time is put into the metadata configuration file you can have a way to recreate your library and all its metadata changes with the click of a button.
|
||||
|
||||
The script is designed to work with most Metadata agents including the new Plex Movie Agent, [Hama Anime Agent](https://github.com/ZeroQI/Hama.bundle), and [MyAnimeList Anime Agent](https://github.com/Fribb/MyAnimeList.bundle).
|
||||
The script is designed to work with most Metadata agents including the new Plex Movie Agent, New Plex TV Agent, [Hama Anime Agent](https://github.com/ZeroQI/Hama.bundle), and [MyAnimeList Anime Agent](https://github.com/Fribb/MyAnimeList.bundle).
|
||||
|
||||
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate?business=JTK3CVKF3ZHP2&item_name=Plex+Meta+Manager¤cy_code=USD)
|
||||
|
||||
## Getting Started
|
||||
|
||||
|
@ -20,4 +22,3 @@ The script is designed to work with most Metadata agents including the new Plex
|
|||
* To see user submitted Metadata configuration files and you could even add your own go to the [Plex Meta Manager Configs](https://github.com/meisnate12/Plex-Meta-Manager-Configs)
|
||||
* Pull Request are welcome but please submit them to the develop branch
|
||||
* If you wish to contribute to the Wiki please fork and send a pull request on the [Plex Meta Manager Wiki Repository](https://github.com/meisnate12/Plex-Meta-Manager-Wiki)
|
||||
* [Buy Me a Pizza](https://www.buymeacoffee.com/meisnate12)
|
||||
|
|
|
@ -240,6 +240,12 @@ class CollectionBuilder:
|
|||
self.summaries[method_name] = config.TMDb.get_list(util.regex_first_int(data[m], "TMDb List ID")).description
|
||||
elif method_name == "tmdb_biography":
|
||||
self.summaries[method_name] = config.TMDb.get_person(util.regex_first_int(data[m], "TMDb Person ID")).biography
|
||||
elif method_name == "tvdb_summary":
|
||||
self.summaries[method_name] = config.TVDb.get_movie_or_show(data[m], self.library.Plex.language, self.library.is_movie).summary
|
||||
elif method_name == "tvdb_description":
|
||||
self.summaries[method_name] = config.TVDb.get_list_description(data[m], self.library.Plex.language)
|
||||
elif method_name == "trakt_description":
|
||||
self.summaries[method_name] = config.Trakt.standard_list(config.Trakt.validate_trakt_list(util.get_list(data[m]))[0]).description
|
||||
elif method_name == "collection_mode":
|
||||
if data[m] in ["default", "hide", "hide_items", "show_items", "hideItems", "showItems"]:
|
||||
if data[m] == "hide_items": self.details[method_name] = "hideItems"
|
||||
|
@ -258,6 +264,8 @@ class CollectionBuilder:
|
|||
self.posters[method_name] = f"{config.TMDb.image_url}{config.TMDb.get_movie_show_or_collection(util.regex_first_int(data[m], 'TMDb ID'), self.library.is_movie).poster_path}"
|
||||
elif method_name == "tmdb_profile":
|
||||
self.posters[method_name] = f"{config.TMDb.image_url}{config.TMDb.get_person(util.regex_first_int(data[m], 'TMDb Person ID')).profile_path}"
|
||||
elif method_name == "tvdb_poster":
|
||||
self.posters[method_name] = f"{config.TVDb.get_movie_or_series(data[m], self.library.Plex.language, self.library.is_movie).poster_path}"
|
||||
elif method_name == "file_poster":
|
||||
if os.path.exists(data[m]): self.posters[method_name] = os.path.abspath(data[m])
|
||||
else: raise Failed(f"Collection Error: Poster Path Does Not Exist: {os.path.abspath(data[m])}")
|
||||
|
@ -265,6 +273,8 @@ class CollectionBuilder:
|
|||
self.backgrounds[method_name] = data[m]
|
||||
elif method_name == "tmdb_background":
|
||||
self.backgrounds[method_name] = f"{config.TMDb.image_url}{config.TMDb.get_movie_show_or_collection(util.regex_first_int(data[m], 'TMDb ID'), self.library.is_movie).poster_path}"
|
||||
elif method_name == "tvdb_background":
|
||||
self.posters[method_name] = f"{config.TVDb.get_movie_or_series(data[m], self.library.Plex.language, self.library.is_movie).background_path}"
|
||||
elif method_name == "file_background":
|
||||
if os.path.exists(data[m]): self.backgrounds[method_name] = os.path.abspath(data[m])
|
||||
else: raise Failed(f"Collection Error: Background Path Does Not Exist: {os.path.abspath(data[m])}")
|
||||
|
@ -533,10 +543,7 @@ class CollectionBuilder:
|
|||
values = util.get_list(data[m])
|
||||
if method_name[-8:] == "_details":
|
||||
if method_name == "tvdb_movie_details":
|
||||
try:
|
||||
item = config.TVDb.get_movie(self.library.Plex.language, tvdb_id=int(values[0])).id
|
||||
except ValueError:
|
||||
item = config.TVDb.get_movie(self.library.Plex.language, tvdb_url=values[0]).id
|
||||
item = config.TVDb.get_movie(self.library.Plex.language, values[0])
|
||||
if hasattr(item, "description") and item.description:
|
||||
self.summaries[method_name] = item.description
|
||||
if hasattr(item, "background_path") and item.background_path:
|
||||
|
@ -544,10 +551,7 @@ class CollectionBuilder:
|
|||
if hasattr(item, "poster_path") and item.poster_path:
|
||||
self.posters[method_name] = f"{config.TMDb.image_url}{item.poster_path}"
|
||||
elif method_name == "tvdb_show_details":
|
||||
try:
|
||||
item = config.TVDb.get_series(self.library.Plex.language, tvdb_id=int(values[0])).id
|
||||
except ValueError:
|
||||
item = config.TVDb.get_series(self.library.Plex.language, tvdb_url=values[0]).id
|
||||
item = config.TVDb.get_series(self.library.Plex.language, values[0])
|
||||
if hasattr(item, "description") and item.description:
|
||||
self.summaries[method_name] = item.description
|
||||
if hasattr(item, "background_path") and item.background_path:
|
||||
|
@ -555,9 +559,7 @@ class CollectionBuilder:
|
|||
if hasattr(item, "poster_path") and item.poster_path:
|
||||
self.posters[method_name] = f"{config.TMDb.image_url}{item.poster_path}"
|
||||
elif method_name == "tvdb_list_details":
|
||||
description = config.TVDb.get_list_description(self.library.Plex.language, values[0])
|
||||
if description and len(description) > 0:
|
||||
self.summaries[method_name] = description
|
||||
self.summaries[method_name] = config.TVDb.get_list_description(values[0], self.library.Plex.language)
|
||||
self.methods.append((method_name[:-8], values))
|
||||
else:
|
||||
self.methods.append((method_name, values))
|
||||
|
@ -737,7 +739,7 @@ class CollectionBuilder:
|
|||
missing_shows_with_names = []
|
||||
for missing_id in missing_shows:
|
||||
try:
|
||||
title = str(self.config.TVDb.get_series(self.library.Plex.language, tvdb_id=missing_id).title.encode("ascii", "replace").decode())
|
||||
title = str(self.config.TVDb.get_series(self.library.Plex.language, missing_id).title.encode("ascii", "replace").decode())
|
||||
except Failed as e:
|
||||
logger.error(e)
|
||||
continue
|
||||
|
@ -782,6 +784,7 @@ class CollectionBuilder:
|
|||
if "summary" in self.summaries: summary = get_summary("summary", self.summaries)
|
||||
elif "tmdb_description" in self.summaries: summary = get_summary("tmdb_description", self.summaries)
|
||||
elif "tmdb_summary" in self.summaries: summary = get_summary("tmdb_summary", self.summaries)
|
||||
elif "tvdb_summary" in self.summaries: summary = get_summary("tvdb_summary", self.summaries)
|
||||
elif "tmdb_biography" in self.summaries: summary = get_summary("tmdb_biography", self.summaries)
|
||||
elif "tmdb_person" in self.summaries: summary = get_summary("tmdb_person", self.summaries)
|
||||
elif "tmdb_collection_details" in self.summaries: summary = get_summary("tmdb_collection_details", self.summaries)
|
||||
|
@ -893,6 +896,7 @@ class CollectionBuilder:
|
|||
elif "file_poster" in self.posters: set_image("file_poster", self.posters)
|
||||
elif "tmdb_poster" in self.posters: set_image("tmdb_poster", self.posters)
|
||||
elif "tmdb_profile" in self.posters: set_image("tmdb_profile", self.posters)
|
||||
elif "tvdb_poster" in self.posters: set_image("tvdb_poster", self.posters)
|
||||
elif "asset_directory" in self.posters: set_image("asset_directory", self.posters)
|
||||
elif "tmdb_person" in self.posters: set_image("tmdb_person", self.posters)
|
||||
elif "tmdb_collection_details" in self.posters: set_image("tmdb_collection_details", self.posters)
|
||||
|
@ -915,8 +919,9 @@ class CollectionBuilder:
|
|||
logger.info(f"Method: {b} Background: {self.backgrounds[b]}")
|
||||
|
||||
if "url_background" in self.backgrounds: set_image("url_background", self.backgrounds, is_background=True)
|
||||
elif "file_background" in self.backgrounds: set_image("file_poster", self.backgrounds, is_background=True)
|
||||
elif "tmdb_background" in self.backgrounds: set_image("tmdb_poster", self.backgrounds, is_background=True)
|
||||
elif "file_background" in self.backgrounds: set_image("file_background", self.backgrounds, is_background=True)
|
||||
elif "tmdb_background" in self.backgrounds: set_image("tmdb_background", self.backgrounds, is_background=True)
|
||||
elif "tvdb_background" in self.backgrounds: set_image("tvdb_background", self.backgrounds, is_background=True)
|
||||
elif "asset_directory" in self.backgrounds: set_image("asset_directory", self.backgrounds, is_background=True)
|
||||
elif "tmdb_collection_details" in self.backgrounds: set_image("tmdb_collection_details", self.backgrounds, is_background=True)
|
||||
elif "tmdb_movie_details" in self.backgrounds: set_image("tmdb_movie_details", self.backgrounds, is_background=True)
|
||||
|
@ -965,7 +970,7 @@ class CollectionBuilder:
|
|||
for missing_id in self.missing_shows:
|
||||
if missing_id not in show_map:
|
||||
try:
|
||||
title = str(self.config.TVDb.get_series(self.library.Plex.language, tvdb_id=missing_id).title.encode("ascii", "replace").decode())
|
||||
title = str(self.config.TVDb.get_series(self.library.Plex.language, missing_id).title.encode("ascii", "replace").decode())
|
||||
except Failed as e:
|
||||
logger.error(e)
|
||||
continue
|
||||
|
|
|
@ -572,7 +572,7 @@ class Config:
|
|||
if tmdb_id and not from_cache: self.TMDb.get_movie(tmdb_id)
|
||||
except Failed: tmdb_id = None
|
||||
try:
|
||||
if tvdb_id and not from_cache: self.TVDb.get_series(language, tvdb_id=tvdb_id)
|
||||
if tvdb_id and not from_cache: self.TVDb.get_series(language, tvdb_id)
|
||||
except Failed: tvdb_id = None
|
||||
if not tmdb_id and not tvdb_id: raise Failed(f"IMDb Error: No TMDb ID or TVDb ID found for IMDb: {imdb_id}")
|
||||
if self.Cache:
|
||||
|
|
|
@ -57,7 +57,7 @@ class SonarrAPI:
|
|||
tag_nums.append(tag_cache[label])
|
||||
for tvdb_id in tvdb_ids:
|
||||
try:
|
||||
show = self.tvdb.get_series(self.language, tvdb_id=tvdb_id)
|
||||
show = self.tvdb.get_series(self.language, tvdb_id)
|
||||
except Failed as e:
|
||||
logger.error(e)
|
||||
continue
|
||||
|
|
|
@ -40,7 +40,7 @@ class TVDbObj:
|
|||
self.background_path = results[0] if len(results) > 0 and len(results[0]) > 0 else None
|
||||
|
||||
results = response.xpath("//div[@class='block']/div[not(@style='display:none')]/p/text()")
|
||||
self.description = results[0] if len(results) > 0 and len(results[0]) > 0 else None
|
||||
self.summary = results[0] if len(results) > 0 and len(results[0]) > 0 else None
|
||||
|
||||
tmdb_id = None
|
||||
if is_movie:
|
||||
|
@ -73,21 +73,24 @@ class TVDbAPI:
|
|||
self.series_id_url = f"{self.site_url}/dereferrer/series/"
|
||||
self.movie_id_url = f"{self.site_url}/dereferrer/movie/"
|
||||
|
||||
def get_series(self, language, tvdb_url=None, tvdb_id=None):
|
||||
if not tvdb_url and not tvdb_id:
|
||||
raise Failed("TVDB Error: get_series requires either tvdb_url or tvdb_id")
|
||||
elif not tvdb_url and tvdb_id:
|
||||
tvdb_url = f"{self.series_id_url}{tvdb_id}"
|
||||
def get_movie_or_series(self, language, tvdb_url, is_movie):
|
||||
return self.get_movie(language, tvdb_url) if is_movie else self.get_series(language, tvdb_url)
|
||||
|
||||
def get_series(self, language, tvdb_url):
|
||||
try:
|
||||
tvdb_url = f"{self.series_id_url}{int(tvdb_url)}"
|
||||
except ValueError:
|
||||
pass
|
||||
return TVDbObj(tvdb_url, language, False, self)
|
||||
|
||||
def get_movie(self, language, tvdb_url=None, tvdb_id=None):
|
||||
if not tvdb_url and not tvdb_id:
|
||||
raise Failed("TVDB Error: get_movie requires either tvdb_url or tvdb_id")
|
||||
elif not tvdb_url and tvdb_id:
|
||||
tvdb_url = f"{self.movie_id_url}{tvdb_id}"
|
||||
def get_movie(self, language, tvdb_url):
|
||||
try:
|
||||
tvdb_url = f"{self.movie_id_url}{int(tvdb_url)}"
|
||||
except ValueError:
|
||||
pass
|
||||
return TVDbObj(tvdb_url, language, True, self)
|
||||
|
||||
def get_list_description(self, language, tvdb_url):
|
||||
def get_list_description(self, tvdb_url, language):
|
||||
description = self.send_request(tvdb_url, language).xpath("//div[@class='block']/div[not(@style='display:none')]/p/text()")
|
||||
return description[0] if len(description) > 0 and len(description[0]) > 0 else ""
|
||||
|
||||
|
@ -102,11 +105,11 @@ class TVDbAPI:
|
|||
title = item.xpath(".//div[@class='col-xs-12 col-sm-9 mt-2']//a/text()")[0]
|
||||
item_url = item.xpath(".//div[@class='col-xs-12 col-sm-9 mt-2']//a/@href")[0]
|
||||
if item_url.startswith("/series/"):
|
||||
try: show_ids.append(self.get_series(language, tvdb_url=f"{self.site_url}{item_url}").id)
|
||||
try: show_ids.append(self.get_series(language, f"{self.site_url}{item_url}").id)
|
||||
except Failed as e: logger.error(f"{e} for series {title}")
|
||||
elif item_url.startswith("/movies/"):
|
||||
try:
|
||||
tmdb_id = self.get_movie(language, tvdb_url=f"{self.site_url}{item_url}").tmdb_id
|
||||
tmdb_id = self.get_movie(language, f"{self.site_url}{item_url}").tmdb_id
|
||||
if tmdb_id: movie_ids.append(tmdb_id)
|
||||
else: raise Failed(f"TVDb Error: TMDb ID not found from TVDb URL: {tvdb_url}")
|
||||
except Failed as e:
|
||||
|
@ -133,11 +136,9 @@ class TVDbAPI:
|
|||
if status_message:
|
||||
logger.info(f"Processing {pretty}: {data}")
|
||||
if method == "tvdb_show":
|
||||
try: show_ids.append(self.get_series(language, tvdb_id=int(data)).id)
|
||||
except ValueError: show_ids.append(self.get_series(language, tvdb_url=data).id)
|
||||
show_ids.append(self.get_series(language, data).id)
|
||||
elif method == "tvdb_movie":
|
||||
try: movie_ids.append(self.get_movie(language, tvdb_id=int(data)).id)
|
||||
except ValueError: movie_ids.append(self.get_movie(language, tvdb_url=data).id)
|
||||
movie_ids.append(self.get_movie(language, data).id)
|
||||
elif method == "tvdb_list":
|
||||
tmdb_ids, tvdb_ids = self.get_tvdb_ids_from_url(data, language)
|
||||
movie_ids.extend(tmdb_ids)
|
||||
|
|
|
@ -453,10 +453,10 @@ boolean_details = [
|
|||
]
|
||||
all_details = [
|
||||
"sort_title", "content_rating",
|
||||
"summary", "tmdb_summary", "tmdb_description", "tmdb_biography",
|
||||
"summary", "tmdb_summary", "tmdb_description", "tmdb_biography", "tvdb_summary", "tvdb_description", "trakt_description",
|
||||
"collection_mode", "collection_order",
|
||||
"url_poster", "tmdb_poster", "tmdb_profile", "file_poster",
|
||||
"url_background", "file_background",
|
||||
"url_poster", "tmdb_poster", "tmdb_profile", "tvdb_poster", "file_poster",
|
||||
"url_background", "tmdb_background", "tvdb_background", "file_background",
|
||||
"name_mapping", "add_to_arr", "arr_tag", "label",
|
||||
"show_filtered", "show_missing", "save_missing"
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue