diff --git a/trakt/calendar.py b/trakt/calendar.py index b330c72..a54fa23 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), @@ -82,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/mixins.py b/trakt/mixins.py new file mode 100644 index 0000000..7812f86 --- /dev/null +++ b/trakt/mixins.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +"""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. + """ + + __ids = ['imdb', 'slug', 'tmdb', 'trakt'] + + def __init__(self): + self._ids = {} + + @property + 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': ids + } + + @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) diff --git a/trakt/movies.py b/trakt/movies.py index e6be7c7..e2cb8d1 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,7 +80,7 @@ def updated_movies(timestamp=None): 'note', 'release_type']) -class Movie: +class Movie(IdsMixin): """A Class representing a Movie object""" def __init__(self, title, year=None, slug=None, **kwargs): super().__init__() @@ -93,13 +92,13 @@ 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 = self.trakt_id = 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 +124,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 +184,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/people.py b/trakt/people.py index ace75e4..c7559f1 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: +class Person(IdsMixin): """A Class representing a trakt.tv Person such as an Actor or Director""" def __init__(self, name, slug=None, **kwargs): 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 8881c42..e920a3b 100644 --- a/trakt/sync.py +++ b/trakt/sync.py @@ -5,7 +5,7 @@ from deprecated import deprecated from trakt.core import get, post, delete -from trakt.utils import slugify, extract_ids, timestamp +from trakt.utils import slugify, timestamp __author__ = 'Jon Nappi' @@ -211,7 +211,6 @@ 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 @@ -280,15 +279,11 @@ 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 trakt.tv import TVEpisode show = d.pop('show') - extract_ids(d['episode']) results.append(TVEpisode(show.get('title', None), show_id=show['ids'].get('trakt'), **d.pop('episode'))) @@ -342,7 +337,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), show_id=show.get('trakt', None), **d['episode'])) diff --git a/trakt/tv.py b/trakt/tv.py index 42cb19c..6c1bcdb 100644 --- a/trakt/tv.py +++ b/trakt/tv.py @@ -6,11 +6,12 @@ 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, 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' @@ -197,15 +198,15 @@ def anticipated_shows(page=1, limit=10, extended=None): yield [TVShow(**show['show']) for show in data] -class TVShow: +class TVShow(IdsMixin): """A Class representing a TV Show object.""" def __init__(self, title='', slug=None, **kwargs): 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 @@ -219,6 +220,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 @@ -244,7 +248,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) @@ -363,16 +366,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): @@ -434,8 +427,6 @@ def seasons(self): data = yield self.ext + '/seasons?extended=episodes' self._seasons = [] for season in data: - extract_ids(season) - # Prepare episodes episodes = [] for ep in season.pop('episodes', []): @@ -447,6 +438,7 @@ def seasons(self): number = season.pop('number') season = TVSeason(self.title, number, self.slug, **season) self._seasons.append(season) + yield self._seasons @property @@ -562,7 +554,7 @@ def __str__(self): __repr__ = __str__ -class TVSeason: +class TVSeason(IdsMixin): """Container for TV Seasons""" def __init__(self, show, season=1, slug=None, **kwargs): @@ -702,7 +694,7 @@ def __len__(self): __repr__ = __str__ -class TVEpisode: +class TVEpisode(IdsMixin): """Container for TV Episodes""" def __init__(self, show, season, number=-1, **kwargs): @@ -713,8 +705,8 @@ def __init__(self, show, season, number=-1, **kwargs): 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) @@ -732,7 +724,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) @@ -782,15 +773,6 @@ def search(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 60a4b86..ce40f53 100644 --- a/trakt/users.py +++ b/trakt/users.py @@ -2,10 +2,11 @@ """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 -from trakt.utils import slugify, extract_ids +from trakt.utils import slugify __author__ = 'Jon Nappi' __all__ = ['User', 'UserList', 'Request', 'follow', 'get_all_requests', @@ -65,18 +66,23 @@ class UserList(namedtuple('UserList', ['name', 'description', 'privacy', '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): + def __init__(self, *args, ids=None, **kwargs): super().__init__() + self._ids = ids self._items = list() def __iter__(self): """Iterate over the items in this user list""" return self._items.__iter__() + @property + def slug(self): + return self._ids.get('slug', None) + @classmethod @post def create(cls, name, creator, description=None, privacy='private', @@ -96,7 +102,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 cls(creator=creator, user=creator, **data) @classmethod @@ -108,7 +113,6 @@ def _get(cls, title, creator): """ data = yield 'users/{user}/lists/{id}'.format(user=slugify(creator), id=slugify(title)) - extract_ids(data) ulist = cls(creator=creator, **data) ulist.get_items() @@ -130,29 +134,26 @@ def get_items(self): continue item_type = item['type'] item_data = item.pop(item_type) - extract_ids(item_data) if item_type == 'movie': self._items.append(Movie(item_data['title'], item_data['year'], - item_data['slug'])) + item_data['ids']['slug'])) elif item_type == 'show': self._items.append(TVShow(item_data['title'], - item_data['slug'])) + item_data['ids']['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') - extract_ids(show_data) 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'], - item_data['slug'])) + item_data['ids']['slug'])) yield self._items @@ -304,7 +305,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 @@ -319,7 +320,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 @@ -337,7 +337,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 @@ -355,7 +354,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 @@ -372,7 +370,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, season=sea['number'], **sea) @@ -393,7 +390,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 @@ -411,7 +407,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 @@ -434,12 +429,10 @@ 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' ep_data = data.pop('episode') - extract_ids(ep_data) sh_data = data.pop('show') ep_data.update(data, show=sh_data.get('title'), show_id=sh_data.get('trakt'))