small fixes
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 24 Nov 2020 21:55:39 +0000 (22:55 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 24 Nov 2020 21:55:39 +0000 (22:55 +0100)
.github/workflows/publish-to-pypi.yml
Dockerfile
music_assistant/constants.py
music_assistant/managers/players.py
music_assistant/mass.py
music_assistant/models/player_queue.py

index 10a0b604b52bfa2fd4a794843df2c4fc994d219b..96d73d00c08ad54317dbe2b0e0d4b536dc9696c4 100644 (file)
@@ -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: >-
index 04c6371cdb67b17ee15904741f126582b2e74fc7..a2d56a7874513a33cc24bcf18f54a81ca9e11704 100644 (file)
@@ -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
index a8ebba667cf97dab1748a00aa64d5fb2c7475980..30028815b8aab94ba167e431879f1b0d649b629d 100755 (executable)
@@ -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
index df367b469e3d7fc8c4a2f281bde63439618580b0..f0163a49371651d869ff364e1f2ff717c7dedd9e 100755 (executable)
@@ -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
index 8b979dc9cb97c2bee81a67cad2f4d6ac726e07e6..a18fe09d01aba871aa272af29083e1ac8a861ac5 100644 (file)
@@ -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)
index 02cba3e6532590c0240043ba2114fd199a8062be..21ccc3807cfe1ec47ae9b8109f3af77fb1743bf3 100755 (executable)
@@ -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())