imagecompress / main.py
Akane710's picture
Update main.py
e1b6327 verified
from fastapi import FastAPI, Query, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
from fastapi.staticfiles import StaticFiles
import os
import ffmpeg
import uuid
import cloudinary
import cloudinary.uploader
from cloudinary.utils import cloudinary_url
VIDEO_DIR = "compressed_videos"
os.makedirs(VIDEO_DIR, exist_ok=True)
app = FastAPI()
app.mount("/videos", StaticFiles(directory=VIDEO_DIR), name="videos")
@app.get("/compress_video")
async def compress_video(
video_url: str = Query(..., description="URL of the video"),
resolution: str = Query("1280x720", description="Resolution (e.g., 1280x720, 640x360)"),
format: str = Query("matroska", description="Output video format (e.g., mp4, mkv)"),
codec: str = Query("libx264", description="264 faster but bigger size,265 slower but smaller size"),
preset: str = Query("fast", description="ultrafast, superfast, fast, medium, slow"),
crf: int = Query(28, description="Constant Rate Factor (CRF) for compression (0-51, lower is better quality)")
):
try:
file_name = f"{uuid.uuid4()}.{format}"
file_path = os.path.join(VIDEO_DIR, file_name)
(
ffmpeg
.input(video_url)
.output(file_path, crf=crf, vcodec=codec, preset=preset, s=resolution, f=format)
.global_args("-threads", "0")
.overwrite_output()
.run()
)
file_url = f"/videos/{file_name}"
return JSONResponse(content={"compressed_video_url": "https://akane710-imagecompress.hf.space" + file_url})
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)
@app.post("/upload_video")
async def upload_video(
file: UploadFile = File(...),
resolution: str = Query("1280x720", description="Resolution (e.g., 1280x720, 640x360)"),
format: str = Query("matroska", description="Output video format (e.g., mp4, mkv)"),
codec: str = Query("libx264", description="264 faster but bigger size,265 slower but smaller size"),
preset: str = Query("fast", description="ultrafast, superfast, fast, medium, slow"),
crf: int = Query(28, description="Constant Rate Factor (CRF) for compression (0-51, lower is better quality)")):
try:
original_filename = file.filename
file_ext = original_filename.split(".")[-1]
temp_filename = f"{uuid.uuid4()}.{file_ext}"
temp_filepath = os.path.join(VIDEO_DIR, temp_filename)
with open(temp_filepath, "wb") as buffer:
buffer.write(file.file.read())
compressed_filename = f"{uuid.uuid4()}.{format}"
compressed_filepath = os.path.join(VIDEO_DIR, compressed_filename)
(
ffmpeg
.input(temp_filepath)
.output(compressed_filepath, crf=crf, vcodec=codec, preset=preset, s=resolution, f=format)
.global_args("-threads", "0")
.overwrite_output()
.run()
)
os.remove(temp_filepath) # Clean up the original uploaded file
file_url = f"/videos/{compressed_filename}"
return JSONResponse(content={"compressed_video_url": "https://akane710-imagecompress.hf.space" + file_url})
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
cloudinary.config(
cloud_name=os.getenv("cloudname"),
api_key=os.getenv("key"),
api_secret=os.getenv("secret"),
secure=True
)
@app.get("/compress_image")
async def compress_image(image_url: str = Query(..., description="URL of the image to compress")):
try:
upload_result = cloudinary.uploader.upload(image_url)
compressed_url, options = cloudinary_url(
upload_result["public_id"],
fetch_format="auto",
quality="auto:low"
)
return JSONResponse(content={"compressed_image_url": compressed_url})
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)
@app.get("/")
def root():
return "بتعمل شنو هنا يا زول"