Omnibus's picture
Update app.py
da5ac36
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()