UniqueList,
)
from music_assistant.common.models.streamdetails import StreamDetails
-from music_assistant.constants import MASS_LOGO, VARIOUS_ARTISTS_FANART
+from music_assistant.constants import MASS_LOGO, RESOURCES_DIR, VARIOUS_ARTISTS_FANART
from music_assistant.server.helpers.tags import AudioTags, parse_tags
from music_assistant.server.models.music_provider import MusicProvider
if not await asyncio.to_thread(os.path.exists, self._playlists_dir):
await asyncio.to_thread(os.mkdir, self._playlists_dir)
await super().loaded_in_mass()
+ # migrate old image path
+ # TODO: remove this after 2.3+ release
+ old_path = (
+ "/usr/local/lib/python3.12/site-packages/music_assistant/server/helpers/resources"
+ )
+ new_path = str(RESOURCES_DIR)
+ query = (
+ "UPDATE playlists SET metadata = "
+ f"REPLACE (metadata, '{old_path}', '{new_path}') "
+ f"WHERE playlists.metadata LIKE '%{old_path}%'"
+ )
+ await self.mass.music.database.execute(query)
+ await self.mass.music.database.commit()
@property
def is_streaming_provider(self) -> bool:
async def get_stream_details(self, item_id: str) -> StreamDetails:
"""Return the content details for the given track when it will be streamed."""
- # fetch full track details
- # this will also check if the track is available for streaming
- # and use spotify's track linking feature to serve a substitute track
- # if the original track is not available
- track = await self.get_track(item_id)
return StreamDetails(
- item_id=track.item_id,
+ item_id=item_id,
provider=self.instance_id,
audio_format=AudioFormat(
content_type=ContentType.OGG,
# so it will be retried (and the token refreshed)
if response.status == 401:
self._auth_info = None
- raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
+ raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.05)
# handle 404 not found, convert to MediaNotFoundError
if response.status == 404:
# so it will be retried (and the token refreshed)
if response.status == 401:
self._auth_info = None
- raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
+ raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.05)
# handle temporary server error
if response.status in (502, 503):
raise ResourceTemporarilyUnavailable(backoff_time=30)
# so it will be retried (and the token refreshed)
if response.status == 401:
self._auth_info = None
- raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
+ raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.05)
# handle temporary server error
if response.status in (502, 503):
# so it will be retried (and the token refreshed)
if response.status == 401:
self._auth_info = None
- raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.1)
+ raise ResourceTemporarilyUnavailable("Token expired", backoff_time=0.05)
# handle temporary server error
if response.status in (502, 503):
raise ResourceTemporarilyUnavailable(backoff_time=30)