File size: 2,502 Bytes
f61429a
 
 
514cd38
 
f61429a
 
 
 
 
 
 
514cd38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f61429a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514cd38
 
 
 
 
 
 
 
 
 
 
 
 
 
f61429a
 
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
import os
import requests
import gradio as gr
import pandas as pd
from datetime import datetime

# Hugging Face API URL
HF_API_URL = "https://huggingface.co/api/spaces"

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

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):
    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;'>{space.get('name', 'N/A')}</h3>
        <p style='margin: 5px 0;'><strong>Author:</strong> {space.get('author', 'N/A')}</p>
        <p style='margin: 5px 0;'><strong>SDK:</strong> {space.get('sdk', 'N/A')}</p>
        <p style='margin: 5px 0;'><strong>Status:</strong> 
           <span style='color: {"green" if space.get("status") == "running" else "red"}'>
           {space.get('status', '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('updatedAt'))}</p>
    </div>
    """

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

    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    response = requests.get(HF_API_URL, 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_all_spaces,
    inputs=None,
    outputs=gr.HTML(),
    title="Hugging Face Spaces Dashboard",
    description="Displays all available 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()