mirror of
https://github.com/meisnate12/Plex-Meta-Manager
synced 2024-11-10 06:54:21 +00:00
added tmdb_vote_count filter
This commit is contained in:
parent
a8ce3a0d92
commit
861df0a97e
3 changed files with 71 additions and 38 deletions
|
@ -303,8 +303,8 @@ class CollectionBuilder:
|
||||||
elif method_name in util.dictionary_lists:
|
elif method_name in util.dictionary_lists:
|
||||||
if isinstance(data[m], dict):
|
if isinstance(data[m], dict):
|
||||||
def get_int(parent, method, data_in, default_in, minimum=1, maximum=None):
|
def get_int(parent, method, data_in, default_in, minimum=1, maximum=None):
|
||||||
if method not in data_in: logger.warning(f"Collection Warning: {parent} {method} attribute not found using {default} as default")
|
if method not in data_in: logger.warning(f"Collection Warning: {parent} {method} attribute not found using {default} as default")
|
||||||
elif not data_in[method]: logger.warning(f"Collection Warning: {parent} {method} attribute is blank using {default} as default")
|
elif not data_in[method]: logger.warning(f"Collection Warning: {parent} {method} attribute is blank using {default} as default")
|
||||||
elif isinstance(data_in[method], int) and data_in[method] >= minimum:
|
elif isinstance(data_in[method], int) and data_in[method] >= minimum:
|
||||||
if maximum is None or data_in[method] <= maximum: return data_in[method]
|
if maximum is None or data_in[method] <= maximum: return data_in[method]
|
||||||
else: logger.warning(f"Collection Warning: {parent} {method} attribute {data_in[method]} invalid must an integer <= {maximum} using {default} as default")
|
else: logger.warning(f"Collection Warning: {parent} {method} attribute {data_in[method]} invalid must an integer <= {maximum} using {default} as default")
|
||||||
|
@ -322,19 +322,24 @@ class CollectionBuilder:
|
||||||
elif data[m][f] is None:
|
elif data[m][f] is None:
|
||||||
raise Failed(f"Collection Error: {filter_method} filter is blank")
|
raise Failed(f"Collection Error: {filter_method} filter is blank")
|
||||||
elif filter_method == "year":
|
elif filter_method == "year":
|
||||||
self.filters.append((filter_method, util.get_year_list(data[m][f], f"{filter_method} filter")))
|
filter_data = util.get_year_list(data[m][f], f"{filter_method} filter")
|
||||||
elif filter_method in ["max_age", "duration.gte", "duration.lte"]:
|
elif filter_method in ["max_age", "duration.gte", "duration.lte", "tmdb_vote_count.gte", "tmdb_vote_count.lte"]:
|
||||||
self.filters.append((filter_method, util.check_number(data[m][f], f"{filter_method} filter", minimum=1)))
|
filter_data = util.check_number(data[m][f], f"{filter_method} filter", minimum=1)
|
||||||
elif filter_method in ["year.gte", "year.lte"]:
|
elif filter_method in ["year.gte", "year.lte"]:
|
||||||
self.filters.append((filter_method, util.check_number(data[m][f], f"{filter_method} filter", minimum=1800, maximum=current_year)))
|
filter_data = util.check_number(data[m][f], f"{filter_method} filter", minimum=1800, maximum=current_year)
|
||||||
elif filter_method in ["rating.gte", "rating.lte"]:
|
elif filter_method in ["rating.gte", "rating.lte"]:
|
||||||
self.filters.append((filter_method, util.check_number(data[m][f], f"{filter_method} filter", number_type="float", minimum=0.1, maximum=10)))
|
filter_data = util.check_number(data[m][f], f"{filter_method} filter", number_type="float", minimum=0.1, maximum=10)
|
||||||
elif filter_method in ["originally_available.gte", "originally_available.lte"]:
|
elif filter_method in ["originally_available.gte", "originally_available.lte"]:
|
||||||
self.filters.append((filter_method, util.check_date(data[m][f], f"{filter_method} filter")))
|
filter_data = util.check_date(data[m][f], f"{filter_method} filter")
|
||||||
|
elif filter_method == "original_language":
|
||||||
|
filter_data = util.get_list(data[m][f], lower=True)
|
||||||
|
elif filter_method == "collection":
|
||||||
|
filter_data = data[m][f] if isinstance(data[m][f], list) else [data[m][f]]
|
||||||
elif filter_method in util.all_filters:
|
elif filter_method in util.all_filters:
|
||||||
self.filters.append((filter_method, data[m][f]))
|
filter_data = util.get_list(data[m][f])
|
||||||
else:
|
else:
|
||||||
raise Failed(f"Collection Error: {filter_method} filter not supported")
|
raise Failed(f"Collection Error: {filter_method} filter not supported")
|
||||||
|
self.filters.append((filter_method, filter_data))
|
||||||
elif method_name == "plex_collectionless":
|
elif method_name == "plex_collectionless":
|
||||||
new_dictionary = {}
|
new_dictionary = {}
|
||||||
prefix_list = []
|
prefix_list = []
|
||||||
|
@ -613,28 +618,32 @@ class CollectionBuilder:
|
||||||
|
|
||||||
if len(missing_movies) > 0 or len(missing_shows) > 0:
|
if len(missing_movies) > 0 or len(missing_shows) > 0:
|
||||||
logger.info("")
|
logger.info("")
|
||||||
|
arr_filters = []
|
||||||
|
for filter_method, filter_data in self.filters:
|
||||||
|
if (filter_method.startswith("original_language") and self.library.is_movie) or filter_method.startswith("tmdb_vote_count"):
|
||||||
|
arr_filters.append((filter_method, filter_data))
|
||||||
if len(missing_movies) > 0:
|
if len(missing_movies) > 0:
|
||||||
not_lang = None
|
|
||||||
terms = None
|
|
||||||
for filter_method, filter_data in self.filters:
|
|
||||||
if filter_method.startswith("original_language"):
|
|
||||||
terms = util.get_list(filter_data, lower=True)
|
|
||||||
not_lang = filter_method.endswith(".not")
|
|
||||||
break
|
|
||||||
|
|
||||||
missing_movies_with_names = []
|
missing_movies_with_names = []
|
||||||
for missing_id in missing_movies:
|
for missing_id in missing_movies:
|
||||||
try:
|
try:
|
||||||
movie = self.config.TMDb.get_movie(missing_id)
|
movie = self.config.TMDb.get_movie(missing_id)
|
||||||
title = str(movie.title)
|
|
||||||
if not_lang is None or (not_lang is True and movie.original_language not in terms) or (not_lang is False and movie.original_language in terms):
|
|
||||||
missing_movies_with_names.append((title, missing_id))
|
|
||||||
if self.details["show_missing"] is True:
|
|
||||||
logger.info(f"{collection_name} Collection | ? | {title} (TMDb: {missing_id})")
|
|
||||||
elif self.details["show_filtered"] is True:
|
|
||||||
logger.info(f"{collection_name} Collection | X | {title} (TMDb: {missing_id})")
|
|
||||||
except Failed as e:
|
except Failed as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
continue
|
||||||
|
match = True
|
||||||
|
for filter_method, filter_data in arr_filters:
|
||||||
|
if (filter_method == "original_language" and movie.original_language not in filter_data) \
|
||||||
|
or (filter_method == "original_language.not" and movie.original_language in filter_data) \
|
||||||
|
or (filter_method == "tmdb_vote_count.gte" and movie.vote_count < filter_data) \
|
||||||
|
or (filter_method == "tmdb_vote_count.lte" and movie.vote_count > filter_data):
|
||||||
|
match = False
|
||||||
|
break
|
||||||
|
if match:
|
||||||
|
missing_movies_with_names.append((movie.title, missing_id))
|
||||||
|
if self.details["show_missing"] is True:
|
||||||
|
logger.info(f"{collection_name} Collection | ? | {movie.title} (TMDb: {missing_id})")
|
||||||
|
elif self.details["show_filtered"] is True:
|
||||||
|
logger.info(f"{collection_name} Collection | X | {movie.title} (TMDb: {missing_id})")
|
||||||
logger.info(f"{len(missing_movies_with_names)} Movie{'s' if len(missing_movies_with_names) > 1 else ''} Missing")
|
logger.info(f"{len(missing_movies_with_names)} Movie{'s' if len(missing_movies_with_names) > 1 else ''} Missing")
|
||||||
if self.details["save_missing"] is True:
|
if self.details["save_missing"] is True:
|
||||||
self.library.add_missing(collection_name, missing_movies_with_names, True)
|
self.library.add_missing(collection_name, missing_movies_with_names, True)
|
||||||
|
@ -645,11 +654,23 @@ class CollectionBuilder:
|
||||||
for missing_id in missing_shows:
|
for missing_id in missing_shows:
|
||||||
try:
|
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, tvdb_id=missing_id).title.encode("ascii", "replace").decode())
|
||||||
|
except Failed as e:
|
||||||
|
logger.error(e)
|
||||||
|
continue
|
||||||
|
match = True
|
||||||
|
if arr_filters:
|
||||||
|
show = self.config.TMDb.get_show(self.config.TMDb.convert_tvdb_to_tmdb(missing_id))
|
||||||
|
for filter_method, filter_data in arr_filters:
|
||||||
|
if (filter_method == "tmdb_vote_count.gte" and show.vote_count < filter_data) \
|
||||||
|
or (filter_method == "tmdb_vote_count.lte" and show.vote_count > filter_data):
|
||||||
|
match = False
|
||||||
|
break
|
||||||
|
if match:
|
||||||
missing_shows_with_names.append((title, missing_id))
|
missing_shows_with_names.append((title, missing_id))
|
||||||
if self.details["show_missing"] is True:
|
if self.details["show_missing"] is True:
|
||||||
logger.info(f"{collection_name} Collection | ? | {title} (TVDB: {missing_id})")
|
logger.info(f"{collection_name} Collection | ? | {title} (TVDB: {missing_id})")
|
||||||
except Failed as e:
|
elif self.details["show_filtered"] is True:
|
||||||
logger.error(e)
|
logger.info(f"{collection_name} Collection | X | {title} (TMDb: {missing_id})")
|
||||||
logger.info(f"{len(missing_shows_with_names)} Show{'s' if len(missing_shows_with_names) > 1 else ''} Missing")
|
logger.info(f"{len(missing_shows_with_names)} Show{'s' if len(missing_shows_with_names) > 1 else ''} Missing")
|
||||||
if self.details["save_missing"] is True:
|
if self.details["save_missing"] is True:
|
||||||
self.library.add_missing(collection_name, missing_shows_with_names, False)
|
self.library.add_missing(collection_name, missing_shows_with_names, False)
|
||||||
|
|
|
@ -135,16 +135,15 @@ class PlexAPI:
|
||||||
match = True
|
match = True
|
||||||
if filters:
|
if filters:
|
||||||
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
|
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
|
||||||
for f in filters:
|
for filter_method, filter_data in filters:
|
||||||
modifier = f[0][-4:]
|
modifier = filter_method[-4:]
|
||||||
method = util.filter_alias[f[0][:-4]] if modifier in [".not", ".lte", ".gte"] else util.filter_alias[f[0]]
|
method = util.filter_alias[filter_method[:-4]] if modifier in [".not", ".lte", ".gte"] else util.filter_alias[filter_method]
|
||||||
if method == "max_age":
|
if method == "max_age":
|
||||||
threshold_date = datetime.now() - timedelta(days=f[1])
|
threshold_date = datetime.now() - timedelta(days=filter_data)
|
||||||
if current.originallyAvailableAt is None or current.originallyAvailableAt < threshold_date:
|
if current.originallyAvailableAt is None or current.originallyAvailableAt < threshold_date:
|
||||||
match = False
|
match = False
|
||||||
break
|
break
|
||||||
elif method == "original_language":
|
elif method == "original_language":
|
||||||
terms = util.get_list(f[1], lower=True)
|
|
||||||
movie = None
|
movie = None
|
||||||
for key, value in movie_map.items():
|
for key, value in movie_map.items():
|
||||||
if current.ratingKey == value:
|
if current.ratingKey == value:
|
||||||
|
@ -156,18 +155,29 @@ class PlexAPI:
|
||||||
if movie is None:
|
if movie is None:
|
||||||
logger.warning(f"Filter Error: No TMDb ID found for {current.title}")
|
logger.warning(f"Filter Error: No TMDb ID found for {current.title}")
|
||||||
continue
|
continue
|
||||||
if (modifier == ".not" and movie.original_language in terms) or (modifier != ".not" and movie.original_language not in terms):
|
if (modifier == ".not" and movie.original_language in filter_data) or (modifier != ".not" and movie.original_language not in filter_data):
|
||||||
match = False
|
match = False
|
||||||
break
|
break
|
||||||
elif modifier in [".gte", ".lte"]:
|
elif modifier in [".gte", ".lte"]:
|
||||||
attr = getattr(current, method)
|
if method == "vote_count":
|
||||||
if method == "duration":
|
tmdb_item = None
|
||||||
attr = attr / 60000
|
for key, value in movie_map.items():
|
||||||
if (modifier == ".lte" and attr > f[1]) or (modifier == ".gte" and attr < f[1]):
|
if current.ratingKey == value:
|
||||||
|
try:
|
||||||
|
tmdb_item = self.TMDb.get_movie(key) if self.is_movie else self.TMDb.get_show(key)
|
||||||
|
break
|
||||||
|
except Failed:
|
||||||
|
pass
|
||||||
|
if tmdb_item is None:
|
||||||
|
logger.warning(f"Filter Error: No TMDb ID found for {current.title}")
|
||||||
|
continue
|
||||||
|
attr = tmdb_item.vote_count
|
||||||
|
else:
|
||||||
|
attr = getattr(current, method) / 60000 if method == "duration" else getattr(current, method)
|
||||||
|
if (modifier == ".lte" and attr > filter_data) or (modifier == ".gte" and attr < filter_data):
|
||||||
match = False
|
match = False
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
terms = util.get_list(f[1])
|
|
||||||
attrs = []
|
attrs = []
|
||||||
if method in ["video_resolution", "audio_language", "subtitle_language"]:
|
if method in ["video_resolution", "audio_language", "subtitle_language"]:
|
||||||
for media in current.media:
|
for media in current.media:
|
||||||
|
@ -178,7 +188,7 @@ class PlexAPI:
|
||||||
elif method in ["contentRating", "studio", "year", "rating", "originallyAvailableAt"]: attrs = [str(getattr(current, method))]
|
elif method in ["contentRating", "studio", "year", "rating", "originallyAvailableAt"]: attrs = [str(getattr(current, method))]
|
||||||
elif method in ["actors", "countries", "directors", "genres", "writers", "collections"]: attrs = [getattr(x, "tag") for x in getattr(current, method)]
|
elif method in ["actors", "countries", "directors", "genres", "writers", "collections"]: attrs = [getattr(x, "tag") for x in getattr(current, method)]
|
||||||
|
|
||||||
if (not list(set(terms) & set(attrs)) and modifier != ".not") or (list(set(terms) & set(attrs)) and modifier == ".not"):
|
if (not list(set(filter_data) & set(attrs)) and modifier != ".not") or (list(set(filter_data) & set(attrs)) and modifier == ".not"):
|
||||||
match = False
|
match = False
|
||||||
break
|
break
|
||||||
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
|
length = util.print_return(length, f"Filtering {(' ' * (max_length - len(str(i)))) + str(i)}/{total} {current.title}")
|
||||||
|
|
|
@ -48,6 +48,7 @@ filter_alias = {
|
||||||
"rating": "rating",
|
"rating": "rating",
|
||||||
"studio": "studio",
|
"studio": "studio",
|
||||||
"subtitle_language": "subtitle_language",
|
"subtitle_language": "subtitle_language",
|
||||||
|
"tmdb_vote_count": "vote_count",
|
||||||
"writer": "writers",
|
"writer": "writers",
|
||||||
"video_resolution": "video_resolution",
|
"video_resolution": "video_resolution",
|
||||||
"year": "year"
|
"year": "year"
|
||||||
|
@ -390,6 +391,7 @@ all_filters = [
|
||||||
"genre", "genre.not",
|
"genre", "genre.not",
|
||||||
"max_age",
|
"max_age",
|
||||||
"originally_available.gte", "originally_available.lte",
|
"originally_available.gte", "originally_available.lte",
|
||||||
|
"tmdb_vote_count.gte", "tmdb_vote_count.lte",
|
||||||
"duration.gte", "duration.lte",
|
"duration.gte", "duration.lte",
|
||||||
"original_language", "original_language.not",
|
"original_language", "original_language.not",
|
||||||
"rating.gte", "rating.lte",
|
"rating.gte", "rating.lte",
|
||||||
|
|
Loading…
Reference in a new issue