mirror of
https://github.com/HumanAIGC-Engineering/gradio-webrtc.git
synced 2026-02-04 17:39:23 +08:00
sync code of fastrtc, add text support through datachannel, fix safari connect problem support chat without camera or mic
223 lines
7.0 KiB
Python
223 lines
7.0 KiB
Python
import argparse
|
|
import os
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
from dotenv import load_dotenv
|
|
from huggingface_hub import HfApi
|
|
from pathspec import PathSpec
|
|
from pathspec.patterns import GitWildMatchPattern # type: ignore
|
|
|
|
|
|
def parse_readme_secrets(readme_path: Path) -> list[str]:
|
|
"""Extract secret names from README.md tags field."""
|
|
if not readme_path.exists():
|
|
return []
|
|
|
|
content = readme_path.read_text()
|
|
try:
|
|
# Parse the YAML frontmatter
|
|
# Find the content between first two '---' lines
|
|
yaml_content = content.split("---")[1]
|
|
metadata = yaml.safe_load(yaml_content)
|
|
|
|
# Extract secrets from tags
|
|
secrets = []
|
|
if "tags" in metadata:
|
|
for tag in metadata["tags"]:
|
|
if "|" in tag:
|
|
prefix, secret_name = tag.split("|")
|
|
if prefix == "secret":
|
|
secrets.append(secret_name)
|
|
return secrets
|
|
except Exception as e:
|
|
print(f"Warning: Could not parse README.md: {e}")
|
|
return []
|
|
|
|
|
|
def upload_space(dir_path: str):
|
|
NO_GRADIO_SPACE = [
|
|
"webrtc_vs_websocket",
|
|
"llama_code_editor",
|
|
"phonic_chat",
|
|
"gemini_audio_video",
|
|
"moonshine_live",
|
|
]
|
|
|
|
path: Path = Path(dir_path)
|
|
if not path.exists():
|
|
raise ValueError(f"Path {path} does not exist")
|
|
|
|
# Get space name from last directory name
|
|
space_name = path.name.replace("_", "-")
|
|
|
|
# Load environment variables
|
|
env_file = path.parent / ".env"
|
|
if env_file.exists():
|
|
load_dotenv(env_file)
|
|
else:
|
|
print("Warning: No .env file found")
|
|
|
|
# Initialize Hugging Face client
|
|
api = HfApi()
|
|
|
|
# Create full repo ID
|
|
repo_id = f"fastrtc/{space_name}"
|
|
print(f"Creating/updating space: {repo_id}")
|
|
|
|
# Create the space if it doesn't exist
|
|
try:
|
|
api.create_repo(
|
|
repo_id=repo_id, repo_type="space", space_sdk="gradio", exist_ok=True
|
|
)
|
|
if path.name not in NO_GRADIO_SPACE:
|
|
api.create_repo(
|
|
repo_id=f"{repo_id}-gradio",
|
|
repo_type="space",
|
|
space_sdk="gradio",
|
|
exist_ok=True,
|
|
)
|
|
except Exception as e:
|
|
print(f"Error creating repo: {e}")
|
|
return
|
|
|
|
# Upload all files from the directory
|
|
print("Uploading files...")
|
|
api.upload_folder(
|
|
repo_id=repo_id,
|
|
repo_type="space",
|
|
folder_path=str(path),
|
|
ignore_patterns=["__pycache__", "*.pyc", ".env", "README_gradio.md"],
|
|
create_pr=False,
|
|
path_in_repo="",
|
|
)
|
|
api.restart_space(repo_id=repo_id, factory_reboot=True)
|
|
|
|
readme_path = path / "README.md"
|
|
|
|
if path.name not in NO_GRADIO_SPACE and (path / "README_gradio.md").exists():
|
|
try:
|
|
# Upload Gradio version with modified README
|
|
api.upload_folder(
|
|
repo_id=f"{repo_id}-gradio",
|
|
repo_type="space",
|
|
folder_path=str(path),
|
|
ignore_patterns=["__pycache__", "*.pyc", ".env", "README.md"],
|
|
create_pr=False,
|
|
path_in_repo="",
|
|
)
|
|
api.upload_file(
|
|
repo_id=f"{repo_id}-gradio",
|
|
repo_type="space",
|
|
path_or_fileobj=str(path / "README_gradio.md"),
|
|
path_in_repo="README.md",
|
|
)
|
|
|
|
api.add_space_secret(
|
|
repo_id=f"{repo_id}-gradio",
|
|
key="MODE",
|
|
value="UI",
|
|
)
|
|
|
|
api.add_space_secret(
|
|
repo_id=f"{repo_id}-gradio",
|
|
key="MODE",
|
|
value="UI",
|
|
)
|
|
api.restart_space(repo_id=f"{repo_id}-gradio", factory_reboot=True)
|
|
except Exception as e:
|
|
print(f"Error uploading Gradio version: {e}")
|
|
|
|
secret_names = parse_readme_secrets(readme_path)
|
|
|
|
if secret_names:
|
|
print("Setting up secrets...")
|
|
for secret_name in secret_names:
|
|
secret_value = os.getenv(secret_name)
|
|
if secret_value:
|
|
try:
|
|
api.add_space_secret(
|
|
repo_id=repo_id, key=secret_name, value=secret_value
|
|
)
|
|
if path.name not in NO_GRADIO_SPACE:
|
|
api.add_space_secret(
|
|
repo_id=f"{repo_id}-gradio",
|
|
key=secret_name,
|
|
value=secret_value,
|
|
)
|
|
print(f"Added secret: {secret_name}")
|
|
except Exception as e:
|
|
print(f"Error adding secret {secret_name}: {e}")
|
|
else:
|
|
print(
|
|
f"Warning: Secret {secret_name} not found in environment variables"
|
|
)
|
|
|
|
print(
|
|
f"\nSpace uploaded successfully! View it at: https://huggingface.co/spaces/{repo_id}"
|
|
)
|
|
|
|
|
|
def is_gitignored(path: Path) -> bool:
|
|
"""Check if a path is gitignored by looking for .gitignore files in parent directories."""
|
|
gitignore_patterns = []
|
|
|
|
# Walk up the directory tree looking for .gitignore files
|
|
gitignore_file = Path(__file__).parent / ".gitignore"
|
|
if gitignore_file.exists():
|
|
patterns = gitignore_file.read_text().splitlines()
|
|
gitignore_patterns.extend(patterns)
|
|
|
|
if not gitignore_patterns:
|
|
return False
|
|
|
|
# Create a PathSpec object with all found patterns
|
|
spec = PathSpec.from_lines(GitWildMatchPattern, gitignore_patterns)
|
|
# Check if the path matches any gitignore pattern
|
|
return (
|
|
spec.match_file(str(path.relative_to("demo")))
|
|
or spec.match_file(str(path.relative_to("demo")) + "/")
|
|
or spec.match_file(str(path.relative_to(".")))
|
|
or spec.match_file(str(path.relative_to(".")) + "/")
|
|
)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Upload a directory as a Hugging Face Space"
|
|
)
|
|
parser.add_argument("path", help="Path to the directory to upload")
|
|
parser.add_argument(
|
|
"--all",
|
|
action="store_true",
|
|
help="Upload all immediate child directories as separate spaces",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
path = Path(args.path)
|
|
|
|
if args.all:
|
|
if not path.is_dir():
|
|
raise ValueError(f"Path {path} must be a directory when using --all")
|
|
|
|
# Process each immediate child directory
|
|
for child_dir in path.iterdir():
|
|
if child_dir.is_dir():
|
|
if is_gitignored(child_dir):
|
|
print(f"Skipping gitignored directory: {child_dir}")
|
|
continue
|
|
print(f"\nProcessing directory: {child_dir}")
|
|
try:
|
|
upload_space(str(child_dir))
|
|
except Exception as e:
|
|
print(f"Error processing {child_dir}: {e}")
|
|
else:
|
|
if is_gitignored(path):
|
|
print(f"Cannot upload gitignored directory: {path}")
|
|
return
|
|
upload_space(args.path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|