import requests import gradio as gr from datetime import datetime import random USERNAME = "openfree" def format_timestamp(timestamp): if timestamp: dt = datetime.fromisoformat(timestamp.replace('Z', '+00:00')) return dt.strftime('%Y-%m-%d %H:%M') return 'N/A' def should_exclude_space(space_name): """특정 스페이스를 제외하는 필터 함수""" exclude_keywords = [ 'mixgen3', 'ginid', 'mouse', 'flxtrainlora', 'vidslicegpu', 'stickimg', 'ultpixgen', 'SORA', 'badassgi', 'newsplus', 'chargen', 'news', 'testhtml' ] return any(keyword.lower() in space_name.lower() for keyword in exclude_keywords) def get_pastel_color(index): """Generate unique pastel colors based on index""" pastel_colors = [ '#FFE6E6', # 연한 분홍 '#FFE6FF', # 연한 보라 '#E6E6FF', # 연한 파랑 '#E6FFFF', # 연한 하늘 '#E6FFE6', # 연한 초록 '#FFFFE6', # 연한 노랑 '#FFF0E6', # 연한 주황 '#F0E6FF', # 연한 라벤더 '#FFE6F0', # 연한 로즈 '#E6FFF0', # 연한 민트 '#F0FFE6', # 연한 라임 '#FFE6EB', # 연한 코랄 '#E6EBFF', # 연한 퍼플블루 '#FFE6F5', # 연한 핑크 '#E6FFF5', # 연한 터코이즈 '#F5E6FF', # 연한 모브 '#FFE6EC', # 연한 살몬 '#E6FFEC', # 연한 스프링그린 '#ECE6FF', # 연한 페리윙클 '#FFE6F7', # 연한 매그놀리아 ] return pastel_colors[index % len(pastel_colors)] def get_space_card(space, index): """Generate HTML card for a space with colorful design and lots of emojis""" space_id = space.get('id', '') space_name = space_id.split('/')[-1] likes = space.get('likes', 0) created_at = format_timestamp(space.get('createdAt')) sdk = space.get('sdk', 'N/A') # SDK별 이모지 및 관련 이모지 세트 sdk_emoji_sets = { 'gradio': { 'main': '🎨', 'related': ['🖼️', '🎭', '🎪', '🎠', '🎡', '🎢', '🎯', '🎲', '🎰', '🎳'] }, 'streamlit': { 'main': '⚡', 'related': ['💫', '✨', '⭐', '🌟', '💥', '⚡', '🔥', '🌈', '🎆', '🎇'] }, 'docker': { 'main': '🐳', 'related': ['🐋', '🌊', '🌍', '🚢', '⛴️', '🛥️', '🐠', '🐡', '🦈', '🐬'] }, 'static': { 'main': '📄', 'related': ['📝', '📰', '📑', '🗂️', '📁', '📂', '📚', '📖', '📒', '📔'] }, 'panel': { 'main': '📊', 'related': ['📈', '📉', '💹', '📋', '📌', '📍', '🗺️', '🎯', '📐', '📏'] }, 'N/A': { 'main': '🔧', 'related': ['🔨', '⚒️', '🛠️', '⚙️', '🔩', '⛏️', '⚡', '🔌', '💡', '🔋'] } } # SDK에 따른 이모지 선택 sdk_lower = sdk.lower() bg_color = get_pastel_color(index) # 인덱스 기반 색상 선택 emoji_set = sdk_emoji_sets.get(sdk_lower, sdk_emoji_sets['N/A']) main_emoji = emoji_set['main'] # 랜덤하게 3개의 관련 이모지 선택 decorative_emojis = random.sample(emoji_set['related'], 3) # 추가 장식용 이모지 general_emojis = ['🚀', '💫', '⭐', '🌟', '✨', '💥', '🔥', '🌈', '🎯', '🎨', '🎭', '🎪', '🎢', '🎡', '🎠', '🎪', '🎭', '🎨', '🎯', '🎲'] random_emojis = random.sample(general_emojis, 3) # 좋아요 수에 따른 하트 이모지 heart_emoji = '❤️' if likes > 100 else '💖' if likes > 50 else '💝' if likes > 10 else '🤍' return f"""
{main_emoji}
{decorative_emojis[0]}
{decorative_emojis[1]}
{decorative_emojis[2]}

{random_emojis[0]} {space_name} {random_emojis[1]}

SDK: {main_emoji} {sdk} {decorative_emojis[0]}

Created: 📅 {created_at} ⏰

Likes: {heart_emoji} {likes} {random_emojis[2]}

View Space 🚀 {random_emojis[0]} 🆔 {space_id} {decorative_emojis[2]}
""" def get_user_spaces(): url = f"https://huggingface.co/api/spaces?author={USERNAME}&limit=500" headers = { "Accept": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } try: response = requests.get(url, headers=headers) print(f"Status Code: {response.status_code}") print(f"Response length: {len(response.json()) if response.status_code == 200 else 'N/A'}") if response.status_code != 200: return f"Error: Failed to fetch spaces (Status Code: {response.status_code})" spaces_data = response.json() # 제외할 스페이스 필터링 user_spaces = [ space for space in spaces_data if not should_exclude_space(space.get('id', '').split('/')[-1]) ] if not user_spaces: return f"""

No public Spaces found for user: {USERNAME}

Try visiting: https://huggingface.co/{USERNAME}

""" user_spaces.sort(key=lambda x: x.get('likes', 0), reverse=True) html_content = f"""

Spaces by {USERNAME}

Found {len(user_spaces)} public spaces

{"".join(get_space_card(space, idx) for idx, space in enumerate(user_spaces))}
""" return html_content except Exception as e: print(f"Error: {str(e)}") return f"""

Error occurred while fetching spaces

Error details: {str(e)}

Please try again later.

""" # Creating the Gradio interface demo = gr.Blocks() with demo: html_output = gr.HTML(value=get_user_spaces()) # 초기 로드 시 직접 함수 호출 if __name__ == "__main__": demo.launch()