|
from fastapi import APIRouter, HTTPException, status, BackgroundTasks, UploadFile, Query |
|
from .Schema import GeneratorRequest, GeneratorBulkRequest |
|
from .utils.GroqInstruct import chatbot, VideoOutput, Scene |
|
from .utils.Cohere import chatbot as cohere_chat |
|
from .utils.HuggingChat import Hugging |
|
from .Story.Story import Story |
|
import asyncio, pprint, json |
|
from tqdm import tqdm |
|
from .database.Model import ( |
|
models, |
|
database_url, |
|
Scene, |
|
Project, |
|
database, |
|
VideoGenerator, |
|
) |
|
from .utils.RenderVideo import RenderVideo |
|
from .Prompts.StoryGen import Prompt |
|
from App.Editor.editorRoutes import celery_task, EditorRequest |
|
import uuid |
|
|
|
|
|
async def update_scene(model_scene, reference_image_url=None, ip_adapter_weight=0.4): |
|
await model_scene.generate_scene_data(reference_image_url, ip_adapter_weight) |
|
await model_scene.update( |
|
**{ |
|
k: v |
|
for k, v in model_scene.__dict__.items() |
|
if k not in ["reference_image_url", "ip_adapter_weight"] |
|
} |
|
) |
|
|
|
|
|
async def from_dict_generate(data: Story): |
|
generated_strory = data |
|
await generate_assets(generated_story=generated_strory) |
|
|
|
|
|
async def generate_assets(generated_story: Story, batch_size=4, threeD=True): |
|
x = await Project.objects.create(name=str(uuid.uuid4())) |
|
|
|
|
|
with tqdm(total=len(generated_story.scenes)) as pbar: |
|
|
|
all_scenes: list[Scene] = [] |
|
|
|
for i in range(0, len(generated_story.scenes), batch_size): |
|
batch = generated_story.scenes[ |
|
i : i + batch_size |
|
] |
|
batch_updates = [] |
|
|
|
|
|
for story_scene in batch: |
|
model_scene = await Scene.objects.create(project=x) |
|
model_scene.image_prompts = story_scene.image_prompts |
|
model_scene.narration = story_scene.narration |
|
model_scene.voice = story_scene.voice |
|
await model_scene.update( |
|
**{ |
|
k: v |
|
for k, v in model_scene.__dict__.items() |
|
if k not in ["reference_image_url", "ip_adapter_weight"] |
|
} |
|
) |
|
all_scenes.append(model_scene) |
|
batch_updates.append( |
|
update_scene( |
|
model_scene, |
|
generated_story.reference_image_url, |
|
generated_story.ip_adapter_weight, |
|
) |
|
) |
|
|
|
await asyncio.gather( |
|
*batch_updates |
|
) |
|
|
|
pbar.update(len(batch)) |
|
|
|
|
|
|
|
if False: |
|
vid_gen = VideoGenerator() |
|
nested_images = [] |
|
for scene in all_scenes: |
|
nested_images.append(scene.images) |
|
|
|
results = await vid_gen.run(nested_image_links=nested_images) |
|
print(results) |
|
for result, _scene in zip(results, all_scenes): |
|
_scene.images = result |
|
await _scene.update(**_scene.__dict__) |
|
|
|
temp = await x.generate_json() |
|
|
|
|
|
renderr = RenderVideo() |
|
await renderr.render_video(temp) |
|
request = EditorRequest.model_validate(temp) |
|
|
|
|
|
|
|
|
|
async def main(request: GeneratorRequest): |
|
topic = request.prompt |
|
batch_size = request.batch_size |
|
renderr = RenderVideo() |
|
huggChat = Hugging() |
|
if request.grok: |
|
message = cohere_chat(Prompt.format(topic=topic), model=request.model) |
|
|
|
else: |
|
temp = await huggChat.chat( |
|
Prompt.format(topic=topic) |
|
+ f"Match your response to the following schema: {VideoOutput.model_json_schema()} Make sure to return an instance of the JSON, not the schema itself, and nothing else." |
|
) |
|
message = temp |
|
generated_story = Story.from_dict(message["scenes"]) |
|
|
|
print("Generated Story ✅") |
|
await generate_assets(generated_story=generated_story, batch_size=batch_size) |
|
|
|
|
|
async def bulkGenerate(bulkRequest: GeneratorBulkRequest): |
|
tasks = [] |
|
for request in bulkRequest.stories: |
|
tasks.append(main(request=request)) |
|
|
|
await asyncio.gather(*tasks) |
|
|
|
|
|
generator_router = APIRouter(tags=["video-Generator"]) |
|
|
|
|
|
@generator_router.post("/generate_video") |
|
async def generate_video( |
|
videoRequest: GeneratorRequest, background_task: BackgroundTasks |
|
): |
|
background_task.add_task(main, videoRequest) |
|
return {"task_id": "started"} |
|
|
|
|
|
@generator_router.post("/generate_video_from_json") |
|
async def generate_video_from_json(jsonReq: Story, background_task: BackgroundTasks): |
|
background_task.add_task(generate_assets, jsonReq) |
|
return {"task_id": "started"} |
|
|
|
|
|
@generator_router.post("/generate_video_bulk") |
|
async def generate_video_bulk( |
|
BulkvideoRequest: GeneratorBulkRequest, background_task: BackgroundTasks |
|
): |
|
background_task.add_task(bulkGenerate, BulkvideoRequest) |
|
return {"task_id": "started"} |
|
|