Some minor tweaks (#1287)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 9 May 2024 18:59:30 +0000 (20:59 +0200)
committerGitHub <noreply@github.com>
Thu, 9 May 2024 18:59:30 +0000 (20:59 +0200)
.github/workflows/release.yml
.vscode/settings.json
music_assistant/common/models/media_items.py
music_assistant/server/controllers/media/base.py
music_assistant/server/providers/chromecast/__init__.py
music_assistant/server/providers/chromecast/helpers.py

index cdeaf81e71c5c6e6ff8083e9c65a7691284375bd..65c13223953300f16729bb7f0abdd109f9570428 100644 (file)
@@ -3,6 +3,8 @@ name: Publish releases
 on:
   release:
     types: [published]
+env:
+  PYTHON_VERSION: "3.11"
 
 jobs:
   build-and-publish-pypi:
@@ -11,14 +13,27 @@ jobs:
     outputs:
       version: ${{ steps.vars.outputs.tag }}
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v4.1.4
       - name: Get tag
         id: vars
         run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
-      - name: Set up Python 3.11
+      - name: Validate version number
+        run: >-
+          if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then
+            if ! [[ "${{ steps.vars.outputs.tag }}" =~ "b" ]]; then
+            echo "Pre-release: Tag is missing beta suffix (${{ steps.vars.outputs.tag }})"
+              exit 1
+            fi
+          else
+            if [[ "${{ steps.vars.outputs.tag }}" =~ "b" ]]; then
+              echo "Release: Tag must not have a beta suffix (${{ steps.vars.outputs.tag }})"
+              exit 1
+            fi
+          fi
+      - name: Set up Python ${{ env.PYTHON_VERSION }}
         uses: actions/setup-python@v5.1.0
         with:
-          python-version: "3.11"
+          python-version: ${{ env.PYTHON_VERSION }}
       - name: Install build
         run: >-
           pip install build tomli tomli-w
@@ -35,7 +50,7 @@ jobs:
 
           with open("pyproject.toml", "wb") as f:
             tomli_w.dump(pyproject, f)
-      - name: Build
+      - name: Build python package
         run: >-
           python3 -m build
       - name: Publish release to PyPI
@@ -47,13 +62,13 @@ jobs:
         run: sleep 300
 
   build-and-push-container-image:
-    name: Builds and pushes the Music Assistant Server container to ghcr.io
+    name: Builds and pushes the Matter Server container to ghcr.io
     runs-on: ubuntu-latest
     permissions:
       packages: write
     needs: build-and-publish-pypi
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@v4.1.4
       - name: Log in to the GitHub container registry
         uses: docker/login-action@v3.1.0
         with:
@@ -70,21 +85,9 @@ jobs:
           echo "patch=${patch}" >> $GITHUB_OUTPUT
           echo "minor=${patch%.*}" >> $GITHUB_OUTPUT
           echo "major=${patch%.*.*}" >> $GITHUB_OUTPUT
-          if [[ $patch =~ "b" ]]; then
-            echo "channel=beta" >> $GITHUB_OUTPUT
-          else
-            echo "channel=stable" >> $GITHUB_OUTPUT
-          fi
-
-      - name: Docker meta
-        id: meta
-        uses: docker/metadata-action@v5
-        with:
-          images: |
-            ghcr.io/${{ github.repository_owner }}/server
-
-      - name: Build and Push images
+      - name: Build and Push release
         uses: docker/build-push-action@v5.3.0
+        if: github.event.release.prerelease == false
         with:
           context: .
           platforms: linux/amd64,linux/arm64
@@ -93,31 +96,47 @@ jobs:
             ghcr.io/${{ github.repository_owner }}/server:${{ steps.tags.outputs.patch }},
             ghcr.io/${{ github.repository_owner }}/server:${{ steps.tags.outputs.minor }},
             ghcr.io/${{ github.repository_owner }}/server:${{ steps.tags.outputs.major }},
-            ghcr.io/${{ github.repository_owner }}/server:${{ steps.tags.outputs.channel }},
-            ghcr.io/${{ github.repository_owner }}/server:latest
+            ghcr.io/${{ github.repository_owner }}/server:stable
+          push: true
+          build-args: "MASS_VERSION=${{ needs.build-and-publish-pypi.outputs.version }}"
+      - name: Build and Push pre-release
+        uses: docker/build-push-action@v5.3.0
+        if: github.event.release.prerelease == true
+        with:
+          context: .
+          platforms: linux/amd64,linux/arm64
+          file: Dockerfile
+          tags: |-
+            ghcr.io/${{ github.repository_owner }}/server:${{ steps.tags.outputs.patch }},
+            ghcr.io/${{ github.repository_owner }}/server:beta
           push: true
-          labels: ${{ steps.meta.outputs.labels }}
-          build-args: |
-            "MASS_VERSION=${{ needs.build-and-publish-pypi.outputs.version }}"
+          build-args: "MASS_VERSION=${{ needs.build-and-publish-pypi.outputs.version }}"
 
   release-notes-update:
     name: Updates the release notes and changelog
-    needs: [ build-and-publish-pypi, build-and-push-container-image ]
+    needs: [build-and-publish-pypi, build-and-push-container-image]
     runs-on: ubuntu-latest
     steps:
       - name: Update changelog and release notes including frontend notes
         uses: music-assistant/release-notes-merge-action@main
+        if: github.event.release.prerelease == true
         with:
           github_token: ${{ secrets.PRIVILEGED_GITHUB_TOKEN }}
           release_tag: ${{ needs.build-and-publish-pypi.outputs.version }}
 
   addon-version-update:
     name: Updates the Addon repository with the new version
-    needs: [ build-and-publish-pypi, build-and-push-container-image, release-notes-update ]
+    needs:
+      [
+        build-and-publish-pypi,
+        build-and-push-container-image,
+        release-notes-update,
+      ]
     runs-on: ubuntu-latest
     steps:
       - name: Push new version number to addon config
         uses: music-assistant/addon-update-action@main
+        if: github.event.release.prerelease == true
         with:
           github_token: ${{ secrets.PRIVILEGED_GITHUB_TOKEN }}
           new_server_version: ${{ needs.build-and-publish-pypi.outputs.version }}
index 95f3ed30100e724efe282fa4a303283aa7beeec7..dcfe9b8339ed6206285cd31d89de2ed30d5adc53 100644 (file)
@@ -6,5 +6,8 @@
       "source.organizeImports": "explicit"
     }
   },
