Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

Codeblock
languagepython
linenumberstrue
collapsetrue
import time
import requests

# FH Münster LiteLLM Server
API_BASE = "https://litellm.fh-muenster.de"
API_KEY = "sk-..." # Hier Ihren LiteLLM API Schlüssen einfügen

def check_for_budget_error(response):
    """Prüft ob das Budget überschritten wurde"""
    try:
        result = response.json()
        error = result.get("error", {})
        if error.get("type") == "budget_exceeded" or "ExceededBudget" in error.get("message", ""):
            return True, error.get("message")
    except:
        pass
    return False, None

def generate_and_download_video(prompt, reference_image_path=None):
    headers = {
        "Authorization": f"Bearer {API_KEY}"
    }
    
    # Step 1: Generate video
    print("Starting video generation...")
    
    if reference_image_path:
        with open(reference_image_path, "rb") as f:
            files = {
                "input_reference": f
            }
            data = {
                "model": "NOT-EU-vertex/veo-3.1-generate-preview", # Modell auswählen
                "prompt": prompt
            }
            response = requests.post(
                f"{API_BASE}/v1/videos",
                headers=headers,
                data=data,
                files=files
            )
    else:
        data = {
            "model": "NOT-EU-vertex/veo-3.1-generate-preview", # Modell ohne Referenzbild
            "prompt": prompt
        }
        response = requests.post(
            f"{API_BASE}/v1/videos",
            headers=headers,
            data=data
        )
    
    print(f"Response status: {response.status_code}")
    
    # Check for budget exceeded
    budget_exceeded, error_msg = check_for_budget_error(response)
    if budget_exceeded:
        print("\n" + "="*50)
        print("FEHLER: BUDGET ÜBERSCHRITTEN!")
        print(error_msg)
        print("="*50)
        return None
    
    print(f"Response: {response.text}")
    
    result = response.json()
    video_id = result.get("id")
    
    if not video_id:
        print("Error: No video ID received")
        return None
    
    print(f"Video ID: {video_id}")
    
    # Step 2: Poll for completion
    print("Waiting for video processing...")
    max_attempts = 60
    attempt = 0
    
    while attempt < max_attempts:
        try:
            # Check status
            status_response = requests.get(
                f"{API_BASE}/v1/videos/{video_id}",
                headers=headers
            )
            
            # Check for budget exceeded
            budget_exceeded, error_msg = check_for_budget_error(status_response)
            if budget_exceeded:
                print("\n" + "="*50)
                print("FEHLER: BUDGET ÜBERSCHRITTEN!")
                print(error_msg)
                print("="*50)
                return None
            
            print(f"Status response: {status_response.status_code}")
            
            if status_response.status_code == 200:
                status_data = status_response.json()
                status = status_data.get("status")
                print(f"Attempt {attempt + 1}: Status = {status}")
                
                if status == "completed":
                    print("Video completed! Downloading...")
                    
                    # Try to get content
                    content_response = requests.get(
                        f"{API_BASE}/v1/videos/{video_id}/content",
                        headers=headers
                    )
                    
                    # Check for budget exceeded
                    budget_exceeded, error_msg = check_for_budget_error(content_response)
                    if budget_exceeded:
                        print("\n" + "="*50)
                        print("FEHLER: BUDGET ÜBERSCHRITTEN!")
                        print(error_msg)
                        print("="*50)
                        return None
                    
                    if content_response.status_code == 200:
                        filename = f"video_{video_id[:20]}.mp4"
                        with open(filename, "wb") as f:
                            f.write(content_response.content)
                        print(f"Video saved: {filename}")
                        return filename
                    else:
                        print(f"Content download failed: {content_response.status_code}")
                        print(f"Response: {content_response.text}")
                        
                        # Maybe the video URL is in the status response?
                        print(f"Full status data: {status_data}")
                        return None
                        
                elif status == "failed":
                    print(f"Video generation failed: {status_data}")
                    return None
                    
        except Exception as e:
            print(f"Attempt {attempt + 1}: Error - {e}")
        
        time.sleep(10)
        attempt += 1
    
    print("Timeout: Video generation took too long")
    return None


if __name__ == "__main__":
    result = generate_and_download_video(
        prompt="Make the dog in the reference image bark", # Geben Sie hier Ihren Prompt ein
        reference_image_path="C:/Users/mm123456/Desktop/Veo/reference2.png" # Pfad zum Referenzbild
    )
    
    if result:
        print(f"Success! Video saved as: {result}")
    else:
        print("Failed to generate video")

...