from __future__ import annotations from fastapi import APIRouter, Request from app.api.media import execute_operation from app.core.response import SuccessResponse from app.operations.compress import compress_video, normalize_video from app.operations.concat import concat_video from app.operations.convert import convert_video from app.operations.crop import crop_video from app.operations.extract_audio import mute_video, remove_audio, replace_audio from app.operations.merge import merge_video from app.operations.resize import pad_video, resize_video, scale_video from app.operations.rotate import ( change_bitrate, change_fps, change_speed, reverse_video, rotate_video, slow_motion, ) from app.operations.subtitles import burn_subtitles, soft_subtitles from app.operations.thumbnails import ( blur_video, denoise_video, extract_frames, generate_gif, sharpen_video, thumbnail, ) from app.operations.trim import trim_video from app.operations.watermark import overlay_video, watermark_video from app.services.media_service import Operation router = APIRouter(prefix="/v1/video", tags=["video"]) def operation_route(path: str, name: str, operation: Operation) -> None: async def endpoint(request: Request) -> SuccessResponse: return await execute_operation(request, name, operation) endpoint.__name__ = name.replace(".", "_") router.add_api_route( path, endpoint, methods=["POST"], response_model=SuccessResponse, name=name ) operation_route("/compress", "video.compress", compress_video) operation_route("/resize", "video.resize", resize_video) operation_route("/convert", "video.convert", convert_video) operation_route("/crop", "video.crop", crop_video) operation_route("/merge", "video.merge", merge_video) operation_route("/trim", "video.trim", trim_video) operation_route("/concat", "video.concat", concat_video) operation_route("/rotate", "video.rotate", rotate_video) operation_route("/reverse", "video.reverse", reverse_video) operation_route("/overlay", "video.overlay", overlay_video) operation_route("/watermark", "video.watermark", watermark_video) operation_route("/frames", "video.extract_frames", extract_frames) operation_route("/gif", "video.gif", generate_gif) operation_route("/thumbnail", "video.thumbnail", thumbnail) operation_route("/replace-audio", "video.replace_audio", replace_audio) operation_route("/remove-audio", "video.remove_audio", remove_audio) operation_route("/mute", "video.mute", mute_video) operation_route("/speed", "video.speed", change_speed) operation_route("/speed-up", "video.speed_up", change_speed) operation_route("/slow-motion", "video.slow_motion", slow_motion) operation_route("/fps", "video.fps", change_fps) operation_route("/bitrate", "video.bitrate", change_bitrate) operation_route("/subtitles/burn", "video.subtitles.burn", burn_subtitles) operation_route("/subtitles/soft", "video.subtitles.soft", soft_subtitles) operation_route("/scale", "video.scale", scale_video) operation_route("/pad", "video.pad", pad_video) operation_route("/blur", "video.blur", blur_video) operation_route("/sharpen", "video.sharpen", sharpen_video) operation_route("/denoise", "video.denoise", denoise_video) operation_route("/normalize", "video.normalize", normalize_video)