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 []
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