Spaces:
Sleeping
Sleeping
import os | |
import sys | |
import cv2 | |
import uuid | |
from PIL import Image | |
import gradio as gr | |
from pathlib import Path | |
from huggingface_hub import (create_repo,get_full_repo_name,upload_file,CommitOperationAdd,HfApi) | |
token_self = os.environ['HF_TOKEN'] | |
def build_space(t_name,t_space,t_title,t_description,t_redirect,t_image=None,t_image_url=None,token=None): | |
uid = uuid.uuid4() | |
model_id=t_name | |
#model_id="omnibus/fff" | |
if token==None or token=="": | |
token = token_self | |
else: | |
token = token | |
pass | |
api = HfApi(token=token) | |
repo_name = get_full_repo_name(model_id=model_id, token=token) | |
if t_redirect==None or t_redirect=="": | |
t_redirect=t_space | |
else: | |
t_redirect=t_redirect | |
pass | |
try: | |
print(t_space.rsplit('.hf', 1)[-1]) | |
if t_space.rsplit('.hf', 1)[-1] == ".space": | |
repo_url = api.create_repo( | |
repo_id=model_id, | |
repo_type="space", | |
space_sdk="static", | |
private=False, | |
) | |
print(f"""Space Built at {repo_name}""") | |
else: | |
model_id=None | |
repo_name=None | |
t_space=None | |
t_image=None | |
t_image_url=None | |
api=None | |
pass | |
return gr.HTML.update(f"""Invalid Direct URL: must be a Huggingface Space<br>Be sure URL is in lowercase""") | |
except Exception as e: | |
return gr.HTML.update(f"""{str(e)}""") | |
if t_image_url != None and t_image_url != "" and t_image==None: | |
t_image=t_image_url | |
print(f"Using image URL {t_image}") | |
pass | |
elif t_image != None: | |
img1 = Image.open(t_image) | |
img1.thumbnail((500,500), Image.Resampling.LANCZOS) | |
img1.save(f'tmpim-{uid}.png') | |
output_pro=cv2.imread(f'tmpim-{uid}.png') | |
cv2.imwrite(f"./img-{uid}.png",output_pro) | |
try: | |
api.upload_file( | |
path_or_fileobj=f"./img-{uid}.png", | |
path_in_repo="card_im.png", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
t_image = f"https://{repo_name.replace('/','-').replace('_','-')}.hf.space/card_im.png" | |
os.remove(f"./img-{uid}.png") | |
print(f"Image Uploaded to: {t_image}") | |
except Exception as e: | |
return gr.HTML.update(f"""{str(e)}""") | |
pass | |
else: | |
print("Default Image") | |
t_image="https://huggingface.co/spaces/portal/bin/resolve/main/ai_demo_card.png" | |
pass | |
try: | |
api_url = f'https://huggingface.co/api/spaces/{model_id}' | |
t_iframe = t_space | |
t_link = f"https://{repo_name.replace('/','-').replace('_','-')}.hf.space/ai.html" | |
t_space = f"https://{repo_name.replace('/','-').replace('_','-')}.hf.space/back.html" | |
with open("template/ai.html", "r") as f: | |
app = f.read() | |
app = app.replace("$space", t_space) | |
app = app.replace("$title", t_title) | |
app = app.replace("$description", t_description) | |
app = app.replace("$image", t_image) | |
app = app.replace("$redirect", t_redirect) | |
with open("ai.html", "w") as f: | |
f.write(app) | |
api.upload_file( | |
path_or_fileobj="ai.html", | |
path_in_repo="ai.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
os.remove("ai.html") | |
with open("template/front.html", "r") as f: | |
app = f.read() | |
app = app.replace("$iframe", t_iframe) | |
with open("front.html", "w") as f: | |
f.write(app) | |
api.upload_file( | |
path_or_fileobj="front.html", | |
path_in_repo="index.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
os.remove("front.html") | |
with open("template/back.html", "r") as f: | |
app = f.read() | |
app = app.replace("$iframe", t_iframe) | |
# 3. save the new app.py file | |
with open("back.html", "w") as f: | |
f.write(app) | |
api.upload_file( | |
path_or_fileobj="back.html", | |
path_in_repo="back.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
os.remove("back.html") | |
return gr.HTML.update(f'''<center>Your Interactive Twitter Card Embed Link is:<br><a href="{t_link}" target="_blank">{t_link}</a><center><br>''') | |
except Exception as e: | |
return gr.HTML.update(f"""{str(e)}""") | |
def d_im(): | |
output="https://huggingface.co/spaces/portal/bin/resolve/main/ai_demo_card.png" | |
return output | |
with gr.Blocks() as build_app: | |
gr.Markdown("""<center><h1>Interactive Twitter Card Builder</h1></center>""") | |
with gr.Row(): | |
gr.Column(scale=1) | |
with gr.Column(scale=3): | |
with gr.Accordion("Details",open=False): | |
with gr.Tab("Description"): | |
gr.Markdown("""<h7>This space will build an Interactive Twitter Card<br> | |
where Twitter (and other) users can run your Gradio demo<br> | |
right on their Social Media feed.<br><br> | |
*Only works through browser, not Twitter App<br><br> | |
Enter the required information and paste the link that is returned<br> | |
as the only link, along with your message and tags, in your Tweet.<br> | |
When posted, the Interactive Twitter Card should have a Play button<br> | |
which will display the Space you provided.<br><br> | |
Twitter will remember this card associated with the link you post,<br> | |
so any changes will often require a differently named link.<br><br> | |
You can test your link first by omitting your Write token<br> | |
which will assign the default REPO: "portal"<br>(Link: portal-NAME.hf.space)<br><br> | |
This Space is a Demo, and is a Work in Progress<br> | |
No Warranties, Guarantees, or Permissions implied | |
""") | |
with gr.Tab("Credits"): | |
gr.Markdown("""<h7><a href='https://huggingface.co/spaces/anzorq/sd-space-creator'>anzorq/sd-space-creator</a><br>""") | |
with gr.Box(): | |
option_token = gr.Textbox(label="HF Write Token to write to your REPO", placeholder="Optional") | |
t_name = gr.Textbox(label="NAME (Link will be: repo-NAME.hf.space)") | |
t_space = gr.Textbox(label="Direct URL to your Space (https://you-repo-you-space.hf.space)") | |
t_title = gr.Textbox(label="Title for Twitter Card") | |
t_description = gr.Textbox(label="Short Description for Twitter Card") | |
t_redirect = gr.Textbox(label="Redirect URL for Twitter Card Click", placeholder="Optional Redirect URL") | |
gr.Markdown("""Image for your Card (min: 300x300 [Square]""") | |
t_image_url = gr.Textbox(label="Image URL", placeholder="Optional URL of Image") | |
t_image = gr.Image(label="Twitter Card Image", type="filepath",interactive=True) | |
with gr.Row(): | |
input_button = gr.Button() | |
def_im = gr.Button("Load Default Image") | |
output_html = gr.HTML("""""") | |
gr.Column(scale=1) | |
input_button.click(build_space,[t_name,t_space,t_title,t_description,t_redirect,t_image,t_image_url,option_token],output_html) | |
def_im.click(d_im,None,t_image) | |
build_app.queue(concurrency_count=10).launch() |