Spaces:
Sleeping
Sleeping
import os | |
import requests | |
import gradio as gr | |
from datetime import datetime | |
# Hugging Face Token | |
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 | |
# Retrieve the username | |
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" | |
} | |
# Get user's repositories filtered by space type | |
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 response for debugging | |
print(f"Found {len(spaces)} spaces: {spaces}") | |
# 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=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; | |
} | |
""" | |
) | |
# Launch the Gradio app | |
if __name__ == "__main__": | |
app.launch() | |