Spaces:
Build error
Build error
File size: 6,779 Bytes
aead09a 04d0121 1ce9878 d82da04 7716718 2255cf1 04d0121 e8f283e 0502e0c 3810d6e 2b65731 bf17c4e 04d0121 a8f7368 ac2b487 a8f7368 04d0121 2b65731 04d0121 a8f7368 04d0121 ac2b487 04d0121 3810d6e ac2b487 04d0121 3810d6e 04d0121 0502e0c 04d0121 d4e29c7 dc9ebd1 d4e29c7 8571798 04d0121 0502e0c 04d0121 8571798 04d0121 0502e0c 04d0121 2b65731 04d0121 ac2b487 04d0121 ac2b487 8571798 04d0121 ac2b487 2b65731 04d0121 2b65731 04d0121 8571798 04d0121 599424e 04d0121 d82da04 04d0121 3810d6e 319e8a0 dc9ebd1 04d0121 c558940 04d0121 dc9ebd1 0502e0c 04d0121 0502e0c 04d0121 0502e0c 04d0121 0502e0c 04d0121 0502e0c 04d0121 c6fe582 04d0121 ac2b487 04d0121 2b65731 04d0121 8571798 04d0121 2b65731 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
uid = uuid.uuid4()
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 from URL
def dl(inp):
out = None
try:
inp_out = inp.replace("https://", "").replace("/", "_").replace(".", "_").replace("=", "_").replace("?", "_")
video_path = f"{uid}/{inp_out}.mp4"
if "twitter" in inp:
os.system(f'yt-dlp "{inp}" --extractor-arg "twitter:api=syndication" --trim-filenames 160 -o "{video_path}" -S res,mp4 --recode mp4')
else:
os.system(f'yt-dlp "{inp}" --trim-filenames 160 -o "{video_path}" -S res,mp4 --recode mp4')
# Verify video download
if not os.path.exists(video_path):
print(f"Downloaded video {video_path} does not exist.")
return None, gr.HTML("Download failed."), "", ""
if os.path.getsize(video_path) == 0:
print(f"Downloaded video {video_path} is empty.")
return None, gr.HTML("Downloaded video is empty."), "", ""
out = video_path
print(f"Video downloaded successfully: {out}")
except Exception as e:
print(f"Error downloading video: {e}")
return out, gr.HTML(""), "", ""
# Function to process video frames
def process_vid(file, cur_frame, every_n):
if not file:
return gr.HTML("No video file provided."), "", ""
new_video_in = str(file)
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
capture.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame_f = capture.read()
# Validate frame read
if not ret or frame_f is None:
print(f"Failed to read frame at index {i}.")
continue
# Check if frame is empty
if frame_f.size == 0:
print(f"Frame at index {i} is empty.")
continue
frame_path = f"{uid}-vid_tmp{i}.png"
cv2.imwrite(frame_path, frame_f)
out = os.path.abspath(frame_path)
out_url = f'https://nymbo-reverse-image.hf.space/file={out}'
print(f"Frame saved: {out}")
# Perform reverse image search
res = rev_img_searcher.search(out_url)
if res:
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
print(f"Processed frame: {i + 1}")
except Exception as e:
return gr.HTML(f'Error during video processing: {e}'), "", ""
return gr.HTML('No frame matches found.'), "", ""
# Function to process image input
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")
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
except Exception as e:
print(f"Error processing image: {e}")
return None
# Function to perform reverse image search
def rev_im(image):
try:
image = cv2.imread(image)
if image is None or image.size == 0:
print("Error: Image is empty or invalid.")
return gr.HTML("Error: Invalid 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)
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"Error during reverse image search: {e}")
return gr.HTML(f"Error: {e}")
# Gradio app interface
with gr.Blocks() as app:
source_tog = gr.Radio(choices=["Image", "Video"], value="Image")
im_box = gr.Box(visible=True)
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()
vid_box = gr.Box(visible=False)
vid_url = gr.Textbox(label="Video URL")
vid_url_btn = gr.Button("Load URL")
inp_vid = gr.Video(label="Search Video")
every_n = gr.Number(label="Every /nth frame", value=10)
stat_box = gr.Textbox(label="Status")
go_btn_vid = gr.Button("Start")
next_btn = gr.Button("Next")
html_out = gr.HTML("")
def shuf(tog):
return (gr.update(visible=(tog == "Image")), gr.update(visible=(tog == "Video")))
im_load = load_im_btn.click(lambda url: url, inp_url, inp_im)
vid_load = vid_url_btn.click(dl, vid_url, [inp_vid, html_out, stat_box])
vid_proc = go_btn_vid.click(process_vid, [inp_vid, "", every_n], [html_out, stat_box])
im_proc = go_btn_im.click(rev_im, inp_im, [html_out])
source_tog.change(shuf, [source_tog], [im_box, vid_box])
app.queue(concurrency_count=20).launch() |