|
import gradio as gr |
|
from lumaai import Lumaai |
|
import requests |
|
import time |
|
|
|
def create_client(api_key): |
|
return Lumaai(auth_token=api_key) |
|
|
|
def generate_video(api_key, prompt, aspect_ratio, loop): |
|
client = create_client(api_key) |
|
try: |
|
generation = client.generations.create( |
|
prompt=prompt, |
|
aspect_ratio=aspect_ratio, |
|
loop=loop |
|
) |
|
return generation.id, "Generation started..." |
|
except Exception as e: |
|
return None, f"Error: {str(e)}" |
|
|
|
def poll_generation(api_key, generation_id): |
|
if not generation_id: |
|
return "No generation in progress", None |
|
|
|
client = create_client(api_key) |
|
try: |
|
generation = client.generations.get(id=generation_id) |
|
return generation.status, generation.assets.thumbnail |
|
except Exception as e: |
|
return f"Error: {str(e)}", None |
|
|
|
def download_video(api_key, generation_id): |
|
if not generation_id: |
|
return None |
|
|
|
client = create_client(api_key) |
|
try: |
|
generation = client.generations.get(id=generation_id) |
|
video_url = generation.assets.video |
|
response = requests.get(video_url, stream=True) |
|
|
|
file_name = f"generated_video_{generation_id}.mp4" |
|
with open(file_name, 'wb') as file: |
|
file.write(response.content) |
|
|
|
return file_name |
|
except Exception as e: |
|
return None |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Luma AI Video Generation Demo") |
|
gr.Markdown("Generate videos using Luma AI based on text prompts.") |
|
|
|
api_key = gr.Textbox(label="Enter your Luma AI API Key", type="password") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
prompt = gr.Textbox(label="Prompt") |
|
aspect_ratio = gr.Dropdown(["16:9", "9:16", "1:1", "4:3", "3:4"], label="Aspect Ratio") |
|
loop = gr.Checkbox(label="Loop") |
|
generate_btn = gr.Button("Generate Video") |
|
|
|
with gr.Column(scale=3): |
|
status = gr.Textbox(label="Status") |
|
thumbnail = gr.Image(label="Thumbnail") |
|
video = gr.Video(label="Generated Video") |
|
|
|
generation_id = gr.State() |
|
|
|
def on_generate(api_key, prompt, aspect_ratio, loop): |
|
gen_id, message = generate_video(api_key, prompt, aspect_ratio, loop) |
|
return gen_id, message |
|
|
|
generate_btn.click( |
|
on_generate, |
|
inputs=[api_key, prompt, aspect_ratio, loop], |
|
outputs=[generation_id, status] |
|
) |
|
|
|
def on_poll(api_key, gen_id): |
|
status, thumb = poll_generation(api_key, gen_id) |
|
if status == "completed": |
|
video_path = download_video(api_key, gen_id) |
|
return status, thumb, video_path |
|
return status, thumb, None |
|
|
|
poll_btn = gr.Button("Check Status") |
|
poll_btn.click( |
|
on_poll, |
|
inputs=[api_key, generation_id], |
|
outputs=[status, thumbnail, video] |
|
) |
|
|
|
demo.launch() |