diff --git a/.gitignore b/.gitignore index 2f396e9..2394d47 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ cython_debug/ #.idea/ .env +audios/*.mp3 +audios/*.ogg diff --git a/audios/.gitkeep b/audios/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/chain_service/dependencies/audio_converter_service.py b/chain_service/dependencies/audio_converter_service.py new file mode 100644 index 0000000..ac5f5f2 --- /dev/null +++ b/chain_service/dependencies/audio_converter_service.py @@ -0,0 +1,13 @@ +from chain_service.services.audio_converter import AudioConverterService + +from fastapi import Depends +from typing import Annotated + + +def get_audio_converter_service() -> AudioConverterService: + return AudioConverterService() + + +AudioConverterServiceDependency = Annotated[ + AudioConverterService, Depends(get_audio_converter_service) +] diff --git a/chain_service/services/audio_converter.py b/chain_service/services/audio_converter.py new file mode 100644 index 0000000..aeb8be2 --- /dev/null +++ b/chain_service/services/audio_converter.py @@ -0,0 +1,33 @@ +from chain_service.utils.sync_to_async import sync_to_async + +import os +import ffmpeg +import aiofiles +from uuid import uuid4 +from io import BytesIO + + +class AudioConverterService: + + @sync_to_async + def __mp3_to_ogg(self, mp3: BytesIO) -> str: + filename = f"./audios/{uuid4()}.ogg" + + process = ( + ffmpeg.input("pipe:") + .output(filename, loglevel="quiet") + .overwrite_output() + .run_async(pipe_stdin=True) + ) + + process.communicate(input=mp3.getbuffer()) + return filename + + async def mp3_to_ogg(self, mp3: BytesIO) -> BytesIO: + filename = await self.__mp3_to_ogg(mp3) + + async with aiofiles.open(filename, "rb") as file: + content = BytesIO(initial_bytes=await file.read()) + + os.remove(filename) + return content