File size: 2,529 Bytes
6a47005
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from pathlib import Path
import os
import gradio as gr
from huggingface_hub import HfApi, HfFolder, CommitOperationAdd, create_repo, Repository

def is_repo_name(s):
    import re
    return re.fullmatch(r'^[^/,\s]+?/[^/,\s]+?$', s)

def is_repo_exists(repo_id):
    api = HfApi()
    try:
        return api.repo_exists(repo_id=repo_id, repo_type="space")
    except Exception as e:
        print(f"Error: Failed to connect {repo_id}.")
        return True  # for safe handling

def save_space_contents(repo_id: str, gradio_version: str, private_ok: bool, dir: str):
    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]
    app_py = f"""import gradio as gr
import os
demo = gr.load("{repo_id}", src="models", hf_token=os.environ.get("HF_TOKEN")).launch()
"""
    readme_md = f"""---
title: {model_name} Demo
emoji: 🖼
colorFrom: purple
colorTo: red
sdk: gradio
sdk_version: {gradio_version}
app_file: app.py
pinned: false
---

Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
"""
    app_path = str(Path(dir, "app.py"))
    with open(app_path, mode='w', encoding="utf-8") as f:
        f.write(app_py)
    readme_path = str(Path(dir, "README.md"))
    with open(readme_path, mode='w', encoding="utf-8") as f:
        f.write(readme_md)
    return [app_path, readme_path]

def upload_to_space(repo_id, app_path, readme_path):
    api = HfApi()
    token = HfFolder.get_token()
    
    # Create the repo if it does not exist
    if not is_repo_exists(repo_id):
        create_repo(repo_id, repo_type="space", token=token, private=False)

    # Upload files to the repository
    operations = [
        CommitOperationAdd(path_in_repo="app.py", path_or_fileobj=app_path),
        CommitOperationAdd(path_in_repo="README.md", path_or_fileobj=readme_path),
    ]
    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}.")

def get_t2i_space_contents(repo_id: str, gradio_version: str, private_ok: bool):
    paths = save_space_contents(repo_id, gradio_version, private_ok, "./temp/")
    if paths:
        upload_to_space(repo_id, *paths)