| from fastapi import APIRouter, HTTPException, status, BackgroundTasks, UploadFile, Query |
| from .Schema import GeneratorRequest |
| from .utils.GroqInstruct import chatbot, VideoOutput |
| from .utils.HuggingChat import chatbot as huggingChat |
| from .Story.Story import Story |
| import asyncio, pprint, json |
| from tqdm import tqdm |
| from .database.Model import models, database_url, Scene, Project, database |
| from .utils.RenderVideo import RenderVideo |
| from .Prompts.StoryGen import Prompt |
| from App.Editor.editorRoutes import celery_task, EditorRequest |
|
|
|
|
| async def update_scene(model_scene): |
| await model_scene.generate_scene_data() |
| await model_scene.update(**model_scene.__dict__) |
|
|
|
|
| async def main(request: GeneratorRequest): |
| topic = request.prompt |
| renderr = RenderVideo() |
| if request.grok: |
| message = chatbot(Prompt.format(topic=topic)) |
|
|
| else: |
| message = json.loads( |
| str( |
| huggingChat.query( |
| 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." |
| ) |
| ) |
| .split("```json")[1] |
| .split("```")[0] |
| .strip() |
| ) |
| generated_story = Story.from_dict(message["scenes"]) |
|
|
| print("Generated Story ✅") |
|
|
| x = await Project.objects.create(name=topic[0:100]) |
|
|
| |
| scene_updates = [] |
| with tqdm(total=len(generated_story.scenes)) as pbar: |
| for i in range(0, len(generated_story.scenes), 2): |
| batch = generated_story.scenes[i : i + 2] |
| 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 |
| await model_scene.update(**model_scene.__dict__) |
| batch_updates.append( |
| update_scene(model_scene) |
| ) |
| scene_updates.extend(batch_updates) |
| await asyncio.gather( |
| *batch_updates |
| ) |
| pbar.update(len(batch)) |
|
|
| temp = await x.generate_json() |
| |
|
|
| |
| request = EditorRequest.model_validate(temp) |
| await celery_task(video_task=request) |
|
|
|
|
| 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"} |
|
|