# app/routers/video.py from fastapi import APIRouter, HTTPException from pydantic import BaseModel from app.services.video_service import ( download_youtube_videos, split_video_and_extract_audio, downscale_video, ) import os router = APIRouter() class YouTubeRequest(BaseModel): urls: list[str] # Accept multiple URLs chunk_duration: int = 30 # Default chunk duration is 30 seconds quality: str = "worst" # Allow specifying the video quality class DownscaleRequest(BaseModel): video_path: str resolution: str = "720p" download_dir = "downloaded_videos" audio_dir = "extracted_audio" @router.post("/download_youtube_videos") async def download_video(data: YouTubeRequest): if not os.path.exists(download_dir): os.makedirs(download_dir) try: video_paths = await download_youtube_videos(data.urls, download_dir, data.quality) return {"video_paths": video_paths} except FileNotFoundError as e: raise HTTPException(status_code=404, detail=str(e)) @router.post("/split-and-extract-audio") async def split_and_extract_audio(data: YouTubeRequest): try: video_path = await download_youtube_video(data.url, download_dir) await split_video_and_extract_audio(video_path, data.chunk_duration, audio_dir) return {"message": "Audio extraction complete", "audio_dir": audio_dir} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/downscale") async def downscale_video_endpoint(data: DownscaleRequest): downscaled_video_path = os.path.join(download_dir, "downscaled_video.mp4") try: await downscale_video(data.video_path, downscaled_video_path, data.resolution) return {"downscaled_video_path": downscaled_video_path} except Exception as e: raise HTTPException(status_code=500, detail=str(e))