mirror of
https://github.com/meisnate12/Plex-Meta-Manager
synced 2024-11-22 20:43:07 +00:00
[32] #802 added decade for shows
This commit is contained in:
parent
d44a672d66
commit
4d2bf6b304
3 changed files with 38 additions and 25 deletions
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
1.16.2-develop31
|
1.16.2-develop32
|
||||||
|
|
|
@ -240,7 +240,7 @@ class Library(ABC):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_all(self, collection_level=None):
|
def get_all(self, collection_level=None, load=False):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def add_missing(self, collection, items, is_movie):
|
def add_missing(self, collection, items, is_movie):
|
||||||
|
|
|
@ -23,13 +23,13 @@ auto = {
|
||||||
}
|
}
|
||||||
auto_type_translation = {"content_rating": "contentRating", "subtitle_language": "subtitleLanguage", "audio_language": "audioLanguage"}
|
auto_type_translation = {"content_rating": "contentRating", "subtitle_language": "subtitleLanguage", "audio_language": "audioLanguage"}
|
||||||
default_templates = {
|
default_templates = {
|
||||||
"original_language": {"plex_all": True, "filters": {"original_language": "<<original_language>>"}},
|
"original_language": {"plex_all": True, "filters": {"original_language": "<<value>>"}},
|
||||||
"origin_country": {"plex_all": True, "filters": {"origin_country": "<<origin_country>>"}},
|
"origin_country": {"plex_all": True, "filters": {"origin_country": "<<value>>"}},
|
||||||
"tmdb_collection": {"tmdb_collection_details": "<<tmdb_collection>>", "minimum_items": 2},
|
"tmdb_collection": {"tmdb_collection_details": "<<value>>", "minimum_items": 2},
|
||||||
"trakt_user_lists": {"trakt_list_details": "<<trakt_user_lists>>"},
|
"trakt_user_lists": {"trakt_list_details": "<<value>>"},
|
||||||
"trakt_liked_lists": {"trakt_list_details": "<<trakt_liked_lists>>"},
|
"trakt_liked_lists": {"trakt_list_details": "<<value>>"},
|
||||||
"tmdb_popular_people": {"tmdb_person": f"<<tmdb_popular_people>>", "plex_search": {"all": {"actor": "tmdb"}}},
|
"tmdb_popular_people": {"tmdb_person": f"<<value>>", "plex_search": {"all": {"actor": "tmdb"}}},
|
||||||
"trakt_people_list": {"tmdb_person": f"<<trakt_people_list>>", "plex_search": {"all": {"actor": "tmdb"}}}
|
"trakt_people_list": {"tmdb_person": f"<<value>>", "plex_search": {"all": {"actor": "tmdb"}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_dict(attribute, attr_data, check_list=None):
|
def get_dict(attribute, attr_data, check_list=None):
|
||||||
|
@ -285,7 +285,25 @@ class MetadataFile(DataFile):
|
||||||
all_keys.append(ck)
|
all_keys.append(ck)
|
||||||
if ck not in exclude and cv not in exclude:
|
if ck not in exclude and cv not in exclude:
|
||||||
auto_list[ck] = cv
|
auto_list[ck] = cv
|
||||||
if auto_type in ["genre", "mood", "style", "country", "studio", "network", "year", "decade", "content_rating", "subtitle_language", "audio_language", "resolution"]:
|
if auto_type == "decade" and library.is_show:
|
||||||
|
all_items = library.get_all()
|
||||||
|
if addons:
|
||||||
|
raise Failed(f"Config Error: addons cannot be used with show decades")
|
||||||
|
addons = {}
|
||||||
|
all_keys = []
|
||||||
|
for i, item in enumerate(all_items, 1):
|
||||||
|
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
||||||
|
if item.year:
|
||||||
|
decade = str(int(math.floor(item.year / 10) * 10))
|
||||||
|
if decade not in addons:
|
||||||
|
addons[decade] = []
|
||||||
|
if item.year not in addons[decade]:
|
||||||
|
addons[decade].append(item.year)
|
||||||
|
all_keys.append(item.year)
|
||||||
|
auto_list = {str(k): f"{k}s" for k in addons if str(k) not in exclude and f"{k}s" not in exclude}
|
||||||
|
default_template = {"smart_filter": {"limit": 50, "sort_by": "critic_rating.desc", "any": {"year": f"<<value>>"}}}
|
||||||
|
default_title_format = "Best <<library_type>>s of <<key_name>>"
|
||||||
|
elif auto_type in ["genre", "mood", "style", "country", "studio", "network", "year", "decade", "content_rating", "subtitle_language", "audio_language", "resolution"]:
|
||||||
search_tag = auto_type_translation[auto_type] if auto_type in auto_type_translation else auto_type
|
search_tag = auto_type_translation[auto_type] if auto_type in auto_type_translation else auto_type
|
||||||
if library.is_show and auto_type in ["resolution", "subtitle_language", "audio_language"]:
|
if library.is_show and auto_type in ["resolution", "subtitle_language", "audio_language"]:
|
||||||
tags = library.get_tags(f"episode.{search_tag}")
|
tags = library.get_tags(f"episode.{search_tag}")
|
||||||
|
@ -298,17 +316,16 @@ class MetadataFile(DataFile):
|
||||||
all_keys = [str(i.title) for i in tags]
|
all_keys = [str(i.title) for i in tags]
|
||||||
auto_list = {str(i.title): i.title for i in tags if str(i.title) not in exclude}
|
auto_list = {str(i.title): i.title for i in tags if str(i.title) not in exclude}
|
||||||
if library.is_music:
|
if library.is_music:
|
||||||
default_template = {"smart_filter": {"limit": 50, "sort_by": "plays.desc", "any": {f"artist_{auto_type}": f"<<{auto_type}>>"}}}
|
default_template = {"smart_filter": {"limit": 50, "sort_by": "plays.desc", "any": {f"artist_{auto_type}": f"<<value>>"}}}
|
||||||
default_title_format = "Most Played <<key_name>> <<library_type>>s"
|
default_title_format = "Most Played <<key_name>> <<library_type>>s"
|
||||||
elif auto_type == "resolution":
|
elif auto_type == "resolution":
|
||||||
default_template = {"smart_filter": {"sort_by": "title.asc", "any": {auto_type: f"<<{auto_type}>>"}}}
|
default_template = {"smart_filter": {"sort_by": "title.asc", "any": {auto_type: f"<<value>>"}}}
|
||||||
default_title_format = "<<key_name>> <<library_type>>s"
|
default_title_format = "<<key_name>> <<library_type>>s"
|
||||||
else:
|
else:
|
||||||
default_template = {"smart_filter": {"limit": 50, "sort_by": "critic_rating.desc", "any": {auto_type: f"<<{auto_type}>>"}}}
|
default_template = {"smart_filter": {"limit": 50, "sort_by": "critic_rating.desc", "any": {auto_type: f"<<value>>"}}}
|
||||||
default_title_format = "Best <<library_type>>s of <<key_name>>" if auto_type in ["year", "decade"] else "Top <<key_name>> <<library_type>>s"
|
default_title_format = "Best <<library_type>>s of <<key_name>>" if auto_type in ["year", "decade"] else "Top <<key_name>> <<library_type>>s"
|
||||||
elif auto_type == "tmdb_collection":
|
elif auto_type == "tmdb_collection":
|
||||||
if not all_items:
|
all_items = library.get_all()
|
||||||
all_items = library.get_all()
|
|
||||||
for i, item in enumerate(all_items, 1):
|
for i, item in enumerate(all_items, 1):
|
||||||
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
||||||
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
||||||
|
@ -319,8 +336,7 @@ class MetadataFile(DataFile):
|
||||||
auto_list[str(tmdb_item.collection_id)] = tmdb_item.collection_name
|
auto_list[str(tmdb_item.collection_id)] = tmdb_item.collection_name
|
||||||
logger.exorcise()
|
logger.exorcise()
|
||||||
elif auto_type == "original_language":
|
elif auto_type == "original_language":
|
||||||
if not all_items:
|
all_items = library.get_all()
|
||||||
all_items = library.get_all()
|
|
||||||
for i, item in enumerate(all_items, 1):
|
for i, item in enumerate(all_items, 1):
|
||||||
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
||||||
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
||||||
|
@ -332,8 +348,7 @@ class MetadataFile(DataFile):
|
||||||
logger.exorcise()
|
logger.exorcise()
|
||||||
default_title_format = "<<key_name>> <<library_type>>s"
|
default_title_format = "<<key_name>> <<library_type>>s"
|
||||||
elif auto_type == "origin_country":
|
elif auto_type == "origin_country":
|
||||||
if not all_items:
|
all_items = library.get_all()
|
||||||
all_items = library.get_all()
|
|
||||||
for i, item in enumerate(all_items, 1):
|
for i, item in enumerate(all_items, 1):
|
||||||
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
logger.ghost(f"Processing: {i}/{len(all_items)} {item.title}")
|
||||||
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
tmdb_id, tvdb_id, imdb_id = library.get_ids(item)
|
||||||
|
@ -363,9 +378,7 @@ class MetadataFile(DataFile):
|
||||||
person_limit = util.parse("Config", "limit", dynamic_data, parent=f"{map_name} data", methods=person_methods, datatype="int", default=25, minimum=1) if "limit" in person_methods else None
|
person_limit = util.parse("Config", "limit", dynamic_data, parent=f"{map_name} data", methods=person_methods, datatype="int", default=25, minimum=1) if "limit" in person_methods else None
|
||||||
if not person_minimum and not person_limit:
|
if not person_minimum and not person_limit:
|
||||||
person_minimum = 3
|
person_minimum = 3
|
||||||
if not all_items:
|
for i, item in enumerate(library.get_all(), 1):
|
||||||
all_items = library.get_all()
|
|
||||||
for i, item in enumerate(all_items, 1):
|
|
||||||
try:
|
try:
|
||||||
self.library.reload(item)
|
self.library.reload(item)
|
||||||
for person in getattr(item, f"{auto_type}s")[:person_depth]:
|
for person in getattr(item, f"{auto_type}s")[:person_depth]:
|
||||||
|
@ -388,7 +401,7 @@ class MetadataFile(DataFile):
|
||||||
person_count += 1
|
person_count += 1
|
||||||
except TMDbNotFound:
|
except TMDbNotFound:
|
||||||
logger.error(f"TMDb Error: Actor {role['name']} Not Found")
|
logger.error(f"TMDb Error: Actor {role['name']} Not Found")
|
||||||
default_template = {"tmdb_person": f"<<{auto_type}>>", "plex_search": {"all": {auto_type: "tmdb"}}},
|
default_template = {"tmdb_person": "<<value>>", "plex_search": {"all": {auto_type: "tmdb"}}},
|
||||||
elif auto_type == "trakt_user_lists":
|
elif auto_type == "trakt_user_lists":
|
||||||
dynamic_data = util.parse("Config", "data", dynamic, parent=map_name, methods=methods, datatype="list")
|
dynamic_data = util.parse("Config", "data", dynamic, parent=map_name, methods=methods, datatype="list")
|
||||||
for option in dynamic_data:
|
for option in dynamic_data:
|
||||||
|
@ -470,9 +483,9 @@ class MetadataFile(DataFile):
|
||||||
for suffix in remove_suffix:
|
for suffix in remove_suffix:
|
||||||
if key_name.endswith(suffix):
|
if key_name.endswith(suffix):
|
||||||
key_name = key_name[:-len(suffix)].strip()
|
key_name = key_name[:-len(suffix)].strip()
|
||||||
key_value = [key]
|
key_value = [key] if key in all_keys else []
|
||||||
if key in addons:
|
if key in addons:
|
||||||
key_value.extend([a for a in addons[key] if a in all_keys])
|
key_value.extend([a for a in addons[key] if a in all_keys and a != key])
|
||||||
template_call = {
|
template_call = {
|
||||||
"name": template_name,
|
"name": template_name,
|
||||||
"value": key_value,
|
"value": key_value,
|
||||||
|
|
Loading…
Reference in a new issue