|
from fastapi import FastAPI, HTTPException, Request |
|
from fastapi.staticfiles import StaticFiles |
|
from concurrent.futures import ThreadPoolExecutor |
|
import asyncio |
|
import aiohttp |
|
import tempfile |
|
import uuid |
|
import os |
|
import random |
|
import traceback |
|
import string |
|
|
|
app = FastAPI() |
|
|
|
def generate_hash(length=12): |
|
|
|
characters = string.ascii_lowercase + string.digits |
|
|
|
hash_string = ''.join(random.choice(characters) for _ in range(length)) |
|
return hash_string |
|
|
|
@app.get("/") |
|
async def read_root(): |
|
return {"message": "Saqib's API"} |
|
|
|
|
|
AUDIO_DIR = "audio_files" |
|
os.makedirs(AUDIO_DIR, exist_ok=True) |
|
|
|
|
|
OUTPUT_DIR = "output" |
|
os.makedirs(OUTPUT_DIR, exist_ok=True) |
|
|
|
|
|
app.mount("/audio", StaticFiles(directory=AUDIO_DIR), name="audio") |
|
|
|
|
|
app.mount("/output", StaticFiles(directory=OUTPUT_DIR), name="output") |
|
|
|
thread_pool = ThreadPoolExecutor(max_workers=2) |
|
|
|
async def run_ffmpeg_async(ffmpeg_command): |
|
loop = asyncio.get_running_loop() |
|
await loop.run_in_executor(thread_pool, ffmpeg_command) |
|
|
|
async def download_file(url: str, suffix: str): |
|
async with aiohttp.ClientSession() as session: |
|
async with session.get(url) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=400, detail=f"Failed to download file from {url}") |
|
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_file: |
|
temp_file.write(await response.read()) |
|
return temp_file.name |
|
|
|
|
|
@app.post("/add_audio_to_image") |
|
async def add_audio_to_image(request: Request): |
|
try: |
|
|
|
output_filename = f"{uuid.uuid4()}.mp4" |
|
output_path = os.path.join(OUTPUT_DIR, output_filename) |
|
|
|
|
|
data = await request.json() |
|
async with aiohttp.ClientSession() as session: |
|
async with session.post(f"{MODAL_BASE_URL}/add_audio_to_image", json=data) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=500, detail="Failed to process request") |
|
output_data = await response.read() |
|
async with aiofiles.open(output_path, "wb") as f: |
|
await f.write(output_data) |
|
|
|
|
|
return f"https://sxqib-api.hf.space/output/{output_filename}" |
|
except Exception as e: |
|
print(f"An error occurred: {str(e)}") |
|
print(traceback.format_exc()) |
|
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") |
|
|
|
@app.post("/add_audio_to_video") |
|
async def add_audio_to_video(request: Request): |
|
try: |
|
|
|
output_filename = f"{uuid.uuid4()}.mp4" |
|
output_path = os.path.join(OUTPUT_DIR, output_filename) |
|
|
|
|
|
data = await request.json() |
|
async with aiohttp.ClientSession() as session: |
|
async with session.post(f"{MODAL_BASE_URL}/add_audio_to_video", json=data) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=500, detail="Failed to process request") |
|
output_data = await response.read() |
|
async with aiofiles.open(output_path, "wb") as f: |
|
await f.write(output_data) |
|
|
|
|
|
return f"https://sxqib-api.hf.space/output/{output_filename}" |
|
except Exception as e: |
|
print(f"An error occurred: {str(e)}") |
|
print(traceback.format_exc()) |
|
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") |
|
|
|
@app.post("/concatenate_videos") |
|
async def concatenate_videos(request: Request): |
|
try: |
|
|
|
output_filename = f"{uuid.uuid4()}.mp4" |
|
output_path = os.path.join(OUTPUT_DIR, output_filename) |
|
|
|
|
|
data = await request.json() |
|
async with aiohttp.ClientSession() as session: |
|
async with session.post(f"{MODAL_BASE_URL}/concatenate_videos", json=data) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=500, detail="Failed to process request") |
|
output_data = await response.read() |
|
async with aiofiles.open(output_path, "wb") as f: |
|
await f.write(output_data) |
|
|
|
|
|
return f"https://sxqib-api.hf.space/output/{output_filename}" |
|
|
|
except Exception as e: |
|
print(f"An error occurred: {str(e)}") |
|
print(traceback.format_exc()) |
|
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") |
|
|
|
@app.post("/concatenate_audio") |
|
async def concatenate_audio(request: Request): |
|
try: |
|
|
|
output_filename = f"{uuid.uuid4()}.mp3" |
|
output_path = os.path.join(AUDIO_DIR, output_filename) |
|
|
|
|
|
data = await request.json() |
|
async with aiohttp.ClientSession() as session: |
|
async with session.post(f"{MODAL_BASE_URL}/concatenate_audio", json=data) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=500, detail="Failed to process request") |
|
output_data = await response.read() |
|
async with aiofiles.open(output_path, "wb") as f: |
|
await f.write(output_data) |
|
|
|
|
|
return f"https://sxqib-api.hf.space/audio_files/{output_filename}" |
|
|
|
except Exception as e: |
|
print(f"An error occurred: {str(e)}") |
|
print(traceback.format_exc()) |
|
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") |
|
|
|
@app.post("/make_video") |
|
async def make_video(request: Request): |
|
try: |
|
|
|
output_filename = f"{uuid.uuid4()}.mp4" |
|
output_path = os.path.join(OUTPUT_DIR, output_filename) |
|
|
|
|
|
data = await request.json() |
|
async with aiohttp.ClientSession() as session: |
|
async with session.post(f"{MODAL_BASE_URL}/make_video", json=data) as response: |
|
if response.status != 200: |
|
raise HTTPException(status_code=500, detail="Failed to process request") |
|
output_data = await response.read() |
|
async with aiofiles.open(output_path, "wb") as f: |
|
await f.write(output_data) |
|
|
|
|
|
return f"https://sxqib-api.hf.space/output/{output_filename}" |
|
|
|
except Exception as e: |
|
print(f"An error occurred: {str(e)}") |
|
print(traceback.format_exc()) |
|
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}") |
|
|
|
if __name__ == "__main__": |
|
import uvicorn |
|
uvicorn.run(app, host="0.0.0.0", port=7860) |