From 0028e360e47f6a08df5eb5408d6aeb484c583e9b Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Thu, 6 Feb 2025 23:58:01 +0100 Subject: [PATCH] Chore: Better exception if ffmpeg is missing or incorrect version --- music_assistant/helpers/ffmpeg.py | 29 +++++++++++++++-------------- music_assistant/mass.py | 5 +++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/music_assistant/helpers/ffmpeg.py b/music_assistant/helpers/ffmpeg.py index 678d9ace..d326e2e4 100644 --- a/music_assistant/helpers/ffmpeg.py +++ b/music_assistant/helpers/ffmpeg.py @@ -338,30 +338,31 @@ def get_ffmpeg_args( async def check_ffmpeg_version() -> None: """Check if ffmpeg is present (with libsoxr support).""" # check for FFmpeg presence - returncode, output = await check_output("ffmpeg", "-version") - ffmpeg_present = returncode == 0 and "FFmpeg" in output.decode() - - # use globals as in-memory cache - version = output.decode().split("ffmpeg version ")[1].split(" ")[0].split("-")[0] - libsoxr_support = "enable-libsoxr" in output.decode() - await set_global_cache_values({CACHE_ATTR_LIBSOXR_PRESENT: libsoxr_support}) - - if not ffmpeg_present: - msg = ( - "FFmpeg binary is missing from system." + try: + returncode, output = await check_output("ffmpeg", "-version") + except FileNotFoundError: + raise AudioError( + "FFmpeg binary is missing from system. " "Please install ffmpeg on your OS to enable playback." ) + # parse version number from output + try: + version = output.decode().split("ffmpeg version ")[1].split(" ")[0].split("-")[0] + except IndexError: raise AudioError( - msg, + "Error determining FFmpeg version on your system." + f"Additional info: {returncode} {output}" ) + libsoxr_support = "enable-libsoxr" in output.decode() + # use globals as in-memory cache + await set_global_cache_values({CACHE_ATTR_LIBSOXR_PRESENT: libsoxr_support}) major_version = int("".join(char for char in version.split(".")[0] if not char.isalpha())) if major_version < MINIMAL_FFMPEG_VERSION: - msg = ( + raise AudioError( f"FFmpeg version {version} is not supported. " f"Minimal version required is {MINIMAL_FFMPEG_VERSION}." ) - raise AudioError(msg) LOGGER.info( "Detected ffmpeg version %s %s", diff --git a/music_assistant/mass.py b/music_assistant/mass.py index 36697714..23c128cf 100644 --- a/music_assistant/mass.py +++ b/music_assistant/mass.py @@ -164,14 +164,15 @@ class MusicAssistant: controller: CoreController = getattr(self, controller_name) self._provider_manifests[controller.domain] = controller.manifest await self.cache.setup(await self.config.get_core_config("cache")) + # load streams controller early so we can abort if we can't load it + await self.streams.setup(await self.config.get_core_config("streams")) await self.music.setup(await self.config.get_core_config("music")) await self.metadata.setup(await self.config.get_core_config("metadata")) await self.players.setup(await self.config.get_core_config("players")) await self.player_queues.setup(await self.config.get_core_config("player_queues")) - # load streams and webserver last so the api/frontend is + # load webserver/api last so the api/frontend is # not yet available while we're starting (or performing migrations) self._register_api_commands() - await self.streams.setup(await self.config.get_core_config("streams")) await self.webserver.setup(await self.config.get_core_config("webserver")) # load all available providers from manifest files await self.__load_provider_manifests() -- 2.34.1