Skip to content

Commit 2618257

Browse files
committed
Refactor all mixins into separate module and files
1 parent a2cebef commit 2618257

File tree

12 files changed

+1604
-1512
lines changed

12 files changed

+1604
-1512
lines changed

plexapi/mixins.py

Lines changed: 0 additions & 1512 deletions
This file was deleted.

plexapi/mixins/__init__.py

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
PlexAPI Mixins Module
4+
5+
This module contains mixins for Plex objects.
6+
"""
7+
8+
from .advanced_settings import AdvancedSettingsMixin
9+
from .edit import (
10+
AddedAtMixin, AudienceRatingMixin, CollectionMixin, ContentRatingMixin,
11+
CountryMixin, CriticRatingMixin, DirectorMixin, EditionTitleMixin,
12+
EditFieldMixin, EditTagsMixin, GenreMixin, LabelMixin, MoodMixin,
13+
OriginallyAvailableMixin, OriginalTitleMixin, PhotoCapturedTimeMixin,
14+
ProducerMixin, SimilarArtistMixin, SortTitleMixin, StudioMixin,
15+
StyleMixin, SummaryMixin, TaglineMixin, TagMixin, TitleMixin,
16+
TrackArtistMixin, TrackDiscNumberMixin, TrackNumberMixin,
17+
UserRatingMixin, WriterMixin
18+
)
19+
from .objects import ExtrasMixin, HubsMixin
20+
from .played_unplayed import PlayedUnplayedMixin
21+
from .rating import RatingMixin
22+
from .resources import (
23+
ArtLockMixin, ArtMixin, ArtUrlMixin,
24+
LogoLockMixin, LogoMixin, LogoUrlMixin,
25+
PosterLockMixin, PosterMixin, PosterUrlMixin,
26+
SquareArtLockMixin, SquareArtMixin, SquareArtUrlMixin,
27+
ThemeLockMixin, ThemeMixin, ThemeUrlMixin
28+
)
29+
from .smart_filter import SmartFilterMixin
30+
from .split_merge import SplitMergeMixin
31+
from .unmatch_match import UnmatchMatchMixin
32+
from .watchlist import WatchlistMixin
33+
34+
35+
class MovieEditMixins(
36+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
37+
AddedAtMixin, AudienceRatingMixin, ContentRatingMixin, CriticRatingMixin, EditionTitleMixin,
38+
OriginallyAvailableMixin, OriginalTitleMixin, SortTitleMixin,
39+
StudioMixin, SummaryMixin, TaglineMixin, TitleMixin, UserRatingMixin,
40+
CollectionMixin, CountryMixin, DirectorMixin, GenreMixin, LabelMixin, ProducerMixin, WriterMixin
41+
):
42+
pass
43+
44+
45+
class ShowEditMixins(
46+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
47+
AddedAtMixin, AudienceRatingMixin, ContentRatingMixin, CriticRatingMixin,
48+
OriginallyAvailableMixin, OriginalTitleMixin, SortTitleMixin, StudioMixin,
49+
SummaryMixin, TaglineMixin, TitleMixin, UserRatingMixin,
50+
CollectionMixin, GenreMixin, LabelMixin,
51+
):
52+
pass
53+
54+
55+
class SeasonEditMixins(
56+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
57+
AddedAtMixin, AudienceRatingMixin, CriticRatingMixin,
58+
SummaryMixin, TitleMixin, UserRatingMixin,
59+
CollectionMixin, LabelMixin
60+
):
61+
pass
62+
63+
64+
class EpisodeEditMixins(
65+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
66+
AddedAtMixin, AudienceRatingMixin, ContentRatingMixin, CriticRatingMixin,
67+
OriginallyAvailableMixin, SortTitleMixin, SummaryMixin, TitleMixin, UserRatingMixin,
68+
CollectionMixin, DirectorMixin, LabelMixin, WriterMixin
69+
):
70+
pass
71+
72+
73+
class ArtistEditMixins(
74+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
75+
AddedAtMixin, AudienceRatingMixin, CriticRatingMixin,
76+
SortTitleMixin, SummaryMixin, TitleMixin, UserRatingMixin,
77+
CollectionMixin, CountryMixin, GenreMixin, LabelMixin, MoodMixin, SimilarArtistMixin, StyleMixin
78+
):
79+
pass
80+
81+
82+
class AlbumEditMixins(
83+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
84+
AddedAtMixin, AudienceRatingMixin, CriticRatingMixin,
85+
OriginallyAvailableMixin, SortTitleMixin, StudioMixin, SummaryMixin, TitleMixin, UserRatingMixin,
86+
CollectionMixin, GenreMixin, LabelMixin, MoodMixin, StyleMixin
87+
):
88+
pass
89+
90+
91+
class TrackEditMixins(
92+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
93+
AddedAtMixin, AudienceRatingMixin, CriticRatingMixin,
94+
TitleMixin, TrackArtistMixin, TrackNumberMixin, TrackDiscNumberMixin, UserRatingMixin,
95+
CollectionMixin, GenreMixin, LabelMixin, MoodMixin
96+
):
97+
pass
98+
99+
100+
class PhotoalbumEditMixins(
101+
ArtLockMixin, PosterLockMixin,
102+
AddedAtMixin, SortTitleMixin, SummaryMixin, TitleMixin, UserRatingMixin
103+
):
104+
pass
105+
106+
107+
class PhotoEditMixins(
108+
ArtLockMixin, PosterLockMixin,
109+
AddedAtMixin, PhotoCapturedTimeMixin, SortTitleMixin, SummaryMixin, TitleMixin, UserRatingMixin,
110+
TagMixin
111+
):
112+
pass
113+
114+
115+
class CollectionEditMixins(
116+
ArtLockMixin, PosterLockMixin, ThemeLockMixin,
117+
AddedAtMixin, AudienceRatingMixin, ContentRatingMixin, CriticRatingMixin,
118+
SortTitleMixin, SummaryMixin, TitleMixin, UserRatingMixin,
119+
LabelMixin
120+
):
121+
pass
122+
123+
124+
class PlaylistEditMixins(
125+
ArtLockMixin, PosterLockMixin,
126+
SortTitleMixin, SummaryMixin, TitleMixin
127+
):
128+
pass
129+
130+
131+
class MovieMixins(
132+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
133+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeMixin,
134+
MovieEditMixins,
135+
WatchlistMixin
136+
):
137+
pass
138+
139+
140+
class ShowMixins(
141+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
142+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeMixin,
143+
ShowEditMixins,
144+
WatchlistMixin
145+
):
146+
pass
147+
148+
149+
class SeasonMixins(
150+
AdvancedSettingsMixin, ExtrasMixin, RatingMixin,
151+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeUrlMixin,
152+
SeasonEditMixins
153+
):
154+
pass
155+
156+
157+
class EpisodeMixins(
158+
ExtrasMixin, RatingMixin,
159+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeUrlMixin,
160+
EpisodeEditMixins
161+
):
162+
pass
163+
164+
165+
class ClipMixins(
166+
ArtUrlMixin, LogoUrlMixin, PosterUrlMixin, SquareArtUrlMixin
167+
):
168+
pass
169+
170+
171+
class ArtistMixins(
172+
AdvancedSettingsMixin, SplitMergeMixin, UnmatchMatchMixin, ExtrasMixin, HubsMixin, RatingMixin,
173+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeMixin,
174+
ArtistEditMixins
175+
):
176+
pass
177+
178+
179+
class AlbumMixins(
180+
SplitMergeMixin, UnmatchMatchMixin, RatingMixin,
181+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeUrlMixin,
182+
AlbumEditMixins
183+
):
184+
pass
185+
186+
187+
class TrackMixins(
188+
ExtrasMixin, RatingMixin,
189+
ArtUrlMixin, LogoUrlMixin, PosterUrlMixin, SquareArtUrlMixin, ThemeUrlMixin,
190+
TrackEditMixins
191+
):
192+
pass
193+
194+
195+
class PhotoalbumMixins(
196+
RatingMixin,
197+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin,
198+
PhotoalbumEditMixins
199+
):
200+
pass
201+
202+
203+
class PhotoMixins(
204+
RatingMixin,
205+
ArtUrlMixin, LogoUrlMixin, PosterUrlMixin, SquareArtUrlMixin,
206+
PhotoEditMixins
207+
):
208+
pass
209+
210+
211+
class CollectionMixins(
212+
AdvancedSettingsMixin, SmartFilterMixin, HubsMixin, RatingMixin,
213+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin, ThemeMixin,
214+
CollectionEditMixins
215+
):
216+
pass
217+
218+
219+
class PlaylistMixins(
220+
SmartFilterMixin,
221+
ArtMixin, LogoMixin, PosterMixin, SquareArtMixin,
222+
PlaylistEditMixins
223+
):
224+
pass
225+
226+
227+
__all__ = [
228+
# Advanced settings
229+
'AdvancedSettingsMixin',
230+
# Edit mixins
231+
'AddedAtMixin', 'AudienceRatingMixin', 'CollectionMixin', 'ContentRatingMixin',
232+
'CountryMixin', 'CriticRatingMixin', 'DirectorMixin', 'EditionTitleMixin',
233+
'EditFieldMixin', 'EditTagsMixin', 'GenreMixin', 'LabelMixin', 'MoodMixin',
234+
'OriginallyAvailableMixin', 'OriginalTitleMixin', 'PhotoCapturedTimeMixin',
235+
'ProducerMixin', 'SimilarArtistMixin', 'SortTitleMixin', 'StudioMixin',
236+
'StyleMixin', 'SummaryMixin', 'TaglineMixin', 'TagMixin', 'TitleMixin',
237+
'TrackArtistMixin', 'TrackDiscNumberMixin', 'TrackNumberMixin',
238+
'UserRatingMixin', 'WriterMixin',
239+
# Objects
240+
'ExtrasMixin', 'HubsMixin',
241+
# Played/Unplayed
242+
'PlayedUnplayedMixin',
243+
# Rating
244+
'RatingMixin',
245+
# Resource mixins
246+
'ArtLockMixin', 'ArtMixin', 'ArtUrlMixin',
247+
'LogoLockMixin', 'LogoMixin', 'LogoUrlMixin',
248+
'PosterLockMixin', 'PosterMixin', 'PosterUrlMixin',
249+
'SquareArtLockMixin', 'SquareArtMixin', 'SquareArtUrlMixin',
250+
'ThemeLockMixin', 'ThemeMixin', 'ThemeUrlMixin',
251+
# Smart Filter
252+
'SmartFilterMixin',
253+
# Split/Merge
254+
'SplitMergeMixin',
255+
# Unmatch/Match
256+
'UnmatchMatchMixin',
257+
# Watchlist
258+
'WatchlistMixin',
259+
# Composite Edit Mixins
260+
'AlbumEditMixins', 'ArtistEditMixins', 'CollectionEditMixins', 'EpisodeEditMixins',
261+
'MovieEditMixins', 'PhotoEditMixins', 'PhotoalbumEditMixins', 'PlaylistEditMixins',
262+
'SeasonEditMixins', 'ShowEditMixins', 'TrackEditMixins',
263+
# Composite Mixins
264+
'AlbumMixins', 'ArtistMixins', 'ClipMixins', 'CollectionMixins', 'EpisodeMixins',
265+
'MovieMixins', 'PhotoMixins', 'PhotoalbumMixins', 'PlaylistMixins',
266+
'SeasonMixins', 'ShowMixins', 'TrackMixins',
267+
]
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# -*- coding: utf-8 -*-
2+
from urllib.parse import urlencode
3+
4+
from plexapi import settings
5+
from plexapi.exceptions import NotFound
6+
7+
8+
class AdvancedSettingsMixin:
9+
""" Mixin for Plex objects that can have advanced settings. """
10+
11+
def preferences(self):
12+
""" Returns a list of :class:`~plexapi.settings.Preferences` objects. """
13+
key = f'{self.key}?includePreferences=1'
14+
return self.fetchItems(key, cls=settings.Preferences, rtag='Preferences')
15+
16+
def preference(self, pref):
17+
""" Returns a :class:`~plexapi.settings.Preferences` object for the specified pref.
18+
19+
Parameters:
20+
pref (str): The id of the preference to return.
21+
"""
22+
prefs = self.preferences()
23+
try:
24+
return next(p for p in prefs if p.id == pref)
25+
except StopIteration:
26+
availablePrefs = [p.id for p in prefs]
27+
raise NotFound(f'Unknown preference "{pref}" for {self.TYPE}. '
28+
f'Available preferences: {availablePrefs}') from None
29+
30+
def editAdvanced(self, **kwargs):
31+
""" Edit a Plex object's advanced settings. """
32+
data = {}
33+
key = f'{self.key}/prefs?'
34+
preferences = {pref.id: pref for pref in self.preferences() if pref.enumValues}
35+
for settingID, value in kwargs.items():
36+
try:
37+
pref = preferences[settingID]
38+
except KeyError:
39+
raise NotFound(f'{value} not found in {list(preferences.keys())}')
40+
41+
enumValues = pref.enumValues
42+
if enumValues.get(value, enumValues.get(str(value))):
43+
data[settingID] = value
44+
else:
45+
raise NotFound(f'{value} not found in {list(enumValues)}')
46+
url = key + urlencode(data)
47+
self._server.query(url, method=self._server._session.put)
48+
return self
49+
50+
def defaultAdvanced(self):
51+
""" Edit all of a Plex object's advanced settings to default. """
52+
data = {}
53+
key = f'{self.key}/prefs?'
54+
for preference in self.preferences():
55+
data[preference.id] = preference.default
56+
url = key + urlencode(data)
57+
self._server.query(url, method=self._server._session.put)
58+
return self

0 commit comments

Comments
 (0)