From 4cae5921f39243a1b69b1df9764da1af0b4d9a78 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Tue, 15 Sep 2020 23:42:13 +0200 Subject: [PATCH] small fixes stability, consistency --- music_assistant/__main__.py | 14 ++++++++++---- music_assistant/database.py | 6 ++++-- music_assistant/http_streamer.py | 13 +++++++++++-- music_assistant/player_manager.py | 2 +- music_assistant/providers/chromecast/__init__.py | 2 +- music_assistant/providers/chromecast/player.py | 4 ++-- music_assistant/utils.py | 2 +- 7 files changed, 30 insertions(+), 13 deletions(-) diff --git a/music_assistant/__main__.py b/music_assistant/__main__.py index 6868b79f..befb2787 100755 --- a/music_assistant/__main__.py +++ b/music_assistant/__main__.py @@ -2,6 +2,8 @@ import argparse import logging import os +import platform +import webbrowser from aiorun import run from music_assistant.mass import MusicAssistant @@ -57,15 +59,19 @@ def main(): mass = MusicAssistant(data_dir) # run UI in browser on windows and macos only - # if platform.system() in ["Windows", "Darwin"]: - # import webbrowser - # webbrowser.open(f"http://localhost:{mass.web.http_port}") + if platform.system() in ["Windows", "Darwin"]: + webbrowser.open(mass.web.internal_url) def on_shutdown(loop): logger.info("shutdown requested!") loop.run_until_complete(mass.async_stop()) - run(mass.async_start(), use_uvloop=True, shutdown_callback=on_shutdown) + run( + mass.async_start(), + use_uvloop=True, + shutdown_callback=on_shutdown, + executor_workers=32, + ) if __name__ == "__main__": diff --git a/music_assistant/database.py b/music_assistant/database.py index c5f36096..0ed0bd8d 100755 --- a/music_assistant/database.py +++ b/music_assistant/database.py @@ -1048,7 +1048,9 @@ class Database: for key, value in external_ids.items(): sql_query = """INSERT or REPLACE INTO external_ids (item_id, media_type, key, value) VALUES(?,?,?,?);""" - await db_conn.execute(sql_query, (item_id, int(media_type), key, value)) + await db_conn.execute( + sql_query, (item_id, int(media_type), str(key), value) + ) async def __async_get_external_ids( self, item_id: int, media_type: MediaType, db_conn: sqlite3.Connection @@ -1131,7 +1133,7 @@ class Database: sql_query = "SELECT (item_id) FROM external_ids \ WHERE media_type=? AND key=? AND value=?;" for db_row in await db_conn.execute_fetchall( - sql_query, (int(media_item.media_type), key, value) + sql_query, (int(media_item.media_type), str(key), value) ): if db_row: return db_row[0] diff --git a/music_assistant/http_streamer.py b/music_assistant/http_streamer.py index db3c4e8b..70c780d0 100755 --- a/music_assistant/http_streamer.py +++ b/music_assistant/http_streamer.py @@ -16,6 +16,7 @@ import threading import urllib from contextlib import suppress +import aiohttp import pyloudnorm import soundfile from aiohttp import web @@ -71,7 +72,11 @@ class HTTPStreamer: # let the streaming begin! try: await asyncio.gather(bg_task) - except (asyncio.CancelledError, asyncio.TimeoutError) as exc: + except ( + asyncio.CancelledError, + aiohttp.ClientConnectionError, + asyncio.TimeoutError, + ) as exc: cancelled.set() raise exc # re-raise return resp @@ -112,7 +117,11 @@ class HTTPStreamer: # let the streaming begin! try: await asyncio.gather(bg_task) - except (asyncio.CancelledError, asyncio.TimeoutError) as exc: + except ( + asyncio.CancelledError, + aiohttp.ClientConnectionError, + asyncio.TimeoutError, + ) as exc: cancelled.set() raise exc # re-raise return resp diff --git a/music_assistant/player_manager.py b/music_assistant/player_manager.py index 1796cd74..591770a1 100755 --- a/music_assistant/player_manager.py +++ b/music_assistant/player_manager.py @@ -461,7 +461,7 @@ class PlayerManager: gain_correct = round(gain_correct, 2) LOGGER.debug( "Loudness level for track %s/%s is %s - calculated replayGain is %s", - id, + provider_id, item_id, track_loudness, gain_correct, diff --git a/music_assistant/providers/chromecast/__init__.py b/music_assistant/providers/chromecast/__init__.py index feace029..ac7177c8 100644 --- a/music_assistant/providers/chromecast/__init__.py +++ b/music_assistant/providers/chromecast/__init__.py @@ -72,7 +72,7 @@ class ChromecastProvider(PlayerProvider): pychromecast.stop_discovery(self._browser) # stop cast socket clients for player in self._players.values(): - await player.async_disconnect() + player.disconnect() async def async_cmd_play_uri(self, player_id: str, uri: str): """ diff --git a/music_assistant/providers/chromecast/player.py b/music_assistant/providers/chromecast/player.py index d39b6458..81facca8 100644 --- a/music_assistant/providers/chromecast/player.py +++ b/music_assistant/providers/chromecast/player.py @@ -186,7 +186,7 @@ class ChromecastPlayer: chromecast.mz_controller = mz_controller self._chromecast.start() - async def async_disconnect(self): + def disconnect(self): """Disconnect Chromecast object if it is set.""" if self._chromecast is None: return @@ -194,7 +194,7 @@ class ChromecastPlayer: "[%s] Disconnecting from chromecast socket", self._cast_info.friendly_name ) self._available = False - self.mass.add_job(self._chromecast.disconnect) + self._chromecast.disconnect() self._invalidate() def _invalidate(self): diff --git a/music_assistant/utils.py b/music_assistant/utils.py index 3a16feab..691fb205 100755 --- a/music_assistant/utils.py +++ b/music_assistant/utils.py @@ -298,7 +298,7 @@ def create_tempfile(): return tempfile.NamedTemporaryFile(buffering=0) -class CustomIntEnum(Enum): +class CustomIntEnum(int, Enum): """Base for IntEnum with some helpers.""" # when serializing we prefer the string (name) representation -- 2.34.1