From 483a59ba23d080cc93835d40df395116163911e7 Mon Sep 17 00:00:00 2001 From: micha91 Date: Thu, 18 Apr 2024 23:41:20 +0200 Subject: [PATCH] fix: Several minor fixes for deezer (#1231) --- .../server/providers/deezer/__init__.py | 15 ++++++++------- .../server/providers/deezer/gw_client.py | 9 +++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/music_assistant/server/providers/deezer/__init__.py b/music_assistant/server/providers/deezer/__init__.py index 3dba2cb1..0ecda5f6 100644 --- a/music_assistant/server/providers/deezer/__init__.py +++ b/music_assistant/server/providers/deezer/__init__.py @@ -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, diff --git a/music_assistant/server/providers/deezer/gw_client.py b/music_assistant/server/providers/deezer/gw_client.py index fc6ad896..0a03c298 100644 --- a/music_assistant/server/providers/deezer/gw_client.py +++ b/music_assistant/server/providers/deezer/gw_client.py @@ -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), -- 2.34.1