From: Marcel van der Veldt Date: Tue, 24 Nov 2020 21:55:39 +0000 (+0100) Subject: small fixes X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=905cd5e6855216a52560cec42bba5eab41912149;p=music-assistant-server.git small fixes --- diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index 10a0b604..96d73d00 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -20,7 +20,7 @@ jobs: curl https://github.com/music-assistant/app/archive/master.zip -LOk unzip master.zip cd /tmp/app-master - mv docs /home/runner/work/server/server/music_assistant/web/static + mv build /home/runner/work/server/server/music_assistant/web/static cd /home/runner/work/server/server/ - name: Install wheel run: >- diff --git a/Dockerfile b/Dockerfile index 04c6371c..a2d56a78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ RUN pip wheel uvloop cchardet aiodns brotlipy \ && pip wheel -r /tmp/requirements.txt \ # Include frontend-app in the source files && curl -L https://github.com/music-assistant/app/archive/master.tar.gz | tar xz \ - && mv app-master/docs /tmp/music_assistant/web/static \ + && mv app-master/build /tmp/music_assistant/web/static \ && pip wheel /tmp #### FINAL IMAGE diff --git a/music_assistant/constants.py b/music_assistant/constants.py index a8ebba66..30028815 100755 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -1,6 +1,6 @@ """All constants for Music Assistant.""" -__version__ = "0.0.67" +__version__ = "0.0.68" REQUIRED_PYTHON_VER = "3.8" # configuration keys/attributes diff --git a/music_assistant/managers/players.py b/music_assistant/managers/players.py index df367b46..f0163a49 100755 --- a/music_assistant/managers/players.py +++ b/music_assistant/managers/players.py @@ -512,7 +512,7 @@ class PlayerManager: return await self.async_cmd_power_off(player_id) return await self.async_cmd_power_on(player_id) - @api_route("players/:player_id/cmd/volume_set/:volume_level") + @api_route("players/:player_id/cmd/volume_set/:volume_level?") async def async_cmd_volume_set(self, player_id: str, volume_level: int) -> None: """ Send volume level command to given player. @@ -603,7 +603,7 @@ class PlayerManager: # TODO: handle mute on volumecontrol? return await player_state.player.async_cmd_volume_mute(is_muted) - @api_route("players/:queue_id/queue/cmd/shuffle_enabled/:enable_shuffle") + @api_route("players/:queue_id/queue/cmd/shuffle_enabled/:enable_shuffle?") async def async_player_queue_cmd_set_shuffle( self, queue_id: str, enable_shuffle: bool = False ): @@ -618,7 +618,7 @@ class PlayerManager: return return await player_queue.async_set_shuffle_enabled(enable_shuffle) - @api_route("players/:queue_id/queue/cmd/repeat_enabled/:enable_repeat") + @api_route("players/:queue_id/queue/cmd/repeat_enabled/:enable_repeat?") async def async_player_queue_cmd_set_repeat( self, queue_id: str, enable_repeat: bool = False ): @@ -633,6 +633,54 @@ class PlayerManager: return return await player_queue.async_set_repeat_enabled(enable_repeat) + @api_route("players/:queue_id/queue/cmd/next") + async def async_player_queue_cmd_next(self, queue_id: str): + """ + Send next track command to given playerqueue. + + :param queue_id: player_id of the playerqueue to handle the command. + """ + player_queue = self.get_player_queue(queue_id) + if not player_queue: + return + return await player_queue.async_next() + + @api_route("players/:queue_id/queue/cmd/previous") + async def async_player_queue_cmd_previous(self, queue_id: str): + """ + Send previous track command to given playerqueue. + + :param queue_id: player_id of the playerqueue to handle the command. + """ + player_queue = self.get_player_queue(queue_id) + if not player_queue: + return + return await player_queue.async_previous() + + @api_route("players/:queue_id/queue/cmd/move/:queue_item_id?/:pos_shift?") + async def async_player_queue_cmd_move_item( + self, queue_id: str, queue_item_id: str, pos_shift: int = 1 + ): + """ + Move queue item x up/down the queue. + + param pos_shift: move item x positions down if positive value + move item x positions up if negative value + move item to top of queue as next item if 0 + """ + player_queue = self.get_player_queue(queue_id) + if not player_queue: + return + return await player_queue.async_move_item(queue_item_id, pos_shift) + + @api_route("players/:queue_id/queue/cmd/play_index/:index?") + async def async_play_index(self, queue_id: str, index: Union[int, str]) -> None: + """Play item at index (or item_id) X in queue.""" + player_queue = self.get_player_queue(queue_id) + if not player_queue: + return + return await player_queue.async_play_index(index) + @api_route("players/:queue_id/queue/cmd/clear") async def async_player_queue_cmd_clear( self, queue_id: str, enable_repeat: bool = False diff --git a/music_assistant/mass.py b/music_assistant/mass.py index 8b979dc9..a18fe09d 100644 --- a/music_assistant/mass.py +++ b/music_assistant/mass.py @@ -264,11 +264,7 @@ class MusicAssistant: @callback def add_background_task(self, task: Coroutine): - """Add a coroutine/task to the end of the job queue. - - target: target to call. - args: parameters for method to call. - """ + """Add a coroutine/task to the end of the job queue.""" if self._background_tasks is None: self._background_tasks = asyncio.Queue() self._background_tasks.put_nowait(task) diff --git a/music_assistant/models/player_queue.py b/music_assistant/models/player_queue.py index 02cba3e6..21ccc380 100755 --- a/music_assistant/models/player_queue.py +++ b/music_assistant/models/player_queue.py @@ -130,6 +130,7 @@ class PlayerQueue: items = played_items + [self.cur_item] + next_items self.mass.add_job(self.async_update(items)) self.mass.add_job(self.async_update_state()) + self.mass.signal_event(EVENT_QUEUE_UPDATED, self.to_dict()) @property def repeat_enabled(self) -> bool: @@ -142,6 +143,7 @@ class PlayerQueue: self._repeat_enabled = enable_repeat self.mass.add_job(self.async_update_state()) self.mass.add_job(self.__async_save_state()) + self.mass.signal_event(EVENT_QUEUE_UPDATED, self.to_dict()) @property def cur_index(self) -> OptionalInt: @@ -307,8 +309,8 @@ class PlayerQueue: "resume queue requested for %s but queue is empty", self.queue_id ) - async def async_play_index(self, index: int) -> None: - """Play item at index X in queue.""" + async def async_play_index(self, index: Union[int, str]) -> None: + """Play item at index (or item_id) X in queue.""" if not isinstance(index, int): index = self.__index_by_id(index) if not len(self.items) > index: @@ -336,7 +338,7 @@ class PlayerQueue: param pos_shift: move item x positions down if positive value move item x positions up if negative value - move item to top of queue as next item + move item to top of queue as next item if 0 """ items = self.items.copy() item_index = self.__index_by_id(queue_item_id) @@ -458,7 +460,7 @@ class PlayerQueue: "cmd_queue_update not supported by player, fallback to cmd_queue_load " ) self._items = self._items[self.cur_index :] - return await self.player.async_cmd_queue_load(self._items) + await self.player.async_cmd_queue_load(self._items) self.mass.signal_event(EVENT_QUEUE_ITEMS_UPDATED, self.to_dict()) self.mass.add_job(self.__async_save_state())