Spaces:
Build error
Build error
File size: 6,429 Bytes
aead09a 376ca7c 1ce9878 d82da04 7716718 2255cf1 376ca7c e8f283e 049ffe7 376ca7c 049ffe7 376ca7c 049ffe7 376ca7c 049ffe7 bf17c4e a8f7368 ac2b487 a8f7368 376ca7c 2b65731 376ca7c 049ffe7 ac2b487 049ffe7 04d0121 049ffe7 04d0121 049ffe7 376ca7c 049ffe7 04d0121 049ffe7 04d0121 376ca7c 04d0121 049ffe7 d4e29c7 dc9ebd1 376ca7c d4e29c7 049ffe7 376ca7c 2b65731 376ca7c ac2b487 049ffe7 376ca7c ac2b487 049ffe7 ac2b487 2b65731 f17dc4f 2b65731 376ca7c 599424e 376ca7c d82da04 049ffe7 319e8a0 dc9ebd1 f17dc4f 04d0121 049ffe7 c558940 dc9ebd1 049ffe7 376ca7c f17dc4f 049ffe7 f17dc4f 376ca7c 049ffe7 04d0121 f17dc4f 049ffe7 f17dc4f 049ffe7 376ca7c f17dc4f 049ffe7 f17dc4f 049ffe7 f17dc4f 049ffe7 376ca7c 049ffe7 f17dc4f 049ffe7 f17dc4f 049ffe7 2b65731 376ca7c f17dc4f 376ca7c 049ffe7 ac2b487 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
import gradio as gr
import requests
import yt_dlp
import cv2
from google_img_source_search import ReverseImageSearcher
from PIL import Image
import os
import uuid
# Unique identifier for files
uid = uuid.uuid4()
# JavaScript for displaying image dimensions
size_js = """
function imgSize(){
var myImg = document.getElementsByClassName("my_im");
var realWidth = myImg.naturalWidth;
var realHeight = myImg.naturalHeight;
alert("Original width=" + realWidth + ", " + "Original height=" + realHeight);
}
"""
def dl(inp):
out = None
try:
inp_out = inp.replace("https://", "").replace("/", "_").replace(".", "_").replace("=", "_").replace("?", "_")
if "twitter" in inp:
os.system(f'yt-dlp "{inp}" --extractor-arg "twitter:api=syndication" --trim-filenames 160 -o "{uid}/{inp_out}.mp4" -S res,mp4 --recode mp4')
else:
os.system(f'yt-dlp "{inp}" --trim-filenames 160 -o "{uid}/{inp_out}.mp4" -S res,mp4 --recode mp4')
out = f"{uid}/{inp_out}.mp4"
print(out)
except Exception as e:
print(e)
return out, gr.HTML(""), "", ""
def process_vid(file, cur_frame, every_n):
new_video_in = str(file)
if not os.path.isfile(new_video_in):
print(f"Video file {new_video_in} does not exist.")
return (gr.HTML('Video file not found.'), "", "")
capture = cv2.VideoCapture(new_video_in)
frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
rev_img_searcher = ReverseImageSearcher()
html_out = ""
count = int(every_n)
start_frame = int(cur_frame) if cur_frame else 0
try:
for i in range(start_frame, frame_count - 1):
if count == int(every_n):
count = 1
print(i)
capture.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame_f = capture.read()
if not ret:
print(f"Failed to read frame {i}")
continue
cv2.imwrite(f"{uid}-vid_tmp{i}.png", frame_f)
out = os.path.abspath(f"{uid}-vid_tmp{i}.png")
out_url = f'https://nymbo-reverse-image.hf.space/file={out}'
print(out)
res = rev_img_searcher.search(out_url)
out_cnt = 0
if res:
for search_item in res:
out_cnt += 1
html_out += f"""
<div>
Title: {search_item.page_title}<br>
Site: <a href='{search_item.page_url}' target='_blank' rel='noopener noreferrer'>{search_item.page_url}</a><br>
Img: <a href='{search_item.image_url}' target='_blank' rel='noopener noreferrer'>{search_item.image_url}</a><br>
<img class='my_im' src='{search_item.image_url}'><br>
</div>"""
return gr.HTML(f'<h1>Total Found: {out_cnt}</h1><br>{html_out}'), f"Found frame: {i}", i + int(every_n)
count += 1
print(i + 1)
except Exception as e:
return gr.HTML(f'{e}'), "", ""
return gr.HTML('No frame matches found.'), "", ""
def process_im(file, url):
if not url.startswith("https://nymbo"):
return url
else:
read_file = Image.open(file)
read_file.save(f"{uid}-tmp.png")
action_input = f"{uid}-tmp.png"
out = os.path.abspath(action_input)
out_url = f'https://nymbo-reverse-image.hf.space/file={out}'
return out_url
def rev_im(image):
html_out = ""
image = cv2.imread(image)
if image is None:
return gr.HTML("Failed to load image.")
cv2.imwrite(f"{uid}-im_tmp.png", image)
out = os.path.abspath(f"{uid}-im_tmp.png")
out_url = f'https://nymbo-reverse-image.hf.space/file={out}'
rev_img_searcher = ReverseImageSearcher()
res = rev_img_searcher.search(out_url)
count = 0
for search_item in res:
count += 1
html_out += f"""
<div>
Title: {search_item.page_title}<br>
Site: <a href='{search_item.page_url}' target='_blank' rel='noopener noreferrer'>{search_item.page_url}</a><br>
Img: <a href='{search_item.image_url}' target='_blank' rel='noopener noreferrer'>{search_item.image_url}</a><br>
<img class='my_im' src='{search_item.image_url}'><br>
</div>"""
return gr.HTML(f'<h1>Total Found: {count}</h1><br>{html_out}')
with gr.Blocks() as app:
with gr.Row():
gr.Column()
with gr.Column():
source_tog = gr.Radio(choices=["Image", "Video"], value="Image")
with gr.Box(visible=True) as im_box:
inp_url = gr.Textbox(label="Image URL")
load_im_btn = gr.Button("Load Image")
inp_im = gr.Image(label="Search Image", type='filepath')
go_btn_im = gr.Button()
with gr.Box(visible=False) as vid_box:
vid_url = gr.Textbox(label="Video URL")
vid_url_btn = gr.Button("Load URL")
inp_vid = gr.Video(label="Search Video")
with gr.Row():
every_n = gr.Number(label="Every /nth frame", value=10)
stat_box = gr.Textbox(label="Status")
with gr.Row():
go_btn_vid = gr.Button("Start")
next_btn = gr.Button("Next")
gr.Column()
with gr.Row():
html_out = gr.HTML("")
with gr.Row(visible=False):
hid_box = gr.Textbox()
def shuf(tog):
return (gr.update(visible=True), gr.update(visible=False)) if tog == "Image" else (gr.update(visible=False), gr.update(visible=True))
def load_image(url):
return url
im_load = load_im_btn.click(load_image, inp_url, inp_im)
next_btn.click(process_vid, [inp_vid, hid_box, every_n], [html_out, stat_box, hid_box])
vid_load = vid_url_btn.click(dl, vid_url, [inp_vid, html_out, stat_box, hid_box])
vid_proc = go_btn_vid.click(process_vid, [inp_vid, hid_box, every_n], [html_out, stat_box, hid_box])
im_proc = go_btn_im.click(rev_im, inp_im, [html_out])
source_tog.change(shuf, [source_tog], [im_box, vid_box], cancels=[vid_proc, im_proc, im_load, vid_load])
app.queue(concurrency_count=20).launch() |