diff --git a/modules/anilist.py b/modules/anilist.py index 5a31cf02..eac01e5a 100644 --- a/modules/anilist.py +++ b/modules/anilist.py @@ -6,19 +6,10 @@ from retrying import retry logger = logging.getLogger("Plex Meta Manager") builders = [ - "anilist_genre", - "anilist_id", - "anilist_popular", - "anilist_relations", - "anilist_season", - "anilist_studio", - "anilist_tag", - "anilist_top_rated" + "anilist_genre", "anilist_id", "anilist_popular", "anilist_relations", + "anilist_season", "anilist_studio", "anilist_tag", "anilist_top_rated" ] -pretty_names = { - "score": "Average Score", - "popular": "Popularity" -} +pretty_names = {"score": "Average Score", "popular": "Popularity"} base_url = "https://graphql.anilist.co" tag_query = "query{MediaTagCollection {name}}" genre_query = "query{GenreCollection}" diff --git a/modules/builder.py b/modules/builder.py index bf85d610..9ec8d495 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -10,7 +10,6 @@ from urllib.parse import quote logger = logging.getLogger("Plex Meta Manager") string_filters = ["title", "episode_title", "studio"] -image_file_details = ["file_poster", "file_background", "asset_directory"] advance_new_agent = ["item_metadata_language", "item_use_original_title"] advance_show = ["item_episode_sorting", "item_keep_episodes", "item_delete_episodes", "item_season_display", "item_episode_sorting"] method_alias = { @@ -58,116 +57,26 @@ filter_translation = { "writer": "writers" } modifier_alias = {".greater": ".gt", ".less": ".lt"} -all_builders = anidb.builders + anilist.builders + icheckmovies.builders + imdb.builders + letterboxd.builders + mal.builders + plex.builders + tautulli.builders + tmdb.builders + trakt.builders + tvdb.builders -dictionary_builders = [ - "filters", - "anidb_tag", - "anilist_genre", - "anilist_season", - "anilist_tag", - "mal_season", - "mal_userlist", - "plex_collectionless", - "plex_search", - "tautulli_popular", - "tautulli_watched", - "tmdb_discover" -] -show_only_builders = [ - "tmdb_network", - "tmdb_show", - "tmdb_show_details", - "tvdb_show", - "tvdb_show_details" -] +all_builders = anidb.builders + anilist.builders + icheckmovies.builders + imdb.builders + letterboxd.builders + \ + mal.builders + plex.builders + tautulli.builders + tmdb.builders + trakt.builders + tvdb.builders +show_only_builders = ["tmdb_network", "tmdb_show", "tmdb_show_details", "tvdb_show", "tvdb_show_details"] movie_only_builders = [ - "letterboxd_list", - "letterboxd_list_details", - "icheckmovies_list", - "icheckmovies_list_details", - "tmdb_collection", - "tmdb_collection_details", - "tmdb_movie", - "tmdb_movie_details", - "tmdb_now_playing", - "tvdb_movie", - "tvdb_movie_details" -] -numbered_builders = [ - "anidb_popular", - "anilist_popular", - "anilist_top_rated", - "mal_all", - "mal_airing", - "mal_upcoming", - "mal_tv", - "mal_ova", - "mal_movie", - "mal_special", - "mal_popular", - "mal_favorite", - "mal_suggested", - "tmdb_popular", - "tmdb_top_rated", - "tmdb_now_playing", - "tmdb_trending_daily", - "tmdb_trending_weekly", - "trakt_trending", - "trakt_popular", - "trakt_recommended", - "trakt_watched", - "trakt_collected" -] -smart_invalid = ["collection_order"] -smart_url_invalid = [ - "run_again", "sync_mode", "show_filtered", "show_missing", "save_missing", "smart_label", - "radarr_add", "radarr_folder", "radarr_monitor", "radarr_availability", - "radarr_quality", "radarr_tag", "radarr_search", - "sonarr_add", "sonarr_folder", "sonarr_monitor", "sonarr_quality", "sonarr_language", - "sonarr_series", "sonarr_season", "sonarr_tag", "sonarr_search", "sonarr_cutoff_search", - "filters" + "letterboxd_list", "letterboxd_list_details", "icheckmovies_list", "icheckmovies_list_details", + "tmdb_collection", "tmdb_collection_details", "tmdb_movie", "tmdb_movie_details", "tmdb_now_playing", + "tvdb_movie", "tvdb_movie_details" ] summary_details = [ "summary", "tmdb_summary", "tmdb_description", "tmdb_biography", "tvdb_summary", "tvdb_description", "trakt_description", "letterboxd_description", "icheckmovies_description" ] -poster_details = [ - "url_poster", "tmdb_poster", "tmdb_profile", "tvdb_poster", "file_poster" -] -background_details = [ - "url_background", "tmdb_background", "tvdb_background", "file_background" -] -boolean_details = [ - "visible_library", - "visible_home", - "visible_shared", - "show_filtered", - "show_missing", - "save_missing", - "item_assets" -] -string_details = [ - "sort_title", - "content_rating", - "name_mapping" -] -ignored_details = [ - "smart_filter", - "smart_label", - "smart_url", - "run_again", - "schedule", - "sync_mode", - "template", - "test", - "tmdb_person", - "build_collection" -] +poster_details = ["url_poster", "tmdb_poster", "tmdb_profile", "tvdb_poster", "file_poster"] +background_details = ["url_background", "tmdb_background", "tvdb_background", "file_background"] +boolean_details = ["visible_library", "visible_home", "visible_shared", "show_filtered", "show_missing", "save_missing", "item_assets"] +string_details = ["sort_title", "content_rating", "name_mapping"] +ignored_details = ["smart_filter", "smart_label", "smart_url", "run_again", "schedule", "sync_mode", "template", "test", "tmdb_person", "build_collection"] details = ["collection_mode", "collection_order", "label"] + boolean_details + string_details -collectionless_details = [ - "collection_order", "plex_collectionless", - "label", "label_sync_mode", "test" -] + poster_details + background_details + summary_details + string_details +collectionless_details = ["collection_order", "plex_collectionless", "label", "label_sync_mode", "test"] + \ + poster_details + background_details + summary_details + string_details item_details = ["item_label", "item_radarr_tag", "item_sonarr_tag", "item_overlay"] + list(plex.item_advance_keys.keys()) radarr_details = ["radarr_add", "radarr_folder", "radarr_monitor", "radarr_search", "radarr_availability", "radarr_quality", "radarr_tag"] sonarr_details = ["sonarr_add", "sonarr_folder", "sonarr_monitor", "sonarr_language", "sonarr_series", "sonarr_quality", "sonarr_season", "sonarr_search", "sonarr_cutoff_search", "sonarr_tag"] @@ -212,6 +121,8 @@ movie_only_filters = [ "writer", "writer.not" ] show_only_filters = ["network"] +smart_invalid = ["collection_order"] +smart_url_invalid = ["filters", "run_again", "sync_mode", "show_filtered", "show_missing", "save_missing", "smart_label"] + radarr_details + sonarr_details class CollectionBuilder: def __init__(self, config, library, metadata, name, data): diff --git a/modules/config.py b/modules/config.py index ae68493a..0468527c 100644 --- a/modules/config.py +++ b/modules/config.py @@ -1,7 +1,7 @@ import logging, os, requests from datetime import datetime from lxml import html -from modules import util +from modules import util, radarr, sonarr from modules.anidb import AniDB from modules.anilist import AniList from modules.cache import Cache @@ -25,29 +25,7 @@ from ruamel import yaml logger = logging.getLogger("Plex Meta Manager") sync_modes = {"append": "Only Add Items to the Collection", "sync": "Add & Remove Items from the Collection"} -radarr_availabilities = { - "announced": "For Announced", - "cinemas": "For In Cinemas", - "released": "For Released", - "db": "For PreDB" -} -sonarr_monitors = { - "all": "Monitor all episodes except specials", - "future": "Monitor episodes that have not aired yet", - "missing": "Monitor episodes that do not have files or have not aired yet", - "existing": "Monitor episodes that have files or have not aired yet", - "pilot": "Monitor the first episode. All other episodes will be ignored", - "first": "Monitor all episodes of the first season. All other seasons will be ignored", - "latest": "Monitor all episodes of the latest season and future seasons", - "none": "No episodes will be monitored" -} -sonarr_series_types = { - "standard": "Episodes released with SxxEyy pattern", - "daily": "Episodes released daily or less frequently that use year-month-day (2017-05-25)", - "anime": "Episodes released using an absolute episode number" -} mass_update_options = {"tmdb": "Use TMDb Metadata", "omdb": "Use IMDb Metadata through OMDb"} -library_types = {"movie": "For Movie Libraries", "show": "For Show Libraries"} class Config: def __init__(self, default_dir, config_path=None, is_test=False, time_scheduled=None, requested_collections=None, requested_libraries=None, resume_from=None): @@ -317,7 +295,7 @@ class Config: self.general["radarr"]["add"] = check_for_attribute(self.data, "add", parent="radarr", var_type="bool", default=False) self.general["radarr"]["root_folder_path"] = check_for_attribute(self.data, "root_folder_path", parent="radarr", default_is_none=True) self.general["radarr"]["monitor"] = check_for_attribute(self.data, "monitor", parent="radarr", var_type="bool", default=True) - self.general["radarr"]["availability"] = check_for_attribute(self.data, "availability", parent="radarr", test_list=radarr_availabilities, default="announced") + self.general["radarr"]["availability"] = check_for_attribute(self.data, "availability", parent="radarr", test_list=radarr.availability_descriptions, default="announced") self.general["radarr"]["quality_profile"] = check_for_attribute(self.data, "quality_profile", parent="radarr", default_is_none=True) self.general["radarr"]["tag"] = check_for_attribute(self.data, "tag", parent="radarr", var_type="lower_list", default_is_none=True) self.general["radarr"]["search"] = check_for_attribute(self.data, "search", parent="radarr", var_type="bool", default=False) @@ -327,10 +305,10 @@ class Config: self.general["sonarr"]["token"] = check_for_attribute(self.data, "token", parent="sonarr", default_is_none=True) self.general["sonarr"]["add"] = check_for_attribute(self.data, "add", parent="sonarr", var_type="bool", default=False) self.general["sonarr"]["root_folder_path"] = check_for_attribute(self.data, "root_folder_path", parent="sonarr", default_is_none=True) - self.general["sonarr"]["monitor"] = check_for_attribute(self.data, "monitor", parent="sonarr", test_list=sonarr_monitors, default="all") + self.general["sonarr"]["monitor"] = check_for_attribute(self.data, "monitor", parent="sonarr", test_list=sonarr.monitor_descriptions, default="all") self.general["sonarr"]["quality_profile"] = check_for_attribute(self.data, "quality_profile", parent="sonarr", default_is_none=True) self.general["sonarr"]["language_profile"] = check_for_attribute(self.data, "language_profile", parent="sonarr", default_is_none=True) - self.general["sonarr"]["series_type"] = check_for_attribute(self.data, "series_type", parent="sonarr", test_list=sonarr_series_types, default="standard") + self.general["sonarr"]["series_type"] = check_for_attribute(self.data, "series_type", parent="sonarr", test_list=sonarr.series_type_descriptions, default="standard") self.general["sonarr"]["season_folder"] = check_for_attribute(self.data, "season_folder", parent="sonarr", var_type="bool", default=True) self.general["sonarr"]["tag"] = check_for_attribute(self.data, "tag", parent="sonarr", var_type="lower_list", default_is_none=True) self.general["sonarr"]["search"] = check_for_attribute(self.data, "search", parent="sonarr", var_type="bool", default=False) @@ -495,7 +473,7 @@ class Config: radarr_params["add"] = check_for_attribute(lib, "add", parent="radarr", var_type="bool", default=self.general["radarr"]["add"], save=False) radarr_params["root_folder_path"] = check_for_attribute(lib, "root_folder_path", parent="radarr", default=self.general["radarr"]["root_folder_path"], req_default=True, save=False) radarr_params["monitor"] = check_for_attribute(lib, "monitor", parent="radarr", var_type="bool", default=self.general["radarr"]["monitor"], save=False) - radarr_params["availability"] = check_for_attribute(lib, "availability", parent="radarr", test_list=radarr_availabilities, default=self.general["radarr"]["availability"], save=False) + radarr_params["availability"] = check_for_attribute(lib, "availability", parent="radarr", test_list=radarr.availability_descriptions, default=self.general["radarr"]["availability"], save=False) radarr_params["quality_profile"] = check_for_attribute(lib, "quality_profile", parent="radarr", default=self.general["radarr"]["quality_profile"], req_default=True, save=False) radarr_params["tag"] = check_for_attribute(lib, "tag", parent="radarr", var_type="lower_list", default=self.general["radarr"]["tag"], default_is_none=True, save=False) radarr_params["search"] = check_for_attribute(lib, "search", parent="radarr", var_type="bool", default=self.general["radarr"]["search"], save=False) @@ -518,13 +496,13 @@ class Config: sonarr_params["token"] = check_for_attribute(lib, "token", parent="sonarr", default=self.general["sonarr"]["token"], req_default=True, save=False) sonarr_params["add"] = check_for_attribute(lib, "add", parent="sonarr", var_type="bool", default=self.general["sonarr"]["add"], save=False) sonarr_params["root_folder_path"] = check_for_attribute(lib, "root_folder_path", parent="sonarr", default=self.general["sonarr"]["root_folder_path"], req_default=True, save=False) - sonarr_params["monitor"] = check_for_attribute(lib, "monitor", parent="sonarr", test_list=sonarr_monitors, default=self.general["sonarr"]["monitor"], save=False) + sonarr_params["monitor"] = check_for_attribute(lib, "monitor", parent="sonarr", test_list=sonarr.monitor_descriptions, default=self.general["sonarr"]["monitor"], save=False) sonarr_params["quality_profile"] = check_for_attribute(lib, "quality_profile", parent="sonarr", default=self.general["sonarr"]["quality_profile"], req_default=True, save=False) if self.general["sonarr"]["language_profile"]: sonarr_params["language_profile"] = check_for_attribute(lib, "language_profile", parent="sonarr", default=self.general["sonarr"]["language_profile"], save=False) else: sonarr_params["language_profile"] = check_for_attribute(lib, "language_profile", parent="sonarr", default_is_none=True, save=False) - sonarr_params["series_type"] = check_for_attribute(lib, "series_type", parent="sonarr", test_list=sonarr_series_types, default=self.general["sonarr"]["series_type"], save=False) + sonarr_params["series_type"] = check_for_attribute(lib, "series_type", parent="sonarr", test_list=sonarr.series_type_descriptions, default=self.general["sonarr"]["series_type"], save=False) sonarr_params["season_folder"] = check_for_attribute(lib, "season_folder", parent="sonarr", var_type="bool", default=self.general["sonarr"]["season_folder"], save=False) sonarr_params["tag"] = check_for_attribute(lib, "tag", parent="sonarr", var_type="lower_list", default=self.general["sonarr"]["tag"], default_is_none=True, save=False) sonarr_params["search"] = check_for_attribute(lib, "search", parent="sonarr", var_type="bool", default=self.general["sonarr"]["search"], save=False) diff --git a/modules/mal.py b/modules/mal.py index b77ce012..d7e8a3bb 100644 --- a/modules/mal.py +++ b/modules/mal.py @@ -6,79 +6,36 @@ from ruamel import yaml logger = logging.getLogger("Plex Meta Manager") builders = [ - "mal_id", - "mal_all", - "mal_airing", - "mal_upcoming", - "mal_tv", - "mal_ova", - "mal_movie", - "mal_special", - "mal_popular", - "mal_favorite", - "mal_season", - "mal_suggested", - "mal_userlist" + "mal_id", "mal_all", "mal_airing", "mal_upcoming", "mal_tv", "mal_ova", "mal_movie", + "mal_special", "mal_popular", "mal_favorite", "mal_season", "mal_suggested", "mal_userlist" ] mal_ranked_name = { - "mal_all": "all", - "mal_airing": "airing", - "mal_upcoming": "upcoming", - "mal_tv": "tv", - "mal_ova": "ova", - "mal_movie": "movie", - "mal_special": "special", - "mal_popular": "bypopularity", - "mal_favorite": "favorite" -} -season_sort_translation = { - "anime_score": "anime_score", - "anime_num_list_users": "anime_num_list_users", - "score": "anime_score", - "members": "anime_num_list_users" + "mal_all": "all", "mal_airing": "airing", "mal_upcoming": "upcoming", "mal_tv": "tv", "mal_ova": "ova", + "mal_movie": "movie", "mal_special": "special", "mal_popular": "bypopularity", "mal_favorite": "favorite" } +season_sort_translation = {"score": "anime_score", "anime_score": "anime_score", "members": "anime_num_list_users", "anime_num_list_users": "anime_num_list_users"} season_sort_options = ["score", "members"] pretty_names = { - "anime_score": "Score", - "anime_num_list_users": "Members", - "list_score": "Score", - "list_updated_at": "Last Updated", - "anime_title": "Title", - "anime_start_date": "Start Date", - "all": "All Anime", - "watching": "Currently Watching", - "completed": "Completed", - "on_hold": "On Hold", - "dropped": "Dropped", - "plan_to_watch": "Plan to Watch" + "anime_score": "Score", "list_score": "Score", "anime_num_list_users": "Members", "list_updated_at": "Last Updated", + "anime_title": "Title", "anime_start_date": "Start Date", "all": "All Anime", "watching": "Currently Watching", + "completed": "Completed", "on_hold": "On Hold", "dropped": "Dropped", "plan_to_watch": "Plan to Watch" } userlist_sort_translation = { - "score": "list_score", - "list_score": "list_score", - "last_updated": "list_updated_at", - "list_updated": "list_updated_at", - "list_updated_at": "list_updated_at", - "title": "anime_title", - "anime_title": "anime_title", - "start_date": "anime_start_date", - "anime_start_date": "anime_start_date" + "score": "list_score", "list_score": "list_score", + "last_updated": "list_updated_at", "list_updated": "list_updated_at", "list_updated_at": "list_updated_at", + "title": "anime_title", "anime_title": "anime_title", + "start_date": "anime_start_date", "anime_start_date": "anime_start_date" } userlist_sort_options = ["score", "last_updated", "title", "start_date"] -userlist_status = [ - "all", - "watching", - "completed", - "on_hold", - "dropped", - "plan_to_watch" -] +userlist_status = ["all", "watching", "completed", "on_hold", "dropped", "plan_to_watch"] +base_url = "https://myanimelist.net" urls = { - "oauth_token": "https://myanimelist.net/v1/oauth2/token", - "oauth_authorize": "https://myanimelist.net/v1/oauth2/authorize", - "ranking": "https://api.myanimelist.net/v2/anime/ranking", - "season": "https://api.myanimelist.net/v2/anime/season", - "suggestions": "https://api.myanimelist.net/v2/anime/suggestions", - "user": "https://api.myanimelist.net/v2/users" + "oauth_token": f"{base_url}/v1/oauth2/token", + "oauth_authorize": f"{base_url}/v1/oauth2/authorize", + "ranking": f"{base_url}/v2/anime/ranking", + "season": f"{base_url}/v2/anime/season", + "suggestions": f"{base_url}/v2/anime/suggestions", + "user": f"{base_url}/v2/users" } class MyAnimeList: diff --git a/modules/plex.py b/modules/plex.py index 3cc0ccb4..6ee186a2 100644 --- a/modules/plex.py +++ b/modules/plex.py @@ -34,16 +34,8 @@ search_translation = { "episode_plays": "episode.viewCount" } modifier_translation = { - "": "", - ".not": "!", - ".gt": "%3E%3E", - ".gte": "%3E", - ".lt": "%3C%3C", - ".lte": "%3C", - ".before": "%3C%3C", - ".after": "%3E%3E", - ".begins": "%3C", - ".ends": "%3E" + "": "", ".not": "!", ".gt": "%3E%3E", ".gte": "%3E", ".lt": "%3C%3C", ".lte": "%3C", + ".before": "%3C%3C", ".after": "%3E%3E", ".begins": "%3C", ".ends": "%3E" } episode_sorting_options = {"default": "-1", "oldest": "0", "newest": "1"} keep_episodes_options = {"all": 0, "5_latest": 5, "3_latest": 3, "latest": 1, "past_3": -3, "past_7": -7, "past_30": -30} @@ -58,17 +50,11 @@ metadata_language_options = {lang.lower(): lang for lang in plex_languages} metadata_language_options["default"] = None use_original_title_options = {"default": -1, "no": 0, "yes": 1} collection_mode_options = { - "default": "default", - "hide": "hide", - "hide_items": "hideItems", - "hideitems": "hideItems", - "show_items": "showItems", - "showitems": "showItems" -} -collection_order_options = { - "release": "release", - "alpha": "alpha" + "default": "default", "hide": "hide", + "hide_items": "hideItems", "hideitems": "hideItems", + "show_items": "showItems", "showitems": "showItems" } +collection_order_options = {"release": "release", "alpha": "alpha"} collection_mode_keys = {-1: "default", 0: "hide", 1: "hideItems", 2: "showItems"} collection_order_keys = {0: "release", 1: "alpha", 2: "custom"} item_advance_keys = { @@ -126,13 +112,9 @@ or_searches = [ "writer", "decade", "resolution", "year", "episode_title", "episode_year" ] movie_only_searches = [ - "country", "country.not", - "director", "director.not", - "producer", "producer.not", - "writer", "writer.not", + "country", "country.not", "director", "director.not", "producer", "producer.not", "writer", "writer.not", "decade", "duplicate", "unplayed", "progress", "trash", - "plays.gt", "plays.gte", "plays.lt", "plays.lte", - "duration.gt", "duration.gte", "duration.lt", "duration.lte" + "plays.gt", "plays.gte", "plays.lt", "plays.lte", "duration.gt", "duration.gte", "duration.lt", "duration.lte" ] show_only_searches = [ "network", "network.not", @@ -152,13 +134,7 @@ boolean_attributes = [ ] tmdb_attributes = ["actor", "director", "producer", "writer"] date_attributes = ["added", "episode_added", "release", "episode_air_date", "last_played", "episode_last_played"] -search_display = { - "added": "Date Added", - "release": "Release Date", - "hdr": "HDR", - "progress": "In Progress", - "episode_progress": "Episode In Progress" -} +search_display = {"added": "Date Added", "release": "Release Date", "hdr": "HDR", "progress": "In Progress", "episode_progress": "Episode In Progress"} sorts = { None: None, "title.asc": "titleSort:asc", "title.desc": "titleSort:desc", @@ -169,44 +145,14 @@ sorts = { "duration.asc": "duration:asc", "duration.desc": "duration:desc", "added.asc": "addedAt:asc", "added.desc": "addedAt:desc" } -modifiers = { - ".not": "!", - ".begins": "<", - ".ends": ">", - ".before": "<<", - ".after": ">>", - ".gt": ">>", - ".gte": "__gte", - ".lt": "<<", - ".lte": "__lte" -} +modifiers = {".not": "!", ".begins": "<", ".ends": ">", ".before": "<<", ".after": ">>", ".gt": ">>", ".gte": "__gte", ".lt": "<<", ".lte": "__lte"} mod_displays = { - "": "is", - ".not": "is not", - ".begins": "begins with", - ".ends": "ends with", - ".before": "is before", - ".after": "is after", - ".gt": "is greater than", - ".gte": "is greater than or equal", - ".lt": "is less than", - ".lte": "is less than or equal" + "": "is", ".not": "is not", ".begins": "begins with", ".ends": "ends with", ".before": "is before", ".after": "is after", + ".gt": "is greater than", ".gte": "is greater than or equal", ".lt": "is less than", ".lte": "is less than or equal" } tags = [ - "actor", - "audio_language", - "collection", - "content_rating", - "country", - "director", - "genre", - "label", - "network", - "producer", - "resolution", - "studio", - "subtitle_language", - "writer" + "actor", "audio_language", "collection", "content_rating", "country", "director", "genre", "label", + "network", "producer", "resolution", "studio", "subtitle_language", "writer" ] movie_sorts = { "title.asc": "titleSort", "title.desc": "titleSort%3Adesc", @@ -257,12 +203,7 @@ episode_sorts = { "added.asc": "addedAt", "added.desc": "addedAt%3Adesc", "random": "random" } -sort_types = { - "movies": (1, movie_sorts), - "shows": (2, show_sorts), - "seasons": (3, season_sorts), - "episodes": (4, episode_sorts), -} +sort_types = {"movies": (1, movie_sorts), "shows": (2, show_sorts), "seasons": (3, season_sorts), "episodes": (4, episode_sorts)} class Plex: def __init__(self, config, params): diff --git a/modules/radarr.py b/modules/radarr.py index 1a135aaf..8bb0909a 100644 --- a/modules/radarr.py +++ b/modules/radarr.py @@ -6,17 +6,9 @@ from arrapi.exceptions import ArrException, Invalid logger = logging.getLogger("Plex Meta Manager") -availability_translation = { - "announced": "announced", - "cinemas": "inCinemas", - "released": "released", - "db": "preDB" -} -apply_tags_translation = { - "": "add", - "sync": "replace", - "remove": "remove" -} +availability_translation = {"announced": "announced", "cinemas": "inCinemas", "released": "released", "db": "preDB"} +apply_tags_translation = {"": "add", "sync": "replace", "remove": "remove"} +availability_descriptions = {"announced": "For Announced", "cinemas": "For In Cinemas", "released": "For Released", "db": "For PreDB"} class Radarr: def __init__(self, config, params): diff --git a/modules/sonarr.py b/modules/sonarr.py index 55782b84..bba35783 100644 --- a/modules/sonarr.py +++ b/modules/sonarr.py @@ -8,20 +8,25 @@ logger = logging.getLogger("Plex Meta Manager") series_type = ["standard", "daily", "anime"] monitor_translation = { - "all": "all", - "future": "future", - "missing": "missing", - "existing": "existing", - "pilot": "pilot", - "first": "firstSeason", - "latest": "latestSeason", - "none": "none" + "all": "all", "future": "future", "missing": "missing", "existing": "existing", + "pilot": "pilot", "first": "firstSeason", "latest": "latestSeason", "none": "none" } -apply_tags_translation = { - "": "add", - "sync": "replace", - "remove": "remove" +series_type_descriptions = { + "standard": "Episodes released with SxxEyy pattern", + "daily": "Episodes released daily or less frequently that use year-month-day (2017-05-25)", + "anime": "Episodes released using an absolute episode number" } +monitor_descriptions = { + "all": "Monitor all episodes except specials", + "future": "Monitor episodes that have not aired yet", + "missing": "Monitor episodes that do not have files or have not aired yet", + "existing": "Monitor episodes that have files or have not aired yet", + "pilot": "Monitor the first episode. All other episodes will be ignored", + "first": "Monitor all episodes of the first season. All other seasons will be ignored", + "latest": "Monitor all episodes of the latest season and future seasons", + "none": "No episodes will be monitored" +} +apply_tags_translation = {"": "add", "sync": "replace", "remove": "remove"} class Sonarr: def __init__(self, config, params): diff --git a/modules/tmdb.py b/modules/tmdb.py index a3065403..e2b82dd6 100644 --- a/modules/tmdb.py +++ b/modules/tmdb.py @@ -7,105 +7,44 @@ from tmdbv3api.exceptions import TMDbException logger = logging.getLogger("Plex Meta Manager") builders = [ - "tmdb_actor", - "tmdb_actor_details", - "tmdb_collection", - "tmdb_collection_details", - "tmdb_company", - "tmdb_crew", - "tmdb_crew_details", - "tmdb_director", - "tmdb_director_details", - "tmdb_discover", - "tmdb_keyword", - "tmdb_list", - "tmdb_list_details", - "tmdb_movie", - "tmdb_movie_details", - "tmdb_network", - "tmdb_now_playing", - "tmdb_popular", - "tmdb_producer", - "tmdb_producer_details", - "tmdb_show", - "tmdb_show_details", - "tmdb_top_rated", - "tmdb_trending_daily", - "tmdb_trending_weekly", - "tmdb_writer", - "tmdb_writer_details" + "tmdb_actor", "tmdb_actor_details", "tmdb_collection", "tmdb_collection_details", "tmdb_company", + "tmdb_crew", "tmdb_crew_details", "tmdb_director", "tmdb_director_details", "tmdb_discover", + "tmdb_keyword", "tmdb_list", "tmdb_list_details", "tmdb_movie", "tmdb_movie_details", "tmdb_network", + "tmdb_now_playing", "tmdb_popular", "tmdb_producer", "tmdb_producer_details", "tmdb_show", "tmdb_show_details", + "tmdb_top_rated", "tmdb_trending_daily", "tmdb_trending_weekly", "tmdb_writer", "tmdb_writer_details" ] type_map = { - "tmdb_actor": "Person", - "tmdb_actor_details": "Person", - "tmdb_collection": "Collection", - "tmdb_collection_details": "Collection", - "tmdb_company": "Company", - "tmdb_crew": "Person", - "tmdb_crew_details": "Person", - "tmdb_director": "Person", - "tmdb_director_details": "Person", - "tmdb_keyword": "Keyword", - "tmdb_list": "List", - "tmdb_list_details": "List", - "tmdb_movie": "Movie", - "tmdb_movie_details": "Movie", - "tmdb_network": "Network", - "tmdb_person": "Person", - "tmdb_producer": "Person", - "tmdb_producer_details": "Person", - "tmdb_show": "Show", - "tmdb_show_details": "Show", - "tmdb_writer": "Person", - "tmdb_writer_details": "Person" + "tmdb_actor": "Person", "tmdb_actor_details": "Person", "tmdb_crew": "Person", "tmdb_crew_details": "Person", + "tmdb_collection": "Collection", "tmdb_collection_details": "Collection", "tmdb_company": "Company", + "tmdb_director": "Person", "tmdb_director_details": "Person", "tmdb_keyword": "Keyword", + "tmdb_list": "List", "tmdb_list_details": "List", "tmdb_movie": "Movie", "tmdb_movie_details": "Movie", + "tmdb_network": "Network", "tmdb_person": "Person", "tmdb_producer": "Person", "tmdb_producer_details": "Person", + "tmdb_show": "Show", "tmdb_show_details": "Show", "tmdb_writer": "Person", "tmdb_writer_details": "Person" } discover_movie = [ - "language", "with_original_language", "region", "sort_by", + "language", "with_original_language", "region", "sort_by", "with_cast", "with_crew", "with_people", "certification_country", "certification", "certification.lte", "certification.gte", - "include_adult", - "primary_release_year", "primary_release_date.gte", "primary_release_date.lte", - "release_date.gte", "release_date.lte", "year", - "vote_count.gte", "vote_count.lte", - "vote_average.gte", "vote_average.lte", - "with_cast", "with_crew", "with_people", - "with_companies", - "with_genres", "without_genres", - "with_keywords", "without_keywords", - "with_runtime.gte", "with_runtime.lte" + "year", "primary_release_year", "primary_release_date.gte", "primary_release_date.lte", + "release_date.gte", "release_date.lte", "vote_count.gte", "vote_count.lte", + "vote_average.gte", "vote_average.lte", "with_runtime.gte", "with_runtime.lte", + "with_companies", "with_genres", "without_genres", "with_keywords", "without_keywords", "include_adult" ] discover_tv = [ - "language", "with_original_language", "timezone", "sort_by", - "air_date.gte", "air_date.lte", - "first_air_date.gte", "first_air_date.lte", "first_air_date_year", - "vote_count.gte", "vote_count.lte", - "vote_average.gte", "vote_average.lte", - "with_genres", "without_genres", - "with_keywords", "without_keywords", - "with_networks", "with_companies", - "with_runtime.gte", "with_runtime.lte", - "include_null_first_air_dates", - "screened_theatrically" + "language", "with_original_language", "timezone", "sort_by", "screened_theatrically", "include_null_first_air_dates", + "air_date.gte", "air_date.lte", "first_air_date.gte", "first_air_date.lte", "first_air_date_year", + "vote_count.gte", "vote_count.lte", "vote_average.gte", "vote_average.lte", "with_runtime.gte", "with_runtime.lte", + "with_genres", "without_genres", "with_keywords", "without_keywords", "with_networks", "with_companies" ] discover_dates = [ - "primary_release_date.gte", "primary_release_date.lte", - "release_date.gte", "release_date.lte", - "air_date.gte", "air_date.lte", - "first_air_date.gte", "first_air_date.lte" + "primary_release_date.gte", "primary_release_date.lte", "release_date.gte", "release_date.lte", + "air_date.gte", "air_date.lte", "first_air_date.gte", "first_air_date.lte" ] discover_movie_sort = [ - "popularity.asc", "popularity.desc", - "release_date.asc", "release_date.desc", - "revenue.asc", "revenue.desc", - "primary_release_date.asc", "primary_release_date.desc", - "original_title.asc", "original_title.desc", - "vote_average.asc", "vote_average.desc", - "vote_count.asc", "vote_count.desc" -] -discover_tv_sort = [ - "vote_average.desc", "vote_average.asc", - "first_air_date.desc", "first_air_date.asc", - "popularity.desc", "popularity.asc" + "popularity.asc", "popularity.desc", "release_date.asc", "release_date.desc", "revenue.asc", "revenue.desc", + "primary_release_date.asc", "primary_release_date.desc", "original_title.asc", "original_title.desc", + "vote_average.asc", "vote_average.desc", "vote_count.asc", "vote_count.desc" ] +discover_tv_sort = ["vote_average.desc", "vote_average.asc", "first_air_date.desc", "first_air_date.asc", "popularity.desc", "popularity.asc"] class TMDb: def __init__(self, config, params): diff --git a/modules/trakt.py b/modules/trakt.py index 60221049..a5ae584e 100644 --- a/modules/trakt.py +++ b/modules/trakt.py @@ -9,15 +9,8 @@ redirect_uri = "urn:ietf:wg:oauth:2.0:oob" redirect_uri_encoded = redirect_uri.replace(":", "%3A") base_url = "https://api.trakt.tv" builders = [ - "trakt_collected", - "trakt_collection", - "trakt_list", - "trakt_list_details", - "trakt_popular", - "trakt_recommended", - "trakt_trending", - "trakt_watched", - "trakt_watchlist" + "trakt_collected", "trakt_collection", "trakt_list", "trakt_list_details", "trakt_popular", + "trakt_recommended", "trakt_trending", "trakt_watched", "trakt_watchlist" ] class Trakt: diff --git a/modules/tvdb.py b/modules/tvdb.py index 6a27dcef..3d6c2e32 100644 --- a/modules/tvdb.py +++ b/modules/tvdb.py @@ -4,25 +4,14 @@ from modules.util import Failed logger = logging.getLogger("Plex Meta Manager") -builders = [ - "tvdb_list", - "tvdb_list_details", - "tvdb_movie", - "tvdb_movie_details", - "tvdb_show", - "tvdb_show_details" -] +builders = ["tvdb_list", "tvdb_list_details", "tvdb_movie", "tvdb_movie_details", "tvdb_show", "tvdb_show_details"] base_url = "https://www.thetvdb.com" alt_url = "https://thetvdb.com" urls = { - "list": f"{base_url}/lists/", - "alt_list": f"{alt_url}/lists/", - "series": f"{base_url}/series/", - "alt_series": f"{alt_url}/series/", - "movies": f"{base_url}/movies/", - "alt_movies": f"{alt_url}/movies/", - "series_id": f"{base_url}/dereferrer/series/", - "movie_id": f"{base_url}/dereferrer/movie/" + "list": f"{base_url}/lists/", "alt_list": f"{alt_url}/lists/", + "series": f"{base_url}/series/", "alt_series": f"{alt_url}/series/", + "movies": f"{base_url}/movies/", "alt_movies": f"{alt_url}/movies/", + "series_id": f"{base_url}/dereferrer/series/", "movie_id": f"{base_url}/dereferrer/movie/" } class TVDbObj: diff --git a/modules/util.py b/modules/util.py index 390271b7..6510a74c 100644 --- a/modules/util.py +++ b/modules/util.py @@ -47,122 +47,47 @@ days_alias = { "saturday": 5, "sat": 5, "s": 5, "sunday": 6, "sun": 6, "su": 6, "u": 6 } -pretty_days = { - 0: "Monday", - 1: "Tuesday", - 2: "Wednesday", - 3: "Thursday", - 4: "Friday", - 5: "Saturday", - 6: "Sunday" -} +pretty_days = {0: "Monday", 1: "Tuesday", 2: "Wednesday", 3: "Thursday", 4: "Friday", 5: "Saturday", 6: "Sunday"} pretty_months = { - 1: "January", - 2: "February", - 3: "March", - 4: "April", - 5: "May", - 6: "June", - 7: "July", - 8: "August", - 9: "September", - 10: "October", - 11: "November", - 12: "December" -} -pretty_seasons = { - "winter": "Winter", - "spring": "Spring", - "summer": "Summer", - "fall": "Fall" + 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", + 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" } +pretty_seasons = {"winter": "Winter", "spring": "Spring", "summer": "Summer", "fall": "Fall"} pretty_names = { - "anidb_id": "AniDB ID", - "anidb_relation": "AniDB Relation", - "anidb_popular": "AniDB Popular", - "anilist_genre": "AniList Genre", - "anilist_id": "AniList ID", - "anilist_popular": "AniList Popular", - "anilist_relations": "AniList Relations", - "anilist_season": "AniList Season", - "anilist_studio": "AniList Studio", - "anilist_tag": "AniList Tag", - "anilist_top_rated": "AniList Top Rated", + "anidb_id": "AniDB ID", "anidb_relation": "AniDB Relation", "anidb_popular": "AniDB Popular", + "anilist_genre": "AniList Genre", "anilist_id": "AniList ID", "anilist_popular": "AniList Popular", + "anilist_relations": "AniList Relations", "anilist_season": "AniList Season", "anilist_studio": "AniList Studio", + "anilist_tag": "AniList Tag", "anilist_top_rated": "AniList Top Rated", "icheckmovies_list": "I Check Movies List", - "imdb_list": "IMDb List", - "imdb_id": "IMDb ID", - "letterboxd_list": "Letterboxd List", - "letterboxd_list_details": "Letterboxd List", - "mal_id": "MyAnimeList ID", - "mal_all": "MyAnimeList All", - "mal_airing": "MyAnimeList Airing", - "mal_upcoming": "MyAnimeList Upcoming", - "mal_tv": "MyAnimeList TV", - "mal_ova": "MyAnimeList OVA", - "mal_movie": "MyAnimeList Movie", - "mal_special": "MyAnimeList Special", - "mal_popular": "MyAnimeList Popular", - "mal_favorite": "MyAnimeList Favorite", - "mal_season": "MyAnimeList Season", - "mal_suggested": "MyAnimeList Suggested", - "mal_userlist": "MyAnimeList Userlist", - "plex_all": "Plex All", - "plex_collection": "Plex Collection", - "plex_search": "Plex Search", - "tautulli_popular": "Tautulli Popular", - "tautulli_watched": "Tautulli Watched", - "tmdb_actor": "TMDb Actor", - "tmdb_actor_details": "TMDb Actor", - "tmdb_collection": "TMDb Collection", - "tmdb_collection_details": "TMDb Collection", - "tmdb_company": "TMDb Company", - "tmdb_crew": "TMDb Crew", - "tmdb_crew_details": "TMDb Crew", - "tmdb_director": "TMDb Director", - "tmdb_director_details": "TMDb Director", - "tmdb_discover": "TMDb Discover", - "tmdb_keyword": "TMDb Keyword", - "tmdb_list": "TMDb List", - "tmdb_list_details": "TMDb List", - "tmdb_movie": "TMDb Movie", - "tmdb_movie_details": "TMDb Movie", - "tmdb_network": "TMDb Network", - "tmdb_now_playing": "TMDb Now Playing", - "tmdb_person": "TMDb Person", - "tmdb_popular": "TMDb Popular", - "tmdb_producer": "TMDb Producer", - "tmdb_producer_details": "TMDb Producer", - "tmdb_show": "TMDb Show", - "tmdb_show_details": "TMDb Show", - "tmdb_top_rated": "TMDb Top Rated", - "tmdb_trending_daily": "TMDb Trending Daily", - "tmdb_trending_weekly": "TMDb Trending Weekly", - "tmdb_writer": "TMDb Writer", - "tmdb_writer_details": "TMDb Writer", - "trakt_collected": "Trakt Collected", - "trakt_collection": "Trakt Collection", - "trakt_list": "Trakt List", - "trakt_list_details": "Trakt List", - "trakt_popular": "Trakt Popular", - "trakt_recommended": "Trakt Recommended", - "trakt_trending": "Trakt Trending", - "trakt_watched": "Trakt Watched", - "trakt_watchlist": "Trakt Watchlist", - "tvdb_list": "TVDb List", - "tvdb_list_details": "TVDb List", - "tvdb_movie": "TVDb Movie", - "tvdb_movie_details": "TVDb Movie", - "tvdb_show": "TVDb Show", - "tvdb_show_details": "TVDb Show" -} -pretty_ids = { - "anidbid": "AniDB", - "imdbid": "IMDb", - "mal_id": "MyAnimeList", - "themoviedb_id": "TMDb", - "thetvdb_id": "TVDb", - "tvdbid": "TVDb" + "imdb_list": "IMDb List", "imdb_id": "IMDb ID", + "letterboxd_list": "Letterboxd List", "letterboxd_list_details": "Letterboxd List", + "mal_id": "MyAnimeList ID", "mal_all": "MyAnimeList All", "mal_airing": "MyAnimeList Airing", + "mal_upcoming": "MyAnimeList Upcoming", "mal_tv": "MyAnimeList TV", "mal_ova": "MyAnimeList OVA", + "mal_movie": "MyAnimeList Movie", "mal_special": "MyAnimeList Special", "mal_popular": "MyAnimeList Popular", + "mal_favorite": "MyAnimeList Favorite", "mal_season": "MyAnimeList Season", + "mal_suggested": "MyAnimeList Suggested", "mal_userlist": "MyAnimeList Userlist", + "plex_all": "Plex All", "plex_collection": "Plex Collection", "plex_search": "Plex Search", + "tautulli_popular": "Tautulli Popular", "tautulli_watched": "Tautulli Watched", + "tmdb_actor": "TMDb Actor", "tmdb_actor_details": "TMDb Actor", + "tmdb_collection": "TMDb Collection", "tmdb_collection_details": "TMDb Collection", + "tmdb_company": "TMDb Company", "tmdb_crew": "TMDb Crew", "tmdb_crew_details": "TMDb Crew", + "tmdb_director": "TMDb Director", "tmdb_director_details": "TMDb Director", "tmdb_discover": "TMDb Discover", + "tmdb_keyword": "TMDb Keyword", "tmdb_list": "TMDb List", "tmdb_list_details": "TMDb List", + "tmdb_movie": "TMDb Movie", "tmdb_movie_details": "TMDb Movie", "tmdb_network": "TMDb Network", + "tmdb_now_playing": "TMDb Now Playing", "tmdb_person": "TMDb Person", "tmdb_popular": "TMDb Popular", + "tmdb_producer": "TMDb Producer", "tmdb_producer_details": "TMDb Producer", + "tmdb_show": "TMDb Show", "tmdb_show_details": "TMDb Show", "tmdb_top_rated": "TMDb Top Rated", + "tmdb_trending_daily": "TMDb Trending Daily", "tmdb_trending_weekly": "TMDb Trending Weekly", + "tmdb_writer": "TMDb Writer", "tmdb_writer_details": "TMDb Writer", + "trakt_collected": "Trakt Collected", "trakt_collection": "Trakt Collection", + "trakt_list": "Trakt List", "trakt_list_details": "Trakt List", + "trakt_popular": "Trakt Popular", "trakt_recommended": "Trakt Recommended", "trakt_trending": "Trakt Trending", + "trakt_watched": "Trakt Watched", "trakt_watchlist": "Trakt Watchlist", + "tvdb_list": "TVDb List", "tvdb_list_details": "TVDb List", + "tvdb_movie": "TVDb Movie", "tvdb_movie_details": "TVDb Movie", + "tvdb_show": "TVDb Show", "tvdb_show_details": "TVDb Show" } +pretty_ids = {"anidbid": "AniDB", "imdbid": "IMDb", "mal_id": "MyAnimeList", "themoviedb_id": "TMDb", "thetvdb_id": "TVDb", "tvdbid": "TVDb"} def tab_new_lines(data): return str(data).replace("\n", "\n|\t ") if "\n" in str(data) else str(data)