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 | |
| 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: | |
| 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) |