import gradio as gr
import sqlite3
import pandas as pd
from themes import IndonesiaTheme # Tema custom
DB_PATH = "spaces.db"
def load_data(status_filter="All", keyword=""):
conn = sqlite3.connect(DB_PATH)
query = "SELECT name, author, desc, likes, updated, status, link FROM spaces"
df = pd.read_sql_query(query, conn)
conn.close()
if status_filter != "All":
df = df[df['status'].str.contains(status_filter, case=False, na=False)]
if keyword.strip():
df = df[df['name'].str.contains(keyword, case=False, na=False)]
df = df.sort_values("likes", ascending=False).head(20)
# Kolom Visit tetap
df["🔗 Visit"] = df["link"].apply(lambda url: f"🌐 Visit")
# Kolom Name: bold
df["name"] = df["name"].apply(lambda name: f"{name}")
# Kolom Status: warna dinamis
def format_status(s):
if "running" in s.lower():
return f"{s}"
else:
return f"{s}"
df["status"] = df["status"].apply(format_status)
# Susun ulang kolom
df = df[["name", "author", "desc", "likes", "updated", "status", "🔗 Visit"]]
df.columns = ["📛 Name", "👤 Author", "📝 Description", "❤️ Likes", "🕒 Updated", "⚙️ Status", "🔗 Visit"]
return df.reset_index(drop=True)
def view_leaderboard(status, keyword):
return load_data(status, keyword)
css = """
table {
width: 100%;
border-collapse: collapse;
margin-top: 1rem;
font-size: 0.92rem;
}
th {
background: #f0f0f0;
padding: 8px;
text-align: left;
font-weight: bold;
border-bottom: 2px solid #ccc;
}
td {
padding: 8px;
border-bottom: 1px solid #eee;
vertical-align: top;
}
tr:hover {
background-color: #f9f9f9;
}
td a {
text-decoration: none;
color: #1e90ff;
font-weight: bold;
}
"""
# === Gradio App UI ===
with gr.Blocks(theme=IndonesiaTheme()) as demo:
with gr.Column():
gr.Markdown("## 🌌 HuggingFace Spaces Leaderboard")
gr.Markdown("🎯 Menampilkan 20 space dengan jumlah like terbanyak + link kunjungan langsung")
with gr.Row():
with gr.Column(elem_id="col-left"):
status_choice = gr.Dropdown(["All", "Running", "Zero", "Stopped"],
label="🎛️ Filter Status", value="All")
with gr.Column(elem_id="col-mid"):
keyword_input = gr.Textbox(label="🔍 Search by Name",
placeholder="e.g. llama, tts, image")
with gr.Column(elem_id="col-bott"):
output_table = gr.HTML(label="Leaderboard Table")
def render_html_table(status, keyword):
df = load_data(status, keyword)
html_table = df.to_html(escape=False, index=False, classes="styled-table")
return f"""
{html_table}
"""
status_choice.change(fn=render_html_table, inputs=[status_choice, keyword_input], outputs=output_table)
keyword_input.change(fn=render_html_table, inputs=[status_choice, keyword_input], outputs=output_table)
gr.Button("🔄 Refresh").click(fn=render_html_table,
inputs=[status_choice, keyword_input], outputs=output_table)
gr.Markdown("#### Made with ❤️ by Deddy | HuggingFace Leaderboard Mirror", elem_id="footer")
demo.launch()