From d2c7feeaac3142a1c94fbac4eda2fe0b2cec3d39 Mon Sep 17 00:00:00 2001 From: Gabriel Stackhouse Date: Mon, 4 Feb 2019 13:45:49 -0600 Subject: [PATCH 1/6] Closes #334 - set default audio & subtitle stream --- plexapi/media.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/plexapi/media.py b/plexapi/media.py index e0519ef1..394f091f 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -124,6 +124,25 @@ class MediaPart(PlexObject): def subtitleStreams(self): """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects in this MediaPart. """ return [stream for stream in self.streams if stream.streamType == SubtitleStream.STREAMTYPE] + + def setDefaultAudioStream(self, id): + """ Set the default :class:`~plexapi.media.AudioStream` for this MediaPart. + + Parameters: + id (int): ID of the AudioStream to set + """ + key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, id) + self._server.query(key, method=self._server._session.put) + + def setDefaultSubtitleStream(self, id): + """ Set the default :class:`~plexapi.media.SubtitleStream` for this MediaPart. + + Parameters: + id (int): ID of the SubtitleStream to set (0 for no subtitles) + """ + key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, id) + self._server.query(key, method=self._server._session.put) + class MediaPartStream(PlexObject): From a554aec87248b74d4b43f1ebbaf4c3bebb6d0991 Mon Sep 17 00:00:00 2001 From: Gabriel Stackhouse Date: Mon, 4 Feb 2019 13:52:16 -0600 Subject: [PATCH 2/6] Removed a space --- plexapi/media.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plexapi/media.py b/plexapi/media.py index 394f091f..e4af9a11 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -144,7 +144,6 @@ class MediaPart(PlexObject): self._server.query(key, method=self._server._session.put) - class MediaPartStream(PlexObject): """ Base class for media streams. These consist of video, audio and subtitles. From 1c95e7165c50b848b8253cb1feacbf2f28373d4a Mon Sep 17 00:00:00 2001 From: gstacks13 Date: Mon, 4 Feb 2019 16:28:30 -0600 Subject: [PATCH 3/6] Pass either stream or stream.id --- plexapi/media.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/plexapi/media.py b/plexapi/media.py index e4af9a11..420c7949 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -125,22 +125,42 @@ class MediaPart(PlexObject): """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects in this MediaPart. """ return [stream for stream in self.streams if stream.streamType == SubtitleStream.STREAMTYPE] - def setDefaultAudioStream(self, id): + def setDefaultAudioStream(self, stream=None, streamID=None): """ Set the default :class:`~plexapi.media.AudioStream` for this MediaPart. Parameters: - id (int): ID of the AudioStream to set + stream (:class:`~plexapi.media.AudioStream`): AudioStream to set as default + (default:None; required if streamID is not specified). + streamID (int): ID of the AudioStream to set + (default:None; required if stream is not specified). + + Raises: + :class:`plexapi.exceptions.BadRequest`: If both stream and streamID are missing. """ - key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, id) + if stream: + key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, stream.id) + elif streamID: + key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, streamID) + else: + raise BadRequest('Missing argument: stream or streamID is required') self._server.query(key, method=self._server._session.put) - - def setDefaultSubtitleStream(self, id): + + def setDefaultSubtitleStream(self, stream=None, streamID=None): """ Set the default :class:`~plexapi.media.SubtitleStream` for this MediaPart. + (Note: pass no parameters to disable subtitles) Parameters: - id (int): ID of the SubtitleStream to set (0 for no subtitles) + stream (:class:`~plexapi.media.SubtitleStream`): SubtitleStream to set as default + (default:None). + streamID (int): ID of the AudioStream to set + (default:None). """ - key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, id) + if stream: + key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, stream.id) + elif streamID: + key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, streamID) + else: + key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, 0) self._server.query(key, method=self._server._session.put) From 5270395b3a9281b30e518f5e3de7430255193854 Mon Sep 17 00:00:00 2001 From: gstacks13 Date: Mon, 4 Feb 2019 20:07:22 -0600 Subject: [PATCH 4/6] Only pass stream object to function --- plexapi/media.py | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/plexapi/media.py b/plexapi/media.py index 420c7949..7f0789fe 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -125,44 +125,40 @@ class MediaPart(PlexObject): """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects in this MediaPart. """ return [stream for stream in self.streams if stream.streamType == SubtitleStream.STREAMTYPE] - def setDefaultAudioStream(self, stream=None, streamID=None): + def setDefaultAudioStream(self, stream): """ Set the default :class:`~plexapi.media.AudioStream` for this MediaPart. Parameters: stream (:class:`~plexapi.media.AudioStream`): AudioStream to set as default - (default:None; required if streamID is not specified). - streamID (int): ID of the AudioStream to set - (default:None; required if stream is not specified). Raises: - :class:`plexapi.exceptions.BadRequest`: If both stream and streamID are missing. + :class:`plexapi.exceptions.BadRequest`: If stream is not an AudioStream. """ - if stream: + if type(stream) == AudioStream: key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, stream.id) - elif streamID: - key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, streamID) + self._server.query(key, method=self._server._session.put) else: - raise BadRequest('Missing argument: stream or streamID is required') - self._server.query(key, method=self._server._session.put) + raise BadRequest("Object 'stream' is not an AudioStream.") - def setDefaultSubtitleStream(self, stream=None, streamID=None): + def setDefaultSubtitleStream(self, stream): """ Set the default :class:`~plexapi.media.SubtitleStream` for this MediaPart. - (Note: pass no parameters to disable subtitles) - + Parameters: - stream (:class:`~plexapi.media.SubtitleStream`): SubtitleStream to set as default - (default:None). - streamID (int): ID of the AudioStream to set - (default:None). + stream (:class:`~plexapi.media.SubtitleStream`): SubtitleStream to set as default. + + Raises: + :class:`plexapi.exceptions.BadRequest`: If stream is not a SubtitleStream. """ - if stream: + if type(stream) == SubtitleStream: key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, stream.id) - elif streamID: - key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, streamID) + self._server.query(key, method=self._server._session.put) else: - key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, 0) - self._server.query(key, method=self._server._session.put) + raise BadRequest("Object 'stream' is not a SubtitleStream.") + def resetSubtitles(self): + """ Set default subtitle of this MediaPart to 'none'. """ + key = "/library/parts/%d?subtitleStreamID=0&allParts=1" % (self.id) + self._server.query(key, method=self._server._session.put) class MediaPartStream(PlexObject): """ Base class for media streams. These consist of video, audio and subtitles. From e830f74436bc3d535c43a4f07e028700c39b8e89 Mon Sep 17 00:00:00 2001 From: gstacks13 Date: Wed, 6 Feb 2019 17:22:28 -0600 Subject: [PATCH 5/6] Tidying up, as requested. --- plexapi/media.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/plexapi/media.py b/plexapi/media.py index 7f0789fe..eecef1fd 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -130,32 +130,26 @@ class MediaPart(PlexObject): Parameters: stream (:class:`~plexapi.media.AudioStream`): AudioStream to set as default - - Raises: - :class:`plexapi.exceptions.BadRequest`: If stream is not an AudioStream. """ - if type(stream) == AudioStream: + if isinstance(stream, AudioStream): key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, stream.id) - self._server.query(key, method=self._server._session.put) else: - raise BadRequest("Object 'stream' is not an AudioStream.") + key = "/library/parts/%d?audioStreamID=%d&allParts=1" % (self.id, stream) + self._server.query(key, method=self._server._session.put) def setDefaultSubtitleStream(self, stream): """ Set the default :class:`~plexapi.media.SubtitleStream` for this MediaPart. Parameters: stream (:class:`~plexapi.media.SubtitleStream`): SubtitleStream to set as default. - - Raises: - :class:`plexapi.exceptions.BadRequest`: If stream is not a SubtitleStream. """ - if type(stream) == SubtitleStream: + if isinstance(stream, SubtitleStream): key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, stream.id) - self._server.query(key, method=self._server._session.put) else: - raise BadRequest("Object 'stream' is not a SubtitleStream.") + key = "/library/parts/%d?subtitleStreamID=%d&allParts=1" % (self.id, stream) + self._server.query(key, method=self._server._session.put) - def resetSubtitles(self): + def resetDefaultSubtitleStream(self): """ Set default subtitle of this MediaPart to 'none'. """ key = "/library/parts/%d?subtitleStreamID=0&allParts=1" % (self.id) self._server.query(key, method=self._server._session.put) From 5980abe956fc54a78392daa0e34a56c188f4b4a4 Mon Sep 17 00:00:00 2001 From: Michael Shepanski Date: Wed, 6 Feb 2019 19:09:35 -0500 Subject: [PATCH 6/6] Triggering a build. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c0862dac..43dea560 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ Plex Web Client. A few of the many features we currently support are: * Perform library actions such as scan, analyze, empty trash. * Remote control and play media on connected clients. * Listen in on all Plex Server notifications. - + Installation & Documentation ----------------------------