Spaces:
Sleeping
Sleeping
from pathlib import Path | |
import os | |
import gradio as gr | |
from huggingface_hub import HfApi, HfFolder, CommitOperationAdd, create_repo | |
def is_repo_name(s): | |
import re | |
return re.fullmatch(r'^[^/,\s]+?/[^/,\s]+?$', s) | |
def get_token(): | |
try: | |
token = HfFolder.get_token() | |
except Exception: | |
token = "" | |
return token | |
def is_repo_exists(repo_id: str): | |
api = HfApi(token=get_token()) | |
try: | |
if api.repo_exists(repo_id=repo_id, repo_type="model"): return True | |
else: return False | |
except Exception as e: | |
print(f"Error: Failed to connect {repo_id}. {e}") | |
return True # for safe | |
def is_repo_t2i(repo_id: str): | |
api = HfApi(token=get_token()) | |
try: | |
model_info = api.repo_info(repo_id=repo_id, repo_type="model") | |
if model_info.pipeline_tag == "text-to-image": return True | |
else: return False | |
except Exception as e: | |
print(f"Error: Failed to connect {repo_id}. {e}") | |
return True # for safe | |
def save_space_contents(repo_id: str, gradio_version: str, private_ok: bool, dir: str, template_dir: str = "template"): | |
if not is_repo_name(repo_id): | |
gr.Info(f"Error: Invalid repo ID: {repo_id}.") | |
return [] | |
if not private_ok and not is_repo_exists(repo_id): | |
gr.Info(f"Error: Repo doesn't exist: {repo_id}.") | |
return [] | |
os.makedirs(dir, exist_ok=True) | |
model_name = repo_id.split("/")[-1] | |
files = [] | |
for readpath in Path(template_dir).glob("*.*"): | |
with open(readpath, mode='r', encoding="utf-8") as f: | |
content = str(f.read()) | |
content = content.format(repo_id=repo_id, model_name=model_name, gradio_version=gradio_version) | |
writepath = str(Path(dir, readpath.name)) | |
with open(writepath, mode='w', encoding="utf-8") as f: | |
f.write(content) | |
files.append(writepath) | |
return files | |
def upload_to_space(repo_id: str, paths: list[str], is_private: bool, is_setkey: bool): | |
token = get_token() | |
api = HfApi(token=token) | |
try: | |
# Create the repo if it does not exist | |
if not is_repo_exists(repo_id): | |
if is_setkey: create_repo(repo_id, repo_type="space", space_sdk="gradio", token=token, private=is_private, | |
space_secrets=[{"key": "HF_TOKEN", "value": token}]) | |
else: create_repo(repo_id, repo_type="space", space_sdk="gradio", token=token, private=is_private) | |
# Upload files to the repository | |
operations = [CommitOperationAdd(path_in_repo=Path(p).name, path_or_fileobj=p) for p in paths] | |
api.create_commit(repo_id=repo_id, repo_type="space", operations=operations, | |
commit_message="Add Gradio app and README", token=token) | |
print(f"Files uploaded successfully to {repo_id}.") | |
return repo_id | |
except Exception as e: | |
raise gr.Error(f"Failed to upload files to {repo_id}. {e}") | |
def get_t2i_space_contents(repo_id: str, gradio_version: str, private_ok: bool, hf_user: str, hf_repo: str, is_private: bool, is_setkey: bool, hf_token: str): | |
HfFolder.save_token(hf_token) | |
paths = save_space_contents(repo_id, gradio_version, private_ok, "./temp/", "./template") | |
if hf_repo == "": new_repo_id = f"{hf_user}/{repo_id.split('/')[-1]}" # model name | |
else: new_repo_id = f"{hf_user}/{hf_repo}" | |
if hf_token and hf_user and upload_to_space(new_repo_id, paths, is_private, is_setkey): | |
md = f"Your new repo:<br>https://huggingface.co/spaces/{new_repo_id}" | |
else: md = "" | |
return paths, md | |