Skip to content

Commit 570742c

Browse files
Support for Artist radio stations (#870)
* Initial support of artist radio stations * Fix docstring * Change to a singular optional station * Change to a property * Revert property * Explicitly set librarySectionID Co-authored-by: JonnyWong16 <[email protected]> Co-authored-by: JonnyWong16 <[email protected]>
1 parent 0620eb4 commit 570742c

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

plexapi/audio.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from plexapi.mixins import AdvancedSettingsMixin, ArtUrlMixin, ArtMixin, PosterUrlMixin, PosterMixin
99
from plexapi.mixins import RatingMixin, SplitMergeMixin, UnmatchMatchMixin
1010
from plexapi.mixins import CollectionMixin, CountryMixin, GenreMixin, LabelMixin, MoodMixin, SimilarArtistMixin, StyleMixin
11+
from plexapi.playlist import Playlist
1112

1213

1314
class Audio(PlexPartialObject):
@@ -222,6 +223,11 @@ def download(self, savepath=None, keep_original_name=False, subfolders=False, **
222223
filepaths += track.download(_savepath, keep_original_name, **kwargs)
223224
return filepaths
224225

226+
def station(self):
227+
""" Returns a :class:`~plexapi.playlist.Playlist` artist radio station or `None`. """
228+
key = '%s?includeStations=1' % self.key
229+
return next(iter(self.fetchItems(key, cls=Playlist, rtag="Stations")), None)
230+
225231

226232
@utils.registerPlexObject
227233
class Album(Audio, ArtMixin, PosterMixin, RatingMixin, UnmatchMatchMixin,

plexapi/playlist.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ class Playlist(PlexPartialObject, Playable, ArtMixin, PosterMixin, SmartFilterMi
2929
icon (str): Icon URI string for smart playlists.
3030
key (str): API URL (/playlist/<ratingkey>).
3131
leafCount (int): Number of items in the playlist view.
32+
librarySectionID (int): Library section identifier (radio only)
33+
librarySectionKey (str): Library section key (radio only)
34+
librarySectionTitle (str): Library section title (radio only)
3235
playlistType (str): 'audio', 'video', or 'photo'
36+
radio (bool): If this playlist represents a radio station
3337
ratingKey (int): Unique key identifying the playlist.
3438
smart (bool): True if the playlist is a smart playlist.
3539
summary (str): Summary of the playlist.
@@ -54,7 +58,11 @@ def _loadData(self, data):
5458
self.icon = data.attrib.get('icon')
5559
self.key = data.attrib.get('key', '').replace('/items', '') # FIX_BUG_50
5660
self.leafCount = utils.cast(int, data.attrib.get('leafCount'))
61+
self.librarySectionID = utils.cast(int, data.attrib.get('librarySectionID'))
62+
self.librarySectionKey = data.attrib.get('librarySectionKey')
63+
self.librarySectionTitle = data.attrib.get('librarySectionTitle')
5764
self.playlistType = data.attrib.get('playlistType')
65+
self.radio = utils.cast(bool, data.attrib.get('radio', 0))
5866
self.ratingKey = utils.cast(int, data.attrib.get('ratingKey'))
5967
self.smart = utils.cast(bool, data.attrib.get('smart'))
6068
self.summary = data.attrib.get('summary')
@@ -169,6 +177,8 @@ def item(self, title):
169177

170178
def items(self):
171179
""" Returns a list of all items in the playlist. """
180+
if self.radio:
181+
return []
172182
if self._items is None:
173183
key = '%s/items' % self.key
174184
items = self.fetchItems(key)

plexapi/playqueue.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,11 @@ def create(
175175
args["uri"] = "library:///directory/{uri_args}".format(uri_args=uri_args)
176176
args["type"] = items[0].listType
177177
elif items.type == "playlist":
178-
args["playlistID"] = items.ratingKey
179178
args["type"] = items.playlistType
179+
if items.radio:
180+
args["uri"] = f"server://{server.machineIdentifier}/{server.library.identifier}{items.key}"
181+
else:
182+
args["playlistID"] = items.ratingKey
180183
else:
181184
uuid = items.section().uuid
182185
args["type"] = items.listType

0 commit comments

Comments
 (0)