-  "editor.defaultFormatter": "charliermarsh.ruff"
+  "editor.defaultFormatter": "charliermarsh.ruff",
+  "[github-actions-workflow]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  }
 }
index 89eebad38af68f8864e2b54a9471fa525b97b606..cad6df97df442134ce1597e56e21a7f17652fe3a 100644 (file)
@@ -576,7 +576,9 @@ class BrowseFolder(MediaItem):
             )
 
 
-MediaItemType = Artist | Album | Track | Radio | Playlist | BrowseFolder
+MediaItemType = (
+    Artist | Album | PlaylistTrack | AlbumTrack | Track | Radio | Playlist | BrowseFolder
+)
 
 
 class PagedItems(Generic[_T]):
index f01da8cc6145c2b7d1ce08d7ac84c76d886a6cee..b5f5cc56b4d83e03a34d0d776661f6dba51dc4c8 100644 (file)
@@ -47,6 +47,8 @@ SORT_KEYS = {
     "sort_name_desc": "sort_name DESC",
     "timestamp_added": "timestamp_added ASC",
     "timestamp_added_desc": "timestamp_added DESC",
+    "timestamp_modified": "timestamp_modified ASC",
+    "timestamp_modified_desc": "timestamp_modified DESC",
     "last_played": "last_played ASC",
     "last_played_desc": "last_played DESC",
     "play_count": "play_count ASC",
@@ -262,7 +264,11 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
             # get (first) provider item id belonging to this library item
             add_to_library = True
             metadata_lookup = True
-            provider_instance_id_or_domain, item_id = await self.get_provider_mapping(library_item)
+            if library_item:
+                # resolve library item into a provider item to get the source details
+                provider_instance_id_or_domain, item_id = await self.get_provider_mapping(
+                    library_item
+                )
 
         # grab full details from the provider
         details = await self.get_provider_item(
index 1a8b5503d3b256586f817c49d4e8ceeaea6ab7b3..66a7382424fb2f937f0a9f6652b7995fef50423d 100644 (file)
@@ -446,6 +446,12 @@ class ChromecastProvider(PlayerProvider):
             castplayer.player.display_name,
             status.player_state,
         )
+        # handle castplayer playing from a group
+        if castplayer.active_group is not None:
+            if not (group_player := self.castplayers.get(castplayer.active_group)):
+                return
+            status = group_player.cc.media_controller.status
+
         # player state
         castplayer.player.elapsed_time_last_updated = time.time()
         if status.player_is_playing:
@@ -579,6 +585,8 @@ class ChromecastProvider(PlayerProvider):
             return
         if not castplayer.cc.media_controller.status.player_is_playing:
             return
+        if castplayer.active_group:
+            return
         if castplayer.player.state != PlayerState.PLAYING:
             return
         if castplayer.player.announcement_in_progress:
index 34fae5eb313e794313aa4a44059efde597c932bf..62d691ad6390d7d11cf4974d53f704f1df7f7a08 100644 (file)
@@ -191,9 +191,11 @@ class CastStatusListener:
             if group_player.cc.media_controller.is_active:
                 self.castplayer.active_group = group_uuid
                 self.castplayer.player.active_source = group_uuid
+                self.castplayer.player.state = group_player.player.state
             elif group_uuid == self.castplayer.active_group:
                 self.castplayer.active_group = None
                 self.castplayer.player.active_source = self.castplayer.player.player_id
+
         self.prov.logger.log(
             VERBOSE_LOG_LEVEL,
             "%s got new cast status for group: %s",
@@ -212,6 +214,7 @@ class CastStatusListener:
             self.castplayer.player.display_name,
             group_uuid,
         )
+        self.prov.on_new_media_status(self.castplayer, media_status)
 
     def load_media_failed(self, queue_item_id, error_code) -> None:
         """Call when media failed to load."""