mirror of
https://github.com/pkkid/python-plexapi
synced 2024-11-21 19:23:05 +00:00
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
This commit is contained in:
parent
47f11f04eb
commit
556b4b3da4
3 changed files with 26 additions and 5 deletions
|
@ -1223,3 +1223,10 @@ class CollectionEditMixins(
|
||||||
LabelMixin
|
LabelMixin
|
||||||
):
|
):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class PlaylistEditMixins(
|
||||||
|
ArtLockMixin, PosterLockMixin,
|
||||||
|
SortTitleMixin, SummaryMixin, TitleMixin
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
|
@ -7,7 +7,7 @@ from plexapi import media, utils
|
||||||
from plexapi.base import Playable, PlexPartialObject
|
from plexapi.base import Playable, PlexPartialObject
|
||||||
from plexapi.exceptions import BadRequest, NotFound, Unsupported
|
from plexapi.exceptions import BadRequest, NotFound, Unsupported
|
||||||
from plexapi.library import LibrarySection, MusicSection
|
from plexapi.library import LibrarySection, MusicSection
|
||||||
from plexapi.mixins import SmartFilterMixin, ArtMixin, PosterMixin
|
from plexapi.mixins import SmartFilterMixin, ArtMixin, PosterMixin, PlaylistEditMixins
|
||||||
from plexapi.utils import deprecated
|
from plexapi.utils import deprecated
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,7 +15,8 @@ from plexapi.utils import deprecated
|
||||||
class Playlist(
|
class Playlist(
|
||||||
PlexPartialObject, Playable,
|
PlexPartialObject, Playable,
|
||||||
SmartFilterMixin,
|
SmartFilterMixin,
|
||||||
ArtMixin, PosterMixin
|
ArtMixin, PosterMixin,
|
||||||
|
PlaylistEditMixins
|
||||||
):
|
):
|
||||||
""" Represents a single Playlist.
|
""" Represents a single Playlist.
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ class Playlist(
|
||||||
smart (bool): True if the playlist is a smart playlist.
|
smart (bool): True if the playlist is a smart playlist.
|
||||||
summary (str): Summary of the playlist.
|
summary (str): Summary of the playlist.
|
||||||
title (str): Name of the playlist.
|
title (str): Name of the playlist.
|
||||||
|
titleSort (str): Title to use when sorting (defaults to title).
|
||||||
type (str): 'playlist'
|
type (str): 'playlist'
|
||||||
updatedAt (datetime): Datetime the playlist was updated.
|
updatedAt (datetime): Datetime the playlist was updated.
|
||||||
"""
|
"""
|
||||||
|
@ -71,6 +73,7 @@ class Playlist(
|
||||||
self.smart = utils.cast(bool, data.attrib.get('smart'))
|
self.smart = utils.cast(bool, data.attrib.get('smart'))
|
||||||
self.summary = data.attrib.get('summary')
|
self.summary = data.attrib.get('summary')
|
||||||
self.title = data.attrib.get('title')
|
self.title = data.attrib.get('title')
|
||||||
|
self.titleSort = data.attrib.get('titleSort', self.title)
|
||||||
self.type = data.attrib.get('type')
|
self.type = data.attrib.get('type')
|
||||||
self.updatedAt = utils.toDatetime(data.attrib.get('updatedAt'))
|
self.updatedAt = utils.toDatetime(data.attrib.get('updatedAt'))
|
||||||
self._items = None # cache for self.items
|
self._items = None # cache for self.items
|
||||||
|
@ -224,7 +227,7 @@ class Playlist(
|
||||||
self._server.query(key, method=self._server._session.put)
|
self._server.query(key, method=self._server._session.put)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@deprecated('use "removeItems" instead', stacklevel=3)
|
@deprecated('use "removeItems" instead')
|
||||||
def removeItem(self, item):
|
def removeItem(self, item):
|
||||||
self.removeItems(item)
|
self.removeItems(item)
|
||||||
|
|
||||||
|
@ -308,10 +311,15 @@ class Playlist(
|
||||||
|
|
||||||
def _edit(self, **kwargs):
|
def _edit(self, **kwargs):
|
||||||
""" Actually edit the playlist. """
|
""" Actually edit the playlist. """
|
||||||
|
if isinstance(self._edits, dict):
|
||||||
|
self._edits.update(kwargs)
|
||||||
|
return self
|
||||||
|
|
||||||
key = f'{self.key}{utils.joinArgs(kwargs)}'
|
key = f'{self.key}{utils.joinArgs(kwargs)}'
|
||||||
self._server.query(key, method=self._server._session.put)
|
self._server.query(key, method=self._server._session.put)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
@deprecated('use "editTitle" and "editSummary" instead')
|
||||||
def edit(self, title=None, summary=None):
|
def edit(self, title=None, summary=None):
|
||||||
""" Edit the playlist.
|
""" Edit the playlist.
|
||||||
|
|
||||||
|
@ -384,7 +392,7 @@ class Playlist(
|
||||||
key = f"/playlists/upload{utils.joinArgs(args)}"
|
key = f"/playlists/upload{utils.joinArgs(args)}"
|
||||||
server.query(key, method=server._session.post)
|
server.query(key, method=server._session.post)
|
||||||
try:
|
try:
|
||||||
return server.playlists(sectionId=section.key, guid__endswith=m3ufilepath)[0].edit(title=title).reload()
|
return server.playlists(sectionId=section.key, guid__endswith=m3ufilepath)[0].editTitle(title).reload()
|
||||||
except IndexError:
|
except IndexError:
|
||||||
raise BadRequest('Failed to create playlist from m3u file.') from None
|
raise BadRequest('Failed to create playlist from m3u file.') from None
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ def test_Playlist_edit(plex, movie):
|
||||||
playlist = plex.createPlaylist(title, items=movie)
|
playlist = plex.createPlaylist(title, items=movie)
|
||||||
assert playlist.title == title
|
assert playlist.title == title
|
||||||
assert playlist.summary == ''
|
assert playlist.summary == ''
|
||||||
playlist.edit(title=new_title, summary=new_summary)
|
playlist.editTitle(new_title).editSummary(new_summary)
|
||||||
playlist.reload()
|
playlist.reload()
|
||||||
assert playlist.title == new_title
|
assert playlist.title == new_title
|
||||||
assert playlist.summary == new_summary
|
assert playlist.summary == new_summary
|
||||||
|
@ -330,3 +330,9 @@ def test_Playlist_mixins_images(playlist):
|
||||||
test_mixins.lock_poster(playlist)
|
test_mixins.lock_poster(playlist)
|
||||||
test_mixins.edit_art(playlist)
|
test_mixins.edit_art(playlist)
|
||||||
test_mixins.edit_poster(playlist)
|
test_mixins.edit_poster(playlist)
|
||||||
|
|
||||||
|
|
||||||
|
def test_Playlist_mixins_fields(playlist):
|
||||||
|
test_mixins.edit_sort_title(playlist)
|
||||||
|
test_mixins.edit_summary(playlist)
|
||||||
|
test_mixins.edit_title(playlist)
|
||||||
|
|
Loading…
Reference in a new issue