forked from platypush/platypush
Renamed parameter of volup
/voldown
for music plugins.
To be consistent with all other media plugins, the parameter name should be `step`, not `delta`. A back-compatibility layer has however been introduced for plugins (namely `music.mpd` and `music.spotify`) that already exposed the old interface.
This commit is contained in:
parent
f0dcb94862
commit
641a2fd135
5 changed files with 76 additions and 42 deletions
|
@ -389,42 +389,42 @@ class MediaPlugin(Plugin, ABC):
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def play(self, resource, *args, **kwargs):
|
def play(self, resource, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def pause(self, *args, **kwargs):
|
def pause(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def stop(self, *args, **kwargs):
|
def stop(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def quit(self, *args, **kwargs):
|
def quit(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def voldown(self, *args, **kwargs):
|
def voldown(self, step: Optional[float] = 5.0, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def volup(self, *args, **kwargs):
|
def volup(self, step: Optional[float] = 5.0, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def back(self, *args, **kwargs):
|
def back(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def forward(self, *args, **kwargs):
|
def forward(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@ -440,42 +440,42 @@ class MediaPlugin(Plugin, ABC):
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def toggle_subtitles(self, *args, **kwargs):
|
def toggle_subtitles(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def set_subtitles(self, filename, *args, **kwargs):
|
def set_subtitles(self, filename, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def remove_subtitles(self, *args, **kwargs):
|
def remove_subtitles(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def is_playing(self, *args, **kwargs):
|
def is_playing(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def load(self, resource, *args, **kwargs):
|
def load(self, resource, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def mute(self, *args, **kwargs):
|
def mute(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def seek(self, *args, **kwargs):
|
def seek(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def set_position(self, *args, **kwargs):
|
def set_position(self, **kwargs):
|
||||||
raise self._NOT_IMPLEMENTED_ERR
|
raise self._NOT_IMPLEMENTED_ERR
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
|
|
@ -338,13 +338,13 @@ class MediaMplayerPlugin(MediaPlugin):
|
||||||
return self.status()
|
return self.status()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def voldown(self, *_, step=10.0, **__):
|
def voldown(self, *_, step=5.0, **__):
|
||||||
"""Volume down by (default: 10)%"""
|
"""Volume down by (default: 10)%"""
|
||||||
self._exec('volume', -step * 10)
|
self._exec('volume', -step * 10)
|
||||||
return self.status()
|
return self.status()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def volup(self, *_, step=10.0, **__):
|
def volup(self, *_, step=5.0, **__):
|
||||||
"""Volume up by (default: 10)%"""
|
"""Volume up by (default: 10)%"""
|
||||||
self._exec('volume', step * 10)
|
self._exec('volume', step * 10)
|
||||||
return self.status()
|
return self.status()
|
||||||
|
|
|
@ -1,84 +1,110 @@
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from platypush.plugins import Plugin, action
|
from platypush.plugins import Plugin, action
|
||||||
|
|
||||||
|
|
||||||
class MusicPlugin(Plugin):
|
class MusicPlugin(Plugin, ABC):
|
||||||
def __init__(self, *args, **kwargs):
|
"""
|
||||||
|
Base class for music player plugins.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def play(self, **kwargs):
|
def play(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def pause(self, **kwargs):
|
def pause(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def stop(self, **kwargs):
|
def stop(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def next(self, **kwargs):
|
def next(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def previous(self, **kwargs):
|
def previous(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def set_volume(self, volume, **kwargs):
|
@abstractmethod
|
||||||
|
def set_volume(self, volume: float, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def volup(self, delta, **kwargs):
|
@abstractmethod
|
||||||
|
def volup(self, step: Optional[float] = None, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def voldown(self, delta, **kwargs):
|
@abstractmethod
|
||||||
|
def voldown(self, step: Optional[float] = None, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def seek(self, position, **kwargs):
|
def seek(self, position, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def add(self, resource, **kwargs):
|
def add(self, resource, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def clear(self, **kwargs):
|
def clear(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def status(self, **kwargs):
|
def status(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def current_track(self, **kwargs):
|
def current_track(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def get_playlists(self, **kwargs):
|
def get_playlists(self, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def get_playlist(self, playlist, **kwargs):
|
def get_playlist(self, playlist, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def add_to_playlist(self, playlist, resources, **kwargs):
|
def add_to_playlist(self, playlist, resources, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def remove_from_playlist(self, playlist, resources, **kwargs):
|
def remove_from_playlist(self, playlist, resources, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@abstractmethod
|
||||||
def playlist_move(self, playlist, from_pos: int, to_pos: int, **kwargs):
|
def playlist_move(self, playlist, from_pos: int, to_pos: int, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def search(self, query, *args, **kwargs):
|
@abstractmethod
|
||||||
|
def search(self, query, **kwargs):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -172,7 +172,7 @@ class MusicMpdPlugin(MusicPlugin):
|
||||||
return self._exec('next')
|
return self._exec('next')
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def previous(self, *_, **__):
|
def previous(self, **__):
|
||||||
"""Play the previous track"""
|
"""Play the previous track"""
|
||||||
return self._exec('previous')
|
return self._exec('previous')
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ class MusicMpdPlugin(MusicPlugin):
|
||||||
return self.set_volume(vol)
|
return self.set_volume(vol)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def set_volume(self, volume: int, *_, **__):
|
def set_volume(self, volume: int, **__):
|
||||||
"""
|
"""
|
||||||
Set the volume.
|
Set the volume.
|
||||||
|
|
||||||
|
@ -197,25 +197,27 @@ class MusicMpdPlugin(MusicPlugin):
|
||||||
return self._exec('setvol', str(volume))
|
return self._exec('setvol', str(volume))
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def volup(self, *_, delta: int = 10, **__):
|
def volup(self, step: Optional[float] = None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Turn up the volume.
|
Turn up the volume.
|
||||||
|
|
||||||
:param delta: Volume up delta (default: +10%).
|
:param step: Volume up step (default: 5%).
|
||||||
"""
|
"""
|
||||||
|
step = step or kwargs.get('delta') or 5
|
||||||
volume = int(self._status()['volume'])
|
volume = int(self._status()['volume'])
|
||||||
new_volume = min(volume + delta, 100)
|
new_volume = min(volume + step, 100)
|
||||||
return self.setvol(new_volume)
|
return self.setvol(new_volume)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def voldown(self, *_, delta: int = 10, **__):
|
def voldown(self, step: Optional[float] = None, **kwargs):
|
||||||
"""
|
"""
|
||||||
Turn down the volume.
|
Turn down the volume.
|
||||||
|
|
||||||
:param delta: Volume down delta (default: -10%).
|
:param step: Volume down step (default: 5%).
|
||||||
"""
|
"""
|
||||||
|
step = step or kwargs.get('delta') or 5
|
||||||
volume = int(self._status()['volume'])
|
volume = int(self._status()['volume'])
|
||||||
new_volume = max(volume - delta, 0)
|
new_volume = max(volume - step, 0)
|
||||||
return self.setvol(new_volume)
|
return self.setvol(new_volume)
|
||||||
|
|
||||||
def _toggle(self, key: str, value: Optional[bool] = None):
|
def _toggle(self, key: str, value: Optional[bool] = None):
|
||||||
|
@ -390,7 +392,7 @@ class MusicMpdPlugin(MusicPlugin):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def clear(self, *_, **__):
|
def clear(self, **__):
|
||||||
"""Clear the current playlist"""
|
"""Clear the current playlist"""
|
||||||
return self._exec('clear')
|
return self._exec('clear')
|
||||||
|
|
||||||
|
@ -405,7 +407,7 @@ class MusicMpdPlugin(MusicPlugin):
|
||||||
return self.seek(value)
|
return self.seek(value)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def seek(self, position: float, *_, **__):
|
def seek(self, position: float, **__):
|
||||||
"""
|
"""
|
||||||
Seek to the specified position
|
Seek to the specified position
|
||||||
|
|
||||||
|
|
|
@ -139,39 +139,45 @@ class MusicSpotifyPlugin(MusicPlugin, SpotifyMixin):
|
||||||
return self.status.output.get('volume')
|
return self.status.output.get('volume')
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def volup(self, delta: int = 5, device: Optional[str] = None):
|
def volup(
|
||||||
|
self, step: Optional[float] = None, device: Optional[str] = None, **kwargs
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Set the volume up by a certain delta.
|
Set the volume up by a certain step.
|
||||||
|
|
||||||
:param delta: Increase the volume by this percentage amount (between 0 and 100).
|
:param step: Increase the volume by this percentage amount (between 0 and 100).
|
||||||
:param device: Device ID or name. If none is specified then the currently active device will be used.
|
:param device: Device ID or name. If none is specified then the currently active device will be used.
|
||||||
"""
|
"""
|
||||||
|
step = step or kwargs.get('delta') or 5
|
||||||
if device:
|
if device:
|
||||||
device = self._get_device(device)['id']
|
device = self._get_device(device)['id']
|
||||||
|
|
||||||
self.spotify_user_call(
|
self.spotify_user_call(
|
||||||
'/v1/me/player/volume',
|
'/v1/me/player/volume',
|
||||||
params={
|
params={
|
||||||
'volume_percent': min(100, (self._get_volume() or 0) + delta),
|
'volume_percent': min(100, (self._get_volume() or 0) + step),
|
||||||
**({'device_id': device} if device else {}),
|
**({'device_id': device} if device else {}),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def voldown(self, delta: int = 5, device: Optional[str] = None):
|
def voldown(
|
||||||
|
self, step: Optional[float] = None, device: Optional[str] = None, **kwargs
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Set the volume down by a certain delta.
|
Set the volume down by a certain step.
|
||||||
|
|
||||||
:param delta: Decrease the volume by this percentage amount (between 0 and 100).
|
:param step: Decrease the volume by this percentage amount (between 0 and 100). Default: 5%.
|
||||||
:param device: Device ID or name. If none is specified then the currently active device will be used.
|
:param device: Device ID or name. If none is specified then the currently active device will be used.
|
||||||
"""
|
"""
|
||||||
|
step = step or kwargs.get('delta') or 5
|
||||||
if device:
|
if device:
|
||||||
device = self._get_device(device)['id']
|
device = self._get_device(device)['id']
|
||||||
|
|
||||||
self.spotify_user_call(
|
self.spotify_user_call(
|
||||||
'/v1/me/player/volume',
|
'/v1/me/player/volume',
|
||||||
params={
|
params={
|
||||||
'volume_percent': max(0, (self._get_volume() or 0) - delta),
|
'volume_percent': max(0, (self._get_volume() or 0) - step),
|
||||||
**({'device_id': device} if device else {}),
|
**({'device_id': device} if device else {}),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue