Skip to content

Commit 3e57c9b

Browse files
authored
Add extras and hubs mixins (#890)
1 parent 870ba66 commit 3e57c9b

File tree

4 files changed

+32
-32
lines changed

4 files changed

+32
-32
lines changed

plexapi/audio.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
import os
33
from urllib.parse import quote_plus
44

5-
from plexapi import library, media, utils
5+
from plexapi import media, utils
66
from plexapi.base import Playable, PlexPartialObject
77
from plexapi.exceptions import BadRequest
88
from plexapi.mixins import (
9-
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
9+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
1010
ArtUrlMixin, ArtMixin, PosterUrlMixin, PosterMixin, ThemeMixin, ThemeUrlMixin,
1111
OriginallyAvailableMixin, SortTitleMixin, StudioMixin, SummaryMixin, TitleMixin,
1212
TrackArtistMixin, TrackDiscNumberMixin, TrackNumberMixin,
@@ -131,7 +131,7 @@ def sync(self, bitrate, client=None, clientId=None, limit=None, title=None):
131131
@utils.registerPlexObject
132132
class Artist(
133133
Audio,
134-
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
134+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
135135
ArtMixin, PosterMixin, ThemeMixin,
136136
SortTitleMixin, SummaryMixin, TitleMixin,
137137
CollectionMixin, CountryMixin, GenreMixin, LabelMixin, MoodMixin, SimilarArtistMixin, StyleMixin
@@ -174,11 +174,6 @@ def __iter__(self):
174174
for album in self.albums():
175175
yield album
176176

177-
def hubs(self):
178-
""" Returns a list of :class:`~plexapi.library.Hub` objects. """
179-
data = self._server.query(self._details_key)
180-
return self.findItems(data, library.Hub, rtag='Related')
181-
182177
def album(self, title):
183178
""" Returns the :class:`~plexapi.audio.Album` that matches the specified title.
184179
@@ -359,7 +354,7 @@ def _defaultSyncTitle(self):
359354
@utils.registerPlexObject
360355
class Track(
361356
Audio, Playable,
362-
RatingMixin,
357+
ExtrasMixin, RatingMixin,
363358
ArtUrlMixin, PosterUrlMixin, ThemeUrlMixin,
364359
TitleMixin, TrackArtistMixin, TrackNumberMixin, TrackDiscNumberMixin,
365360
CollectionMixin, LabelMixin, MoodMixin

plexapi/collection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from plexapi.exceptions import BadRequest, NotFound, Unsupported
77
from plexapi.library import LibrarySection
88
from plexapi.mixins import (
9-
AdvancedSettingsMixin, SmartFilterMixin, RatingMixin,
9+
AdvancedSettingsMixin, SmartFilterMixin, HubsMixin, RatingMixin,
1010
ArtMixin, PosterMixin, ThemeMixin,
1111
ContentRatingMixin, SortTitleMixin, SummaryMixin, TitleMixin,
1212
LabelMixin
@@ -18,7 +18,7 @@
1818
@utils.registerPlexObject
1919
class Collection(
2020
PlexPartialObject,
21-
AdvancedSettingsMixin, SmartFilterMixin, RatingMixin,
21+
AdvancedSettingsMixin, SmartFilterMixin, HubsMixin, RatingMixin,
2222
ArtMixin, PosterMixin, ThemeMixin,
2323
ContentRatingMixin, SortTitleMixin, SummaryMixin, TitleMixin,
2424
LabelMixin

plexapi/mixins.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,26 @@ def fixMatch(self, searchResult=None, auto=False, agent=None):
234234
self._server.query(data, method=self._server._session.put)
235235

236236

237+
class ExtrasMixin(object):
238+
""" Mixin for Plex objects that can have extras. """
239+
240+
def extras(self):
241+
""" Returns a list of :class:`~plexapi.video.Extra` objects. """
242+
from plexapi.video import Extra
243+
data = self._server.query(self._details_key)
244+
return self.findItems(data, Extra, rtag='Extras')
245+
246+
247+
class HubsMixin(object):
248+
""" Mixin for Plex objects that can have related hubs. """
249+
250+
def hubs(self):
251+
""" Returns a list of :class:`~plexapi.library.Hub` objects. """
252+
from plexapi.library import Hub
253+
data = self._server.query(self._details_key)
254+
return self.findItems(data, Hub, rtag='Related')
255+
256+
237257
class RatingMixin(object):
238258
""" Mixin for Plex objects that can have user star ratings. """
239259

plexapi/video.py

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
import os
33
from urllib.parse import quote_plus, urlencode
44

5-
from plexapi import library, media, utils
5+
from plexapi import media, utils
66
from plexapi.base import Playable, PlexPartialObject
77
from plexapi.exceptions import BadRequest
88
from plexapi.mixins import (
9-
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
9+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
1010
ArtUrlMixin, ArtMixin, BannerMixin, PosterUrlMixin, PosterMixin, ThemeUrlMixin, ThemeMixin,
1111
ContentRatingMixin, OriginallyAvailableMixin, OriginalTitleMixin, SortTitleMixin, StudioMixin,
1212
SummaryMixin, TaglineMixin, TitleMixin,
@@ -267,7 +267,7 @@ def sync(self, videoQuality, client=None, clientId=None, limit=None, unwatched=F
267267
@utils.registerPlexObject
268268
class Movie(
269269
Video, Playable,
270-
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
270+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
271271
ArtMixin, PosterMixin, ThemeMixin,
272272
ContentRatingMixin, OriginallyAvailableMixin, OriginalTitleMixin, SortTitleMixin, StudioMixin,
273273
SummaryMixin, TaglineMixin, TitleMixin,
@@ -377,21 +377,11 @@ def reviews(self):
377377
data = self._server.query(self._details_key)
378378
return self.findItems(data, media.Review, rtag='Video')
379379

380-
def extras(self):
381-
""" Returns a list of :class:`~plexapi.video.Extra` objects. """
382-
data = self._server.query(self._details_key)
383-
return self.findItems(data, Extra, rtag='Extras')
384-
385-
def hubs(self):
386-
""" Returns a list of :class:`~plexapi.library.Hub` objects. """
387-
data = self._server.query(self._details_key)
388-
return self.findItems(data, library.Hub, rtag='Related')
389-
390380

391381
@utils.registerPlexObject
392382
class Show(
393383
Video,
394-
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
384+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
395385
ArtMixin, BannerMixin, PosterMixin, ThemeMixin,
396386
ContentRatingMixin, OriginallyAvailableMixin, OriginalTitleMixin, SortTitleMixin, StudioMixin,
397387
SummaryMixin, TaglineMixin, TitleMixin,
@@ -501,11 +491,6 @@ def isWatched(self):
501491
""" Returns True if the show is fully watched. """
502492
return bool(self.viewedLeafCount == self.leafCount)
503493

504-
def hubs(self):
505-
""" Returns a list of :class:`~plexapi.library.Hub` objects. """
506-
data = self._server.query(self._details_key)
507-
return self.findItems(data, library.Hub, rtag='Related')
508-
509494
def onDeck(self):
510495
""" Returns show's On Deck :class:`~plexapi.video.Video` object or `None`.
511496
If show is unwatched, return will likely be the first episode.
@@ -594,7 +579,7 @@ def download(self, savepath=None, keep_original_name=False, subfolders=False, **
594579
@utils.registerPlexObject
595580
class Season(
596581
Video,
597-
RatingMixin,
582+
ExtrasMixin, RatingMixin,
598583
ArtMixin, PosterMixin, ThemeUrlMixin,
599584
SummaryMixin, TitleMixin,
600585
CollectionMixin, LabelMixin
@@ -737,7 +722,7 @@ def _defaultSyncTitle(self):
737722
@utils.registerPlexObject
738723
class Episode(
739724
Video, Playable,
740-
RatingMixin,
725+
ExtrasMixin, RatingMixin,
741726
ArtMixin, PosterMixin, ThemeUrlMixin,
742727
ContentRatingMixin, OriginallyAvailableMixin, SortTitleMixin, SummaryMixin, TitleMixin,
743728
CollectionMixin, DirectorMixin, LabelMixin, WriterMixin

0 commit comments

Comments
 (0)