From e83d72d7ff1e77e8d62ca2a6ae6a4314c2294d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 23:38:30 +0200 Subject: [PATCH 01/13] Move extract_ids(media_item) to be able to make atomic commits --- trakt/sync.py | 5 ++++- trakt/users.py | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/trakt/sync.py b/trakt/sync.py index c4bf7cf..df4c230 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -209,21 +209,24 @@ def get_search_results(query, search_type=None, slugify_query=False): # need to import Scrobblers results = [] for media_item in data: - extract_ids(media_item) result = SearchResult(media_item['type'], media_item['score']) if media_item['type'] == 'movie': from trakt.movies import Movie + extract_ids(media_item) result.media = Movie(**media_item.pop('movie')) elif media_item['type'] == 'show': from trakt.tv import TVShow + extract_ids(media_item) result.media = TVShow(**media_item.pop('show')) elif media_item['type'] == 'episode': from trakt.tv import TVEpisode show = media_item.pop('show') + extract_ids(media_item) result.media = TVEpisode(show.get('title', None), **media_item.pop('episode')) elif media_item['type'] == 'person': from trakt.people import Person + extract_ids(media_item) result.media = Person(**media_item.pop('person')) results.append(result) diff --git a/trakt/users.py b/trakt/users.py index 523b83d..7e5fdd7 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -129,11 +129,12 @@ def get_items(self): continue item_type = item['type'] item_data = item.pop(item_type) - extract_ids(item_data) if item_type == 'movie': + extract_ids(item_data) self._items.append(Movie(item_data['title'], item_data['year'], item_data['slug'])) elif item_type == 'show': + extract_ids(item_data) self._items.append(TVShow(item_data['title'], item_data['slug'])) elif item_type == 'season': @@ -149,6 +150,7 @@ def get_items(self): item_data['number']) self._items.append(episode) elif item_type == 'person': + extract_ids(item_data) self._items.append(Person(item_data['name'], item_data['slug'])) From b86e0d6c7d8bee0dfd2c3ebb8625529284333046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 22:54:02 +0200 Subject: [PATCH 02/13] Add mixins module --- trakt/mixins.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 trakt/mixins.py diff --git a/trakt/mixins.py b/trakt/mixins.py new file mode 100644 index 0000000..ab9e4ba --- /dev/null +++ b/trakt/mixins.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +"""Contains various MixIns""" + +__author__ = 'Jon Nappi, Elan Ruusamäe' From 4cab98ec03ff34fd61c4abd788b8a4b000dd67ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 22:55:00 +0200 Subject: [PATCH 03/13] Add IdsMixin --- trakt/mixins.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/trakt/mixins.py b/trakt/mixins.py index ab9e4ba..ddf720f 100644 --- a/trakt/mixins.py +++ b/trakt/mixins.py @@ -2,3 +2,57 @@ """Contains various MixIns""" __author__ = 'Jon Nappi, Elan Ruusamäe' + + +class IdsMixin: + """ + Provides Mixin to translate "ids" array + to appropriate provider ids in base class. + + This is replacement for extract_ids() utility method. + """ + + def __init__(self): + self._ids = { + 'tmdb': None, + 'trakt': None, + 'tvdb': None, + 'slug': None, + 'tvrage': None, + } + self.slug = None + + @property + def ids(self): + """ + Accessor to the trakt, imdb, and tmdb ids, + as well as the trakt.tv slug + """ + return { + 'ids': { + 'imdb': self.imdb, + 'slug': self.slug, + 'tmdb': self.tmdb, + 'trakt': self.trakt, + } + } + + @property + def imdb(self): + return self._ids.get('imdb', None) + + @property + def tmdb(self): + return self._ids.get('tmdb', None) + + @property + def trakt(self): + return self._ids.get('trakt', None) + + @property + def tvdb(self): + return self._ids.get('tvdb', None) + + @property + def tvrage(self): + return self._ids.get('tvrage', None) From dfc4bcdb12f4d131700afa66c905604f1bc7e137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 16 Jan 2022 02:59:03 +0200 Subject: [PATCH 04/13] Build ids dynamically --- trakt/mixins.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/trakt/mixins.py b/trakt/mixins.py index ddf720f..7812f86 100644 --- a/trakt/mixins.py +++ b/trakt/mixins.py @@ -12,15 +12,10 @@ class IdsMixin: This is replacement for extract_ids() utility method. """ + __ids = ['imdb', 'slug', 'tmdb', 'trakt'] + def __init__(self): - self._ids = { - 'tmdb': None, - 'trakt': None, - 'tvdb': None, - 'slug': None, - 'tvrage': None, - } - self.slug = None + self._ids = {} @property def ids(self): @@ -28,13 +23,9 @@ def ids(self): Accessor to the trakt, imdb, and tmdb ids, as well as the trakt.tv slug """ + ids = {k: getattr(self, k, None) for k in self.__ids} return { - 'ids': { - 'imdb': self.imdb, - 'slug': self.slug, - 'tmdb': self.tmdb, - 'trakt': self.trakt, - } + 'ids': ids } @property From a77bd78c2732c0f8fca49444fbc4b327a42e211f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 23:12:26 +0200 Subject: [PATCH 05/13] Person: Use IdsMixin --- trakt/people.py | 20 +++++++------------- trakt/sync.py | 1 - trakt/users.py | 3 +-- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/trakt/people.py b/trakt/people.py index 074dfdb..4d221d1 100644 --- a/trakt/people.py +++ b/trakt/people.py @@ -1,23 +1,26 @@ # -*- coding: utf-8 -*- """Interfaces to all of the People objects offered by the Trakt.tv API""" from trakt.core import get +from trakt.mixins import IdsMixin from trakt.sync import search -from trakt.utils import extract_ids, slugify +from trakt.utils import slugify __author__ = 'Jon Nappi' __all__ = ['Person', 'ActingCredit', 'CrewCredit', 'Credits', 'MovieCredits', 'TVCredits'] -class Person(object): +class Person(IdsMixin): """A Class representing a trakt.tv Person such as an Actor or Director""" def __init__(self, name, slug=None, **kwargs): - super(Person, self).__init__() + super().__init__() self.name = name - self.biography = self.birthplace = self.tmdb_id = self.birthday = None + self.biography = self.birthplace = self.birthday = None + self.death = self.homepage = None self.job = self.character = self._images = self._movie_credits = None self._tv_credits = None self.slug = slug or slugify(self.name) + self.tmdb_id = None # @deprecated: unused if len(kwargs) > 0: self._build(kwargs) @@ -59,7 +62,6 @@ def _get(self): self._build(data) def _build(self, data): - extract_ids(data) for key, val in data.items(): try: setattr(self, key, val) @@ -67,14 +69,6 @@ def _build(self, data): if not hasattr(self, '_' + key): raise ae - @property - def ids(self): - """Accessor to the trakt, imdb, and tmdb ids, as well as the trakt.tv - slug - """ - return {'ids': {'trakt': self.trakt, 'slug': self.slug, - 'imdb': self.imdb, 'tmdb': self.tmdb}} - @property @get def images(self): diff --git a/trakt/sync.py b/trakt/sync.py index df4c230..921a22a 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -226,7 +226,6 @@ def get_search_results(query, search_type=None, slugify_query=False): **media_item.pop('episode')) elif media_item['type'] == 'person': from trakt.people import Person - extract_ids(media_item) result.media = Person(**media_item.pop('person')) results.append(result) diff --git a/trakt/users.py b/trakt/users.py index 7e5fdd7..d2a3066 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -150,9 +150,8 @@ def get_items(self): item_data['number']) self._items.append(episode) elif item_type == 'person': - extract_ids(item_data) self._items.append(Person(item_data['name'], - item_data['slug'])) + item_data['ids']['slug'])) yield self._items From c7a61331045352acd4c668855af88bc00ce65181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 23:18:12 +0200 Subject: [PATCH 06/13] Movie: Use IdsMixin --- trakt/movies.py | 24 ++++++++---------------- trakt/sync.py | 1 - trakt/users.py | 7 +------ 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/trakt/movies.py b/trakt/movies.py index fd5f15c..8680588 100644 --- a/trakt/movies.py +++ b/trakt/movies.py @@ -2,13 +2,14 @@ """Interfaces to all of the Movie objects offered by the Trakt.tv API""" from collections import namedtuple from trakt.core import Alias, Comment, Genre, get, delete +from trakt.mixins import IdsMixin from trakt.sync import (Scrobbler, comment, rate, add_to_history, remove_from_history, add_to_watchlist, remove_from_watchlist, add_to_collection, remove_from_collection, search, checkin_media, delete_checkin) from trakt.people import Person -from trakt.utils import slugify, now, extract_ids +from trakt.utils import slugify, now __author__ = 'Jon Nappi' __all__ = ['dismiss_recommendation', 'get_recommended_movies', 'genres', @@ -36,7 +37,6 @@ def get_recommended_movies(): data = yield 'recommendations/movies' movies = [] for movie in data: - extract_ids(movie) movies.append(Movie(**movie)) yield movies @@ -71,7 +71,6 @@ def updated_movies(timestamp=None): to_ret = [] for movie in data: mov = movie.pop('movie') - extract_ids(mov) mov.update({'updated_at': movie.pop('updated_at')}) to_ret.append(Movie(**mov)) yield to_ret @@ -81,10 +80,10 @@ def updated_movies(timestamp=None): 'note', 'release_type']) -class Movie(object): +class Movie(IdsMixin): """A Class representing a Movie object""" def __init__(self, title, year=None, slug=None, **kwargs): - super(Movie, self).__init__() + super().__init__() self.media_type = 'movies' self.title = title self.year = int(year) if year is not None else year @@ -93,13 +92,15 @@ def __init__(self, title, year=None, slug=None, **kwargs): else: self.slug = slug or slugify(self.title) - self.released = self.tmdb_id = self.imdb_id = self.duration = None - self.trakt_id = self.tagline = self.overview = self.runtime = None + self.released = self.duration = None + self.tagline = self.overview = self.runtime = None self.updated_at = self.trailer = self.homepage = self.rating = None self.votes = self.language = self.available_translations = None self.genres = self.certification = None self._comments = self._images = self._aliases = self._people = None self._ratings = self._releases = self._translations = None + self.tmdb_id = self.imdb_id = None # @deprecated: unused + self.trakt_id = None # @deprecated: unused if len(kwargs) > 0: self._build(kwargs) @@ -125,7 +126,6 @@ def _get(self): def _build(self, data): """Build this :class:`Movie` object with the data in *data*""" - extract_ids(data) for key, val in data.items(): if hasattr(self, '_' + key): setattr(self, '_' + key, val) @@ -186,14 +186,6 @@ def crew(self): """All of the crew members that worked on this :class:`Movie`""" return [p for p in self.people if getattr(p, 'job')] - @property - def ids(self): - """Accessor to the trakt, imdb, and tmdb ids, as well as the trakt.tv - slug - """ - return {'ids': {'trakt': self.trakt, 'slug': self.slug, - 'imdb': self.imdb, 'tmdb': self.tmdb}} - @property @get def images(self): diff --git a/trakt/sync.py b/trakt/sync.py index 921a22a..3d8f109 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -212,7 +212,6 @@ def get_search_results(query, search_type=None, slugify_query=False): result = SearchResult(media_item['type'], media_item['score']) if media_item['type'] == 'movie': from trakt.movies import Movie - extract_ids(media_item) result.media = Movie(**media_item.pop('movie')) elif media_item['type'] == 'show': from trakt.tv import TVShow diff --git a/trakt/users.py b/trakt/users.py index d2a3066..b2aeae6 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -130,9 +130,8 @@ def get_items(self): item_type = item['type'] item_data = item.pop(item_type) if item_type == 'movie': - extract_ids(item_data) self._items.append(Movie(item_data['title'], item_data['year'], - item_data['slug'])) + item_data['ids']['slug'])) elif item_type == 'show': extract_ids(item_data) self._items.append(TVShow(item_data['title'], @@ -336,7 +335,6 @@ def watchlist_movies(self): self._movie_watchlist = [] for movie in data: mov = movie.pop('movie') - extract_ids(mov) self._movie_watchlist.append(Movie(**mov)) yield self._movie_watchlist yield self._movie_watchlist @@ -354,7 +352,6 @@ def movie_collection(self): self._movie_collection = [] for movie in data: mov = movie.pop('movie') - extract_ids(mov) self._movie_collection.append(Movie(**mov)) yield self._movie_collection @@ -391,7 +388,6 @@ def watched_movies(self): self._watched_movies = [] for movie in data: movie_data = movie.pop('movie') - extract_ids(movie_data) movie_data.update(movie) self._watched_movies.append(Movie(**movie_data)) yield self._watched_movies @@ -432,7 +428,6 @@ def watching(self): media_type = data.pop('type') if media_type == 'movie': movie_data = data.pop('movie') - extract_ids(movie_data) movie_data.update(data) yield Movie(**movie_data) else: # media_type == 'episode' From 642a66d85f0f5cf15f324323dfc3972739055a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 23:48:58 +0200 Subject: [PATCH 07/13] TVEpisode: Use IdsMixin --- trakt/sync.py | 3 --- trakt/tv.py | 19 +++++-------------- trakt/users.py | 2 -- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/trakt/sync.py b/trakt/sync.py index 3d8f109..35f6a53 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -220,7 +220,6 @@ def get_search_results(query, search_type=None, slugify_query=False): elif media_item['type'] == 'episode': from trakt.tv import TVEpisode show = media_item.pop('show') - extract_ids(media_item) result.media = TVEpisode(show.get('title', None), **media_item.pop('episode')) elif media_item['type'] == 'person': @@ -286,7 +285,6 @@ def search_by_id(query, id_type='imdb', media_type=None, slugify_query=False): if 'episode' in d: from trakt.tv import TVEpisode show = d.pop('show') - extract_ids(d['episode']) results.append(TVEpisode(show.get('title', None), **d['episode'])) elif 'movie' in d: from trakt.movies import Movie @@ -333,7 +331,6 @@ def get_watchlist(list_type=None, sort=None): if 'episode' in d: from trakt.tv import TVEpisode show = d.pop('show') - extract_ids(d['episode']) results.append(TVEpisode(show.get('title', None), **d['episode'])) elif 'movie' in d: from trakt.movies import Movie diff --git a/trakt/tv.py b/trakt/tv.py index 9c60d9f..ced76aa 100644 --- a/trakt/tv.py +++ b/trakt/tv.py @@ -4,6 +4,7 @@ from datetime import datetime, timedelta from trakt.core import Airs, Alias, Comment, Genre, delete, get from trakt.errors import NotFoundException +from trakt.mixins import IdsMixin from trakt.sync import (Scrobbler, rate, comment, add_to_collection, add_to_watchlist, add_to_history, remove_from_history, remove_from_collection, remove_from_watchlist, search, @@ -639,19 +640,19 @@ def __len__(self): __repr__ = __str__ -class TVEpisode(object): +class TVEpisode(IdsMixin): """Container for TV Episodes""" def __init__(self, show, season, number=-1, **kwargs): - super(TVEpisode, self).__init__() + super().__init__() self.media_type = 'episodes' self.show = show self.season = season self.number = number self.overview = self.title = self.year = self.number_abs = None self.first_aired = self.last_updated = None - self.trakt = self.tmdb = self.tvdb = self.imdb = None - self.tvrage = self._stats = self._images = self._comments = None + self.runtime = None + self._stats = self._images = self._comments = None self._translations = self._ratings = None if len(kwargs) > 0: self._build(kwargs) @@ -669,7 +670,6 @@ def _get(self): def _build(self, data): """Build this :class:`TVEpisode` object with the data in *data*""" - extract_ids(data) for key, val in data.items(): if hasattr(self, '_' + key): setattr(self, '_' + key, val) @@ -716,15 +716,6 @@ def search(cls, title, year=None): """ return search(title, search_type='episode', year=year) - @property - def ids(self): - """Accessor to the trakt, imdb, and tmdb ids, as well as the trakt.tv - slug - """ - return {'ids': { - 'trakt': self.trakt, 'imdb': self.imdb, 'tmdb': self.tmdb - }} - @property @get def images(self): diff --git a/trakt/users.py b/trakt/users.py index b2aeae6..cc95c42 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -144,7 +144,6 @@ def get_items(self): self._items.append(season) elif item_type == 'episode': show_data = item.pop('show') - extract_ids(show_data) episode = TVEpisode(show_data['title'], item_data['season'], item_data['number']) self._items.append(episode) @@ -432,7 +431,6 @@ def watching(self): yield Movie(**movie_data) else: # media_type == 'episode' ep_data = data.pop('episode') - extract_ids(ep_data) sh_data = data.pop('show') ep_data.update(data, show=sh_data.get('title')) yield TVEpisode(**ep_data) From d993aa9ed40831a92593ab8c84bc8ff61ea3fd52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 16 Jan 2022 00:54:55 +0200 Subject: [PATCH 08/13] TVSeason: Use IdsMixin --- trakt/tv.py | 5 ++--- trakt/users.py | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/trakt/tv.py b/trakt/tv.py index ced76aa..4ac4e1e 100644 --- a/trakt/tv.py +++ b/trakt/tv.py @@ -384,7 +384,6 @@ def seasons(self): data = yield self.ext + '/seasons?extended=full' self._seasons = [] for season in data: - extract_ids(season) self._seasons.append(TVSeason(self.title, season['number'], **season)) yield self._seasons @@ -500,11 +499,11 @@ def __str__(self): __repr__ = __str__ -class TVSeason(object): +class TVSeason(IdsMixin): """Container for TV Seasons""" def __init__(self, show, season=1, slug=None, **kwargs): - super(TVSeason, self).__init__() + super().__init__() self.show = show self.season = season self.slug = slug or slugify(show) diff --git a/trakt/users.py b/trakt/users.py index cc95c42..4c51787 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -138,9 +138,8 @@ def get_items(self): item_data['slug'])) elif item_type == 'season': show_data = item.pop('show') - extract_ids(show_data) season = TVSeason(show_data['title'], item_data['number'], - show_data['slug']) + show_data['ids']['slug']) self._items.append(season) elif item_type == 'episode': show_data = item.pop('show') From 27be41af8ee0f202d639921ba843e4b0f9567e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 23:59:56 +0200 Subject: [PATCH 09/13] TVShow: Use IdsMixin --- trakt/calendar.py | 3 +-- trakt/sync.py | 1 - trakt/tv.py | 26 +++++++++----------------- trakt/users.py | 8 ++------ 4 files changed, 12 insertions(+), 26 deletions(-) diff --git a/trakt/calendar.py b/trakt/calendar.py index 5fdae2d..cc54b60 100644 --- a/trakt/calendar.py +++ b/trakt/calendar.py @@ -4,7 +4,7 @@ from trakt.core import get from trakt.movies import Movie from trakt.tv import TVEpisode, TVShow -from trakt.utils import extract_ids, now, airs_date +from trakt.utils import now, airs_date __author__ = 'Jon Nappi' __all__ = ['Calendar', 'PremiereCalendar', 'MyPremiereCalendar', @@ -72,7 +72,6 @@ def _build(self, data): first_aired = cal_item.get('first_aired') season = episode.get('season') ep_num = episode.get('number') - extract_ids(show_data) show_data.update(show_data) e_data = { 'airs_at': airs_date(first_aired), diff --git a/trakt/sync.py b/trakt/sync.py index 35f6a53..0a61afd 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -215,7 +215,6 @@ def get_search_results(query, search_type=None, slugify_query=False): result.media = Movie(**media_item.pop('movie')) elif media_item['type'] == 'show': from trakt.tv import TVShow - extract_ids(media_item) result.media = TVShow(**media_item.pop('show')) elif media_item['type'] == 'episode': from trakt.tv import TVEpisode diff --git a/trakt/tv.py b/trakt/tv.py index 4ac4e1e..198ccd8 100644 --- a/trakt/tv.py +++ b/trakt/tv.py @@ -9,7 +9,7 @@ add_to_watchlist, add_to_history, remove_from_history, remove_from_collection, remove_from_watchlist, search, checkin_media, delete_checkin) -from trakt.utils import slugify, extract_ids, airs_date +from trakt.utils import slugify, airs_date from trakt.people import Person __author__ = 'Jon Nappi' @@ -196,15 +196,15 @@ def anticipated_shows(page=1, limit=10, extended=None): yield [TVShow(**show['show']) for show in data] -class TVShow(object): +class TVShow(IdsMixin): """A Class representing a TV Show object.""" def __init__(self, title='', slug=None, **kwargs): - super(TVShow, self).__init__() + super().__init__() self.media_type = 'shows' - self.top_watchers = self.top_episodes = self.year = self.tvdb = None - self.imdb = self.genres = self.certification = self.network = None - self.trakt = self.tmdb = self._aliases = self._comments = None + self.top_watchers = self.top_episodes = self.year = None + self.genres = self.certification = self.network = None + self._aliases = self._comments = None self._images = self._people = self._ratings = self._translations = None self._seasons = None self._last_episode = self._next_episode = None @@ -218,6 +218,9 @@ def __init__(self, title='', slug=None, **kwargs): @property def slug(self): + if self._ids.get('slug', None) is not None: + return self._ids['slug'] + if self._slug is not None: return self._slug @@ -243,7 +246,6 @@ def _get(self): self._build(data) def _build(self, data): - extract_ids(data) for key, val in data.items(): if hasattr(self, '_' + key): setattr(self, '_' + key, val) @@ -313,16 +315,6 @@ def crew(self): """All of the crew members that worked on this :class:`TVShow`""" return [p for p in self.people if getattr(p, 'job')] - @property - def ids(self): - """Accessor to the trakt, imdb, and tmdb ids, as well as the trakt.tv - slug - """ - return {'ids': { - 'trakt': self.trakt, 'slug': self.slug, 'imdb': self.imdb, - 'tmdb': self.tmdb, 'tvdb': self.tvdb - }} - @property @get def images(self): diff --git a/trakt/users.py b/trakt/users.py index 4c51787..0d6ac01 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -5,7 +5,7 @@ from trakt.movies import Movie from trakt.people import Person from trakt.tv import TVShow, TVSeason, TVEpisode -from trakt.utils import slugify, extract_ids +from trakt.utils import slugify __author__ = 'Jon Nappi' __all__ = ['User', 'UserList', 'Request', 'follow', 'get_all_requests', @@ -133,9 +133,8 @@ def get_items(self): self._items.append(Movie(item_data['title'], item_data['year'], item_data['ids']['slug'])) elif item_type == 'show': - extract_ids(item_data) self._items.append(TVShow(item_data['title'], - item_data['slug'])) + item_data['ids']['slug'])) elif item_type == 'season': show_data = item.pop('show') season = TVSeason(show_data['title'], item_data['number'], @@ -315,7 +314,6 @@ def watchlist_shows(self): self._show_watchlist = [] for show in data: show_data = show.pop('show') - extract_ids(show_data) show_data.update(show) self._show_watchlist.append(TVShow(**show_data)) yield self._show_watchlist @@ -366,7 +364,6 @@ def show_collection(self): self._show_collection = [] for show in data: s = show.pop('show') - extract_ids(s) sh = TVShow(**s) sh._seasons = [TVSeason(show=sh.title, **sea) for sea in show.pop('seasons')] @@ -403,7 +400,6 @@ def watched_shows(self): self._watched_shows = [] for show in data: show_data = show.pop('show') - extract_ids(show_data) show_data.update(show) self._watched_shows.append(TVShow(**show_data)) yield self._watched_shows From 01e495eddf73decf57f20c71e84c126c3e996f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 16 Jan 2022 01:00:43 +0200 Subject: [PATCH 10/13] UserList: Use IdsMixin --- trakt/users.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/trakt/users.py b/trakt/users.py index 0d6ac01..d8661b2 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -2,6 +2,7 @@ """Interfaces to all of the User objects offered by the Trakt.tv API""" from collections import namedtuple from trakt.core import get, post, delete +from trakt.mixins import IdsMixin from trakt.movies import Movie from trakt.people import Person from trakt.tv import TVShow, TVSeason, TVEpisode @@ -64,18 +65,23 @@ class UserList(namedtuple('UserList', ['name', 'description', 'privacy', 'display_numbers', 'allow_comments', 'sort_by', 'sort_how', 'created_at', 'updated_at', 'item_count', - 'comment_count', 'likes', 'trakt', - 'slug', 'user', 'creator'])): + 'comment_count', 'likes', 'ids', + 'user', 'creator']), IdsMixin): """A list created by a Trakt.tv :class:`User`""" - def __init__(self, *args, **kwargs): - super(UserList, self).__init__() + def __init__(self, *args, ids=None, **kwargs): + super().__init__() + self._ids = ids self._items = list() def __iter__(self, *args, **kwargs): """Iterate over the items in this user list""" return self._items.__iter__(*args, **kwargs) + @property + def slug(self): + return self._ids.get('slug', None) + @classmethod @post def create(cls, name, creator, description=None, privacy='private', @@ -95,7 +101,6 @@ def create(cls, name, creator, description=None, privacy='private', if description is not None: args['description'] = description data = yield 'users/{user}/lists'.format(user=slugify(creator)), args - extract_ids(data) yield UserList(creator=creator, user=creator, **data) @classmethod @@ -107,7 +112,6 @@ def _get(cls, title, creator): """ data = yield 'users/{user}/lists/{id}'.format(user=slugify(creator), id=slugify(title)) - extract_ids(data) ulist = UserList(creator=creator, **data) ulist.get_items() @@ -299,7 +303,7 @@ def lists(self): # user will be replaced with the self User object del ul["user"] self._lists = [UserList(creator=slugify(self.username), user=self, - **extract_ids(ul)) for ul in data] + **ul) for ul in data] yield self._lists @property From 762217d0a0a1561dda92ce3febc0b2c284d5e0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 16 Jan 2022 03:42:32 +0200 Subject: [PATCH 11/13] Drop un-needed extract_ids --- trakt/sync.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/trakt/sync.py b/trakt/sync.py index 0a61afd..e58ba68 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -3,7 +3,7 @@ from datetime import datetime, timezone from trakt.core import get, post, delete -from trakt.utils import slugify, extract_ids, timestamp +from trakt.utils import slugify, timestamp __author__ = 'Jon Nappi' @@ -276,9 +276,6 @@ def search_by_id(query, id_type='imdb', media_type=None, slugify_query=False): query=query, source=source, media_type=media_type) data = yield uri - for media_item in data: - extract_ids(media_item) - results = [] for d in data: if 'episode' in d: From f8f7a2e9e97cba67d00043d4d4853bf543335beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 16 Jan 2022 03:48:43 +0200 Subject: [PATCH 12/13] Correct doc: dismiss_recommendation accepts only title --- docs/movies.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/movies.rst b/docs/movies.rst index ea96155..ddfe09a 100644 --- a/docs/movies.rst +++ b/docs/movies.rst @@ -15,8 +15,7 @@ block the specified movie from being shown in your recommended movies. :: >>> from trakt.movies import dismiss_recommendation - >>> dismiss_recommendation(imdb_id='tt3139072', title='Son of Batman', - ... year=2014) + >>> dismiss_recommendation('Son of Batman') This code snippet would prevent Son of Batman from appearing in your recommended From 137e639852c907fabf4b44f8308577ee9b3b3cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sun, 11 Dec 2022 17:01:48 +0200 Subject: [PATCH 13/13] Fix use of trakt property --- trakt/calendar.py | 2 +- trakt/users.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/trakt/calendar.py b/trakt/calendar.py index afe90c8..a54fa23 100644 --- a/trakt/calendar.py +++ b/trakt/calendar.py @@ -81,7 +81,7 @@ def _build(self, data): } self._calendar.append( TVEpisode(show_data['title'], season, ep_num, - show_id=show_data['trakt'], **e_data) + show_id=show_data['ids']['trakt'], **e_data) ) self._calendar = sorted(self._calendar, key=lambda x: x.airs_at) diff --git a/trakt/users.py b/trakt/users.py index ceda879..ce40f53 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -149,7 +149,7 @@ def get_items(self): show_data = item.pop('show') episode = TVEpisode(show_data['title'], item_data['season'], item_data['number'], - show_id=show_data['trakt']) + show_id=show_data['ids']['trakt']) self._items.append(episode) elif item_type == 'person': self._items.append(Person(item_data['name'],