Chore: Better exception if ffmpeg is missing or incorrect version
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 6 Feb 2025 22:58:01 +0000 (23:58 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 6 Feb 2025 22:58:01 +0000 (23:58 +0100)
music_assistant/helpers/ffmpeg.py
music_assistant/mass.py

index 678d9ace43a7836cde7059c266a39c9d7a711765..d326e2e4abe63dd9e225a2db470e1019e56240d3 100644 (file)
@@ -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",
index 3669771448f86d7ed42261890ce7156379a7dd70..23c128cfc7f880e6759c2239a7fecd2ba07c6c2d 100644 (file)
@@ -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()