File size: 3,093 Bytes
2bd2664 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | from fastapi import FastAPI, UploadFile, File, Form
from fastapi.responses import FileResponse, JSONResponse
from datetime import datetime
from typing import List
from extract_metadata import get_metadata, get_scenes_metadata
from grok_analyze import create_caps_with_grok, get_story_with_grok
from create_captions import create_caps, add_captions_to_video
from transcripts_editing import get_dialog
from video_editing_ffmpeg import concatenate_videos
import shutil
import os
import uuid
app = FastAPI(title="Video Storyline Generator API")
# Directory to temporarily store uploaded videos
UPLOAD_DIR = "uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)
@app.post("/generatestoryline")
async def generate_storyline(
videos: List[UploadFile] = File(...),
date: str = Form(...)
):
"""
Generate a storyline from uploaded videos and a date.
Returns a selected video filename and a list of generated captions.
"""
try:
# Validate date format
try:
input_date = datetime.strptime(date, "%Y-%m-%d")
except ValueError:
return JSONResponse(
status_code=400,
content={"error": "Invalid date format. Use YYYY-MM-DD"}
)
if input_date:
dialog= get_dialog(date)
# Save uploaded videos temporarily
saved_videos = []
directory=f"{uuid.uuid4()}"
if not os.path.exists(os.path.join(UPLOAD_DIR,directory)):
os.makedirs(os.path.join(UPLOAD_DIR,directory))
for video in videos:
print(video.filename)
file_extension = video.filename.split(".")[-1]
file_name = f"{uuid.uuid4()}.{file_extension}"
file_path = os.path.join(UPLOAD_DIR,directory, file_name)
with open(file_path, "wb") as buffer:
shutil.copyfileobj(video.file, buffer)
saved_videos.append(file_path)
print("HERE")
metadata, filename= get_metadata(saved_videos)
print(metadata)
metadata=get_scenes_metadata(metadata)
steps=get_story_with_grok(metadata,"",dialog)
print("here are the steps", steps)
caps=create_caps(steps)
print("the caps:",caps)
final_video=concatenate_videos(steps)
final_video=add_captions_to_video(final_video,False,caps)
return FileResponse(
path=final_video,
media_type="video/mp4", # Adjust based on your video format
filename="final_storyline_video.mp4" # Name for the downloaded file
)
except Exception as e:
return JSONResponse(
status_code=500,
content={"error": f"An error occurred: {str(e)}"}
)
@app.on_event("shutdown")
async def cleanup():
"""Clean up uploaded files on shutdown"""
for file in os.listdir(UPLOAD_DIR):
file_path = os.path.join(UPLOAD_DIR, file)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
except Exception:
pass |