from flask import Flask, render_template, request, jsonify import os, re, json app = Flask(__name__) # ────────────────────────── 1. CONFIGURATION ────────────────────────── # Domains that commonly block iframes BLOCKED_DOMAINS = [ "naver.com", "daum.net", "google.com", "facebook.com", "instagram.com", "kakao.com", "ycombinator.com" ] # ────────────────────────── 2. CURATED CATEGORIES ────────────────────────── CATEGORIES = { "Popular": [ "https://huggingface.co/spaces/fantaxy/ofai-flx-logo", "https://huggingface.co/spaces/aiqtech/FLUX-Ghibli-Studio-LoRA", "https://huggingface.co/spaces/seawolf2357/REALVISXL-V5", "https://huggingface.co/spaces/fantos/flx8lora", "https://huggingface.co/spaces/ginipick/Realtime-FLUX", "https://huggingface.co/spaces/fantaxy/flx-pulid", "https://huggingface.co/spaces/ginipick/FLUX-Prompt-Generator", "https://huggingface.co/spaces/aiqtech/kofaceid", "https://huggingface.co/spaces/aiqtech/flxgif", "https://huggingface.co/spaces/fantos/flxfashmodel", "https://huggingface.co/spaces/fantos/flxcontrol", "https://huggingface.co/spaces/fantos/textcutobject", "https://huggingface.co/spaces/seawolf2357/flxloraexp", "https://huggingface.co/spaces/fantaxy/flxloraexp", "https://huggingface.co/spaces/aiqtech/imaginpaint", "https://huggingface.co/spaces/ginipick/FLUXllama", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored", "https://huggingface.co/spaces/fantaxy/flx-upscale", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video", "https://huggingface.co/spaces/fantos/VoiceClone", "https://huggingface.co/spaces/fantaxy/Rolls-Royce", "https://huggingface.co/spaces/aiqtech/FLUX-military", "https://huggingface.co/spaces/fantaxy/FLUX-Animations", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video2", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-photo", "https://huggingface.co/spaces/ginipick/Time-Stream", "https://huggingface.co/spaces/seawolf2357/sd-prompt-gen", "https://huggingface.co/spaces/openfree/MagicFace-V3", "https://huggingface.co/spaces/Heartsync/adult", "https://huggingface.co/spaces/Heartsync/wan2-1-fast-security", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-REAL", "https://huggingface.co/spaces/seawolf2357/img2vid", "https://huggingface.co/spaces/openfree/image-to-vector", "https://huggingface.co/spaces/openfree/DreamO-video", "https://huggingface.co/spaces/VIDraft/FramePack_rotate_landscape", "https://huggingface.co/spaces/fantaxy/Sound-AI-SFX", "https://huggingface.co/spaces/ginigen/VoiceClone-TTS", "https://huggingface.co/spaces/Heartsync/FREE-NSFW-HUB", "https://huggingface.co/spaces/Heartsync/NSFW-image", "https://huggingface.co/spaces/Heartsync/NSFW-detection", "https://huggingface.co/spaces/Heartsync/VEO3-RealTime", "https://huggingface.co/spaces/ginigen/VEO3-Free", "https://huggingface.co/spaces/ginigen/FLUX-Text-Tree-Image", "https://huggingface.co/spaces/ginigen/text3d-r1", "https://huggingface.co/spaces/VIDraft/stable-diffusion-3.5-large-turboX", ], "BEST": [ "https://huggingface.co/spaces/openfree/Cycle-Navigator", "https://huggingface.co/spaces/ginigen/Flux-Kontext-FaceLORA", "https://huggingface.co/spaces/ginigen/Seedance-Free", "https://huggingface.co/spaces/VIDraft/SOMA-AGI", "https://huggingface.co/spaces/aiqtech/Heatmap-Leaderboard", "https://huggingface.co/spaces/VIDraft/DNA-CASINO", "https://huggingface.co/spaces/aiqtech/SOMA-Oriental", "https://huggingface.co/spaces/fantaxy/YTB-TEST", "https://huggingface.co/spaces/aiqtech/Contributors-Leaderboard", "https://huggingface.co/spaces/ginigen/text3d-r1", "https://huggingface.co/spaces/VIDraft/stable-diffusion-3.5-large-turboX", "https://huggingface.co/spaces/openfree/Korean-Leaderboard", "https://huggingface.co/spaces/fantos/flxcontrol", "https://huggingface.co/spaces/aiqtech/FLUX-Ghibli-Studio-LoRA", "https://huggingface.co/spaces/openfree/AI-Podcast", "https://huggingface.co/spaces/ginigen/Workflow-Canvas", "https://huggingface.co/spaces/ginigen/3D-LLAMA", "https://huggingface.co/spaces/ginigen/VoiceClone-TTS", "https://huggingface.co/spaces/VIDraft/ACE-Singer", "https://huggingface.co/spaces/ginipick/AI-BOOK", "https://huggingface.co/spaces/immunobiotech/drug-discovery", "https://huggingface.co/spaces/VIDraft/Robo-Beam", "https://huggingface.co/spaces/fantaxy/fantasy-novel", "https://huggingface.co/spaces/immunobiotech/Gemini-MICHELIN", "https://huggingface.co/spaces/openfree/Chart-GPT", "https://huggingface.co/spaces/ginipick/NH-Korea", "https://huggingface.co/spaces/VIDraft/Voice-Clone-Podcast", "https://huggingface.co/spaces/ginipick/Private-AI", "https://huggingface.co/spaces/ginigen/Flux-VIDEO", "https://huggingface.co/spaces/openfree/open-GAMMA", "https://huggingface.co/spaces/ginipick/PharmAI-Korea", "https://huggingface.co/spaces/ginipick/Pharmacy", "https://huggingface.co/spaces/ginipick/PDF-EXAM", "https://huggingface.co/spaces/ginipick/IDEA-DESIGN", "https://huggingface.co/spaces/openfree/DreamO-video", "https://huggingface.co/spaces/ginipick/10m-marketing", "https://huggingface.co/spaces/VIDraft/voice-trans", "https://huggingface.co/spaces/VIDraft/NH-Prediction", "https://huggingface.co/spaces/fantos/flx8lora", "https://huggingface.co/spaces/ginigen/MagicFace-V3", "https://huggingface.co/spaces/openfree/Live-Podcast", "https://huggingface.co/spaces/seawolf2357/ocrlatex", "https://huggingface.co/spaces/Heartsync/VEO3-RealTime", "https://huggingface.co/spaces/ginigen/VEO3-Free", "https://huggingface.co/spaces/openfree/MagicFace-V3", "https://huggingface.co/spaces/aiqtech/FLUX-military", "https://huggingface.co/spaces/fantaxy/flxloraexp", "https://huggingface.co/spaces/Heartsync/WAN2-1-fast-T2V-FusioniX", "https://huggingface.co/spaces/ginigen/FLUXllama-Multilingual", "https://huggingface.co/spaces/Heartsync/wan2-1-fast-security", "https://huggingface.co/spaces/fantaxy/Rolls-Royce", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-REAL", "https://huggingface.co/spaces/ginipick/Realtime-FLUX", "https://huggingface.co/spaces/aiqtech/imaginpaint", "https://huggingface.co/spaces/aiqtech/flxgif", "https://huggingface.co/spaces/fantos/flxfashmodel", "https://huggingface.co/spaces/aiqtech/kofaceid", "https://huggingface.co/spaces/ginipick/FLUX-Prompt-Generator", "https://huggingface.co/spaces/seawolf2357/REALVISXL-V5", "https://huggingface.co/spaces/fantaxy/FLUX-Animations", "https://huggingface.co/spaces/fantaxy/flx-pulid", "https://huggingface.co/spaces/fantaxy/ofai-flx-logo", "https://huggingface.co/spaces/openfree/image-to-vector", "https://huggingface.co/spaces/Heartsync/FREE-NSFW-HUB", "https://huggingface.co/spaces/seawolf2357/sd-prompt-gen", "https://huggingface.co/spaces/VIDraft/FramePack_rotate_landscape", "https://huggingface.co/spaces/ginipick/FLUXllama", "https://huggingface.co/spaces/Heartsync/NSFW-image", "https://huggingface.co/spaces/seawolf2357/img2vid", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video2", "https://huggingface.co/spaces/Heartsync/NSFW-detection", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video", "https://huggingface.co/spaces/Heartsync/adult", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored", "https://huggingface.co/spaces/fantos/VoiceClone", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-photo", "https://huggingface.co/spaces/fantaxy/flx-upscale", "https://huggingface.co/spaces/seawolf2357/flxloraexp", "https://huggingface.co/spaces/ginipick/Time-Stream", "https://huggingface.co/spaces/fantos/textcutobject", ], "NEW": [ "https://huggingface.co/spaces/VIDraft/ACE-Singer", "https://huggingface.co/spaces/ginipick/AI-BOOK", "https://huggingface.co/spaces/openfree/Best-AI", "https://huggingface.co/spaces/aiqtech/Heatmap-Leaderboard", "https://huggingface.co/spaces/VIDraft/DNA-CASINO", "https://huggingface.co/spaces/ginigen/Seedance-Free", "https://huggingface.co/spaces/aiqtech/SOMA-Oriental", "https://huggingface.co/spaces/ginigen/Flux-Kontext-FaceLORA", "https://huggingface.co/spaces/VIDraft/SOMA-AGI", "https://huggingface.co/spaces/Heartsync/VEO3-RealTime", "https://huggingface.co/spaces/openfree/Open-GAMMA", "https://huggingface.co/spaces/ginigen/VEO3-Free", "https://huggingface.co/spaces/Heartsync/WAN2-1-fast-T2V-FusioniX", "https://huggingface.co/spaces/VIDraft/voice-trans", "https://huggingface.co/spaces/VIDraft/Robo-Beam", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-REAL", "https://huggingface.co/spaces/fantaxy/fantasy-novel", "https://huggingface.co/spaces/openfree/Chart-GPT", "https://huggingface.co/spaces/Heartsync/Novel-NSFW", "https://huggingface.co/spaces/ginigen/FLUX-Ghibli-LoRA2", "https://huggingface.co/spaces/Heartsync/WAN-VIDEO-AUDIO", "https://huggingface.co/spaces/Heartsync/wan2-1-fast-security", "https://huggingface.co/spaces/ginigen/Flux-VIDEO", "https://huggingface.co/spaces/aiqcamp/REMOVAL-TEXT-IMAGE", "https://huggingface.co/spaces/VIDraft/Mistral-RAG-BitSix", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video2", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video", "https://huggingface.co/spaces/fantaxy/YTB-TEST", "https://huggingface.co/spaces/Heartsync/FREE-NSFW-HUB", "https://huggingface.co/spaces/Heartsync/adult", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-photo", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored", "https://huggingface.co/spaces/openfree/Live-Podcast", "https://huggingface.co/spaces/openfree/AI-Podcast", "https://huggingface.co/spaces/ginipick/NH-Korea", "https://huggingface.co/spaces/VIDraft/NH-Prediction", "https://huggingface.co/spaces/VIDraft/Voice-Clone-Podcast", "https://huggingface.co/spaces/ginipick/PDF-EXAM", "https://huggingface.co/spaces/openfree/Game-Gallery", "https://huggingface.co/spaces/openfree/Vibe-Game", "https://huggingface.co/spaces/ginipick/IDEA-DESIGN", "https://huggingface.co/spaces/openfree/Cycle-Navigator", "https://huggingface.co/spaces/openfree/DreamO-video", "https://huggingface.co/spaces/Heartsync/NSFW-detection", ], "Productivity": [ "https://huggingface.co/spaces/aiqtech/Heatmap-Leaderboard", "https://huggingface.co/spaces/VIDraft/DNA-CASINO", "https://huggingface.co/spaces/openfree/Open-GAMMA", "https://huggingface.co/spaces/VIDraft/Robo-Beam", "https://huggingface.co/spaces/VIDraft/voice-trans", "https://huggingface.co/spaces/Heartsync/FREE-NSFW-HUB", "https://huggingface.co/spaces/openfree/Chart-GPT", "https://huggingface.co/spaces/ginipick/AI-BOOK", "https://huggingface.co/spaces/VIDraft/Voice-Clone-Podcast", "https://huggingface.co/spaces/ginipick/PDF-EXAM", "https://huggingface.co/spaces/ginigen/perflexity-clone", "https://huggingface.co/spaces/ginipick/IDEA-DESIGN", "https://huggingface.co/spaces/ginipick/10m-marketing", "https://huggingface.co/spaces/openfree/Live-Podcast", "https://huggingface.co/spaces/openfree/AI-Podcast", "https://huggingface.co/spaces/ginipick/QR-Canvas-plus", "https://huggingface.co/spaces/openfree/Badge", "https://huggingface.co/spaces/VIDraft/mouse-webgen", "https://huggingface.co/spaces/openfree/Vibe-Game", "https://huggingface.co/spaces/VIDraft/NH-Prediction", "https://huggingface.co/spaces/ginipick/NH-Korea", "https://huggingface.co/spaces/openfree/Naming", "https://huggingface.co/spaces/ginipick/Change-Hair", ], "Multimodal": [ "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-photo", "https://huggingface.co/spaces/fantaxy/YTB-TEST", "https://huggingface.co/spaces/ginigen/Seedance-Free", "https://huggingface.co/spaces/Heartsync/VEO3-RealTime", "https://huggingface.co/spaces/ginigen/VEO3-Free", "https://huggingface.co/spaces/ginigen/VEO3-Directors", "https://huggingface.co/spaces/Heartsync/WAN2-1-fast-T2V-FusioniX", "https://huggingface.co/spaces/Heartsync/adult", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video2", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-video", "https://huggingface.co/spaces/Heartsync/WAN-VIDEO-AUDIO", "https://huggingface.co/spaces/Heartsync/wan2-1-fast-security", "https://huggingface.co/spaces/ginigen/Flux-VIDEO", "https://huggingface.co/spaces/ginigen/3D-LLAMA-V1", "https://huggingface.co/spaces/ginigen/Flux-VIDEO", "https://huggingface.co/spaces/openfree/Multilingual-TTS", "https://huggingface.co/spaces/VIDraft/ACE-Singer", "https://huggingface.co/spaces/openfree/DreamO-video", "https://huggingface.co/spaces/fantaxy/Sound-AI-SFX", "https://huggingface.co/spaces/ginigen/SFX-Sound-magic", "https://huggingface.co/spaces/ginigen/VoiceClone-TTS", "https://huggingface.co/spaces/aiqcamp/ENGLISH-Speaking-Scoring", "https://huggingface.co/spaces/fantaxy/Remove-Video-Background", ], "Professional": [ "https://huggingface.co/spaces/Heartsync/NSFW-novels", "https://huggingface.co/spaces/aiqtech/SOMA-Oriental", "https://huggingface.co/spaces/VIDraft/SOMA-AGI", "https://huggingface.co/spaces/Heartsync/Novel-NSFW", "https://huggingface.co/spaces/fantaxy/fantasy-novel", "https://huggingface.co/spaces/VIDraft/money-radar", "https://huggingface.co/spaces/immunobiotech/drug-discovery", "https://huggingface.co/spaces/immunobiotech/Gemini-MICHELIN", "https://huggingface.co/spaces/openfree/Cycle-Navigator", "https://huggingface.co/spaces/VIDraft/Fashion-Fit", "https://huggingface.co/spaces/openfree/Stock-Trading-Analysis", "https://huggingface.co/spaces/ginipick/AgentX-Papers", "https://huggingface.co/spaces/Heartsync/Papers-Leaderboard", "https://huggingface.co/spaces/VIDraft/PapersImpact", "https://huggingface.co/spaces/ginigen/multimodal-chat-mbti-korea", ], "Image": [ "https://huggingface.co/spaces/ginigen/Flux-Kontext-FaceLORA", "https://huggingface.co/spaces/Heartsync/NSFW-Uncensored-REAL", "https://huggingface.co/spaces/ginigen/FLUX-Ghibli-LoRA2", "https://huggingface.co/spaces/aiqcamp/REMOVAL-TEXT-IMAGE", "https://huggingface.co/spaces/VIDraft/BAGEL-Websearch", "https://huggingface.co/spaces/ginigen/Every-Text", "https://huggingface.co/spaces/ginigen/text3d-r1", "https://huggingface.co/spaces/ginipick/FLUXllama", "https://huggingface.co/spaces/ginigen/Workflow-Canvas", "https://huggingface.co/spaces/ginigen/canvas-studio", "https://huggingface.co/spaces/VIDraft/ReSize-Image-Outpainting", "https://huggingface.co/spaces/Heartsync/FLUX-Vision", "https://huggingface.co/spaces/fantos/textcutobject", "https://huggingface.co/spaces/aiqtech/imaginpaint", "https://huggingface.co/spaces/openfree/ColorRevive", "https://huggingface.co/spaces/openfree/ultpixgen", "https://huggingface.co/spaces/VIDraft/Polaroid-Style", "https://huggingface.co/spaces/ginigen/VisualCloze", "https://huggingface.co/spaces/fantaxy/ofai-flx-logo", "https://huggingface.co/spaces/ginigen/interior-design", "https://huggingface.co/spaces/ginigen/MagicFace-V3", "https://huggingface.co/spaces/fantaxy/flx-pulid", "https://huggingface.co/spaces/seawolf2357/Ghibli-Multilingual-Text-rendering", "https://huggingface.co/spaces/VIDraft/Open-Meme-Studio", "https://huggingface.co/spaces/VIDraft/stable-diffusion-3.5-large-turboX", "https://huggingface.co/spaces/aiqtech/flxgif", "https://huggingface.co/spaces/openfree/VectorFlow", "https://huggingface.co/spaces/ginigen/3D-LLAMA", "https://huggingface.co/spaces/ginigen/Multi-LoRAgen", ], "LLM / VLM": [ "https://huggingface.co/spaces/fantaxy/fantasy-novel", "https://huggingface.co/spaces/ginigen/deepseek-r1-0528-API", "https://huggingface.co/spaces/aiqcamp/Mistral-Devstral-API", "https://huggingface.co/spaces/aiqcamp/deepseek-r1-0528", "https://huggingface.co/spaces/aiqcamp/deepseek-r1-0528-qwen3-8b", "https://huggingface.co/spaces/aiqcamp/deepseek-r1-0528", "https://huggingface.co/spaces/aiqcamp/Mistral-Devstral-API", "https://huggingface.co/spaces/VIDraft/Mistral-RAG-BitSix", "https://huggingface.co/spaces/VIDraft/Gemma-3-R1984-4B", "https://huggingface.co/spaces/VIDraft/Gemma-3-R1984-12B", "https://huggingface.co/spaces/ginigen/Mistral-Perflexity", "https://huggingface.co/spaces/aiqcamp/gemini-2.5-flash-preview", "https://huggingface.co/spaces/openfree/qwen3-30b-a3b-research", "https://huggingface.co/spaces/openfree/qwen3-235b-a22b-research", "https://huggingface.co/spaces/openfree/Llama-4-Maverick-17B-Research", ], } # ────────────────────────── 3. URL HELPERS ────────────────────────── def direct_url(hf_url): m = re.match(r"https?://huggingface\.co/spaces/([^/]+)/([^/?#]+)", hf_url) if not m: return hf_url owner, name = m.groups() owner = owner.lower() name = name.replace('.', '-').replace('_', '-').lower() return f"https://{owner}-{name}.hf.space" def screenshot_url(url): return f"https://image.thum.io/get/fullpage/{url}" def process_url_for_preview(url): """Returns (preview_url, mode)""" # Handle blocked domains first if any(d for d in BLOCKED_DOMAINS if d in url): return screenshot_url(url), "snapshot" # Special case handling for problematic URLs if "vibe-coding-tetris" in url or "World-of-Tank-GAME" in url or "Minesweeper-Game" in url: return screenshot_url(url), "snapshot" # General HF space handling try: if "huggingface.co/spaces" in url: parts = url.rstrip("/").split("/") if len(parts) >= 5: owner = parts[-2] name = parts[-1] embed_url = f"https://huggingface.co/spaces/{owner}/{name}/embed" return embed_url, "iframe" except Exception: return screenshot_url(url), "snapshot" # Default handling return url, "iframe" # ────────────────────────── 4. API ROUTES ────────────────────────── @app.route('/api/category') def api_category(): cat = request.args.get('name', '') urls = CATEGORIES.get(cat, []) # Add pagination for categories page = int(request.args.get('page', 1)) per_page = int(request.args.get('per_page', 4)) total_pages = max(1, (len(urls) + per_page - 1) // per_page) start = (page - 1) * per_page end = min(start + per_page, len(urls)) urls_page = urls[start:end] items = [ { "title": url.split('/')[-1], "owner": url.split('/')[-2] if '/spaces/' in url else '', "iframe": direct_url(url), "shot": screenshot_url(url), "hf": url } for url in urls_page ] return jsonify({ "items": items, "page": page, "total_pages": total_pages }) # ────────────────────────── 5. MAIN ROUTES ────────────────────────── @app.route('/') def home(): os.makedirs('templates', exist_ok=True) with open('templates/index.html', 'w', encoding='utf-8') as fp: fp.write(r''' Web Gallery

🌟OPEN & Free: BEST AI Playground

badge badge badge

''') # Return the rendered template return render_template('index.html', cats=list(CATEGORIES.keys())) if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)