File size: 4,125 Bytes
f61429a
 
514cd38
f61429a
060cebe
 
059f849
514cd38
 
 
 
 
 
 
059f849
514cd38
 
d51b0b3
 
 
 
059f849
060cebe
059f849
060cebe
059f849
 
060cebe
 
 
d51b0b3
060cebe
d51b0b3
 
060cebe
 
 
d51b0b3
514cd38
 
 
059f849
060cebe
 
 
 
 
 
 
 
 
 
 
 
 
f61429a
060cebe
 
fbd7b3f
060cebe
 
 
 
 
 
 
f61429a
060cebe
 
f61429a
060cebe
 
2d1b715
060cebe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d51b0b3
060cebe
514cd38
060cebe
 
 
 
 
f61429a
 
514cd38
059f849
514cd38
 
d51b0b3
 
514cd38
 
 
 
 
 
 
f61429a
 
514cd38
d51b0b3
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import requests
import gradio as gr
from datetime import datetime

# ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Gradio ๊ณต์‹ ๊ณ„์ •์œผ๋กœ ๋ณ€๊ฒฝ
USERNAME = "gradio"

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);
                transition: transform 0.2s ease-in-out;'
         onmouseover='this.style.transform="scale(1.02)"'
         onmouseout='this.style.transform="scale(1)"'>
        <h3 style='color: #2d2d2d; margin: 0 0 10px 0;'>
            <a href='{space.get("url", "#")}' target='_blank' 
               style='text-decoration: none; color: #2d2d2d;'>
                {space.get('title', 'Unnamed Space')}
            </a>
        </h3>
        <p style='margin: 5px 0; color: #666;'>{space.get('description', 'No description available')}</p>
        <div style='margin-top: 10px; display: flex; justify-content: space-between; align-items: center;'>
            <a href='{space.get("url", "#")}' target='_blank' 
               style='background-color: #0084ff; color: white; padding: 5px 10px; 
                      border-radius: 5px; text-decoration: none;'>
                View Space
            </a>
            <span style='color: #666;'>
                โค๏ธ {space.get('likes', 0)}
            </span>
        </div>
    </div>
    """

def get_user_spaces():
    # Hugging Face search API ์‚ฌ์šฉ
    url = "https://huggingface.co/api/spaces"
    params = {
        "author": USERNAME,
        "limit": 100,
        "full": True
    }
    
    try:
        response = requests.get(url, params=params)
        print(f"Status Code: {response.status_code}")  # ๋””๋ฒ„๊น…์šฉ
        print(f"URL: {response.url}")  # ๋””๋ฒ„๊น…์šฉ
        print(f"Response: {response.text[:500]}...")  # ๋””๋ฒ„๊น…์šฉ

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

        spaces = response.json()
        
        if not spaces:
            # ๋‹ค๋ฅธ API ์—”๋“œํฌ์ธํŠธ ์‹œ๋„
            alternate_url = f"https://huggingface.co/api/spaces/{USERNAME}"
            response = requests.get(alternate_url)
            spaces = response.json() if response.status_code == 200 else []

        if not spaces:
            return "No public Spaces found for this user."

        if not isinstance(spaces, list):
            spaces = [spaces]

        # Create HTML grid layout
        html_content = f"""
        <div style='padding: 20px; background-color: #f5f5f5;'>
            <div style='margin-bottom: 20px;'>
                <p style='color: #666; margin: 0;'>Found {len(spaces)} public spaces for {USERNAME}</p>
            </div>
            <div style='
                display: grid;
                grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
                gap: 20px;
            '>
                {"".join(get_space_card({
                    'title': space.get('id', '').split('/')[-1],
                    'description': space.get('description', ''),
                    'url': f"https://huggingface.co/spaces/{space.get('id', '')}",
                    'likes': space.get('likes', 0)
                }) for space in spaces)}
            </div>
        </div>
        """

        return html_content

    except Exception as e:
        print(f"Error: {str(e)}")  # ๋””๋ฒ„๊น…์šฉ
        return f"Error occurred: {str(e)}"

# Creating the Gradio interface
app = gr.Interface(
    fn=get_user_spaces,
    inputs=None,
    outputs=gr.HTML(),
    title=f"Hugging Face Public Spaces - {USERNAME}",
    description=f"Displays public Spaces from {USERNAME}",
    theme=gr.themes.Soft(),
    css="""
    .gradio-container {
        max-width: 100% !important;
    }
    """
)

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