|
import os |
|
import requests |
|
import gradio as gr |
|
from datetime import datetime |
|
|
|
|
|
HF_TOKEN = os.getenv("HF_TOKEN") |
|
|
|
def get_username_from_token(): |
|
"""Retrieve the username using the Hugging Face token""" |
|
if not HF_TOKEN: |
|
return None |
|
|
|
headers = { |
|
"Authorization": f"Bearer {HF_TOKEN}", |
|
"Accept": "application/json" |
|
} |
|
|
|
response = requests.get("https://huggingface.co/api/whoami", headers=headers) |
|
print(f"Response status: {response.status_code}") |
|
print(f"Response content: {response.text}") |
|
|
|
if response.status_code == 200: |
|
return response.json().get("name") |
|
return None |
|
|
|
|
|
USERNAME = get_username_from_token() |
|
|
|
if not USERNAME: |
|
raise ValueError("Error: Could not retrieve username. Check your Hugging Face 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): |
|
"""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["repo_id"]}' target='_blank' |
|
style='text-decoration: none; color: #2d2d2d;'> |
|
{space["repo_id"].split('/')[-1]} |
|
</a> |
|
</h3> |
|
<p style='margin: 5px 0;'><strong>Repository:</strong> {space["repo_id"]}</p> |
|
<p style='margin: 5px 0;'><strong>Private:</strong> {space.get("private", False)}</p> |
|
<p style='margin: 5px 0;'><strong>Last Modified:</strong> {format_timestamp(space.get("lastModified"))}</p> |
|
<p style='margin: 5px 0;'><strong>Space SDK:</strong> {space.get("sdk", "N/A")}</p> |
|
</div> |
|
""" |
|
|
|
def get_user_spaces(): |
|
if not HF_TOKEN: |
|
return "Error: Hugging Face token not found." |
|
|
|
headers = { |
|
"Authorization": f"Bearer {HF_TOKEN}", |
|
"Accept": "application/json" |
|
} |
|
|
|
|
|
response = requests.get( |
|
f"https://huggingface.co/api/models?author={USERNAME}&filter=space", |
|
headers=headers |
|
) |
|
|
|
if response.status_code != 200: |
|
return f"Error: Failed to fetch spaces (Status Code: {response.status_code})\nResponse: {response.text}" |
|
|
|
spaces = response.json() |
|
|
|
if not spaces: |
|
return "No Spaces found for this user." |
|
|
|
|
|
print(f"Found {len(spaces)} spaces: {spaces}") |
|
|
|
|
|
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 |
|
|
|
|
|
app = gr.Interface( |
|
fn=get_user_spaces, |
|
inputs=None, |
|
outputs=gr.HTML(), |
|
title=f"Hugging Face Spaces Dashboard - {USERNAME}", |
|
description=f"Displays {USERNAME}'s Hugging Face Spaces in a grid layout", |
|
theme=gr.themes.Soft(), |
|
css=""" |
|
.gradio-container { |
|
max-width: 100% !important; |
|
} |
|
""" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.launch() |
|
|