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