Skip to content

Commit 556b4b3

Browse files
authored
Use edit mixins for Playlists (#1284)
* Use mixins to edit playlists * Add titleSort attribute to Playlists * Update Playlists edit tests * Fix deprecation warning stacklevel * Fix edit title for m3u playlist
1 parent 47f11f0 commit 556b4b3

3 files changed

Lines changed: 26 additions & 5 deletions

File tree

plexapi/mixins.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,3 +1223,10 @@ class CollectionEditMixins(
12231223
LabelMixin
12241224
):
12251225
pass
1226+
1227+
1228+
class PlaylistEditMixins(
1229+
ArtLockMixin, PosterLockMixin,
1230+
SortTitleMixin, SummaryMixin, TitleMixin
1231+
):
1232+
pass

plexapi/playlist.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
from plexapi.base import Playable, PlexPartialObject
88
from plexapi.exceptions import BadRequest, NotFound, Unsupported
99
from plexapi.library import LibrarySection, MusicSection
10-
from plexapi.mixins import SmartFilterMixin, ArtMixin, PosterMixin
10+
from plexapi.mixins import SmartFilterMixin, ArtMixin, PosterMixin, PlaylistEditMixins
1111
from plexapi.utils import deprecated
1212

1313

1414
@utils.registerPlexObject
1515
class Playlist(
1616
PlexPartialObject, Playable,
1717
SmartFilterMixin,
18-
ArtMixin, PosterMixin
18+
ArtMixin, PosterMixin,
19+
PlaylistEditMixins
1920
):
2021
""" Represents a single Playlist.
2122
@@ -42,6 +43,7 @@ class Playlist(
4243
smart (bool): True if the playlist is a smart playlist.
4344
summary (str): Summary of the playlist.
4445
title (str): Name of the playlist.
46+
titleSort (str): Title to use when sorting (defaults to title).
4547
type (str): 'playlist'
4648
updatedAt (datetime): Datetime the playlist was updated.
4749
"""
@@ -71,6 +73,7 @@ def _loadData(self, data):
7173
self.smart = utils.cast(bool, data.attrib.get('smart'))
7274
self.summary = data.attrib.get('summary')
7375
self.title = data.attrib.get('title')
76+
self.titleSort = data.attrib.get('titleSort', self.title)
7477
self.type = data.attrib.get('type')
7578
self.updatedAt = utils.toDatetime(data.attrib.get('updatedAt'))
7679
self._items = None # cache for self.items
@@ -224,7 +227,7 @@ def addItems(self, items):
224227
self._server.query(key, method=self._server._session.put)
225228
return self
226229

227-
@deprecated('use "removeItems" instead', stacklevel=3)
230+
@deprecated('use "removeItems" instead')
228231
def removeItem(self, item):
229232
self.removeItems(item)
230233

@@ -308,10 +311,15 @@ def updateFilters(self, limit=None, sort=None, filters=None, **kwargs):
308311

309312
def _edit(self, **kwargs):
310313
""" Actually edit the playlist. """
314+
if isinstance(self._edits, dict):
315+
self._edits.update(kwargs)
316+
return self
317+
311318
key = f'{self.key}{utils.joinArgs(kwargs)}'
312319
self._server.query(key, method=self._server._session.put)
313320
return self
314321

322+
@deprecated('use "editTitle" and "editSummary" instead')
315323
def edit(self, title=None, summary=None):
316324
""" Edit the playlist.
317325
@@ -384,7 +392,7 @@ def _createFromM3U(cls, server, title, section, m3ufilepath):
384392
key = f"/playlists/upload{utils.joinArgs(args)}"
385393
server.query(key, method=server._session.post)
386394
try:
387-
return server.playlists(sectionId=section.key, guid__endswith=m3ufilepath)[0].edit(title=title).reload()
395+
return server.playlists(sectionId=section.key, guid__endswith=m3ufilepath)[0].editTitle(title).reload()
388396
except IndexError:
389397
raise BadRequest('Failed to create playlist from m3u file.') from None
390398

tests/test_playlist.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def test_Playlist_edit(plex, movie):
9494
playlist = plex.createPlaylist(title, items=movie)
9595
assert playlist.title == title
9696
assert playlist.summary == ''
97-
playlist.edit(title=new_title, summary=new_summary)
97+
playlist.editTitle(new_title).editSummary(new_summary)
9898
playlist.reload()
9999
assert playlist.title == new_title
100100
assert playlist.summary == new_summary
@@ -330,3 +330,9 @@ def test_Playlist_mixins_images(playlist):
330330
test_mixins.lock_poster(playlist)
331331
test_mixins.edit_art(playlist)
332332
test_mixins.edit_poster(playlist)
333+
334+
335+
def test_Playlist_mixins_fields(playlist):
336+
test_mixins.edit_sort_title(playlist)
337+
test_mixins.edit_summary(playlist)
338+
test_mixins.edit_title(playlist)

0 commit comments

Comments
 (0)