fix: Several minor fixes for deezer (#1231)
authormicha91 <michael.harbarth@gmx.de>
Thu, 18 Apr 2024 21:41:20 +0000 (23:41 +0200)
committerGitHub <noreply@github.com>
Thu, 18 Apr 2024 21:41:20 +0000 (23:41 +0200)
music_assistant/server/providers/deezer/__init__.py
music_assistant/server/providers/deezer/gw_client.py

index 3dba2cb1a2c70e303a1ea7f5eed937b0ea454753..0ecda5f656e2e0f52d543c1b568b83bb91b262c0 100644 (file)
@@ -1,6 +1,5 @@
 """Deezer music provider support for MusicAssistant."""
 
-import datetime
 import hashlib
 import uuid
 from asyncio import TaskGroup
@@ -12,7 +11,9 @@ from typing import Any
 import deezer
 from aiohttp import ClientSession, ClientTimeout
 from Crypto.Cipher import Blowfish
+from deezer import exceptions as deezer_exceptions
 
+from music_assistant.common.helpers.datetime import utc_timestamp
 from music_assistant.common.models.config_entries import (
     ConfigEntry,
     ConfigValueType,
@@ -289,14 +290,14 @@ class DeezerProvider(MusicProvider):  # pylint: disable=W0223
             return self.parse_artist(
                 artist=await self.client.get_artist(artist_id=int(prov_artist_id))
             )
-        except deezer.exceptions.DeezerErrorResponse as error:
+        except deezer_exceptions.DeezerErrorResponse as error:
             self.logger.warning("Failed getting artist: %s", error)
 
     async def get_album(self, prov_album_id: str) -> Album:
         """Get full album details by id."""
         try:
             return self.parse_album(album=await self.client.get_album(album_id=int(prov_album_id)))
-        except deezer.exceptions.DeezerErrorResponse as error:
+        except deezer_exceptions.DeezerErrorResponse as error:
             self.logger.warning("Failed getting album: %s", error)
 
     async def get_playlist(self, prov_playlist_id: str) -> Playlist:
@@ -305,7 +306,7 @@ class DeezerProvider(MusicProvider):  # pylint: disable=W0223
             return self.parse_playlist(
                 playlist=await self.client.get_playlist(playlist_id=int(prov_playlist_id)),
             )
-        except deezer.exceptions.DeezerErrorResponse as error:
+        except deezer_exceptions.DeezerErrorResponse as error:
             self.logger.warning("Failed getting playlist: %s", error)
 
     async def get_track(self, prov_track_id: str) -> Track:
@@ -315,7 +316,7 @@ class DeezerProvider(MusicProvider):  # pylint: disable=W0223
                 track=await self.client.get_track(track_id=int(prov_track_id)),
                 user_country=self.gw_client.user_country,
             )
-        except deezer.exceptions.DeezerErrorResponse as error:
+        except deezer_exceptions.DeezerErrorResponse as error:
             self.logger.warning("Failed getting track: %s", error)
 
     async def get_album_tracks(self, prov_album_id: str) -> list[AlbumTrack]:
@@ -473,7 +474,7 @@ class DeezerProvider(MusicProvider):  # pylint: disable=W0223
             headers["Range"] = f"bytes={skip_bytes}-"
 
         buffer = bytearray()
-        streamdetails.data["start_ts"] = datetime.datetime.utcnow().timestamp()
+        streamdetails.data["start_ts"] = utc_timestamp()
         streamdetails.data["stream_id"] = uuid.uuid1()
         self.mass.create_task(self.gw_client.log_listen(next_track=streamdetails.item_id))
         async with self.mass.http_session.get(
@@ -618,7 +619,7 @@ class DeezerProvider(MusicProvider):  # pylint: disable=W0223
                         remotely_accessible=True,
                     )
                 ],
-                checksum=playlist.checksum,
+                cache_checksum=playlist.checksum,
             ),
             is_editable=creator.id == self.user.id,
             owner=creator.name,
index fc6ad896384b68cc198c9ab2d4fad5ffa611eeba..0a03c298fdebb18030edd2dac129d025f0cc1e90 100644 (file)
@@ -10,6 +10,7 @@ from http.cookies import BaseCookie, Morsel
 from aiohttp import ClientSession
 from yarl import URL
 
+from music_assistant.common.helpers.datetime import utc_timestamp
 from music_assistant.common.models.streamdetails import StreamDetails
 
 USER_AGENT_HEADER = (
@@ -57,11 +58,11 @@ class GWClient:
     async def _update_user_data(self) -> None:
         user_data = await self._gw_api_call("deezer.getUserData", False)
         if not user_data["results"]["USER"]["USER_ID"]:
-            await self._get_cookie()
+            await self._set_cookie()
             user_data = await self._gw_api_call("deezer.getUserData", False)
 
         if not user_data["results"]["OFFER_ID"]:
-            msg = "Free subscriptions cannot be used in MA."
+            msg = "Free subscriptions cannot be used in MA. Make sure you set a valid ARL."
             raise DeezerGWError(msg)
 
         self._gw_csrf_token = user_data["results"]["checkForm"]
@@ -167,7 +168,7 @@ class GWClient:
 
         if last_track:
             seconds_streamed = min(
-                datetime.datetime.utcnow().timestamp() - last_track.data["start_ts"],
+                utc_timestamp() - last_track.data["start_ts"],
                 last_track.seconds_streamed,
             )
 
@@ -179,7 +180,7 @@ class GWClient:
                 },
                 "type": 1,
                 "stat": {
-                    "seek": 1 if last_track.seconds_skipped else 0,
+                    "seek": 1 if seconds_streamed < last_track.duration else 0,
                     "pause": 0,
                     "sync": 0,
                     "next": bool(next_track),