from flask import Flask, render_template, request, jsonify import requests import os from collections import Counter app = Flask(__name__) # 1) 트렌딩 모델을 가져오는 함수 def fetch_trending_models(offset=0, limit=72): try: url = "https://huggingface.co/api/models" params = {"limit": 10000} # 많은 모델을 가져옴 response = requests.get(url, params=params, timeout=30) if response.status_code == 200: models = response.json() # 필터링 filtered = [ m for m in models if m.get('owner') != 'None' and m.get('id', '').split('/', 1)[0] != 'None' ] start = min(offset, len(filtered)) end = min(offset + limit, len(filtered)) print(f"Fetched {len(filtered)} models, returning {end - start} from {start} to {end}.") return { 'models': filtered[start:end], 'total': len(filtered), 'offset': offset, 'limit': limit, 'all_models': filtered } else: # 오류 응답 시 더미 모델 print(f"Error fetching models: {response.status_code}") return { 'models': generate_dummy_models(limit), 'total': 200, 'offset': offset, 'limit': limit, 'all_models': generate_dummy_models(500) } except Exception as e: print("Exception when fetching models:", e) return { 'models': generate_dummy_models(limit), 'total': 200, 'offset': offset, 'limit': limit, 'all_models': generate_dummy_models(500) } # 2) 더미 모델 생성 함수(오류시 사용) def generate_dummy_models(count): dummy_list = [] for i in range(count): dummy_list.append({ 'id': f'dummy/model-{i}', 'owner': 'dummy', 'title': f'Example Model {i+1}', 'likes': 100 - i, 'downloads': 9999 - i, # 임의의 다운로드 수 'createdAt': '2023-01-01T00:00:00.000Z', 'tags': ['dummy', 'fallback'] }) return dummy_list # 3) 모델 URL 생성 def transform_url(owner, name): name = name.replace('.', '-').replace('_', '-').lower() owner = owner.lower() return f"https://huggingface.co/{owner}/{name}" # 4) 모델 상세정보 가공 def get_model_details(model_data, index, offset): try: if '/' in model_data.get('id', ''): owner, name = model_data['id'].split('/', 1) else: owner = model_data.get('owner', '') name = model_data.get('id', '') if owner == 'None' or name == 'None': return None original_url = f"https://huggingface.co/{owner}/{name}" embed_url = transform_url(owner, name) # 다운로드, 좋아요 likes_count = model_data.get('likes', 0) downloads_count = model_data.get('downloads', 0) # 다운로드 수 추가 title = model_data.get('title', name) tags = model_data.get('tags', []) return { 'url': original_url, 'embedUrl': embed_url, 'title': title, 'owner': owner, 'name': name, 'likes_count': likes_count, 'downloads_count': downloads_count, # 다운로드 수 'tags': tags, 'rank': offset + index + 1 } except Exception as e: print("Error processing model data:", e) return { 'url': 'https://huggingface.co', 'embedUrl': 'https://huggingface.co', 'title': 'Error Loading Model', 'owner': 'huggingface', 'name': 'error', 'likes_count': 0, 'downloads_count': 0, 'tags': [], 'rank': offset + index + 1 } # 5) 오너 통계 (Top 30) def get_owner_stats(all_models): owners = [] for m in all_models: if '/' in m.get('id', ''): o, _ = m['id'].split('/', 1) else: o = m.get('owner', '') if o != 'None': owners.append(o) c = Counter(owners) return c.most_common(30) @app.route('/') def home(): return render_template('index.html') # 6) 트렌딩 모델 API @app.route('/api/trending-models', methods=['GET']) def trending_models(): search_query = request.args.get('search', '').lower() offset = int(request.args.get('offset', 0)) limit = int(request.args.get('limit', 72)) data = fetch_trending_models(offset, limit) results = [] for index, md in enumerate(data['models']): info = get_model_details(md, index, offset) if not info: continue if search_query: title_l = info['title'].lower() owner_l = info['owner'].lower() url_l = info['url'].lower() tags_l = ' '.join(t.lower() for t in info['tags']) # 검색 조건에 없으면 pass if (search_query not in title_l and search_query not in owner_l and search_query not in url_l and search_query not in tags_l): continue results.append(info) top_owners = get_owner_stats(data['all_models']) return jsonify({ 'models': results, 'total': data['total'], 'offset': offset, 'limit': limit, 'top_owners': top_owners }) if __name__ == '__main__': # 템플릿 폴더 생성 os.makedirs('templates', exist_ok=True) # index.html 생성 with open('templates/index.html', 'w', encoding='utf-8') as f: f.write("""
Discover the top trending models from Huggingface