From 7ad3251291ea6d1844c7f1ba1928a8d199d508be Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 08:24:38 +0200 Subject: [PATCH 01/14] turn off pics --- music_assistant/server/controllers/metadata.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index 48b6311b0..e8b906539 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -361,7 +361,8 @@ async def get_thumbnail( return thumbnail async def handle_imageproxy(self, request: web.Request) -> web.Response: - """Handle request for image proxy.""" + """ + #Handle request for image proxy. path = request.query["path"] provider = request.query.get("provider", "builtin") if provider in ("url", "file"): @@ -385,6 +386,7 @@ async def handle_imageproxy(self, request: web.Request) -> web.Response: headers={"Cache-Control": "max-age=31536000", "Access-Control-Allow-Origin": "*"}, content_type=f"image/{image_format}", ) + """ return web.Response(status=404) async def create_collage_image( From 6a40af8b0437b3c0d314e800ea1716b85e81ba9b Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 08:58:24 +0200 Subject: [PATCH 02/14] Update release.yml set permissions --- .github/workflows/release.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c4e17abb6..db4917b2a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,11 @@ on: types: [published] env: PYTHON_VERSION: "3.11" - + +permissions: + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout + jobs: build-and-publish-pypi: name: Builds and publishes releases to PyPI From 4bcf53f6c2feede090167db80e9fdd9488f1663a Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 09:01:57 +0200 Subject: [PATCH 03/14] Update release.yml set permissions v2 --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index db4917b2a..88aed4c5c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,6 +12,9 @@ permissions: jobs: build-and-publish-pypi: + permissions: + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout name: Builds and publishes releases to PyPI runs-on: ubuntu-latest outputs: From ac41fb9fccc0968e1b450b93fcbf0c45172c90be Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 09:06:49 +0200 Subject: [PATCH 04/14] Update release.yml permissions v3 --- .github/workflows/release.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 88aed4c5c..59dd8ca0f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,19 +6,14 @@ on: env: PYTHON_VERSION: "3.11" -permissions: - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout - jobs: build-and-publish-pypi: - permissions: - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout name: Builds and publishes releases to PyPI runs-on: ubuntu-latest outputs: version: ${{ steps.vars.outputs.tag }} + permissions: + id-token: write steps: - uses: actions/checkout@v4.1.4 - name: Get tag From 0642681e99a7233976e60b66ddcd96c28d87e240 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 09:55:38 +0200 Subject: [PATCH 05/14] change name --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 428c2d51b..09490be71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "music_assistant" +name = "ma-server-mp" # The version is set by GH action on release authors = [ {name = "The Music Assistant Authors", email = "marcelveldt@users.noreply.github.com"}, @@ -10,7 +10,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] dependencies = ["aiohttp", "orjson", "mashumaro"] -description = "Music Assistant" +description = "ma-server-mp" license = {text = "Apache-2.0"} readme = "README.md" requires-python = ">=3.11" From 7008f157030039954d52fcae212c946975872978 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 11:13:50 +0200 Subject: [PATCH 06/14] deleting pics v2 --- music_assistant/server/helpers/images.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/music_assistant/server/helpers/images.py b/music_assistant/server/helpers/images.py index 4b015eee2..cf0652b34 100644 --- a/music_assistant/server/helpers/images.py +++ b/music_assistant/server/helpers/images.py @@ -26,6 +26,7 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) -> bytes: """Create thumbnail from image url.""" # TODO: add local cache here ! + """ if prov := mass.get_provider(provider): prov: MusicProvider | MetadataProvider if resolved_image := await prov.resolve_image(path_or_url): @@ -49,6 +50,7 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) if img_data := await get_embedded_image(path_or_url): return img_data msg = f"Image not found: {path_or_url}" + """ raise FileNotFoundError(msg) From fe20e23e344bbd37c2dc0eb379a2c8b93786f6cd Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:09:23 +0200 Subject: [PATCH 07/14] deleting images --- music_assistant/client/client.py | 24 ++++---- music_assistant/client/music.py | 52 ++++++++--------- .../server/controllers/metadata.py | 56 +++++++++---------- music_assistant/server/helpers/images.py | 3 +- 4 files changed, 68 insertions(+), 67 deletions(-) diff --git a/music_assistant/client/client.py b/music_assistant/client/client.py index cc0ae4ce6..3653cf86c 100644 --- a/music_assistant/client/client.py +++ b/music_assistant/client/client.py @@ -151,18 +151,18 @@ def get_image_url(self, image: MediaItemImage, size: int = 0) -> str: ) def get_media_item_image_url( - self, - item: MediaItemType | ItemMapping | QueueItem, - type: ImageType = ImageType.THUMB, # noqa: A002 - size: int = 0, - ) -> str | None: - """Get image URL for MediaItem, QueueItem or ItemMapping.""" - # handle queueitem with media_item attribute - if media_item := getattr(item, "media_item", None): - if img := self.music.get_media_item_image(media_item, type): - return self.get_image_url(img, size) - if img := self.music.get_media_item_image(item, type): - return self.get_image_url(img, size) + #self, + #item: MediaItemType | ItemMapping | QueueItem, + #type: ImageType = ImageType.THUMB, # noqa: A002 + #size: int = 0, + # ) -> str | None: + #"""Get image URL for MediaItem, QueueItem or ItemMapping.""" + ## handle queueitem with media_item attribute + #if media_item := getattr(item, "media_item", None): + # if img := self.music.get_media_item_image(media_item, type): + # return self.get_image_url(img, size) + #if img := self.music.get_media_item_image(item, type): + # return self.get_image_url(img, size) return None def subscribe( diff --git a/music_assistant/client/music.py b/music_assistant/client/music.py index 9cdadb3a2..b620fe71b 100644 --- a/music_assistant/client/music.py +++ b/music_assistant/client/music.py @@ -527,35 +527,35 @@ async def refresh_item( # helpers def get_media_item_image( - self, - item: MediaItemType | ItemMapping | QueueItem, - type: ImageType = ImageType.THUMB, # noqa: A002 - ) -> MediaItemImage | None: - """Get MediaItemImage for MediaItem, ItemMapping.""" - if not item: - # guard for unexpected bad things - return None + #self, + #item: MediaItemType | ItemMapping | QueueItem, + #type: ImageType = ImageType.THUMB, # noqa: A002 + # ) -> MediaItemImage | None: + # Get MediaItemImage for MediaItem, ItemMapping + #if not item: + # # guard for unexpected bad things + # return None # handle image in itemmapping - if item.image and item.image.type == type: - return item.image + #if item.image and item.image.type == type: + # return item.image # always prefer album image for tracks - album: Album | ItemMapping | None - if album := getattr(item, "album", None): - if album_image := self.get_media_item_image(album, type): - return album_image + #album: Album | ItemMapping | None + #if album := getattr(item, "album", None): + # if album_image := self.get_media_item_image(album, type): + # return album_image # handle regular image within mediaitem - metadata: MediaItemMetadata | None - if metadata := getattr(item, "metadata", None): - for img in metadata.images or []: - if img.type == type: - return cast(MediaItemImage, img) + #metadata: MediaItemMetadata | None + #if metadata := getattr(item, "metadata", None): + # for img in metadata.images or []: + # if img.type == type: + # return cast(MediaItemImage, img) # retry with album/track artist(s) - artists: list[Artist | ItemMapping] | None - if artists := getattr(item, "artists", None): - for artist in artists: - if artist_image := self.get_media_item_image(artist, type): - return artist_image + #artists: list[Artist | ItemMapping] | None + #if artists := getattr(item, "artists", None): + # for artist in artists: + # if artist_image := self.get_media_item_image(artist, type): + # return artist_image # allow landscape fallback - if type == ImageType.THUMB: - return self.get_media_item_image(item, ImageType.LANDSCAPE) + #if type == ImageType.THUMB: + # return self.get_media_item_image(item, ImageType.LANDSCAPE) return None diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index 48b6311b0..63413e079 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -291,39 +291,38 @@ async def get_image_data_for_item( return await self.get_thumbnail(img_path, size) async def get_image_url_for_item( - self, - media_item: MediaItemType, - img_type: ImageType = ImageType.THUMB, - resolve: bool = True, - ) -> str | None: - """Get url to image for given media media_item.""" - if not media_item: - return None - if isinstance(media_item, ItemMapping): - media_item = await self.mass.music.get_item_by_uri(media_item.uri) - if media_item and media_item.metadata.images: - for img in media_item.metadata.images: - if img.type != img_type: - continue - if img.remotely_accessible and not resolve: - continue - if img.remotely_accessible and resolve: - return self.get_image_url(img) - return img.path + #self, + #media_item: MediaItemType, + #img_type: ImageType = ImageType.THUMB, + #resolve: bool = True, + #) -> str | None: + #"""Get url to image for given media media_item.""" + #if not media_item: + # return None + #if isinstance(media_item, ItemMapping): + # media_item = await self.mass.music.get_item_by_uri(media_item.uri) + #if media_item and media_item.metadata.images: + # for img in media_item.metadata.images: + # if img.type != img_type: + # continue + # if img.remotely_accessible and not resolve: + # continue + # if img.remotely_accessible and resolve: + # return self.get_image_url(img) + # return img.path # retry with track's album - if media_item.media_type == MediaType.TRACK and media_item.album: - return await self.get_image_url_for_item(media_item.album, img_type, resolve) + #if media_item.media_type == MediaType.TRACK and media_item.album: + # return await self.get_image_url_for_item(media_item.album, img_type, resolve) # try artist instead for albums - if media_item.media_type == MediaType.ALBUM and media_item.artists: - return await self.get_image_url_for_item(media_item.artists[0], img_type, resolve) + #if media_item.media_type == MediaType.ALBUM and media_item.artists: + # return await self.get_image_url_for_item(media_item.artists[0], img_type, resolve) # last resort: track artist(s) - if media_item.media_type == MediaType.TRACK and media_item.artists: - for artist in media_item.artists: - return await self.get_image_url_for_item(artist, img_type, resolve) - + #if media_item.media_type == MediaType.TRACK and media_item.artists: + # for artist in media_item.artists: + # return await self.get_image_url_for_item(artist, img_type, resolve) return None def get_image_url( @@ -361,7 +360,7 @@ async def get_thumbnail( return thumbnail async def handle_imageproxy(self, request: web.Request) -> web.Response: - """Handle request for image proxy.""" + """Handle request for image proxy path = request.query["path"] provider = request.query.get("provider", "builtin") if provider in ("url", "file"): @@ -385,6 +384,7 @@ async def handle_imageproxy(self, request: web.Request) -> web.Response: headers={"Cache-Control": "max-age=31536000", "Access-Control-Allow-Origin": "*"}, content_type=f"image/{image_format}", ) + """ return web.Response(status=404) async def create_collage_image( diff --git a/music_assistant/server/helpers/images.py b/music_assistant/server/helpers/images.py index 4b015eee2..b43b3c1b4 100644 --- a/music_assistant/server/helpers/images.py +++ b/music_assistant/server/helpers/images.py @@ -24,7 +24,7 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) -> bytes: - """Create thumbnail from image url.""" + """Create thumbnail from image url. # TODO: add local cache here ! if prov := mass.get_provider(provider): prov: MusicProvider | MetadataProvider @@ -49,6 +49,7 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) if img_data := await get_embedded_image(path_or_url): return img_data msg = f"Image not found: {path_or_url}" + """ raise FileNotFoundError(msg) From ff479e4303e4619a81bded92d372bc8fdafa3c2b Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:15:24 +0200 Subject: [PATCH 08/14] deleting v4 --- .../server/controllers/metadata.py | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index 63413e079..dddf45a86 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -360,31 +360,30 @@ async def get_thumbnail( return thumbnail async def handle_imageproxy(self, request: web.Request) -> web.Response: - """Handle request for image proxy - path = request.query["path"] - provider = request.query.get("provider", "builtin") - if provider in ("url", "file"): - # temporary for backwards compatibility - provider = "builtin" - size = int(request.query.get("size", "0")) - image_format = request.query.get("fmt", "png") - if not self.mass.get_provider(provider): - return web.Response(status=404) - if "%" in path: - # assume (double) encoded url, decode it - path = urllib.parse.unquote(path) - with suppress(FileNotFoundError): - image_data = await self.get_thumbnail( - path, size=size, provider=provider, image_format=image_format - ) - # we set the cache header to 1 year (forever) - # assuming that images do not/rarely change - return web.Response( - body=image_data, - headers={"Cache-Control": "max-age=31536000", "Access-Control-Allow-Origin": "*"}, - content_type=f"image/{image_format}", - ) - """ + #Handle request for image proxy + #path = request.query["path"] + #provider = request.query.get("provider", "builtin") + #if provider in ("url", "file"): + # # temporary for backwards compatibility + # provider = "builtin" + #size = int(request.query.get("size", "0")) + #image_format = request.query.get("fmt", "png") + #if not self.mass.get_provider(provider): + # return web.Response(status=404) + #if "%" in path: + # # assume (double) encoded url, decode it + # path = urllib.parse.unquote(path) + #with suppress(FileNotFoundError): + # image_data = await self.get_thumbnail( + # path, size=size, provider=provider, image_format=image_format + # ) + # # we set the cache header to 1 year (forever) + # # assuming that images do not/rarely change + # return web.Response( + # body=image_data, + # headers={"Cache-Control": "max-age=31536000", "Access-Control-Allow-Origin": "*"}, + # content_type=f"image/{image_format}", + # ) return web.Response(status=404) async def create_collage_image( From 03c4515a4a42a32744bc70cc618afd1424b34834 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:23:24 +0200 Subject: [PATCH 09/14] deleting v4 --- music_assistant/server/controllers/metadata.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index dddf45a86..979c69533 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -291,11 +291,11 @@ async def get_image_data_for_item( return await self.get_thumbnail(img_path, size) async def get_image_url_for_item( - #self, - #media_item: MediaItemType, - #img_type: ImageType = ImageType.THUMB, - #resolve: bool = True, - #) -> str | None: + self, + media_item: MediaItemType, + img_type: ImageType = ImageType.THUMB, + resolve: bool = True, + ) -> str | None: #"""Get url to image for given media media_item.""" #if not media_item: # return None From f866bf7e0b47f93f652e8c22a222742e21b6871e Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:26:14 +0200 Subject: [PATCH 10/14] deleting v4 --- music_assistant/server/helpers/images.py | 1 - 1 file changed, 1 deletion(-) diff --git a/music_assistant/server/helpers/images.py b/music_assistant/server/helpers/images.py index 420ce3020..b43b3c1b4 100644 --- a/music_assistant/server/helpers/images.py +++ b/music_assistant/server/helpers/images.py @@ -26,7 +26,6 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) -> bytes: """Create thumbnail from image url. # TODO: add local cache here ! - """ if prov := mass.get_provider(provider): prov: MusicProvider | MetadataProvider if resolved_image := await prov.resolve_image(path_or_url): From a7231197d839cce25d091e4baf6cf7c61078a1d4 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:29:11 +0200 Subject: [PATCH 11/14] deleting v4 --- music_assistant/client/client.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/music_assistant/client/client.py b/music_assistant/client/client.py index 3653cf86c..b397a38d2 100644 --- a/music_assistant/client/client.py +++ b/music_assistant/client/client.py @@ -151,11 +151,11 @@ def get_image_url(self, image: MediaItemImage, size: int = 0) -> str: ) def get_media_item_image_url( - #self, - #item: MediaItemType | ItemMapping | QueueItem, - #type: ImageType = ImageType.THUMB, # noqa: A002 - #size: int = 0, - # ) -> str | None: + self, + item: MediaItemType | ItemMapping | QueueItem, + type: ImageType = ImageType.THUMB, # noqa: A002 + size: int = 0, + ) -> str | None: #"""Get image URL for MediaItem, QueueItem or ItemMapping.""" ## handle queueitem with media_item attribute #if media_item := getattr(item, "media_item", None): From 34e61fc4d021bdb8707eac624442e89557ba2cbc Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:32:24 +0200 Subject: [PATCH 12/14] deleting v4 --- music_assistant/client/music.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/music_assistant/client/music.py b/music_assistant/client/music.py index b620fe71b..39a53cf16 100644 --- a/music_assistant/client/music.py +++ b/music_assistant/client/music.py @@ -527,10 +527,10 @@ async def refresh_item( # helpers def get_media_item_image( - #self, - #item: MediaItemType | ItemMapping | QueueItem, - #type: ImageType = ImageType.THUMB, # noqa: A002 - # ) -> MediaItemImage | None: + self, + item: MediaItemType | ItemMapping | QueueItem, + type: ImageType = ImageType.THUMB, # noqa: A002 + ) -> MediaItemImage | None: # Get MediaItemImage for MediaItem, ItemMapping #if not item: # # guard for unexpected bad things From ebf3f4aaafae5c065aff8922cda56e58084e3003 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:52:25 +0200 Subject: [PATCH 13/14] deleting v5 --- music_assistant/client/client.py | 8 +- music_assistant/client/music.py | 28 +------ .../server/controllers/metadata.py | 77 +------------------ music_assistant/server/helpers/images.py | 27 +------ 4 files changed, 5 insertions(+), 135 deletions(-) diff --git a/music_assistant/client/client.py b/music_assistant/client/client.py index b397a38d2..3f50485ce 100644 --- a/music_assistant/client/client.py +++ b/music_assistant/client/client.py @@ -156,13 +156,7 @@ def get_media_item_image_url( type: ImageType = ImageType.THUMB, # noqa: A002 size: int = 0, ) -> str | None: - #"""Get image URL for MediaItem, QueueItem or ItemMapping.""" - ## handle queueitem with media_item attribute - #if media_item := getattr(item, "media_item", None): - # if img := self.music.get_media_item_image(media_item, type): - # return self.get_image_url(img, size) - #if img := self.music.get_media_item_image(item, type): - # return self.get_image_url(img, size) + """Get image URL for MediaItem, QueueItem or ItemMapping.""" return None def subscribe( diff --git a/music_assistant/client/music.py b/music_assistant/client/music.py index 39a53cf16..26816276d 100644 --- a/music_assistant/client/music.py +++ b/music_assistant/client/music.py @@ -531,31 +531,5 @@ def get_media_item_image( item: MediaItemType | ItemMapping | QueueItem, type: ImageType = ImageType.THUMB, # noqa: A002 ) -> MediaItemImage | None: - # Get MediaItemImage for MediaItem, ItemMapping - #if not item: - # # guard for unexpected bad things - # return None - # handle image in itemmapping - #if item.image and item.image.type == type: - # return item.image - # always prefer album image for tracks - #album: Album | ItemMapping | None - #if album := getattr(item, "album", None): - # if album_image := self.get_media_item_image(album, type): - # return album_image - # handle regular image within mediaitem - #metadata: MediaItemMetadata | None - #if metadata := getattr(item, "metadata", None): - # for img in metadata.images or []: - # if img.type == type: - # return cast(MediaItemImage, img) - # retry with album/track artist(s) - #artists: list[Artist | ItemMapping] | None - #if artists := getattr(item, "artists", None): - # for artist in artists: - # if artist_image := self.get_media_item_image(artist, type): - # return artist_image - # allow landscape fallback - #if type == ImageType.THUMB: - # return self.get_media_item_image(item, ImageType.LANDSCAPE) + """Get MediaItemImage for MediaItem, ItemMapping.""" return None diff --git a/music_assistant/server/controllers/metadata.py b/music_assistant/server/controllers/metadata.py index 979c69533..d5907ea70 100644 --- a/music_assistant/server/controllers/metadata.py +++ b/music_assistant/server/controllers/metadata.py @@ -295,34 +295,8 @@ async def get_image_url_for_item( media_item: MediaItemType, img_type: ImageType = ImageType.THUMB, resolve: bool = True, - ) -> str | None: - #"""Get url to image for given media media_item.""" - #if not media_item: - # return None - #if isinstance(media_item, ItemMapping): - # media_item = await self.mass.music.get_item_by_uri(media_item.uri) - #if media_item and media_item.metadata.images: - # for img in media_item.metadata.images: - # if img.type != img_type: - # continue - # if img.remotely_accessible and not resolve: - # continue - # if img.remotely_accessible and resolve: - # return self.get_image_url(img) - # return img.path - - # retry with track's album - #if media_item.media_type == MediaType.TRACK and media_item.album: - # return await self.get_image_url_for_item(media_item.album, img_type, resolve) - - # try artist instead for albums - #if media_item.media_type == MediaType.ALBUM and media_item.artists: - # return await self.get_image_url_for_item(media_item.artists[0], img_type, resolve) - - # last resort: track artist(s) - #if media_item.media_type == MediaType.TRACK and media_item.artists: - # for artist in media_item.artists: - # return await self.get_image_url_for_item(artist, img_type, resolve) + ) -> str | None: + """Get url to image for given media media_item.""" return None def get_image_url( @@ -360,30 +334,6 @@ async def get_thumbnail( return thumbnail async def handle_imageproxy(self, request: web.Request) -> web.Response: - #Handle request for image proxy - #path = request.query["path"] - #provider = request.query.get("provider", "builtin") - #if provider in ("url", "file"): - # # temporary for backwards compatibility - # provider = "builtin" - #size = int(request.query.get("size", "0")) - #image_format = request.query.get("fmt", "png") - #if not self.mass.get_provider(provider): - # return web.Response(status=404) - #if "%" in path: - # # assume (double) encoded url, decode it - # path = urllib.parse.unquote(path) - #with suppress(FileNotFoundError): - # image_data = await self.get_thumbnail( - # path, size=size, provider=provider, image_format=image_format - # ) - # # we set the cache header to 1 year (forever) - # # assuming that images do not/rarely change - # return web.Response( - # body=image_data, - # headers={"Cache-Control": "max-age=31536000", "Access-Control-Allow-Origin": "*"}, - # content_type=f"image/{image_format}", - # ) return web.Response(status=404) async def create_collage_image( @@ -393,29 +343,6 @@ async def create_collage_image( fanart: bool = False, ) -> MediaItemImage | None: """Create collage thumb/fanart image for (in-library) playlist.""" - if len(images) < 8 and fanart or len(images) < 3: - # require at least some images otherwise this does not make a lot of sense - return None - try: - # create collage thumb from playlist tracks - # if playlist has no default image (e.g. a local playlist) - dimensions = (2500, 1750) if fanart else (1500, 1500) - img_data = await create_collage(self.mass, images, dimensions) - # always overwrite existing path - async with aiofiles.open(img_path, "wb") as _file: - await _file.write(img_data) - return MediaItemImage( - type=ImageType.FANART if fanart else ImageType.THUMB, - path=img_path, - provider="builtin", - remotely_accessible=False, - ) - except Exception as err: - self.logger.warning( - "Error while creating playlist image: %s", - str(err), - exc_info=err if self.logger.isEnabledFor(10) else None, - ) return None async def _update_artist_metadata(self, artist: Artist, force_refresh: bool = False) -> None: diff --git a/music_assistant/server/helpers/images.py b/music_assistant/server/helpers/images.py index b43b3c1b4..4b3ccf922 100644 --- a/music_assistant/server/helpers/images.py +++ b/music_assistant/server/helpers/images.py @@ -24,32 +24,7 @@ async def get_image_data(mass: MusicAssistant, path_or_url: str, provider: str) -> bytes: - """Create thumbnail from image url. - # TODO: add local cache here ! - if prov := mass.get_provider(provider): - prov: MusicProvider | MetadataProvider - if resolved_image := await prov.resolve_image(path_or_url): - if isinstance(resolved_image, bytes): - return resolved_image - if isinstance(resolved_image, str): - path_or_url = resolved_image - # handle HTTP location - if path_or_url.startswith("http"): - try: - async with mass.http_session.get(path_or_url, raise_for_status=True) as resp: - return await resp.read() - except ClientError as err: - raise FileNotFoundError from err - # handle FILE location (of type image) - if path_or_url.endswith(("jpg", "JPG", "png", "PNG", "jpeg")): - if await asyncio.to_thread(os.path.isfile, path_or_url): - async with aiofiles.open(path_or_url, "rb") as _file: - return await _file.read() - # use ffmpeg for embedded images - if img_data := await get_embedded_image(path_or_url): - return img_data - msg = f"Image not found: {path_or_url}" - """ + """Create thumbnail from image url.""" raise FileNotFoundError(msg) From e7340f3385c7379d8124d94e4efc05a033af25a9 Mon Sep 17 00:00:00 2001 From: michaapyr Date: Sun, 28 Jul 2024 12:55:01 +0200 Subject: [PATCH 14/14] deleting v6 --- music_assistant/client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/music_assistant/client/client.py b/music_assistant/client/client.py index 3f50485ce..996910181 100644 --- a/music_assistant/client/client.py +++ b/music_assistant/client/client.py @@ -143,7 +143,7 @@ def get_image_url(self, image: MediaItemImage, size: int = 0) -> str: f"&w=${size}&h=${size}&fit=cover&a=attention" ) # return imageproxy url for images that need to be resolved - # the original path is double encoded + # the original path is double encoded 2 encoded_url = urllib.parse.quote(urllib.parse.quote(image.path)) return ( f"{self.server_info.base_url}/imageproxy?path={encoded_url}"