File size: 3,309 Bytes
f61429a
 
 
514cd38
f61429a
 
 
 
059f849
 
 
 
 
 
 
 
514cd38
 
 
 
 
 
 
059f849
514cd38
 
 
059f849
 
 
 
 
 
 
 
 
514cd38
059f849
 
 
 
 
514cd38
 
 
059f849
f61429a
 
 
059f849
 
 
 
f61429a
059f849
 
 
 
 
 
f61429a
 
 
 
 
 
 
 
 
514cd38
 
 
 
 
 
 
 
 
 
 
 
 
 
f61429a
 
514cd38
059f849
514cd38
 
059f849
 
514cd38
 
 
 
 
 
 
f61429a
 
514cd38
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import os
import requests
import gradio as gr
from datetime import datetime

# Hugging Face Token
HF_TOKEN = os.getenv("HF_TOKEN")

def get_user_info():
    """Get username from token"""
    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    response = requests.get("https://huggingface.co/api/whoami", headers=headers)
    if response.status_code == 200:
        return response.json().get('name')
    return None

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 get_space_card(space):
    """Generate HTML card for a space"""
    return f"""
    <div style='border: 1px solid #ddd; padding: 15px; margin: 10px; border-radius: 8px; 
                background-color: white; box-shadow: 2px 2px 5px rgba(0,0,0,0.1);'>
        <h3 style='color: #2d2d2d; margin: 0 0 10px 0;'>
            <a href='https://huggingface.co/spaces/{space["id"]}' target='_blank' 
               style='text-decoration: none; color: #2d2d2d;'>
                {space["id"].split("/")[-1]}
            </a>
        </h3>
        <p style='margin: 5px 0;'><strong>Space ID:</strong> {space["id"]}</p>
        <p style='margin: 5px 0;'><strong>Runtime:</strong> {space.get("runtime", {}).get("stage", "N/A")}</p>
        <p style='margin: 5px 0;'><strong>Hardware:</strong> {space.get("runtime", {}).get("hardware", "N/A")}</p>
        <p style='margin: 5px 0;'><strong>Status:</strong> 
           <span style='color: {"green" if space.get("runtime", {}).get("stage") == "RUNNING" else "red"}'>
           {space.get("runtime", {}).get("stage", "N/A")}</span>
        </p>
        <p style='margin: 5px 0;'><strong>Created:</strong> {format_timestamp(space.get("createdAt"))}</p>
        <p style='margin: 5px 0;'><strong>Updated:</strong> {format_timestamp(space.get("lastModified"))}</p>
    </div>
    """

def get_user_spaces():
    if not HF_TOKEN:
        return "Error: Hugging Face token not found."

    username = get_user_info()
    if not username:
        return "Error: Could not get user information."

    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    
    # Get user's spaces
    response = requests.get(
        f"https://huggingface.co/api/spaces/{username}",
        headers=headers
    )

    if response.status_code != 200:
        return f"Error: Failed to fetch spaces (Status Code: {response.status_code})"

    spaces = response.json()

    if not spaces:
        return "No Spaces found."

    # Create HTML grid layout
    html_content = f"""
    <div style='
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        gap: 20px;
        padding: 20px;
        background-color: #f5f5f5;
    '>
    {"".join(get_space_card(space) for space in spaces)}
    </div>
    """

    return html_content

# Creating the Gradio interface
app = gr.Interface(
    fn=get_user_spaces,
    inputs=None,
    outputs=gr.HTML(),
    title="My Hugging Face Spaces Dashboard",
    description="Displays your Hugging Face Spaces in a grid layout",
    theme=gr.themes.Soft(),
    css="""
    .gradio-container {
        max-width: 100% !important;
    }
    """
)

# Launch the Gradio app
if __name__ == "__main__":
    app.launch()