import os import math import time import random import tempfile import gradio as gr import pandas as pd from datasets import load_dataset from huggingface_hub import snapshot_download # ====================================================== # QUOTA CONFIG # ====================================================== LIMIT = 3 WINDOW = 86400 usage = {} def quota_guard(fn): def wrapper(*args, request: gr.Request = None, **kwargs): session = request.session_hash if request else "global" now = time.time() count, start = usage.get(session, (0, now)) if now - start > WINDOW: count = 0 start = now if count >= LIMIT: raise gr.Error( "🚫 Demo limit reached.\n\n" "You can unlock only 3 times per day.\n" "Please try again after 24 hours." ) usage[session] = (count + 1, start) return fn(*args, request=request, **kwargs) return wrapper # ====================================================== # CONFIG # ====================================================== APP_PASSWORD = os.getenv("APP_PASSWORD") if not APP_PASSWORD: raise RuntimeError("APP_PASSWORD environment variable not set") # PRO CONTENT PRO_DATASET = "rahul7star/Wan-video" # FREE PREVIEW (MODEL REPO) FREE_VIDEO_REPO = "rahul7star/ohamlab" FREE_VIDEO_FOLDER = "showcase/video" MAX_FREE_VIDEOS = 5 # ====================================================== # LOAD FREE VIDEOS (MODEL REPO) # ====================================================== def load_free_videos(): local_dir = snapshot_download( repo_id=FREE_VIDEO_REPO, repo_type="model", allow_patterns=["showcase/video/*"], local_dir=tempfile.mkdtemp(), local_dir_use_symlinks=False, ) video_dir = os.path.join(local_dir, FREE_VIDEO_FOLDER) if not os.path.isdir(video_dir): print(f"[WARN] Free video folder not found: {video_dir}") return [] videos = [ os.path.join(video_dir, f) for f in os.listdir(video_dir) if f.lower().endswith((".mp4", ".webm", ".mov")) ] print(f"[INFO] Loaded free videos: {videos}") return videos FREE_VIDEOS = load_free_videos() def pick_free_videos(max_count=MAX_FREE_VIDEOS): if not FREE_VIDEOS: return [] if len(FREE_VIDEOS) >= max_count: return random.sample(FREE_VIDEOS, max_count) # Repeat if fewer than max_count result = [] while len(result) < max_count: result.extend(FREE_VIDEOS) return result[:max_count] # ====================================================== # LOAD PRO DATASET # ====================================================== dataset = load_dataset(PRO_DATASET, split="test") df = dataset.to_pandas()[["video", "text", "date"]].dropna().reset_index(drop=True) # ====================================================== # PAGINATION # ====================================================== def render_grid(page, page_size): page = int(page) page_size = int(page_size) total_pages = max(1, math.ceil(len(df) / page_size)) page = max(0, min(page, total_pages - 1)) batch = df.iloc[page * page_size:(page + 1) * page_size] cards = [] for _, row in batch.iterrows(): cards.append(f"""