From 17467d25a73252bf32a5304df356ed2f9a517d2d Mon Sep 17 00:00:00 2001 From: marcelveldt Date: Tue, 12 Nov 2019 19:47:56 +0100 Subject: [PATCH] some threading fixes --- music_assistant/models/musicprovider.py | 11 ++++------- music_assistant/models/player_queue.py | 6 +++--- music_assistant/music_manager.py | 6 +++--- music_assistant/playerproviders/squeezebox.py | 3 +++ music_assistant/web.py | 9 ++++++--- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/music_assistant/models/musicprovider.py b/music_assistant/models/musicprovider.py index 630fb561..dc7f4cdb 100755 --- a/music_assistant/models/musicprovider.py +++ b/music_assistant/models/musicprovider.py @@ -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: diff --git a/music_assistant/models/player_queue.py b/music_assistant/models/player_queue.py index e61d00e0..7b69f418 100755 --- a/music_assistant/models/player_queue.py +++ b/music_assistant/models/player_queue.py @@ -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): diff --git a/music_assistant/music_manager.py b/music_assistant/music_manager.py index 85399ea7..dcbaecbd 100755 --- a/music_assistant/music_manager.py +++ b/music_assistant/music_manager.py @@ -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 diff --git a/music_assistant/playerproviders/squeezebox.py b/music_assistant/playerproviders/squeezebox.py index fdee6c0a..0581dbf4 100644 --- a/music_assistant/playerproviders/squeezebox.py +++ b/music_assistant/playerproviders/squeezebox.py @@ -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") diff --git a/music_assistant/web.py b/music_assistant/web.py index 0f414695..ffe27f01 100755 --- a/music_assistant/web.py +++ b/music_assistant/web.py @@ -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}') -- 2.34.1