Download Pros1.app.py from AzureModels4AI/PeopleModelsDatasets2X: direct link, hf CLI and curl.
- Browser
- Download file 7.88 kB
-
https://huggingface.co/spaces/AzureModels4AI/PeopleModelsDatasets2X/resolve/main/Pros1.app.py
- Command line
-
hf download hf://spaces/AzureModels4AI/PeopleModelsDatasets2X/Pros1.app.py
-
curl -L -o Pros1.app.py https://huggingface.co/spaces/AzureModels4AI/PeopleModelsDatasets2X/resolve/main/Pros1.app.py
7.88 kB
| import streamlit as st | |
| from huggingface_hub import HfApi | |
| import asyncio | |
| import os | |
| import plotly.express as px | |
| # Initialize the Hugging Face API | |
| api = HfApi() | |
| # Directory to save the generated HTML files | |
| HTML_DIR = "generated_html_pages" | |
| if not os.path.exists(HTML_DIR): | |
| os.makedirs(HTML_DIR) | |
| # Default list of Hugging Face usernames - where all the magic begins! ๐ช | |
| default_users = { | |
| "users": [ | |
| "awacke1", "rogerxavier", "jonatasgrosman", "kenshinn", "Csplk", "DavidVivancos", | |
| "cdminix", "Jaward", "TuringsSolutions", "Severian", "Wauplin", | |
| "phosseini", "Malikeh1375", "gokaygokay", "MoritzLaurer", "mrm8488", | |
| "TheBloke", "lhoestq", "xw-eric", "Paul", "Muennighoff", | |
| "ccdv", "haonan-li", "chansung", "lukaemon", "hails", | |
| "pharmapsychotic", "KingNish", "merve", "ameerazam08", "ashleykleynhans" | |
| ] | |
| } | |
| # Asynchronous function to fetch user content - because why wait when you can multitask? ๐ | |
| async def fetch_user_content(username): | |
| try: | |
| # Fetch models and datasets - the stars of our show! ๐ | |
| models = list(await asyncio.to_thread(api.list_models, author=username)) # Convert generator to list | |
| datasets = list(await asyncio.to_thread(api.list_datasets, author=username)) # Convert generator to list | |
| return { | |
| "username": username, | |
| "models": models, | |
| "datasets": datasets | |
| } | |
| except Exception as e: | |
| # Oops! Something went wrong - blame it on the gremlins! ๐ | |
| return {"username": username, "error": str(e)} | |
| # Fetch all users concurrently - more hands (or threads) make light work! ๐ช | |
| async def fetch_all_users(usernames): | |
| tasks = [fetch_user_content(username) for username in usernames] | |
| return await asyncio.gather(*tasks) | |
| # Generate HTML content for a user and save it to a file - because who doesn't love a good download link? ๐พ | |
| def generate_html_page(username, models, datasets): | |
| html_content = f""" | |
| <html> | |
| <head> | |
| <title>{username}'s Hugging Face Content</title> | |
| </head> | |
| <body> | |
| <h1>{username}'s Hugging Face Profile</h1> | |
| <p><a href="https://huggingface.co/{username}">๐ Profile Link</a></p> | |
| <h2>๐ง Models</h2> | |
| <ul> | |
| """ | |
| for model in models: | |
| model_name = model.modelId.split("/")[-1] | |
| html_content += f'<li><a href="https://huggingface.co/{model.modelId}">{model_name}</a></li>' | |
| html_content += """ | |
| </ul> | |
| <h2>๐ Datasets</h2> | |
| <ul> | |
| """ | |
| for dataset in datasets: | |
| dataset_name = dataset.id.split("/")[-1] | |
| html_content += f'<li><a href="https://huggingface.co/datasets/{dataset.id}">{dataset_name}</a></li>' | |
| html_content += """ | |
| </ul> | |
| </body> | |
| </html> | |
| """ | |
| # Save the HTML content to a file | |
| html_file_path = os.path.join(HTML_DIR, f"{username}.html") | |
| with open(html_file_path, "w") as html_file: | |
| html_file.write(html_content) | |
| return html_file_path | |
| # Cache the HTML file path using Streamlit's caching decorator | |
| def get_cached_html_file(username): | |
| return generate_html_page(username, *get_user_content(username)) | |
| # Fetch user content from the API (without caching) | |
| def get_user_content(username): | |
| user_data = asyncio.run(fetch_user_content(username)) | |
| if "error" in user_data: | |
| return None, user_data["error"] | |
| return user_data["models"], user_data["datasets"] | |
| # Streamlit app setup - the nerve center of our operation! ๐๏ธ | |
| st.title("Hugging Face User Content Display - Let's Automate Some Fun! ๐") | |
| # Convert the default users list to a string - because nobody likes typing out long lists! ๐ | |
| default_users_str = "\n".join(default_users["users"]) | |
| # Text area with default list of usernames - feel free to add your friends! ๐ฅ | |
| usernames = st.text_area("Enter Hugging Face usernames (one per line):", value=default_users_str, height=300) | |
| # Show User Content button - the big red button! (But actually it's blue) ๐ฑ๏ธ | |
| if st.button("Show User Content"): | |
| if usernames: | |
| username_list = [username.strip() for username in usernames.split('\n') if username.strip()] | |
| # Collect statistics for Plotly graphs | |
| stats = {"username": [], "models_count": [], "datasets_count": []} | |
| st.markdown("### User Content Overview") | |
| for username in username_list: | |
| with st.container(): | |
| # Profile link - because everyone deserves their 15 seconds of fame! ๐ค | |
| st.markdown(f"**{username}** [๐ Profile](https://huggingface.co/{username})") | |
| # Generate HTML page and provide download link - because who wouldn't want a custom webpage? ๐ | |
| models, datasets = get_user_content(username) | |
| if models is None: | |
| st.warning(f"{username}: {datasets} - Looks like the AI needs a coffee break โ") | |
| else: | |
| html_file_path = get_cached_html_file(username) | |
| st.markdown(f"[๐ Download {username}'s HTML Page]({html_file_path})") | |
| # Add to statistics for Plotly graphs | |
| stats["username"].append(username) | |
| stats["models_count"].append(len(models)) | |
| stats["datasets_count"].append(len(datasets)) | |
| # Models section with expander - ๐ง because AI models are brainy! ๐ง | |
| with st.expander(f"๐ง Models ({len(models)})", expanded=False): | |
| if models: | |
| for model in models: | |
| model_name = model.modelId.split("/")[-1] | |
| st.markdown(f"- [{model_name}](https://huggingface.co/{model.modelId})") | |
| else: | |
| st.markdown("No models found. Did you check under the rug? ๐ต๏ธโโ๏ธ") | |
| # Datasets section with expander - ๐ because data is the foundation of AI! ๐ | |
| with st.expander(f"๐ Datasets ({len(datasets)})", expanded=False): | |
| if datasets: | |
| for dataset in datasets: | |
| dataset_name = dataset.id.split("/")[-1] | |
| st.markdown(f"- [{dataset_name}](https://huggingface.co/datasets/{dataset.id})") | |
| else: | |
| st.markdown("No datasets found. Maybe theyโre still baking in the oven? ๐ช") | |
| st.markdown("---") | |
| # Plotly graphs to visualize the number of models and datasets each user has | |
| if stats["username"]: | |
| st.markdown("### User Content Statistics") | |
| # Plotting the number of models per user | |
| fig_models = px.bar(x=stats["username"], y=stats["models_count"], labels={'x':'Username', 'y':'Number of Models'}, title="Number of Models per User") | |
| st.plotly_chart(fig_models) | |
| # Plotting the number of datasets per user | |
| fig_datasets = px.bar(x=stats["username"], y=stats["datasets_count"], labels={'x':'Username', 'y':'Number of Datasets'}, title="Number of Datasets per User") | |
| st.plotly_chart(fig_datasets) | |
| else: | |
| st.warning("Please enter at least one username. Don't be shy! ๐ ") | |
| # Sidebar instructions - just in case you get lost! ๐บ๏ธ | |
| st.sidebar.markdown(""" | |
| ## How to use: | |
| 1. The text area is pre-filled with a list of Hugging Face usernames. You can edit this list or add more usernames. | |
| 2. Click 'Show User Content'. | |
| 3. View the user's models and datasets along with a link to their Hugging Face profile. | |
| 4. Download an HTML page for each user to use the absolute links offline! | |
| 5. Check out the statistics visualizations at the end! | |
| """) | |