scripts/github-profile-image-downloader.py (62 lines of code) (raw):
#!/usr/bin/env -S uv run
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# /// script
# requires-python = ">=3.13"
# dependencies = [
# "requests",
# ]
# ///
import json
import os
import requests
from urllib.parse import urljoin
import sys
def extract_github_usernames(js_file_path):
"""
Extract GitHub usernames from the team.js file.
"""
try:
with open(js_file_path, 'r') as file:
# Read the content of the file
content = file.read()
# Remove the "module.exports = " part to get valid JSON
json_content = content.replace("module.exports = ", "").rstrip().rstrip(';')
# Parse the JSON
data = json.loads(json_content)
# Extract GitHub usernames from PMC members
github_usernames = []
for member in data.get("pmc", []):
github_usernames.extend(member.get("githubUsername", []))
# Extract GitHub usernames from committers
for committer in data.get("committers", []):
github_usernames.extend(committer.get("githubUsername", []))
# Remove duplicates and empty values
github_usernames = [username for username in github_usernames if username]
return list(set(github_usernames))
except Exception as e:
print(f"Error extracting GitHub usernames: {e}")
return []
def download_github_profile_images(github_usernames, output_dir):
"""
Download GitHub profile images for the given usernames.
"""
# Create output directory if it doesn't exist
os.makedirs(output_dir, exist_ok=True)
success_count = 0
error_count = 0
print(f"Found {len(github_usernames)} GitHub usernames. Starting download...")
for username in github_usernames:
image_url = f"https://github.com/{username}.png"
output_path = os.path.join(output_dir, f"{username}.png")
try:
response = requests.get(image_url, stream=True, allow_redirects=True)
# Check if the request was successful
if response.status_code == 200:
# Save the image
with open(output_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
success_count += 1
print(f"Downloaded: {username}.png")
else:
print(f"Failed to download {username}.png: HTTP Status {response.status_code}")
error_count += 1
except Exception as e:
print(f"Error downloading {username}.png: {e}")
error_count += 1
print(f"\nDownload complete: {success_count} successful, {error_count} failed.")
return success_count, error_count
def main():
# Get the path to the team.js file from command line or use default
js_file_path = "data/team.js"
if len(sys.argv) > 1:
js_file_path = sys.argv[1]
# Set the output directory
output_dir = "static/img/team"
if len(sys.argv) > 2:
output_dir = sys.argv[2]
print(f"Using team.js file: {js_file_path}")
print(f"Output directory: {output_dir}")
# Extract GitHub usernames
github_usernames = extract_github_usernames(js_file_path)
if not github_usernames:
print("No GitHub usernames found. Exiting.")
return
# Download profile images
download_github_profile_images(github_usernames, output_dir)
if __name__ == "__main__":
main()