from flask import Flask, render_template, request, jsonify, session import os from datetime import timedelta app = Flask(__name__) app.secret_key = os.urandom(24) app.permanent_session_lifetime = timedelta(days=7) # Hugging Face URL 목록 - 일부 URL은 미리 좋아요 상태로 설정 # 'is_liked'를 true로 설정한 URL은 항상 좋아요 상태로 표시됨 HUGGINGFACE_URLS = [ {"url": "https://huggingface.co/spaces/ginipick/Tech_Hangman_Game", "is_liked": True}, {"url": "https://huggingface.co/spaces/openfree/deepseek_r1_API", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginipick/open_Deep-Research", "is_liked": True}, {"url": "https://huggingface.co/spaces/aiqmaster/open-deep-research", "is_liked": False}, {"url": "https://huggingface.co/spaces/seawolf2357/DeepSeek-R1-32b-search", "is_liked": True}, {"url": "https://huggingface.co/spaces/ginigen/LLaDA", "is_liked": False}, {"url": "https://huggingface.co/spaces/VIDraft/PHI4-Multimodal", "is_liked": True}, {"url": "https://huggingface.co/spaces/ginigen/Ovis2-8B", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginigen/Graph-Mind", "is_liked": True}, {"url": "https://huggingface.co/spaces/ginigen/Workflow-Canvas", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginigen/Design", "is_liked": True}, {"url": "https://huggingface.co/spaces/ginigen/Diagram", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginigen/Mockup", "is_liked": True}, {"url": "https://huggingface.co/spaces/ginigen/Infographic", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginigen/Flowchart", "is_liked": True}, {"url": "https://huggingface.co/spaces/aiqcamp/FLUX-Vision", "is_liked": False}, {"url": "https://huggingface.co/spaces/ginigen/VoiceClone-TTS", "is_liked": True}, {"url": "https://huggingface.co/spaces/openfree/Perceptron-Network", "is_liked": False}, {"url": "https://huggingface.co/spaces/openfree/Article-Generator", "is_liked": True}, ] # URL의 마지막 부분을 제목으로 추출 def extract_title(url): parts = url.split("/") title = parts[-1] if parts else "" return title.replace("_", " ").replace("-", " ") @app.route('/') def home(): return render_template('index.html') @app.route('/api/login', methods=['POST']) def login(): token = request.form.get('token', '') if not token: return jsonify({'success': False, 'message': '토큰을 입력해주세요.'}) # 간단히 토큰 길이만 검사 (실제로는 더 복잡한 검증 필요) if len(token) < 5: return jsonify({'success': False, 'message': '유효하지 않은 토큰입니다.'}) # 토큰의 첫 글자를 사용자 이름으로 설정 (테스트용) username = f"사용자_{token[:3]}" # 세션에 저장 session['username'] = username return jsonify({ 'success': True, 'username': username }) @app.route('/api/logout', methods=['POST']) def logout(): session.pop('username', None) return jsonify({'success': True}) @app.route('/api/urls', methods=['GET']) def get_urls(): results = [] for url_item in HUGGINGFACE_URLS: url = url_item["url"] is_liked = url_item["is_liked"] title = extract_title(url) results.append({ 'url': url, 'title': title, 'is_liked': is_liked }) return jsonify(results) @app.route('/api/toggle-like', methods=['POST']) def toggle_like(): if 'username' not in session: return jsonify({'success': False, 'message': '로그인이 필요합니다.'}) data = request.json url = data.get('url') if not url: return jsonify({'success': False, 'message': 'URL이 필요합니다.'}) # URL 목록에서 해당 URL 찾기 for url_item in HUGGINGFACE_URLS: if url_item["url"] == url: # 좋아요 상태 토글 url_item["is_liked"] = not url_item["is_liked"] return jsonify({ 'success': True, 'is_liked': url_item["is_liked"], 'message': '좋아요를 추가했습니다.' if url_item["is_liked"] else '좋아요를 취소했습니다.' }) return jsonify({'success': False, 'message': '해당 URL을 찾을 수 없습니다.'}) @app.route('/api/session-status', methods=['GET']) def session_status(): return jsonify({ 'logged_in': 'username' in session, 'username': session.get('username') }) if __name__ == '__main__': os.makedirs('templates', exist_ok=True) with open('templates/index.html', 'w', encoding='utf-8') as f: f.write(''' Hugging Face URL 카드 리스트
허깅페이스 계정: 로그인되지 않음
0개 중 0의 URL을 좋아요 했습니다.
''') # 허깅페이스 스페이스에서는 7860 포트 사용 app.run(host='0.0.0.0', port=7860)