try to fix queue crash if qobuz does not return stream details
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 16 Jun 2019 15:54:07 +0000 (17:54 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 16 Jun 2019 15:54:07 +0000 (17:54 +0200)
music_assistant/modules/http_streamer.py
music_assistant/modules/musicproviders/qobuz.py

index 83c451e2b87d276e07618b0ac0a05abb0f1db84f..f49a5a103559c53ba642a058203867d15f33ef26 100755 (executable)
@@ -317,7 +317,7 @@ class HTTPStreamer():
         streamdetails = asyncio.run_coroutine_threadsafe(
                 self.mass.music.providers[provider].get_stream_details(track_id), self.mass.event_loop).result()
         if not streamdetails:
-            yield b''
+            yield (True, b'')
             return
         # TODO: add support for AAC streams (which sox doesn't natively support)
         if streamdetails['type'] == 'url':
index f4c94a0dbe56e9cfff62c828f75f6fc24254a473..7acd3e98fe47841680e2dd436254debc9c45cdc2 100644 (file)
@@ -254,13 +254,15 @@ class QobuzProvider(MusicProvider):
     
     async def get_stream_details(self, track_id):
         ''' return the content details for the given track when it will be streamed'''
-        # TODO: Report streaming start and streaming end !!
-        params = {'format_id': 27, 'track_id': track_id, 'intent': 'stream'}
-        streamdetails = await self.__get_data('track/getFileUrl', params, sign_request=True, ignore_cache=True)
-        if not streamdetails:
-            # simply retry this request
-            await asyncio.sleep(2)
+        for format_id in [27, 7, 6, 5]:
+            # it seems that simply requesting for highest available quality does not work
+            # from time to time the api response is empty for this request ?!
+            params = {'format_id': format_id, 'track_id': track_id, 'intent': 'stream'}
             streamdetails = await self.__get_data('track/getFileUrl', params, sign_request=True, ignore_cache=True)
+            if streamdetails and streamdetails.get('url'):
+                break
+            else:
+                await asyncio.sleep(1)
         if not streamdetails or not streamdetails.get('url'):
             LOGGER.error("Unable to retrieve stream url for track %s" % track_id)
             return None