Youtube Music: Fix streaming of non secured URLs (#404)
authorMarvin Schenkel <marvinschenkel@gmail.com>
Sat, 9 Jul 2022 19:39:53 +0000 (21:39 +0200)
committerGitHub <noreply@github.com>
Sat, 9 Jul 2022 19:39:53 +0000 (21:39 +0200)
* Fix streaming of non secured URLs

* Fix missing duration for artist top tracks

music_assistant/music_providers/ytmusic/ytmusic.py

index 8503557cf057895b47a830aa984b85f22b132953..3272d05bf296f3608bb8cabbf58ff8276d49caaf 100644 (file)
@@ -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