Spaces:
Running
Running
| from __future__ import annotations | |
| from collections.abc import Sequence | |
| from pathlib import Path | |
| from typing import Any | |
| from app.models.media import InputMedia, OperationResult | |
| from app.operations.common import ( | |
| AUDIO_FORMATS, | |
| IMAGE_FORMATS, | |
| VIDEO_FORMATS, | |
| audio_codec, | |
| execute, | |
| format_param, | |
| output_path, | |
| require_inputs, | |
| video_codecs, | |
| ) | |
| from app.services.ffmpeg_service import FFmpegService | |
| async def convert_video( | |
| ffmpeg: FFmpegService, inputs: Sequence[InputMedia], params: dict[str, Any], output_dir: Path | |
| ) -> OperationResult: | |
| require_inputs(inputs) | |
| extension = format_param(params, "mp4", VIDEO_FORMATS) | |
| output = output_path(output_dir, "converted", extension) | |
| args = ["-i", inputs[0].temp_path, *video_codecs(extension), output] | |
| return await execute(ffmpeg, args, output, "video.convert", {"format": extension}) | |
| async def convert_audio( | |
| ffmpeg: FFmpegService, inputs: Sequence[InputMedia], params: dict[str, Any], output_dir: Path | |
| ) -> OperationResult: | |
| require_inputs(inputs) | |
| extension = format_param(params, "mp3", AUDIO_FORMATS) | |
| output = output_path(output_dir, "converted", extension) | |
| args = ["-i", inputs[0].temp_path, "-vn", *audio_codec(extension), output] | |
| return await execute(ffmpeg, args, output, "audio.convert", {"format": extension}) | |
| async def convert_image( | |
| ffmpeg: FFmpegService, inputs: Sequence[InputMedia], params: dict[str, Any], output_dir: Path | |
| ) -> OperationResult: | |
| require_inputs(inputs) | |
| extension = format_param(params, "png", IMAGE_FORMATS) | |
| output = output_path(output_dir, "converted", extension) | |
| args: list[str | Path] = ["-i", inputs[0].temp_path, "-frames:v", "1"] | |
| if extension in {"jpg", "jpeg"}: | |
| args += ["-q:v", str(params.get("quality", 2))] | |
| args += [output] | |
| return await execute(ffmpeg, args, output, "image.convert", {"format": extension}) | |