Skip to content

Commit f533cb7

Browse files
authored
Merge pull request #203 from pkkid/dunder
Dunders
2 parents 6a4f777 + f3a0a8f commit f533cb7

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

plexapi/audio.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ def _loadData(self, data):
7878
self.similar = self.findItems(data, media.Similar)
7979
self.collections = self.findItems(data, media.Collection)
8080

81+
def __iter__(self):
82+
for album in self.albums():
83+
yield album
84+
8185
def album(self, title):
8286
""" Returns the :class:`~plexapi.audio.Album` that matches the specified title.
8387
@@ -151,6 +155,10 @@ class Album(Audio):
151155
TAG = 'Directory'
152156
TYPE = 'album'
153157

158+
def __iter__(self):
159+
for track in self.tracks:
160+
yield track
161+
154162
def _loadData(self, data):
155163
""" Load attribute values from Plex XML response. """
156164
Audio._loadData(self, data)

plexapi/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,12 @@ class PlexPartialObject(PlexObject):
269269
def __eq__(self, other):
270270
return other is not None and self.key == other.key
271271

272+
def __hash__(self):
273+
return hash(repr(self))
274+
275+
def __iter__(self):
276+
yield self
277+
272278
def __getattribute__(self, attr):
273279
# Dragons inside.. :-/
274280
value = utils.getattributeOrNone(PlexPartialObject, self, attr)

plexapi/playlist.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,24 @@ def _loadData(self, data):
3232
self.title = data.attrib.get('title')
3333
self.type = data.attrib.get('type')
3434
self.updatedAt = toDatetime(data.attrib.get('updatedAt'))
35+
self._items = None # cache for self.items
36+
37+
def __len__(self):
38+
return len(self.items())
39+
40+
def __contains__(self, other):
41+
return any(i.key == other.key for i in self.items())
42+
43+
def __getitem__(self, key):
44+
return self.items()[key]
3545

3646
def items(self):
3747
""" Returns a list of all items in the playlist. """
38-
key = '%s/items' % self.key
39-
return self.fetchItems(key)
48+
if self._items is None:
49+
key = '%s/items' % self.key
50+
items = self.fetchItems(key)
51+
self._items = items
52+
return self._items
4053

4154
def addItems(self, items):
4255
""" Add items to a playlist. """
@@ -53,24 +66,32 @@ def addItems(self, items):
5366
key = '%s/items%s' % (self.key, utils.joinArgs({
5467
'uri': 'library://%s/directory//library/metadata/%s' % (uuid, ratingKeys)
5568
}))
56-
return self._server.query(key, method=self._server._session.put)
69+
result = self._server.query(key, method=self._server._session.put)
70+
self.reload()
71+
return result
5772

5873
def removeItem(self, item):
5974
""" Remove a file from a playlist. """
6075
key = '%s/items/%s' % (self.key, item.playlistItemID)
61-
return self._server.query(key, method=self._server._session.delete)
76+
result = self._server.query(key, method=self._server._session.delete)
77+
self.reload()
78+
return result
6279

6380
def moveItem(self, item, after=None):
6481
""" Move a to a new position in playlist. """
6582
key = '%s/items/%s/move' % (self.key, item.playlistItemID)
6683
if after:
6784
key += '?after=%s' % after.playlistItemID
68-
return self._server.query(key, method=self._server._session.put)
85+
result = self._server.query(key, method=self._server._session.put)
86+
self.reload()
87+
return result
6988

7089
def edit(self, title=None, summary=None):
7190
""" Edit playlist. """
7291
key = '/library/metadata/%s%s' % (self.ratingKey, utils.joinArgs({'title': title, 'summary': summary}))
73-
return self._server.query(key, method=self._server._session.put)
92+
result = self._server.query(key, method=self._server._session.put)
93+
self.reload()
94+
return result
7495

7596
def delete(self):
7697
""" Delete playlist. """

plexapi/video.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class Video(PlexPartialObject):
2424
updatedAt (datatime): Datetime this item was updated.
2525
viewCount (int): Count of times this item was accessed.
2626
"""
27+
2728
def _loadData(self, data):
2829
""" Load attribute values from Plex XML response. """
2930
self._data = data
@@ -214,6 +215,10 @@ class Show(Video):
214215
TAG = 'Directory'
215216
TYPE = 'show'
216217

218+
def __iter__(self):
219+
for season in self.seasons():
220+
yield season
221+
217222
def _loadData(self, data):
218223
""" Load attribute values from Plex XML response. """
219224
Video._loadData(self, data)
@@ -335,6 +340,10 @@ class Season(Video):
335340
TAG = 'Directory'
336341
TYPE = 'season'
337342

343+
def __iter__(self):
344+
for episode in self.episodes():
345+
yield episode
346+
338347
def _loadData(self, data):
339348
""" Load attribute values from Plex XML response. """
340349
Video._loadData(self, data)

tests/test_server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ def test_server_account(plex):
233233
assert account.signInState == 'ok'
234234
assert isinstance(account.subscriptionActive, bool)
235235
if account.subscriptionActive: assert len(account.subscriptionFeatures)
236-
else: assert sorted(account.subscriptionFeatures) == ['download_certificates', 'federated-auth', 'news']
236+
else: assert sorted(account.subscriptionFeatures) == ['adaptive_bitrate', 'download_certificates',
237+
'federated-auth', 'news']
237238
assert account.subscriptionState == 'Active' if account.subscriptionActive else 'Unknown'
238239
assert re.match(utils.REGEX_EMAIL, account.username)
239240

0 commit comments

Comments
 (0)