From 4f487a8411f2249c1a765f222d7141f5152ee48d Mon Sep 17 00:00:00 2001 From: desimaniac <5501908+desimaniac@users.noreply.github.com> Date: Mon, 30 Sep 2019 23:45:11 -0500 Subject: [PATCH] Trakt: Pass range of years to limit api results even further --- media/trakt.py | 76 +++++++++++++++++++++++++++++++++++++------------- traktarr.py | 27 ++++++++++++++++++ 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/media/trakt.py b/media/trakt.py index 457af5f..da7d538 100644 --- a/media/trakt.py +++ b/media/trakt.py @@ -73,7 +73,8 @@ class Trakt: @backoff.on_predicate(backoff.expo, lambda x: x is None, max_tries=6, on_backoff=backoff_handler) def _make_items_request(self, url, limit, type_name, object_name, authenticate_user=None, payload={}, - sleep_between=5, countries=None, languages=None, genres=None, include_non_acting_roles=False): + sleep_between=5, years=None, countries=None, languages=None, genres=None, + include_non_acting_roles=False): # languages if not languages: @@ -87,6 +88,10 @@ class Trakt: 'languages': languages, }) + # years + if years: + payload['years'] = years + # countries if countries: payload['countries'] = ','.join(countries).lower() @@ -163,6 +168,8 @@ class Trakt: else: processed.append(item) + elif resp_data == '[]': + log.warning("Received empty JSON response for page: %d of %d", current_page, total_pages) else: log.warning("Received malformed JSON response for page: %d of %d", current_page, total_pages) @@ -402,48 +409,52 @@ class Trakt: ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_trending_shows(self, limit=1000, countries=None, languages=None, genres=None): + def get_trending_shows(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/shows/trending', object_name='shows', type_name='trending', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_popular_shows(self, limit=1000, countries=None, languages=None, genres=None): + def get_popular_shows(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/shows/popular', object_name='shows', type_name='popular', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_anticipated_shows(self, limit=1000, countries=None, languages=None, genres=None): + def get_anticipated_shows(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/shows/anticipated', object_name='shows', type_name='anticipated', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_person_shows(self, person, limit=1000, countries=None, languages=None, genres=None, + def get_person_shows(self, person, limit=1000, years=None, countries=None, languages=None, genres=None, include_non_acting_roles=False): return self._make_items_request( url='https://api.trakt.tv/people/%s/shows' % person.replace(' ', '-').lower(), object_name='shows', type_name='person', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, @@ -451,55 +462,64 @@ class Trakt: ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_most_played_shows(self, limit=1000, countries=None, languages=None, genres=None, most_type=None): + def get_most_played_shows(self, limit=1000, years=None, countries=None, languages=None, genres=None, + most_type=None): return self._make_items_request( url='https://api.trakt.tv/shows/played/%s' % ('weekly' if not most_type else most_type), object_name='shows', type_name='played', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_most_watched_shows(self, limit=1000, languages=None, countries=None, genres=None, most_type=None): + def get_most_watched_shows(self, limit=1000, years=None, countries=None, languages=None, genres=None, + most_type=None): return self._make_items_request( url='https://api.trakt.tv/shows/watched/%s' % ('weekly' if not most_type else most_type), object_name='shows', type_name='watched', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_recommended_shows(self, authenticate_user=None, limit=1000, countries=None, languages=None, genres=None): + def get_recommended_shows(self, authenticate_user=None, limit=1000, years=None, countries=None, languages=None, + genres=None): return self._make_items_request( url='https://api.trakt.tv/recommendations/shows', object_name='shows', type_name='recommended from {authenticate_user}', authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_watchlist_shows(self, authenticate_user=None, limit=1000, countries=None, languages=None): + def get_watchlist_shows(self, authenticate_user=None, limit=1000, years=None, countries=None, languages=None, + genres=None): return self._make_items_request( url='https://api.trakt.tv/users/{authenticate_user}/watchlist/shows', object_name='shows', type_name='watchlist from {authenticate_user}', authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_user_list_shows(self, list_url, authenticate_user=None, limit=1000, countries=None, languages=None): + def get_user_list_shows(self, list_url, authenticate_user=None, limit=1000, years=None, countries=None, + languages=None, genres=None): list_user, list_key = extract_list_user_and_key_from_url(list_url) log.debug('Fetching %s from %s', list_key, list_user) @@ -510,6 +530,7 @@ class Trakt: type_name=(list_key + ' from ' + list_user), authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, @@ -526,48 +547,52 @@ class Trakt: ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_trending_movies(self, limit=1000, countries=None, languages=None, genres=None): + def get_trending_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/movies/trending', object_name='movies', type_name='trending', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_popular_movies(self, limit=1000, countries=None, languages=None, genres=None): + def get_popular_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/movies/popular', object_name='movies', type_name='popular', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_anticipated_movies(self, limit=1000, countries=None, languages=None, genres=None): + def get_anticipated_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/movies/anticipated', object_name='movies', type_name='anticipated', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_person_movies(self, person, limit=1000, countries=None, languages=None, genres=None, + def get_person_movies(self, person, limit=1000, years=None, countries=None, languages=None, genres=None, include_non_acting_roles=False): return self._make_items_request( url='https://api.trakt.tv/people/%s/movies' % person.replace(' ', '-').lower(), object_name='movies', type_name='person', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, @@ -575,65 +600,75 @@ class Trakt: ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_most_played_movies(self, limit=1000, countries=None, languages=None, genres=None, most_type=None): + def get_most_played_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None, + most_type=None): return self._make_items_request( url='https://api.trakt.tv/movies/played/%s' % ('weekly' if not most_type else most_type), object_name='movies', type_name='played', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) @cache(cache_file=cachefile, retry_if_blank=True) - def get_most_watched_movies(self, limit=1000, countries=None, languages=None, genres=None, most_type=None): + def get_most_watched_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None, + most_type=None): return self._make_items_request( url='https://api.trakt.tv/movies/watched/%s' % ('weekly' if not most_type else most_type), object_name='movies', type_name='watched', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_boxoffice_movies(self, limit=1000, countries=None, languages=None, genres=None): + def get_boxoffice_movies(self, limit=1000, years=None, countries=None, languages=None, genres=None): return self._make_items_request( url='https://api.trakt.tv/movies/boxoffice', object_name='movies', type_name='anticipated', limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_recommended_movies(self, authenticate_user=None, limit=1000, countries=None, languages=None, genres=None): + def get_recommended_movies(self, authenticate_user=None, limit=1000, years=None, countries=None, languages=None, + genres=None): return self._make_items_request( url='https://api.trakt.tv/recommendations/movies', object_name='movies', type_name='recommended from {authenticate_user}', authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_watchlist_movies(self, authenticate_user=None, limit=1000, countries=None, languages=None): + def get_watchlist_movies(self, authenticate_user=None, limit=1000, years=None, countries=None, languages=None, + genres=None): return self._make_items_request( url='https://api.trakt.tv/users/{authenticate_user}/watchlist/movies', object_name='movies', type_name='watchlist from {authenticate_user}', authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, ) - def get_user_list_movies(self, list_url, authenticate_user=None, limit=1000, countries=None, languages=None): + def get_user_list_movies(self, list_url, authenticate_user=None, limit=1000, years=None, countries=None, + languages=None, genres=None): list_user, list_key = extract_list_user_and_key_from_url(list_url) log.debug('Fetching %s from %s', list_key, list_user) @@ -644,6 +679,7 @@ class Trakt: type_name=(list_key + ' from ' + list_user), authenticate_user=authenticate_user, limit=limit, + years=years, countries=countries, languages=languages, genres=genres, diff --git a/traktarr.py b/traktarr.py index bd96d39..fc9f1df 100755 --- a/traktarr.py +++ b/traktarr.py @@ -353,6 +353,12 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold misc_helper.unblacklist_genres(genres, cfg['filters']['shows']['blacklisted_genres']) log.debug("Filter Trakt results with genre(s): %s", ', '.join(map(lambda x: x.title(), genres.split(',')))) + # set years range + if cfg.filters.shows.blacklisted_min_year and cfg.filters.shows.blacklisted_max_year: + years = str(cfg.filters.shows.blacklisted_min_year) + '-' + str(cfg.filters.shows.blacklisted_max_year) + else: + years = None + # replace sonarr root_folder if folder is supplied if folder: cfg['sonarr']['root_folder'] = folder @@ -377,6 +383,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold # get trakt series list if list_type.lower() == 'anticipated': trakt_objects_list = trakt.get_anticipated_shows( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -384,6 +391,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold elif list_type.lower() == 'trending': trakt_objects_list = trakt.get_trending_shows( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -391,6 +399,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold elif list_type.lower() == 'popular': trakt_objects_list = trakt.get_popular_shows( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -402,6 +411,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold " list type!") return None trakt_objects_list = trakt.get_person_shows( + years=years, person=actor, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, @@ -412,6 +422,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold elif list_type.lower() == 'recommended': trakt_objects_list = trakt.get_recommended_shows( authenticate_user, + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -420,6 +431,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold elif list_type.lower().startswith('played'): most_type = misc_helper.substring_after(list_type.lower(), "_") trakt_objects_list = trakt.get_most_played_shows( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -429,6 +441,7 @@ def shows(list_type, add_limit=0, add_delay=2.5, sort='votes', genres=None, fold elif list_type.lower().startswith('watched'): most_type = misc_helper.substring_after(list_type.lower(), "_") trakt_objects_list = trakt.get_most_watched_shows( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -769,6 +782,12 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= misc_helper.unblacklist_genres(genres, cfg['filters']['movies']['blacklisted_genres']) log.debug("Filter Trakt results with genre(s): %s", ', '.join(map(lambda x: x.title(), genres))) + # set years range + if cfg.filters.movies.blacklisted_min_year and cfg.filters.movies.blacklisted_max_year: + years = str(cfg.filters.movies.blacklisted_min_year) + '-' + str(cfg.filters.movies.blacklisted_max_year) + else: + years = None + # replace radarr root_folder if folder is supplied if folder: cfg['radarr']['root_folder'] = folder @@ -800,6 +819,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= # get trakt movies list if list_type.lower() == 'anticipated': trakt_objects_list = trakt.get_anticipated_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -807,6 +827,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower() == 'trending': trakt_objects_list = trakt.get_trending_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -814,6 +835,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower() == 'popular': trakt_objects_list = trakt.get_popular_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -821,6 +843,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower() == 'boxoffice': trakt_objects_list = trakt.get_boxoffice_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -832,6 +855,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= " list type!") return None trakt_objects_list = trakt.get_person_movies( + years=years, person=actor, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, @@ -842,6 +866,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower() == 'recommended': trakt_objects_list = trakt.get_recommended_movies( authenticate_user, + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -850,6 +875,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower().startswith('played'): most_type = misc_helper.substring_after(list_type.lower(), "_") trakt_objects_list = trakt.get_most_played_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres, @@ -859,6 +885,7 @@ def movies(list_type, add_limit=0, add_delay=2.5, sort='votes', rotten_tomatoes= elif list_type.lower().startswith('watched'): most_type = misc_helper.substring_after(list_type.lower(), "_") trakt_objects_list = trakt.get_most_watched_movies( + years=years, countries=cfg.filters.shows.allowed_countries, languages=cfg.filters.shows.allowed_languages, genres=genres,