Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
from bs4 import BeautifulSoup | |
from huggingface_hub import HfApi,create_repo,upload_file,get_full_repo_name | |
import re | |
import os | |
token_self=os.environ.get("HF_TOKEN") | |
default_repo_name="collection" | |
''' | |
from selenium import webdriver | |
from bs4 import BeautifulSoup | |
url = 'https://www.wikipedia.org/' | |
driver = webdriver.Chrome() | |
driver.get(url) | |
html_page = driver.page_source | |
soup = BeautifulSoup(html_page, 'html.parser') | |
title = soup.title.string | |
print(title) | |
driver.quit()''' | |
def search_fn(query,count): | |
if count>40: | |
count = 40 | |
page = requests.get(f"https://www.google.com/search?q={query}&num={count}") | |
soup = BeautifulSoup(page.content) | |
#links = soup.findAll("a") | |
links = soup.findAll("a") | |
file = open("myfile.txt", "w") | |
for link in soup.find_all("a",href=re.compile("(?<=/url\?q=)(htt.*://.*)")): | |
out = (re.split(":(?=http)",link["href"].replace("/url?q=","").split("&sa",1)[0])) | |
out = out[0] | |
rr=requests.get(f"{out}") | |
x_opt = (dict(rr.headers).get("x-frame-options")) | |
if x_opt == None: | |
frame_l=f'<div class="container-mee"><div class="put-on-top"><a target="_blank" href="{out}">{out}</a></div><iframe class="responsive-iframe-mee" src="{out}" frameborder="3"></iframe></div>' | |
file.writelines(frame_l) | |
else: | |
pass | |
#print(file1.read()) | |
print (out) | |
print(dict(rr.headers).get("x-frame-options")) | |
file.close() | |
with open("myfile.txt", "r") as file1: | |
html_out = file1.read() | |
out = format_t(html_out) | |
return out | |
def details_fn(query): | |
link_list=[] | |
page = requests.get(f"{query}") | |
#links = soup.findAll("a") | |
soup = BeautifulSoup(page.content, 'html.parser') | |
try: | |
title = soup.title.string | |
except Exception as e: | |
title = query | |
try: | |
description = soup.find('meta', attrs={'name':'description'}) | |
description = description['content'] | |
except Exception as e: | |
description = title | |
out = f""" | |
<center><h3>{title}</h3><br>{description}</center>""" | |
try: | |
image_out=""" | |
<style> | |
.im_container{ | |
background: white; | |
width: 100%; | |
display: flex; | |
flex-direction: row; | |
flex-wrap: wrap; | |
justify-content: space-evenly; | |
align-items: center; | |
align-content: flex-start; | |
max-height: 500px; | |
overflow-y: auto; | |
} | |
.im_each{ | |
background: blue; | |
width: 20%; | |
border-style: dashed; | |
border-width: medium; | |
} | |
.main_box{ | |
display:flex; | |
flex-direction: column; | |
} | |
#txt_box{ | |
visibility:hidden; | |
} | |
#im_up{ | |
max-height:500px; | |
} | |
</style> | |
<div class='main_box'> | |
<div> | |
<div id='txt_box'></div> | |
<div><img id='im_up' src=''></div> | |
</div> | |
<div class='im_container'> | |
""" | |
images = soup.findAll('img') | |
if query.startswith("https://"): | |
q_beg="https://" | |
if query.startswith("http://"): | |
q_beg="http://" | |
query_src=query.split("//",1)[1] | |
if "/" in query_src: | |
query_src=query_src.split("/",1)[0] | |
query_comp=f'{q_beg}{query_src}' | |
for i,img in enumerate(images): | |
if not img['src'].startswith("data:"): | |
print(query_comp) | |
imga=img['src'] | |
print(imga) | |
if imga.startswith("/"): | |
imga = f'{query_comp}{imga}' | |
print(imga) | |
im_id = f'img_{i}' | |
link_list.append(imga) | |
image_out += f""" | |
<div id="img_{i}" class='im_each'> | |
<img onclick="func('{imga}','img_{i}')" src={imga}> | |
</div> | |
""" | |
#print (img['src']) | |
format_out = f"""{image_out}</div></div>""" | |
except Exception as e: | |
format_out = "None" | |
print (e) | |
return out,format_out,title,description | |
def first(): | |
out = '''<h1>Loading''' | |
return out | |
def test(out): | |
return format_t(f'<div class="container-mee"><div class="put-on-top"><a target="_blank" href="{out}">{out}</a></div><iframe class="responsive-iframe-mee" src="{out}" frameborder="3"></iframe></div>') | |
def test_single(out): | |
return format_t(f'<div class="container-single"><div class="put-on-top"><a target="_blank" href="{out}">{out}</a></div><iframe class="responsive-iframe-mee" src="{out}" frameborder="3"></iframe></div>') | |
def format_t(inp): | |
style = ''' | |
.put-on-top{ | |
align-contents:center; | |
border-style: solid; | |
border-width: 3px; | |
border-radius: 5px; | |
background: none; | |
padding: 0.5em; | |
margin-top:1em; | |
margin-bottom:0.3em; | |
} | |
.grid-mee { | |
display: flex; | |
flex-direction: row; | |
flex-wrap: wrap; | |
justify-content: space-evenly; | |
align-items: stretch; | |
align-content: space-evenly; | |
} | |
.container-mee { | |
position: relative; | |
overflow: hidden; | |
width: 48%; | |
height: 60em; | |
margin-top:1em; | |
} | |
.container-single { | |
position: relative; | |
overflow: hidden; | |
width: 100%; | |
height: 60em; | |
margin-top:1em; | |
} | |
.responsive-iframe-mee { | |
position: relative; | |
top: 0; | |
left: 0; | |
bottom: 0; | |
right: 0; | |
width: 100%; | |
height: 100%; | |
} | |
''' | |
out = f'''<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
</head> | |
<style> | |
{style} | |
</style> | |
<body> | |
<div class=grid-mee> | |
{inp} | |
</div> | |
</body> | |
</html>''' | |
return out | |
def build_space(file_content,file_name,repo_name=None,token=None): | |
if repo_name==None or repo_name=="": | |
model_id = default_repo_name | |
else: | |
model_id = repo_name | |
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", | |
exist_ok=True, | |
private=False, | |
) | |
print(f"""Space Built at {repo_name}""") | |
except Exception as e: | |
return gr.HTML(f"""{str(e)}""") | |
try: | |
api_url = f'https://huggingface.co/api/spaces/{model_id}' | |
t_link3= f"https://{repo_name.replace('/','-').replace('_','-')}.static.hf.space/{file_name}-masto.html" | |
t_link2= f"https://{repo_name.replace('/','-').replace('_','-')}.static.hf.space/{file_name}-gab.html" | |
t_link = f"https://{repo_name.replace('/','-').replace('_','-')}.static.hf.space/{file_name}-main.html" | |
########## norm | |
with open("main.html", "w") as f: | |
f.write(file_content) | |
api.upload_file( | |
path_or_fileobj="main.html", | |
path_in_repo=f"{file_name}-main.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
######## gab | |
api.upload_file( | |
path_or_fileobj="main.html", | |
path_in_repo=f"{file_name}-gab.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
######## masto | |
api.upload_file( | |
path_or_fileobj="main.html", | |
path_in_repo=f"{file_name}-masto.html", | |
repo_id=repo_name, | |
token=token, | |
repo_type="space", | |
) | |
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)}""") | |
load_js = """ | |
func = function(a,b) { | |
console.log(a); | |
console.log(b); | |
var vv = document.getElementById("txt_box"); | |
vv.innerHTML=a; | |
var ii = document.getElementById("im_up"); | |
ii.src=a; | |
} | |
""" | |
link_js=""" | |
function() { | |
const link_url = document.getElementById('txt_box').innerHTML; | |
console.log(link_url); | |
return [link_url]; | |
} | |
""" | |
def preview_img(im): | |
print (im) | |
if not im.startswith("https:"): | |
im = f'https:{im}' | |
out = f"""<body><div><img src={im}></div></body>""" | |
print(out) | |
return out,im | |
def prepare_card(url,title,description,img): | |
filename=url | |
if "//" in filename: | |
filename=url.split("//",1)[1] | |
if "?" in filename: | |
if len(filename) > 100: | |
filename=filename.split("?",1)[0] | |
else: | |
filename=filename.replace("?","-").replace("=","-") | |
filename = filename.replace(".","-").replace("/","-").replace("?","-").replace("=","-") | |
#filename = f'{filename}.html' | |
with open("template.html", "r") as f: | |
app = f.read() | |
app = app.replace("$space", url) | |
app = app.replace("$title", title) | |
app = app.replace("$description", description) | |
app = app.replace("$image", img) | |
app = app.replace("$redirect", url) | |
#with open("ai.html", "w") as f: | |
# f.write(app) | |
#files.append("ai.html") | |
return(app,filename) | |
with gr.Blocks() as app: | |
gr.HTML("""<h1>Interactive Social Media Card Maker</h1>""") | |
gr.HTML("""<h3><b>Step 1:</b> Enter a URL with Iframe capability</h3>""") | |
with gr.Row(): | |
search_box=gr.Textbox(label = "Enter a search topic here to find URL's",scale=2) | |
num_return=gr.Number(label= "Number of URL's to return", value=20, scale=1) | |
search_btn=gr.Button(value= "Search", scale=1) | |
with gr.Row(): | |
input = gr.Textbox(label = "URL") | |
btn = gr.Button("Preview") | |
details = gr.HTML("""""") | |
with gr.Accordion("Iframe"): | |
output = gr.HTML("""""") | |
gr.HTML("""<h3><b>Step 2:</b> Select the Image to use on the Card</h3>""") | |
with gr.Accordion("Images"): | |
images = gr.HTML("""""") | |
gr.HTML("""<h3><b>Step 3:</b> Build the Card </h3>""") | |
with gr.Row() as im_row: | |
with gr.Column(): | |
title=gr.Textbox(label="Title") | |
description=gr.Textbox(label="Description") | |
link_list=gr.Textbox(label="Image URL") | |
with gr.Accordion("Image Preview"): | |
img_card=gr.HTML("""""") | |
#img_card=gr.Image() | |
with gr.Column(): | |
grab_im_url_btn=gr.Button("Load Image URL") | |
preview_image_btn=gr.Button("Preview Image") | |
prepare_btn=gr.Button("Prepare Card") | |
bld_btn=gr.Button("Build Card") | |
links_html=gr.HTML() | |
filename_box = gr.Textbox(label="File Name") | |
prepared_html = gr.Textbox(max_lines=50) | |
#preview_html = gr.HTML("""""") | |
app.load(None,None,link_list,js=load_js) | |
app.load(None,None,link_list,js=link_js) | |
grab_im_url_btn.click(None,None,[link_list],js=link_js) | |
preview_image_btn.click(preview_img,link_list,[img_card,link_list]) | |
prepare_btn.click(prepare_card,[input,title,description,link_list],[prepared_html,filename_box]) | |
#images.change(update_im,None,link_list,trigger_mode="multiple",js=link_js) | |
search_btn.click(search_fn,[search_box,num_return],output) | |
btn.click(first,None,output).then(test_single,input,output).then(details_fn,input,[details,images,title,description]) | |
bld_btn.click(build_space,[prepared_html,filename_box],links_html) | |
app.launch() |