diff --git a/apps/web/public/demo-pets/dog-beagle-curious.png b/apps/web/public/demo-pets/dog-beagle-curious.png new file mode 100644 index 0000000..2f94a9f Binary files /dev/null and b/apps/web/public/demo-pets/dog-beagle-curious.png differ diff --git a/apps/web/public/demo-pets/dog-boxer-playful.png b/apps/web/public/demo-pets/dog-boxer-playful.png new file mode 100644 index 0000000..d7ea122 Binary files /dev/null and b/apps/web/public/demo-pets/dog-boxer-playful.png differ diff --git a/apps/web/public/demo-pets/dog-bulldog-gentle.png b/apps/web/public/demo-pets/dog-bulldog-gentle.png new file mode 100644 index 0000000..f077e54 Binary files /dev/null and b/apps/web/public/demo-pets/dog-bulldog-gentle.png differ diff --git a/apps/web/public/demo-pets/dog-cocker-spaniel-groomed.png b/apps/web/public/demo-pets/dog-cocker-spaniel-groomed.png new file mode 100644 index 0000000..1c022cf Binary files /dev/null and b/apps/web/public/demo-pets/dog-cocker-spaniel-groomed.png differ diff --git a/apps/web/public/demo-pets/dog-corgi-happy.png b/apps/web/public/demo-pets/dog-corgi-happy.png new file mode 100644 index 0000000..e3f20c2 Binary files /dev/null and b/apps/web/public/demo-pets/dog-corgi-happy.png differ diff --git a/apps/web/public/demo-pets/dog-dachshund-long.png b/apps/web/public/demo-pets/dog-dachshund-long.png new file mode 100644 index 0000000..7817080 Binary files /dev/null and b/apps/web/public/demo-pets/dog-dachshund-long.png differ diff --git a/apps/web/public/demo-pets/dog-english-springer-spaniel.png b/apps/web/public/demo-pets/dog-english-springer-spaniel.png new file mode 100644 index 0000000..7fbd46b Binary files /dev/null and b/apps/web/public/demo-pets/dog-english-springer-spaniel.png differ diff --git a/apps/web/public/demo-pets/dog-german-shepherd-alert.png b/apps/web/public/demo-pets/dog-german-shepherd-alert.png new file mode 100644 index 0000000..b2dfb2c Binary files /dev/null and b/apps/web/public/demo-pets/dog-german-shepherd-alert.png differ diff --git a/apps/web/public/demo-pets/dog-german-shepherd-lying.png b/apps/web/public/demo-pets/dog-german-shepherd-lying.png new file mode 100644 index 0000000..021e2ea Binary files /dev/null and b/apps/web/public/demo-pets/dog-german-shepherd-lying.png differ diff --git a/apps/web/public/demo-pets/dog-german-shepherd-sitting.png b/apps/web/public/demo-pets/dog-german-shepherd-sitting.png new file mode 100644 index 0000000..e0a7452 Binary files /dev/null and b/apps/web/public/demo-pets/dog-german-shepherd-sitting.png differ diff --git a/apps/web/public/demo-pets/dog-golden-retriever-happy.png b/apps/web/public/demo-pets/dog-golden-retriever-happy.png new file mode 100644 index 0000000..0ffcf77 Binary files /dev/null and b/apps/web/public/demo-pets/dog-golden-retriever-happy.png differ diff --git a/apps/web/public/demo-pets/dog-golden-retriever-lying.png b/apps/web/public/demo-pets/dog-golden-retriever-lying.png new file mode 100644 index 0000000..366d983 Binary files /dev/null and b/apps/web/public/demo-pets/dog-golden-retriever-lying.png differ diff --git a/apps/web/public/demo-pets/dog-husky-alert.png b/apps/web/public/demo-pets/dog-husky-alert.png new file mode 100644 index 0000000..20f5a96 Binary files /dev/null and b/apps/web/public/demo-pets/dog-husky-alert.png differ diff --git a/apps/web/public/demo-pets/dog-labrador-running.png b/apps/web/public/demo-pets/dog-labrador-running.png new file mode 100644 index 0000000..b5194e6 Binary files /dev/null and b/apps/web/public/demo-pets/dog-labrador-running.png differ diff --git a/apps/web/public/demo-pets/dog-maltese-fluffy.png b/apps/web/public/demo-pets/dog-maltese-fluffy.png new file mode 100644 index 0000000..5ec8b54 Binary files /dev/null and b/apps/web/public/demo-pets/dog-maltese-fluffy.png differ diff --git a/apps/web/public/demo-pets/dog-mixed-breed-black.png b/apps/web/public/demo-pets/dog-mixed-breed-black.png new file mode 100644 index 0000000..4c48f98 Binary files /dev/null and b/apps/web/public/demo-pets/dog-mixed-breed-black.png differ diff --git a/apps/web/public/demo-pets/dog-mixed-breed-brown.png b/apps/web/public/demo-pets/dog-mixed-breed-brown.png new file mode 100644 index 0000000..222efcc Binary files /dev/null and b/apps/web/public/demo-pets/dog-mixed-breed-brown.png differ diff --git a/apps/web/public/demo-pets/dog-mixed-breed-spotted.png b/apps/web/public/demo-pets/dog-mixed-breed-spotted.png new file mode 100644 index 0000000..a3b0fdb Binary files /dev/null and b/apps/web/public/demo-pets/dog-mixed-breed-spotted.png differ diff --git a/apps/web/public/demo-pets/dog-pomeranian-alert.png b/apps/web/public/demo-pets/dog-pomeranian-alert.png new file mode 100644 index 0000000..8551d4a Binary files /dev/null and b/apps/web/public/demo-pets/dog-pomeranian-alert.png differ diff --git a/apps/web/public/demo-pets/dog-poodle-standard-groomed.png b/apps/web/public/demo-pets/dog-poodle-standard-groomed.png new file mode 100644 index 0000000..34a9c6b Binary files /dev/null and b/apps/web/public/demo-pets/dog-poodle-standard-groomed.png differ diff --git a/apps/web/public/demo-pets/dog-pug-curious.png b/apps/web/public/demo-pets/dog-pug-curious.png new file mode 100644 index 0000000..57171e4 Binary files /dev/null and b/apps/web/public/demo-pets/dog-pug-curious.png differ diff --git a/apps/web/public/demo-pets/dog-puggle-black-sitting.png b/apps/web/public/demo-pets/dog-puggle-black-sitting.png new file mode 100644 index 0000000..a37b418 Binary files /dev/null and b/apps/web/public/demo-pets/dog-puggle-black-sitting.png differ diff --git a/apps/web/public/demo-pets/dog-puggle-cream-groomed.png b/apps/web/public/demo-pets/dog-puggle-cream-groomed.png new file mode 100644 index 0000000..9a24e1e Binary files /dev/null and b/apps/web/public/demo-pets/dog-puggle-cream-groomed.png differ diff --git a/apps/web/public/demo-pets/dog-puggle-fawn-grooming.png b/apps/web/public/demo-pets/dog-puggle-fawn-grooming.png new file mode 100644 index 0000000..e71c666 Binary files /dev/null and b/apps/web/public/demo-pets/dog-puggle-fawn-grooming.png differ diff --git a/apps/web/public/demo-pets/dog-puggle-fawn-playful.png b/apps/web/public/demo-pets/dog-puggle-fawn-playful.png new file mode 100644 index 0000000..1541f3c Binary files /dev/null and b/apps/web/public/demo-pets/dog-puggle-fawn-playful.png differ diff --git a/apps/web/public/demo-pets/dog-shih-tzu-groomed.png b/apps/web/public/demo-pets/dog-shih-tzu-groomed.png new file mode 100644 index 0000000..d3d8169 Binary files /dev/null and b/apps/web/public/demo-pets/dog-shih-tzu-groomed.png differ diff --git a/apps/web/public/demo-pets/dog-yorkshire-terrier.png b/apps/web/public/demo-pets/dog-yorkshire-terrier.png new file mode 100644 index 0000000..9d356ef Binary files /dev/null and b/apps/web/public/demo-pets/dog-yorkshire-terrier.png differ diff --git a/generate_dogs_bulk.py b/generate_dogs_bulk.py new file mode 100644 index 0000000..7879e1b --- /dev/null +++ b/generate_dogs_bulk.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +import base64 +import requests +import os +import json +import time +from datetime import datetime + +api_key = os.environ.get("MINIMAX_API_KEY") +if not api_key: + raise ValueError("MINIMAX_API_KEY environment variable not set") + +url = "https://api.minimax.io/v1/image_generation" +headers = {"Authorization": f"Bearer {api_key}"} + +os.makedirs("minimax-output", exist_ok=True) + +# Comprehensive list of dog breeds and variations for diverse demo data +dog_prompts = [ + # Large breeds + ("german-shepherd-alert", "German Shepherd dog with alert expression, standing confidently, professional pet photography, studio lighting, photorealistic"), + ("golden-retriever-happy", "Golden Retriever with joyful expression, sitting, golden coat, natural daylight, professional pet photography, photorealistic"), + ("labrador-running", "Black Labrador Retriever running towards camera, outdoor park setting, dynamic pose, professional pet photography, photorealistic"), + ("german-shepherd-sitting", "German Shepherd sitting in front of studio backdrop, professional portrait, studio lighting, photorealistic"), + ("golden-retriever-lying", "Golden Retriever lying down on grass, peaceful expression, outdoor natural lighting, professional pet photography, photorealistic"), + + # Medium breeds + ("beagle-curious", "Beagle with curious expression, sitting, outdoor garden setting, professional pet photography, photorealistic"), + ("cocker-spaniel-groomed", "Cocker Spaniel freshly groomed with fluffy coat, happy expression, professional grooming studio, photorealistic"), + ("english-springer-spaniel", "English Springer Spaniel in natural outdoor setting, alert pose, professional pet photography, photorealistic"), + ("boxer-playful", "Boxer dog with playful expression, standing, muscular build, professional studio lighting, photorealistic"), + ("bulldog-gentle", "English Bulldog with gentle expression, sitting, studio backdrop, professional pet photography, photorealistic"), + + # Small breeds + ("maltese-fluffy", "Maltese dog with white fluffy coat, sitting, groomed appearance, professional pet photography, studio lighting, photorealistic"), + ("shih-tzu-groomed", "Shih Tzu with long groomed coat, sitting pretty, professional grooming studio, photorealistic"), + ("pomeranian-alert", "Pomeranian with alert expression, standing, fluffy coat, professional pet photography, photorealistic"), + ("yorkshire-terrier", "Yorkshire Terrier with silky coat, sitting, professional grooming environment, photorealistic"), + ("pug-curious", "Pug with curious expression, sitting, studio lighting, professional pet photography, photorealistic"), + + # Specialty breeds + ("poodle-standard-groomed", "Standard Poodle with professionally groomed coat, standing in show stance, professional grooming studio, photorealistic"), + ("dachshund-long", "Long-haired Dachshund, lying down, relaxed pose, professional pet photography, photorealistic"), + ("corgi-happy", "Welsh Corgi with happy expression, standing, professional outdoor setting, photorealistic"), + ("husky-alert", "Siberian Husky with alert expression, sitting, professional pet photography, studio lighting, photorealistic"), + ("german-shepherd-lying", "German Shepherd lying down in relaxed pose, indoor setting, professional pet photography, photorealistic"), + + # Mixed/rescue variations + ("mixed-breed-brown", "Brown and white mixed breed dog, friendly expression, sitting, professional pet photography, photorealistic"), + ("mixed-breed-black", "Black mixed breed dog with gentle eyes, standing, outdoor natural lighting, photorealistic"), + ("mixed-breed-spotted", "Spotted mixed breed dog, playful pose, outdoor park setting, professional pet photography, photorealistic"), + ("terrier-mix-sitting", "Terrier mix dog, alert expression, sitting, professional studio backdrop, photorealistic"), + ("spaniel-mix-outdoor", "Spaniel mix dog in outdoor garden, relaxed pose, natural daylight, professional pet photography, photorealistic"), + + # Additional variations + ("labrador-golden", "Golden Labrador Retriever, calm expression, standing in professional pose, studio lighting, photorealistic"), + ("labrador-black-sitting", "Black Labrador Retriever sitting, gentle expression, professional pet photography, photorealistic"), + ("rottweiler-calm", "Rottweiler with calm expression, sitting, professional studio, photorealistic"), + ("doberman-alert", "Doberman Pinscher with alert expression, standing, professional pet photography, photorealistic"), + ("german-shepherd-side", "German Shepherd in side profile, standing, professional outdoor setting, photorealistic"), +] + +print(f"Generating {len(dog_prompts)} unique dog images...") +print(f"Start time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") +print("") + +generated = 0 +failed = 0 + +for i, (filename_base, prompt) in enumerate(dog_prompts, 1): + filename = f"dog-{filename_base}.png" + filepath = f"minimax-output/{filename}" + + # Check if already exists + if os.path.exists(filepath): + size = os.path.getsize(filepath) + print(f"[{i:2d}/{len(dog_prompts)}] ✓ {filename} (already exists, {size} bytes)") + generated += 1 + continue + + print(f"[{i:2d}/{len(dog_prompts)}] Generating {filename}...", end=" ", flush=True) + + payload = { + "model": "image-01", + "prompt": prompt, + "aspect_ratio": "1:1", + "response_format": "base64", + } + + try: + response = requests.post(url, headers=headers, json=payload, timeout=120) + + # Check for quota errors + if response.status_code == 429: + print(f"✗ QUOTA EXCEEDED") + print(f"\nQuota limit reached after {generated} successful generations") + break + + response.raise_for_status() + + data = response.json() + if "data" in data and "image_base64" in data["data"]: + images = data["data"]["image_base64"] + + with open(filepath, "wb") as f: + f.write(base64.b64decode(images[0])) + + file_size = os.path.getsize(filepath) + print(f"✓ ({file_size} bytes)") + generated += 1 + else: + print(f"✗ Unexpected response format") + failed += 1 + + except requests.exceptions.Timeout: + print(f"✗ Timeout") + failed += 1 + except requests.exceptions.RequestException as e: + if "429" in str(e) or "quota" in str(e).lower(): + print(f"✗ QUOTA EXCEEDED") + print(f"\nQuota limit reached after {generated} successful generations") + break + else: + print(f"✗ {type(e).__name__}") + failed += 1 + except Exception as e: + print(f"✗ {type(e).__name__}") + failed += 1 + + time.sleep(0.5) # Small delay between requests + +print("") +print(f"End time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") +print(f"✓ Successfully generated: {generated}") +print(f"✗ Failed: {failed}") +print(f"\nCopying images to demo-pets directory...") + +# Copy all generated images to demo-pets +import subprocess +result = subprocess.run( + ["cp", "-v", "minimax-output/dog-*.png", "apps/web/public/demo-pets/"], + capture_output=True, + text=True +) + +if result.returncode == 0: + # Count files in demo-pets + import glob + demo_pets = glob.glob("apps/web/public/demo-pets/dog-*.png") + print(f"✓ Copied to demo-pets. Total dog images: {len(demo_pets)}") +else: + print(f"Note: Copy result - {result.stderr}")