-
Notifications
You must be signed in to change notification settings - Fork 198
add support for fetching loudness levels of audio streams #1529
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Added a basic test that fetches a custom amount of levels and checks the returned list length. |
@JonnyWong16 no interest in this patch? |
@@ -433,10 +433,34 @@ def setSelected(self): | |||
""" | |||
return self._parent().setSelectedAudioStream(self) | |||
|
|||
def levels(self, subSample=128): | |||
""" Load time series loudness levels. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
""" Load time series loudness levels. | |
""" Returns a list of :class:`~plexapi.media.Level` objects for this AudioStream. | |
Only available for Tracks which have been analyzed for loudness. |
""" Load time series loudness levels. | ||
|
||
Attributes: | ||
subSample: (int): the number of loudness segments to load |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
subSample: (int): the number of loudness segments to load | |
subSample (int): The number of loudness samples to return. Default 128. |
|
||
key = f'/library/streams/{self.id}/levels' | ||
params = {'subsample': subSample} | ||
|
||
levels = self.fetchItems(ekey=key, cls=Level, params=params) | ||
return levels |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
key = f'/library/streams/{self.id}/levels' | |
params = {'subsample': subSample} | |
levels = self.fetchItems(ekey=key, cls=Level, params=params) | |
return levels | |
key = f'/library/streams/{self.id}/levels' | |
params = {'subsample': subSample} | |
return self.fetchItems(key, params=params) |
@utils.registerPlexObject | ||
class Level(PlexObject): | ||
""" Represents an instance of loudness for an audio stream. | ||
|
||
Attributes: | ||
loudness (float): loudness level in db | ||
""" | ||
def _loadData(self, data): | ||
""" Load attribute values from Plex XML response. """ | ||
self.loudness = data.attrib.get('v') | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move to the bottom of the file.
@utils.registerPlexObject | |
class Level(PlexObject): | |
""" Represents an instance of loudness for an audio stream. | |
Attributes: | |
loudness (float): loudness level in db | |
""" | |
def _loadData(self, data): | |
""" Load attribute values from Plex XML response. """ | |
self.loudness = data.attrib.get('v') | |
@utils.registerPlexObject | |
class Level(PlexObject): | |
""" Represents a single loudness Level sample for an AudioStream. | |
Attributes: | |
loudness (float): Loudness level value | |
""" | |
def _loadData(self, data): | |
""" Load attribute values from Plex XML response. """ | |
self.loudness = utils.cast(float, data.attrib.get('v')) |
@@ -397,6 +397,7 @@ def test_audio_Track_attrs(album): | |||
assert stream.lra is None | |||
assert stream.peak is None | |||
assert stream.startRamp is None | |||
assert len(stream.levels(subSample=32)) == 32 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
assert len(stream.levels(subSample=32)) == 32 | |
if stream.loudness is not None: | |
assert len(stream.levels(subSample=32)) == 32 |
Description
This adds support for fetching loudness levels. This is used in Plexamp and Dash to show a waveform of the currently playing track. See here for a screenshot of what I mean.
Type of change
Checklist:
I have not added tests (yet). Python is not my first language and I'm having a bit of trouble wrapping my head around how the test suite works.