kai-vidsearch / app.py
seawolf2357's picture
Update app.py
b29883b verified
import gradio as gr
import requests
from datetime import datetime, timedelta
import pandas as pd
import plotly.express as px
def get_user_spaces(token):
"""์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  Space ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค."""
headers = {"Authorization": f"Bearer {token}"}
try:
# ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
user_info = requests.get("https://huggingface.co/api/whoami", headers=headers)
user_info.raise_for_status()
username = user_info.json().get('name')
if not username:
return None, "์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
# ์‚ฌ์šฉ์ž์˜ Space ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
spaces_url = f"https://huggingface.co/api/spaces/{username}"
spaces_response = requests.get(spaces_url, headers=headers)
spaces_response.raise_for_status()
return username, spaces_response.json()
except requests.exceptions.RequestException as e:
return None, f"API ์š”์ฒญ ์‹คํŒจ: {str(e)}"
def get_space_visitors(owner, space_name, token):
"""ํŠน์ • Space์˜ ๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค."""
url = f"https://huggingface.co/api/spaces/{owner}/{space_name}/metrics"
headers = {"Authorization": f"Bearer {token}"}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
# ์ตœ๊ทผ 7์ผ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋งŒ ํ•„ํ„ฐ๋ง
today = datetime.now()
week_ago = today - timedelta(days=7)
daily_visits = {}
total_visits = 0
for record in response.json():
date = datetime.fromtimestamp(record['timestamp'])
if date >= week_ago:
date_str = date.strftime('%Y-%m-%d')
visits = record.get('visits', 0)
daily_visits[date_str] = daily_visits.get(date_str, 0) + visits
total_visits += visits
return {
'name': space_name,
'total_visits': total_visits,
'daily_visits': daily_visits
}
except requests.exceptions.RequestException:
return None
def analyze_spaces(token):
"""๋ชจ๋“  Space์˜ ๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค."""
if not token:
return "API ํ† ํฐ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", None, None
# ์‚ฌ์šฉ์ž ์ •๋ณด์™€ Space ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
username, spaces_data = get_user_spaces(token)
if not username:
return f"์˜ค๋ฅ˜: {spaces_data}", None, None
if not isinstance(spaces_data, list):
return "Space ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.", None, None
# ๊ฐ Space์˜ ๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„ ์ˆ˜์ง‘
all_stats = []
daily_data = []
for space in spaces_data:
space_name = space.get('id')
if space_name:
stats = get_space_visitors(username, space_name, token)
if stats:
all_stats.append(stats)
for date, visits in stats['daily_visits'].items():
daily_data.append({
'date': date,
'space': space_name,
'visits': visits
})
if not all_stats:
return "๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.", None, None
# ๊ฒฐ๊ณผ ํ…์ŠคํŠธ ์ƒ์„ฑ
result_text = f"๊ณ„์ •: {username}\n\n"
for stats in sorted(all_stats, key=lambda x: x['total_visits'], reverse=True):
result_text += f"Space: {stats['name']}\n"
result_text += f"์ด ๋ฐฉ๋ฌธ์ž ์ˆ˜: {stats['total_visits']}๋ช…\n\n"
# ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
if daily_data:
df = pd.DataFrame(daily_data)
fig = px.line(df, x='date', y='visits', color='space',
title=f'Space๋ณ„ ์ผ์ผ ๋ฐฉ๋ฌธ์ž ์ˆ˜',
labels={'date': '๋‚ ์งœ', 'visits': '๋ฐฉ๋ฌธ์ž ์ˆ˜', 'space': 'Space ์ด๋ฆ„'})
# ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
summary_df = pd.DataFrame([(s['name'], s['total_visits']) for s in all_stats],
columns=['space', 'total_visits'])
summary_fig = px.bar(summary_df, x='space', y='total_visits',
title='Space๋ณ„ ์ด ๋ฐฉ๋ฌธ์ž ์ˆ˜',
labels={'space': 'Space ์ด๋ฆ„', 'total_visits': '์ด ๋ฐฉ๋ฌธ์ž ์ˆ˜'})
return result_text, fig, summary_fig
return result_text, None, None
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ
with gr.Blocks() as app:
gr.Markdown("""
# Hugging Face Space ๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„
API ํ† ํฐ์„ ์ž…๋ ฅํ•˜๋ฉด ๋ชจ๋“  Space์˜ ๋ฐฉ๋ฌธ์ž ํ†ต๊ณ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
""")
with gr.Row():
token_input = gr.Textbox(label="API ํ† ํฐ", type="password")
submit_btn = gr.Button("ํ†ต๊ณ„ ํ™•์ธ")
stats_output = gr.Textbox(label="ํ†ต๊ณ„ ์ •๋ณด", lines=10)
plot_output = gr.Plot(label="์ผ๋ณ„ ๋ฐฉ๋ฌธ์ž ์ˆ˜")
summary_plot = gr.Plot(label="์ด ๋ฐฉ๋ฌธ์ž ์ˆ˜")
submit_btn.click(
analyze_spaces,
inputs=[token_input],
outputs=[stats_output, plot_output, summary_plot]
)
if __name__ == "__main__":
app.launch()