some threading fixes
authormarcelveldt <marcelvanderveldt@MacBook-Pro.local>
Tue, 12 Nov 2019 18:47:56 +0000 (19:47 +0100)
committermarcelveldt <marcelvanderveldt@MacBook-Pro.local>
Tue, 12 Nov 2019 18:47:56 +0000 (19:47 +0100)
music_assistant/models/musicprovider.py
music_assistant/models/player_queue.py
music_assistant/music_manager.py
music_assistant/playerproviders/squeezebox.py
music_assistant/web.py

index 630fb5615b7b3fe01b4c5735baa0173684c33d7c..dc7f4cdbf9cf9bd46f954e13f93d12a52df6edd6 100755 (executable)
@@ -95,9 +95,8 @@ class MusicProvider():
             ]
             for prov_id, provider in self.mass.music.providers.items():
                 if not prov_id in item_provider_keys:
-                    self.mass.event_loop.create_task(
-                        provider.match_artist(new_artist, new_artist_albums,
-                                              new_artist_toptracks))
+                    await provider.match_artist(
+                            new_artist, new_artist_albums, new_artist_toptracks)
         return item_id
 
     async def get_artist_musicbrainz_id(self,
@@ -192,8 +191,7 @@ class MusicProvider():
         ]
         for prov_id, provider in self.mass.music.providers.items():
             if not prov_id in item_provider_keys:
-                self.mass.event_loop.create_task(
-                    provider.match_album(new_album))
+                await provider.match_album(new_album)
         return item_id
 
     async def track(self, prov_item_id, lazy=True,
@@ -239,8 +237,7 @@ class MusicProvider():
         ]
         for prov_id, provider in self.mass.music.providers.items():
             if not prov_id in item_provider_keys:
-                self.mass.event_loop.create_task(
-                    provider.match_track(new_track))
+                await provider.match_track(new_track)
         return item_id
 
     async def playlist(self, prov_playlist_id) -> Playlist:
index e61d00e071c8d5d08ae163e4ccf8dfee5a72c92a..7b69f418b4107015fda1cca210e935aee848fbbb 100755 (executable)
@@ -55,10 +55,10 @@ class PlayerQueue():
         self._next_queue_startindex = 0
         self._last_player_state = PlayerState.Stopped
         self._last_track = None
-        self.mass.run_task(
-                self.mass.add_event_listener(self.on_shutdown, "shutdown"))
+        asyncio.run_coroutine_threadsafe(
+                self.mass.add_event_listener(self.on_shutdown, "shutdown"), self.mass.event_loop)
         # load previous queue settings from disk
-        self.mass.run_task(self.__restore_saved_state())
+        asyncio.run_coroutine_threadsafe(self.__restore_saved_state(), self.mass.event_loop)
 
     @property
     def shuffle_enabled(self):
index 85399ea7576b51f01cbd4639f64f71a4cda6f8e4..dcbaecbd8c284eaeec2825432e923f6be0414977 100755 (executable)
@@ -161,7 +161,7 @@ class MusicManager():
                                provider='database') -> List[Track]:
         ''' get top tracks for given artist '''
         track_names = []
-        artist = await self.artist(artist_id, provider)
+        artist = await self.artist(artist_id, provider, lazy=False)
         # always append database tracks
         async for item in self.mass.db.artist_tracks(artist.item_id):
             if (item.name + item.version) not in track_names:
@@ -180,8 +180,8 @@ class MusicManager():
                             provider='database') -> List[Album]:
         ''' get (all) albums for given artist '''
         album_names = []
-        artist = await self.artist(artist_id, provider)
-        # always append database tracks
+        artist = await self.artist(artist_id, provider, lazy=False)
+        # always append database tracks (if db artist)
         async for item in self.mass.db.artist_albums(artist.item_id):
             if (item.name + item.version) not in album_names:
                 yield item
index fdee6c0afb8d209b03e945f4a9162147e36bcf25..0581dbf40f48a8e6fc87c3d3491af3b1f7d30ad6 100644 (file)
@@ -581,6 +581,9 @@ class DiscoveryProtocol():
         mreq = struct.pack('4sL', group, socket.INADDR_ANY)
         sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
 
+    def error_received(self, exc):
+        LOGGER.error(exc)
+
     def connection_lost(self, *args, **kwargs):
         LOGGER.debug("Connection lost to discovery")
     
index 0f414695fba5c1acbc837ed8be76e92a8e686e8e..ffe27f01dd0911c191c5d62bbd36daec5f66b6df 100755 (executable)
@@ -188,9 +188,10 @@ class Web():
         """ get full artist details"""
         item_id = request.match_info.get('item_id')
         provider = request.rel_url.query.get('provider')
+        lazy = request.rel_url.query.get('lazy', 'true') != 'false'
         if (item_id is None or provider is None):
             return web.Response(text='invalid item or provider', status=501)
-        result = await self.mass.music.artist(item_id, provider, lazy=False)
+        result = await self.mass.music.artist(item_id, provider, lazy=lazy)
         return web.json_response(result, dumps=json_serializer)
     
     @routes.get('/api/albums/{item_id}')
@@ -198,9 +199,10 @@ class Web():
         """ get full album details"""
         item_id = request.match_info.get('item_id')
         provider = request.rel_url.query.get('provider')
+        lazy = request.rel_url.query.get('lazy', 'true') != 'false'
         if (item_id is None or provider is None):
             return web.Response(text='invalid item or provider', status=501)
-        result = await self.mass.music.album(item_id, provider, lazy=False)
+        result = await self.mass.music.album(item_id, provider, lazy=lazy)
         return web.json_response(result, dumps=json_serializer)
 
     @routes.get('/api/tracks/{item_id}')
@@ -208,9 +210,10 @@ class Web():
         """ get full track details"""
         item_id = request.match_info.get('item_id')
         provider = request.rel_url.query.get('provider')
+        lazy = request.rel_url.query.get('lazy', 'true') != 'false'
         if (item_id is None or provider is None):
             return web.Response(text='invalid item or provider', status=501)
-        result = await self.mass.music.track(item_id, provider, lazy=False)
+        result = await self.mass.music.track(item_id, provider, lazy=lazy)
         return web.json_response(result, dumps=json_serializer)
 
     @routes.get('/api/playlists/{item_id}')