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()