default_value: ConfigValueType = None
required: bool = True
# options [optional]: select from list of possible values/options
- options: tuple[ConfigValueOption] | None = None
+ options: tuple[ConfigValueOption, ...] | None = None
# range [optional]: select values within range
range: tuple[int, int] | None = None
# description [optional]: extended description of the setting.
return None
@property
- def isrcs(self) -> tuple[str]:
+ def isrcs(self) -> tuple[str, ...]:
"""Split multiple values in isrc field."""
# sometimes the isrc contains multiple values, split by semicolon
if not self.isrc:
provider_domain: str
provider_instance: str
- media_types: tuple[MediaType]
+ media_types: tuple[MediaType, ...]
task: asyncio.Task
def to_dict(self, *args, **kwargs) -> dict[str, Any]:
self,
provider_domain: str | None = None,
provider_instance: str | None = None,
- provider_item_ids: tuple[str] | None = None,
+ provider_item_ids: tuple[str, ...] | None = None,
limit: int = 500,
offset: int = 0,
) -> list[ItemCls]:
self,
provider_domain: str | None = None,
provider_instance: str | None = None,
- provider_item_ids: tuple[str] | None = None,
+ provider_item_ids: tuple[str, ...] | None = None,
limit: int = 500,
offset: int = 0,
) -> AsyncGenerator[ItemCls, None]:
await self.get(db_playlist_id, provider_domain="database", force_refresh=True)
async def remove_playlist_tracks(
- self, db_playlist_id: str, positions_to_remove: tuple[int]
+ self, db_playlist_id: str, positions_to_remove: tuple[int, ...]
) -> None:
"""Remove multiple tracks from playlist."""
playlist = await self.get_db_item(db_playlist_id)
return iter(self._queues.values())
@api_command("players/queue/all")
- def all(self) -> tuple[PlayerQueue]:
+ def all(self) -> tuple[PlayerQueue, ...]:
"""Return all registered PlayerQueues."""
return tuple(self._queues.values())
return_unavailable: bool = True,
return_hidden: bool = True,
return_disabled: bool = False,
- ) -> tuple[Player]:
+ ) -> tuple[Player, ...]:
"""Return all registered players."""
return tuple(
player
TAG_SPLITTER = ";"
-def split_items(org_str: str) -> tuple[str]:
+def split_items(org_str: str) -> tuple[str, ...]:
"""Split up a tags string by common splitter."""
if not org_str:
return tuple()
return tuple(x.strip() for x in org_str.split(TAG_SPLITTER))
-def split_artists(org_artists: str | tuple[str]) -> tuple[str]:
+def split_artists(org_artists: str | tuple[str, ...]) -> tuple[str, ...]:
"""Parse all artists from a string."""
final_artists = set()
# when not using the multi artist tag, the artist string may contain
return self.tags.get("album")
@property
- def artists(self) -> tuple[str]:
+ def artists(self) -> tuple[str, ...]:
"""Return track artists."""
# prefer multi-artist tag
if tag := self.tags.get("artists"):
return (UNKNOWN_ARTIST,)
@property
- def album_artists(self) -> tuple[str]:
+ def album_artists(self) -> tuple[str, ...]:
"""Return (all) album artists (if any)."""
# prefer multi-artist tag
if tag := self.tags.get("albumartists"):
return tuple()
@property
- def genres(self) -> tuple[str]:
+ def genres(self) -> tuple[str, ...]:
"""Return (all) genres, if any."""
return split_items(self.tags.get("genre"))
return None
@property
- def musicbrainz_artistids(self) -> tuple[str]:
+ def musicbrainz_artistids(self) -> tuple[str, ...]:
"""Return musicbrainz_artistid tag(s) if present."""
return split_items(self.tags.get("musicbrainzartistid"))
@property
- def musicbrainz_albumartistids(self) -> tuple[str]:
+ def musicbrainz_albumartistids(self) -> tuple[str, ...]:
"""Return musicbrainz_albumartistid tag if present."""
return split_items(self.tags.get("musicbrainzalbumartistid"))
raise NotImplementedError
async def remove_playlist_tracks(
- self, prov_playlist_id: str, positions_to_remove: tuple[int]
+ self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
) -> None:
"""Remove track(s) from playlist."""
if ProviderFeature.PLAYLIST_TRACKS_EDIT in self.supported_features:
self._closing = True
await self._stop_bridge()
- def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry]:
+ def get_player_config_entries(self, player_id: str) -> tuple[ConfigEntry, ...]:
"""Return all (provider/player specific) Config Entries for the given player (if any)."""
slimproto_prov = self.mass.get_provider("slimproto")
base_entries = slimproto_prov.get_player_config_entries(player_id)
await self.write_file_content(prov_playlist_id, playlist_data.encode("utf-8"))
async def remove_playlist_tracks(
- self, prov_playlist_id: str, positions_to_remove: tuple[int]
+ self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
) -> None:
"""Remove track(s) from playlist."""
if not await self.exists(prov_playlist_id):
return await self._post_data(f"playlists/{prov_playlist_id}/tracks", data=data)
async def remove_playlist_tracks(
- self, prov_playlist_id: str, positions_to_remove: tuple[int]
+ self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
) -> None:
"""Remove track(s) from playlist."""
track_uris = []
)
async def remove_playlist_tracks(
- self, prov_playlist_id: str, positions_to_remove: tuple[int]
+ self, prov_playlist_id: str, positions_to_remove: tuple[int, ...]
) -> None:
"""Remove track(s) from playlist."""
playlist_obj = await get_playlist(
from types import TracebackType
EventCallBackType = Callable[[MassEvent], None]
-EventSubscriptionType = tuple[EventCallBackType, tuple[EventType] | None, tuple[str] | None]
+EventSubscriptionType = tuple[
+ EventCallBackType, tuple[EventType, ...] | None, tuple[str, ...] | None
+]
LOGGER = logging.getLogger(ROOT_LOGGER_NAME)