From 0925fc0e0ec4fd259073ef825a4563ccd54200d4 Mon Sep 17 00:00:00 2001 From: Marvin Schenkel Date: Sat, 9 Jul 2022 21:39:53 +0200 Subject: [PATCH] Youtube Music: Fix streaming of non secured URLs (#404) * Fix streaming of non secured URLs * Fix missing duration for artist top tracks --- .../music_providers/ytmusic/ytmusic.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/music_assistant/music_providers/ytmusic/ytmusic.py b/music_assistant/music_providers/ytmusic/ytmusic.py index 8503557c..3272d05b 100644 --- a/music_assistant/music_providers/ytmusic/ytmusic.py +++ b/music_assistant/music_providers/ytmusic/ytmusic.py @@ -224,8 +224,9 @@ class YoutubeMusicProvider(MusicProvider): artist_obj = await get_artist(prov_artist_id=prov_artist_id) if "songs" in artist_obj and "results" in artist_obj["songs"]: return [ - await self._parse_track(track) + await self.get_track(track["videoId"]) for track in artist_obj["songs"]["results"] + if track.get("videoId") ] return [] @@ -453,14 +454,20 @@ class YoutubeMusicProvider(MusicProvider): async def _parse_stream_url(self, stream_format: dict, item_id: str) -> str: """Figure out the stream URL to use based on the YT track object.""" - cipher_parts = {} - for part in stream_format["signatureCipher"].split("&"): - key, val = part.split("=", maxsplit=1) - cipher_parts[key] = unquote(val) - signature = await self._decipher_signature( - ciphered_signature=cipher_parts["s"], item_id=item_id - ) - url = cipher_parts["url"] + "&sig=" + signature + url = None + if stream_format.get("signatureCipher"): + # Secured URL + cipher_parts = {} + for part in stream_format["signatureCipher"].split("&"): + key, val = part.split("=", maxsplit=1) + cipher_parts[key] = unquote(val) + signature = await self._decipher_signature( + ciphered_signature=cipher_parts["s"], item_id=item_id + ) + url = cipher_parts["url"] + "&sig=" + signature + elif stream_format.get("url"): + # Non secured URL + url = stream_format.get("url") return url @classmethod -- 2.34.1