Skip to content

Commit c6c720a

Browse files
TpmKranzJuniorJPDJ
authored andcommitted
fix: allow returning DASH manifest in get_file_url
If a track's manifest is not a JSON object but a DASH manifest, get_file_url throws. This fix encodes the DASH manifest in a data: URI to allow compatible players to play the track regardless. This is technically not a URL, but compatible players usually don't mind.
1 parent 99a46e4 commit c6c720a

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

tidal_async/api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,6 @@ async def _playbackinfopostpaywall(self, preferred_audio_quality) -> dict:
282282

283283
return await resp.json()
284284

285-
async def _stream_manifest(self, preferred_audio_quality):
286-
data = await self._playbackinfopostpaywall(preferred_audio_quality)
287-
return json.loads(base64.b64decode(data["manifest"])), data
288-
289285
async def get_file_url(
290286
self,
291287
required_quality: Optional[AudioQuality] = None,
@@ -307,12 +303,16 @@ async def get_file_url(
307303
if required_quality is None:
308304
required_quality = self.sess.required_audio_quality
309305

310-
manifest, playback_info = await self._stream_manifest(preferred_quality)
306+
playback_info = await self._playbackinfopostpaywall(preferred_quality)
311307
quality = AudioQuality(playback_info["audioQuality"])
312308

313309
if quality < required_quality:
314310
raise InsufficientAudioQuality(f"Got {quality} for {self}, required audio quality is {required_quality}")
315311

312+
try:
313+
manifest = json.loads(base64.b64decode(playback_info["manifest"]))
314+
except json.decoder.JSONDecodeError:
315+
return f'data:application/dash+xml;base64,{playback_info["manifest"]}'
316316
return manifest["urls"][0]
317317

318318
async def _lyrics(self) -> Optional[dict]:

0 commit comments

Comments
 (0)