| | 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"} |
| |
|