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",
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()