Spaces:
Build error
Build error
File size: 6,794 Bytes
aead09a bf17c4e 1ce9878 d82da04 7716718 2255cf1 bf17c4e e8f283e c6fe582 bf17c4e a8f7368 ac2b487 bf17c4e a8f7368 ac2b487 bf17c4e a8f7368 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e 599424e bf17c4e d4e29c7 dc9ebd1 d4e29c7 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e ac2b487 bf17c4e 599424e bf17c4e d82da04 bf17c4e 319e8a0 dc9ebd1 bf17c4e dc9ebd1 ac2b487 bf17c4e c558940 bf17c4e dc9ebd1 bf17c4e a8f7368 bf17c4e a8f7368 bf17c4e a8f7368 bf17c4e c6fe582 bf17c4e ac2b487 bf17c4e 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 163 164 165 166 167 168 169 170 171 172 173 |
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
# Generate a unique identifier for temporary file storage
uid = str(uuid.uuid4())
# Ensure the temporary directory exists
if not os.path.exists(uid):
os.makedirs(uid)
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);
}
"""
# Function to download video using yt-dlp
def dl(inp):
out = None
inp_out = inp.replace("https://", "").replace("/", "_").replace(".", "_").replace("=", "_").replace("?", "_")
try:
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"
if not os.path.exists(out):
print("Error: Video download failed. File not found.")
return None, gr.HTML("<h1>Error: Video download failed.</h1>"), "", ""
print(f"Downloaded video file: {out}")
except Exception as e:
print(f"Exception during video download: {e}")
return None, gr.HTML(f"<h1>Error: {e}</h1>"), "", ""
return out, gr.HTML(""), "", ""
# Function to process video and perform reverse image search
def process_vid(file, cur_frame, every_n):
new_video_in = str(file)
if not os.path.exists(new_video_in):
print("Error: Video file does not exist.")
return gr.HTML("<h1>Error: Video file not found.</h1>"), "", ""
capture = cv2.VideoCapture(new_video_in)
if not capture.isOpened():
print("Error: Video file could not be opened.")
return gr.HTML("<h1>Error: Failed to open video file.</h1>"), "", ""
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
capture.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame_f = capture.read()
if not ret:
print(f"Error: Failed to read frame at index {i}.")
continue
frame_path = f"{uid}-vid_tmp{i}.png"
cv2.imwrite(frame_path, frame_f)
if not os.path.exists(frame_path):
print(f"Error: Failed to save frame at index {i}.")
continue
out_url = f'https://nymbo-reverse-image.hf.space/file={os.path.abspath(frame_path)}'
res = rev_img_searcher.search(out_url)
if len(res) > 0:
out_cnt = 0
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'>{search_item.page_url}</a><br>
Img: <a href='{search_item.image_url}' target='_blank'>{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
except Exception as e:
print(f"Exception during video processing: {e}")
return gr.HTML(f"<h1>Error: {e}</h1>"), "", ""
return gr.HTML('No frame matches found.'), "", ""
# Function to process image file
def process_im(file, url):
if not url.startswith("https://nymbo"):
return url
try:
read_file = Image.open(file)
read_file.save(f"{uid}-tmp.png")
out_url = f'https://nymbo-reverse-image.hf.space/file={os.path.abspath(f"{uid}-tmp.png")}'
return out_url
except Exception as e:
print(f"Exception during image processing: {e}")
return gr.HTML(f"<h1>Error: {e}</h1>")
# Function to perform reverse image search
def rev_im(image):
if not os.path.exists(image):
print("Error: Image file does not exist.")
return gr.HTML("<h1>Error: Image file not found.</h1>")
try:
image = cv2.imread(image)
if image is None:
print("Error: Failed to read image.")
return gr.HTML("<h1>Error: Could not read image.</h1>")
cv2.imwrite(f"{uid}-im_tmp.png", image)
out_url = f'https://nymbo-reverse-image.hf.space/file={os.path.abspath(f"{uid}-im_tmp.png")}'
rev_img_searcher = ReverseImageSearcher()
res = rev_img_searcher.search(out_url)
html_out = ""
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'>{search_item.page_url}</a><br>
Img: <a href='{search_item.image_url}' target='_blank'>{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}')
except Exception as e:
print(f"Exception during reverse image search: {e}")
return gr.HTML(f"<h1>Error: {e}</h1>")
# Gradio app layout
with gr.Blocks() as app:
source_tog = gr.Radio(choices=["Image", "Video"], value="Image")
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("Search Image")
vid_url = gr.Textbox(label="Video URL")
vid_url_btn = gr.Button("Load Video")
inp_vid = gr.Video(label="Search Video")
every_n = gr.Number(label="Every nth Frame", value=10)
go_btn_vid = gr.Button("Start Video Search")
html_out = gr.HTML("")
source_tog.change(lambda x: (gr.update(visible=x == "Image"), gr.update(visible=x == "Video")), [source_tog], [inp_im, inp_vid])
load_im_btn.click(lambda url: url, inp_url, inp_im)
go_btn_im.click(rev_im, inp_im, html_out)
vid_url_btn.click(dl, vid_url, [inp_vid, html_out])
go_btn_vid.click(process_vid, [inp_vid, "", every_n], [html_out])
app.queue(concurrency_count=20).launch() |