Spaces:
Sleeping
Sleeping
import gradio as gr | |
from huggingface_hub import HfApi, list_files_info, get_full_repo_name | |
import requests | |
import json | |
import os | |
from PIL import Image | |
import urllib.request | |
import uuid | |
uid=uuid.uuid4() | |
token = "" | |
source_dataset = "jbilcke-hf/ai-tube-index" | |
api = HfApi(token=token) | |
token_self = os.environ['HF_TOKEN'] | |
def find_dataset(author=""): | |
s_ist = (api.list_datasets(author=author,search="ai-tube")) | |
#print(api.whoami()) | |
channels=[] | |
videos=[] | |
for space in s_ist: | |
try: | |
channels.append(space.id) | |
except Exception: | |
pass | |
return (gr.Dropdown(label="Channels", choices=[s for s in channels],interactive=True)) | |
def load_vid(channel): | |
out_html="" | |
label_html="" | |
vid_list=[] | |
sync_list=[] | |
try: | |
file_box = [info.path for info in list_files_info(f'{channel}', repo_type="dataset")] | |
ai_tube_box = [info.path for info in list_files_info(f'{source_dataset}', repo_type="dataset")] | |
for file in file_box: | |
if file.startswith("prompt_"): | |
prompt_slug = file.split("prompt_",1)[1].split(".",1)[0] | |
out_html=f'{out_html}<pre> • {file}</pre>' | |
#print(prompt_slug) | |
for vid_file in ai_tube_box: | |
try: | |
vid_slug=vid_file.split("videos/",1)[1].split(".",1)[0] | |
#print(vid_slug) | |
try: | |
if vid_slug == prompt_slug: | |
out_html=f'{out_html}<pre> + {vid_file}</pre>' | |
if vid_file.endswith(".json"): | |
r = requests.get(f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/raw/main/videos/{vid_slug}.json') | |
#r = requests.get(f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/blob/main/videos/00b4bcda-7b4a-40f8-9833-e490425a7b91.mp4') | |
json_out=r.json() | |
label_html=f'{label_html}{json_out["label"]}<br>{json_out["description"]}<br>' | |
#print (r.json()) | |
if vid_file.endswith(".mp4"): | |
vid_list.append(json_out["label"]) | |
sync_list.append(vid_file) | |
#<source src="https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/resolve/main/videos/{vid_file}" type="video/mp4"> | |
print(vid_file) | |
label_html=f'''{label_html} | |
<video src="https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/resolve/main/{vid_file}" controls> | |
</video>''' | |
#uid = uuid.uuid4() | |
#file = open(f'{name}/{f_name}','wb') | |
#file.write(r.content) | |
except Exception as e: | |
print (f'error:: {e}') | |
pass | |
except Exception: | |
pass | |
except Exception as e: | |
print(e) | |
return(out_html,gr.Dropdown(label="Videos",type="index", choices=[s for s in vid_list],interactive=True),sync_list) | |
def show_vid(vid_file,list_hid): | |
print(vid_file) | |
print(list_hid) | |
vid_list=[] | |
for i,ea in enumerate(list_hid): | |
vid_list.append(ea) | |
label_html="" | |
#vid_slug=vid_file.split("videos/",1)[1].split(".",1)[0] | |
label_html=f'''{label_html} | |
<video src="https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/resolve/main/{vid_list[int(vid_file)]}" controls> | |
</video>''' | |
return label_html | |
############################################## | |
#def build_space(t_space,t_title,t_description=None,t_name=None,t_redirect=None,t_image=None,t_image_url=None,token=None): | |
def build_space(index_sel, vid_file, t_name=None, token=None): | |
if token == None or token == "": | |
token=token_self | |
vid_src = vid_file[int(index_sel)] | |
print(vid_src) | |
vid_slug=vid_src.split("videos/",1)[1].split(".",1)[0] | |
print(vid_slug) | |
#json_in = f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/blob/main/videos/{vid_slug}.json' | |
video_in = f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/resolve/main/videos/{vid_slug}.mp4' | |
#thumb_in = f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/blob/main/videos/{vid_slug}.webp' | |
r = requests.get(f'https://huggingface.co/datasets/jbilcke-hf/ai-tube-index/raw/main/videos/{vid_slug}.json') | |
json_out=r.json() | |
t_name="ai-tube-test1" | |
t_description = json_out["description"] | |
t_image = json_out["thumbnailUrl"] | |
f_name = json_out["id"] | |
if t_description == None or t_description == "": | |
t_description = f'Embedded App' | |
#if t_redirect == None or t_redirect =="": | |
t_redirect = "https://jbilcke-hf-ai-tube.hf.space/" | |
#if t_name == None or t_name =="": | |
#print (t_space) | |
#t_name = t_space.split("//",1)[1] | |
#print (t_name) | |
#t_name = t_name.strip(".hf.space") | |
#print (f't_name::{t_name}') | |
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) | |
try: | |
repo_url = api.create_repo( | |
repo_id=model_id, | |
repo_type="space", | |
space_sdk="static", | |
private=False, | |
exist_ok=True, | |
) | |
except Exception as e: | |
return gr.HTML(f"""{str(e)}""") | |
if t_image != None: | |
urllib.request.urlretrieve(f'{t_image}',"gfg.png") | |
img1 = Image.open("gfg.png") | |
#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') | |
output_pro2=cv2.imread(f'tmpim2-{uid}.png') | |
cv2.imwrite(f"./img-{uid}.png",output_pro) | |
cv2.imwrite(f"./img2-{uid}.png",output_pro2) | |
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('_','-')}.static.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(f"""{str(e)}""") | |
try: | |
api.upload_file( | |
path_or_fileobj=f"./img2-{uid}.png", | |
path_in_repo="card_im_crop.png", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
t_image2 = f"https://{repo_name.replace('/','-').replace('_','-')}.static.hf.space/card_im_crop.png" | |
os.remove(f"./img2-{uid}.png") | |
print(f"Image Uploaded to: {t_image2}") | |
except Exception as e: | |
return gr.HTML(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('_','-')}.static.hf.space/ai.html" | |
########## norm | |
with open("template_front.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=f"{f_name}.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
os.remove("ai.html") | |
return gr.HTML(f'''<center>Your Interactive Twitter Card Embed Link is:<br><a href="{t_link}" target="_blank">{t_link}</a><br> | |
Your Interactive Mastodon Card Embed Link is:<br><a href="{t_link3}" target="_blank">{t_link3}</a><br> | |
Your Interactive Gab Card Embed Link is:<br><a href="{t_link2}" target="_blank">{t_link2}</a><br> | |
<center><br>''') | |
except Exception as e: | |
return gr.HTML(f"""{str(e)}""") | |
######################################### | |
with gr.Blocks() as app: | |
with gr.Row(): | |
channel = gr.Dropdown() | |
videos = gr.Dropdown() | |
button = gr.Button() | |
output = gr.HTML() | |
label_output = gr.HTML() | |
list_hid=gr.JSON(visible=False) | |
app.load(find_dataset,None,channel) | |
channel.change(load_vid,channel,[output,videos,list_hid]) | |
videos.change(show_vid,[videos,list_hid],[label_output]) | |
button.click(build_space,[videos,list_hid],None) | |
app.launch(show_api=False,share=False) |