From e576129dd97ee14f5b24b4cd2b54ea44722c492c Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Thu, 9 May 2024 20:59:30 +0200 Subject: [PATCH] Some minor tweaks (#1287) --- .github/workflows/release.yml | 73 ++++++++++++------- .vscode/settings.json | 5 +- music_assistant/common/models/media_items.py | 4 +- .../server/controllers/media/base.py | 8 +- .../server/providers/chromecast/__init__.py | 8 ++ .../server/providers/chromecast/helpers.py | 3 + 6 files changed, 71 insertions(+), 30 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdeaf81e..65c13223 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 }} diff --git a/.vscode/settings.json b/.vscode/settings.json index 95f3ed30..dcfe9b83 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,8 @@ "source.organizeImports": "explicit" } }, - "editor.defaultFormatter": "charliermarsh.ruff" + "editor.defaultFormatter": "charliermarsh.ruff", + "[github-actions-workflow]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/music_assistant/common/models/media_items.py b/music_assistant/common/models/media_items.py index 89eebad3..cad6df97 100644 --- a/music_assistant/common/models/media_items.py +++ b/music_assistant/common/models/media_items.py @@ -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]): diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index f01da8cc..b5f5cc56 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -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( diff --git a/music_assistant/server/providers/chromecast/__init__.py b/music_assistant/server/providers/chromecast/__init__.py index 1a8b5503..66a73824 100644 --- a/music_assistant/server/providers/chromecast/__init__.py +++ b/music_assistant/server/providers/chromecast/__init__.py @@ -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: diff --git a/music_assistant/server/providers/chromecast/helpers.py b/music_assistant/server/providers/chromecast/helpers.py index 34fae5eb..62d691ad 100644 --- a/music_assistant/server/providers/chromecast/helpers.py +++ b/music_assistant/server/providers/chromecast/helpers.py @@ -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.""" -- 2.34.1