From 254f8269587539c5150d7aab93bcf84652b2d78b Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 18 Nov 2023 17:47:41 -0800 Subject: [PATCH 1/4] Move videoStreams, audioStreams, lyricStreams to Playable --- plexapi/base.py | 36 ++++++++++++++++++++++++++++++++++++ plexapi/video.py | 36 ------------------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/plexapi/base.py b/plexapi/base.py index 4e6d59d8b..cc9457828 100644 --- a/plexapi/base.py +++ b/plexapi/base.py @@ -771,6 +771,42 @@ def iterParts(self): for part in item.parts: yield part + def videoStreams(self): + """ Returns a list of :class:`~plexapi.media.videoStream` objects for all MediaParts. """ + streams = [] + + if self.isPartialObject(): + self.reload() + + parts = self.iterParts() + for part in parts: + streams += part.videoStreams() + return streams + + def audioStreams(self): + """ Returns a list of :class:`~plexapi.media.AudioStream` objects for all MediaParts. """ + streams = [] + + if self.isPartialObject(): + self.reload() + + parts = self.iterParts() + for part in parts: + streams += part.audioStreams() + return streams + + def subtitleStreams(self): + """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects for all MediaParts. """ + streams = [] + + if self.isPartialObject(): + self.reload() + + parts = self.iterParts() + for part in parts: + streams += part.subtitleStreams() + return streams + def play(self, client): """ Start playback on the specified client. diff --git a/plexapi/video.py b/plexapi/video.py index e95b12ffb..45eec1f8c 100644 --- a/plexapi/video.py +++ b/plexapi/video.py @@ -97,42 +97,6 @@ def _defaultSyncTitle(self): """ Returns str, default title for a new syncItem. """ return self.title - def videoStreams(self): - """ Returns a list of :class:`~plexapi.media.videoStream` objects for all MediaParts. """ - streams = [] - - if self.isPartialObject(): - self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.videoStreams() - return streams - - def audioStreams(self): - """ Returns a list of :class:`~plexapi.media.AudioStream` objects for all MediaParts. """ - streams = [] - - if self.isPartialObject(): - self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.audioStreams() - return streams - - def subtitleStreams(self): - """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects for all MediaParts. """ - streams = [] - - if self.isPartialObject(): - self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.subtitleStreams() - return streams - def uploadSubtitles(self, filepath): """ Upload Subtitle file for video. """ url = f'{self.key}/subtitles' From 25ea12a5cd2ba55bb6857728bc660f2cd5cc48d9 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 18 Nov 2023 17:52:46 -0800 Subject: [PATCH 2/4] Add lyricStreams to Playable --- plexapi/base.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plexapi/base.py b/plexapi/base.py index cc9457828..29e75ce88 100644 --- a/plexapi/base.py +++ b/plexapi/base.py @@ -807,6 +807,18 @@ def subtitleStreams(self): streams += part.subtitleStreams() return streams + def lyricStreams(self): + """ Returns a list of :class:`~plexapi.media.LyricStream` objects for all MediaParts. """ + streams = [] + + if self.isPartialObject(): + self.reload() + + parts = self.iterParts() + for part in parts: + streams += part.lyricStreams() + return streams + def play(self, client): """ Start playback on the specified client. From e9de0657684e2f0b21ef0816e9dfbcd523efcec7 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 18 Nov 2023 17:54:38 -0800 Subject: [PATCH 3/4] Simplify returning list of streams --- plexapi/base.py | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/plexapi/base.py b/plexapi/base.py index 29e75ce88..5373d3a96 100644 --- a/plexapi/base.py +++ b/plexapi/base.py @@ -773,51 +773,27 @@ def iterParts(self): def videoStreams(self): """ Returns a list of :class:`~plexapi.media.videoStream` objects for all MediaParts. """ - streams = [] - if self.isPartialObject(): self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.videoStreams() - return streams + return sum((part.videoStreams() for part in self.iterParts()), []) def audioStreams(self): """ Returns a list of :class:`~plexapi.media.AudioStream` objects for all MediaParts. """ - streams = [] - if self.isPartialObject(): self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.audioStreams() - return streams + return sum((part.audioStreams() for part in self.iterParts()), []) def subtitleStreams(self): """ Returns a list of :class:`~plexapi.media.SubtitleStream` objects for all MediaParts. """ - streams = [] - if self.isPartialObject(): self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.subtitleStreams() - return streams + return sum((part.subtitleStreams() for part in self.iterParts()), []) def lyricStreams(self): """ Returns a list of :class:`~plexapi.media.LyricStream` objects for all MediaParts. """ - streams = [] - if self.isPartialObject(): self.reload() - - parts = self.iterParts() - for part in parts: - streams += part.lyricStreams() - return streams + return sum((part.lyricStreams() for part in self.iterParts()), []) def play(self, client): """ Start playback on the specified client. From 2f597a200c21c4456076323b199ef0a83af0a68c Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 18 Nov 2023 17:54:58 -0800 Subject: [PATCH 4/4] Add test for track.lyricStreams() --- tests/test_audio.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_audio.py b/tests/test_audio.py index 0968ec8ee..8887423a8 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -394,6 +394,10 @@ def test_audio_Track_artist(album, artist): assert tracks[0].artist() == artist +def test_audio_Track_lyricStreams(track): + assert not track.lyricStreams() + + def test_audio_Track_mixins_images(track): test_mixins.attr_artUrl(track) test_mixins.attr_posterUrl(track)