Spaces:
Running
Running
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() |