add_to_library = True
if library_item and force_refresh:
# get (first) provider item id belonging to this library item
+ add_to_library = True
provider_instance_id_or_domain, item_id = await self.get_provider_mapping(library_item)
elif library_item:
# we have a library item and no refreshing is needed, return the results!
import asyncio
import random
+import time
from collections.abc import AsyncGenerator
from typing import Any
return library_item
async def tracks(
- self,
- item_id: str,
- provider_instance_id_or_domain: str,
+ self, item_id: str, provider_instance_id_or_domain: str, force_refresh: bool = False
) -> AsyncGenerator[Track, None]:
"""Return playlist tracks for the given provider playlist id."""
- playlist = await self.get(item_id, provider_instance_id_or_domain)
+ playlist = await self.get(
+ item_id, provider_instance_id_or_domain, force_refresh=force_refresh
+ )
prov = next(x for x in playlist.provider_mappings)
async for track in self._get_provider_playlist_tracks(
prov.item_id,
prov.provider_instance,
- cache_checksum=playlist.metadata.checksum,
+ cache_checksum=str(time.time()) if force_refresh else playlist.metadata.checksum,
):
yield track
raise ProviderUnavailableError("No provider available which allows playlists creation.")
# create playlist on the provider
- return await provider.create_playlist(name)
+ playlist = await provider.create_playlist(name)
+ # add the new playlist to the library
+ return await self.add_item_to_library(playlist, True)
async def add_playlist_tracks(self, db_playlist_id: str | int, uris: list[str]) -> None:
"""Add multiple tracks to playlist. Creates background tasks to process the action."""
item.album = await self.mass.music.albums.get_provider_item(
item.album.item_id, item.album.provider, fallback=item.album
)
+ if isinstance(item.album, ItemMapping):
+ self.logger.warning(
+ "Unable to resolve Album for track %s, "
+ "track will be added to the library without album",
+ item.uri,
+ )
if item.album and not isinstance(item.album, ItemMapping):
item.album.artists = [
await self.mass.music.artists.get_provider_item(
self,
search_query: str,
media_types: list[MediaType] = MediaType.ALL,
- limit: int = 10,
+ limit: int = 50,
) -> SearchResults:
"""Perform global search for media items on all providers.
async def subscribe(self, player_id: str) -> AsyncGenerator[bytes, None]:
"""Subscribe consumer and iterate incoming chunks on the queue."""
try:
- self.subscribed_players[player_id] = sub_queue = asyncio.Queue(1)
+ self.subscribed_players[player_id] = sub_queue = asyncio.Queue(2)
if self._all_clients_connected.is_set():
# client subscribes while we're already started
if strict and not compare_version(base_item.version, compare_item.version):
return False
# check if both tracks are (not) explicit
- if base_item.metadata.explicit is None and base_item.album:
+ if base_item.metadata.explicit is None and isinstance(base_item.album, Album):
base_item.metadata.explicit = base_item.album.metadata.explicit
- if compare_item.metadata.explicit is None and compare_item.album:
+ if compare_item.metadata.explicit is None and isinstance(base_item.album, Album):
compare_item.metadata.explicit = compare_item.album.metadata.explicit
if strict and not compare_explicit(base_item.metadata, compare_item.metadata):
return False
elif playlist := await self.get_playlist(item.path):
# make sure that the item exists
# https://github.com/music-assistant/hass-music-assistant/issues/707
- library_item = await self.mass.music.playlists.add(
+ library_item = await self.mass.music.playlists.add_item_to_library(
playlist, skip_metadata_lookup=True
)
subitems.append(library_item)
else:
playlist_lines = await parse_pls(playlist_data)
- for line_no, playlist_line in enumerate(playlist_lines):
+ for line_no, playlist_line in enumerate(playlist_lines, 1):
if line_no not in positions_to_remove:
cur_lines.append(playlist_line)
child_players: list[Player] = []
conf_members: list[str] = self.config.get_value(player_id)
ignore_ids = set()
- group_player = self.mass.players.get(player_id)
- parent_source = group_player.active_source
+ if group_player := self.mass.players.get(player_id):
+ parent_source = group_player.active_source
+ else:
+ parent_source = player_id
for child_id in conf_members:
if child_player := self.mass.players.get(child_id, False):
# work out power state
"documentation": "",
"multi_instance": false,
"builtin": false,
- "load_by_default": false,
+ "load_by_default": true,
"icon": "speaker-multiple"
}
"python-slugify==8.0.1",
"mashumaro==3.8.1",
"memory-tempfile==2.2.3",
- "music-assistant-frontend==2.0.5",
+ "music-assistant-frontend==2.0.7",
"pillow==9.5.0",
"unidecode==1.3.6",
"xmltodict==0.13.0",
ifaddr==0.2.0
mashumaro==3.8.1
memory-tempfile==2.2.3
-music-assistant-frontend==2.0.5
+music-assistant-frontend==2.0.7
orjson==3.9.2
pillow==9.5.0
plexapi==4.14.0