Nymbo commited on
Commit
91fad26
1 Parent(s): 547d352

UUID, adding comments, debug

Browse files
Files changed (1) hide show
  1. app.py +123 -117
app.py CHANGED
@@ -6,176 +6,182 @@ from google_img_source_search import ReverseImageSearcher
6
  from PIL import Image
7
  import os
8
  import uuid
9
- uid=uuid.uuid4()
10
- size_js="""
11
- function imgSize(){
12
- var myImg = document.getElementsByClassName("my_im");
13
- var realWidth = myImg.naturalWidth;
14
- var realHeight = myImg.naturalHeight;
15
- alert("Original width=" + realWidth + ", " + "Original height=" + realHeight);
16
- }"""
17
 
 
18
  def dl(inp):
19
  out = None
20
- out_file=[]
21
  try:
22
- inp_out=inp.replace("https://","")
23
- inp_out=inp_out.replace("/","_").replace(".","_").replace("=","_").replace("?","_")
24
- if "twitter" in inp:
25
- os.system(f'yt-dlp "{inp}" --extractor-arg "twitter:api=syndication" --trim-filenames 160 -o "{uid}/{inp_out}.mp4" -S res,mp4 --recode mp4')
26
- else:
27
- os.system(f'yt-dlp "{inp}" --trim-filenames 160 -o "{uid}/{inp_out}.mp4" -S res,mp4 --recode mp4')
28
 
29
- #os.system(f'yt-dlp "{inp}" --trim-filenames 160 -o "{inp_out}.mp4" -S res,mp4 --recode mp4')
 
 
 
 
 
 
 
 
 
 
 
 
30
  out = f"{uid}/{inp_out}.mp4"
31
- #out_ap = os.path.abspath(out_f)
32
- #out = f'https://omnibus-reverse-image.hf.space/file={out_ap}'
33
- print (out)
34
- except Exception as e:
35
- print (e)
36
- #out = f'{e}'
37
- return out,gr.HTML(""),"",""
38
 
39
- def process_vid(file,cur_frame,every_n):
40
- new_video_in = str(file)
41
- capture = cv2.VideoCapture(new_video_in)
42
- frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
43
- rev_img_searcher = ReverseImageSearcher()
44
- html_out=""
 
45
  count = int(every_n)
46
- if cur_frame == "" or cur_frame==None:
47
- start_frame = 0
48
- elif cur_frame != "" and cur_frame!=None:
49
- start_frame = int(cur_frame)
50
  try:
51
- for i in range(start_frame, frame_count-1):
52
- if count == int(every_n):
 
53
  count = 1
54
- print(i)
55
- capture.set(cv2.CAP_PROP_POS_FRAMES, i)
56
- ret, frame_f = capture.read(i)
57
- cv2.imwrite(f"{uid}-vid_tmp{i}.png", frame_f)
58
- out = os.path.abspath(f"{uid}-vid_tmp{i}.png")
59
- out_url = f'https://omnibus-reverse-image.hf.space/file={out}'
60
- print(out)
 
 
 
 
 
61
  res = rev_img_searcher.search(out_url)
62
- #print (res)
63
- out_cnt =0
 
64
  if len(res) > 0:
65
- #count = 0
66
  for search_item in res:
67
- print (f'counting {count}')
68
- out_cnt+=1
69
- out_dict={
70
- 'Title': f'{search_item.page_title}',
71
- 'Site': f'{search_item.page_url}',
72
- 'Img': f'{search_item.image_url}',
73
- }
74
- print (dir(search_item))
75
- html_out = f"""{html_out}
76
  <div>
77
- Title: {search_item.page_title}<br>
78
- Site: <a href='{search_item.page_url}' target='_blank' rel='noopener noreferrer'>{search_item.page_url}</a><br>
79
- Img: <a href='{search_item.image_url}' target='_blank' rel='noopener noreferrer'>{search_item.image_url}</a><br>
80
- <img class='my_im' src='{search_item.image_url}'><br>
81
  </div>"""
82
- return (gr.HTML(f'<h1>Total Found: {out_cnt}</h1><br>{html_out}'), f"Found frame: {i}", i+int(every_n))
83
- else:
84
- pass
85
- count +=1
86
- print (i+1)
87
- #return (None,f"Searching Frame: {i}", "")
88
  except Exception as e:
89
- return (gr.HTML(f'{e}'),"","")
90
- return (gr.HTML('No frame matches found.'),"","")
91
 
92
- def process_im(file,url):
 
 
93
  if not url.startswith("https://omnibus"):
94
  return url
95
  else:
 
 
96
  read_file = Image.open(file)
97
  read_file.save(f"{uid}-tmp.png")
98
  action_input = f"{uid}-tmp.png"
99
  out = os.path.abspath(action_input)
100
  out_url = f'https://omnibus-reverse-image.hf.space/file={out}'
101
- return (out_url)
102
 
 
103
  def rev_im(image):
104
- #image_url = 'https://i.pinimg.com/originals/c4/50/35/c450352ac6ea8645ead206721673e8fb.png'
105
- out_list = []
106
- out_im = []
107
- html_out = """"""
108
- image=cv2.imread(image)
109
  cv2.imwrite(f"{uid}-im_tmp.png", image)
110
  out = os.path.abspath(f"{uid}-im_tmp.png")
111
  out_url = f'https://omnibus-reverse-image.hf.space/file={out}'
 
 
112
  rev_img_searcher = ReverseImageSearcher()
113
  res = rev_img_searcher.search(out_url)
114
  count = 0
 
 
115
  for search_item in res:
116
- count+=1
117
- out_dict={
118
- 'Title': f'{search_item.page_title}',
119
- 'Site': f'{search_item.page_url}',
120
- 'Img': f'{search_item.image_url}',
121
- }
122
- print (dir(search_item))
123
- html_out = f"""{html_out}
124
  <div>
125
- Title: {search_item.page_title}<br>
126
- Site: <a href='{search_item.page_url}' target='_blank' rel='noopener noreferrer'>{search_item.page_url}</a><br>
127
- Img: <a href='{search_item.image_url}' target='_blank' rel='noopener noreferrer'>{search_item.image_url}</a><br>
128
- <img class='my_im' src='{search_item.image_url}'><br>
129
  </div>"""
130
 
131
- return (gr.HTML(f'<h1>Total Found: {count}</h1><br>{html_out}'))
132
-
133
-
134
-
135
-
136
 
 
137
  with gr.Blocks() as app:
138
  with gr.Row():
139
  gr.Column()
140
  with gr.Column():
 
 
141
 
142
- source_tog=gr.Radio(choices=["Image","Video"],value="Image")
143
  with gr.Box(visible=True) as im_box:
144
- inp_url=gr.Textbox(label="Image URL")
145
- load_im_btn=gr.Button("Load Image")
146
- inp_im=gr.Image(label="Search Image",type='filepath')
147
- go_btn_im=gr.Button()
 
 
148
  with gr.Box(visible=False) as vid_box:
149
- vid_url=gr.Textbox(label="Video URL")
150
- vid_url_btn=gr.Button("Load URL")
151
- inp_vid=gr.Video(label="Search Video")
152
  with gr.Row():
153
- every_n=gr.Number(label = "Every /nth frame", value = 10)
154
- stat_box=gr.Textbox(label="Status")
155
  with gr.Row():
156
- go_btn_vid=gr.Button("Start")
157
- next_btn=gr.Button("Next")
158
-
159
- gr.Column()
160
- #paste_clip = gr.Button("Paste from Clipboard")
161
  with gr.Row():
162
- html_out = gr.HTML("""""")
 
163
  with gr.Row(visible=False):
164
- hid_box=gr.Textbox()
 
 
165
  def shuf(tog):
166
  if tog == "Image":
167
- return gr.update(visible=True),gr.update(visible=False)
168
  if tog == "Video":
169
- return gr.update(visible=False),gr.update(visible=True)
 
 
170
  def load_image(url):
171
  return url
172
- im_load = load_im_btn.click(load_image,inp_url,inp_im)
173
- next_btn.click(process_vid,[inp_vid,hid_box,every_n],[html_out,stat_box,hid_box])
174
- vid_load = vid_url_btn.click(dl,vid_url,[inp_vid,html_out,stat_box,hid_box])
175
- #inp_im.change(process_im,[inp_im,inp_url],[inp_url])
176
- vid_proc = go_btn_vid.click(process_vid,[inp_vid,hid_box,every_n],[html_out,stat_box,hid_box])
177
- im_proc = go_btn_im.click(rev_im,inp_im,[html_out])
178
- source_tog.change(shuf,[source_tog],[im_box,vid_box],cancels=[vid_proc,im_proc,im_load,vid_load])
179
 
180
- #go_btn_url.click(rev_im,inp_url,[html_out])
 
 
 
 
 
 
 
 
181
  app.queue(concurrency_count=20).launch()
 
6
  from PIL import Image
7
  import os
8
  import uuid
9
+ import subprocess
10
+ import html
 
 
 
 
 
 
11
 
12
+ # Function to download video from a given URL using yt-dlp
13
  def dl(inp):
14
  out = None
 
15
  try:
16
+ # Generate a unique ID for each download to avoid conflicts
17
+ uid = uuid.uuid4()
18
+ # Replace characters in URL to create a valid filename
19
+ inp_out = inp.replace("https://", "").replace("/", "_").replace(".", "_").replace("=", "_").replace("?", "_")
 
 
20
 
21
+ # Construct yt-dlp command to download the video
22
+ command = [
23
+ 'yt-dlp', inp, '--trim-filenames', '160',
24
+ '-o', f"{uid}/{inp_out}.mp4", '-S', 'res,mp4', '--recode', 'mp4'
25
+ ]
26
+
27
+ # Special handling for Twitter URLs
28
+ if "twitter" in inp:
29
+ command.insert(2, '--extractor-arg')
30
+ command.insert(3, 'twitter:api=syndication')
31
+
32
+ # Run the yt-dlp command to download the video
33
+ subprocess.run(command, check=True)
34
  out = f"{uid}/{inp_out}.mp4"
35
+ print(out)
36
+ except subprocess.CalledProcessError as e:
37
+ print(f"yt-dlp failed: {e}")
38
+ return out, gr.HTML(""), "", ""
 
 
 
39
 
40
+ # Function to process the video, extracting frames and performing reverse image search
41
+ def process_vid(file, cur_frame, every_n):
42
+ uid = uuid.uuid4() # Unique identifier for each run to avoid conflicts
43
+ capture = cv2.VideoCapture(file) # Open the video file
44
+ frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) # Get total number of frames in the video
45
+ rev_img_searcher = ReverseImageSearcher() # Initialize the reverse image searcher
46
+ html_out = ""
47
  count = int(every_n)
48
+
49
+ # Determine the starting frame based on user input
50
+ start_frame = int(cur_frame) if cur_frame else 0
51
+
52
  try:
53
+ # Iterate over frames from the starting frame to the end
54
+ for i in range(start_frame, frame_count):
55
+ if count >= int(every_n):
56
  count = 1
57
+ capture.set(cv2.CAP_PROP_POS_FRAMES, i) # Set the position to the specific frame
58
+ ret, frame_f = capture.read() # Read the frame
59
+
60
+ if not ret:
61
+ continue # If frame could not be read, continue to the next one
62
+
63
+ # Save the current frame as an image file
64
+ frame_path = f"{uid}-vid_tmp{i}.png"
65
+ cv2.imwrite(frame_path, frame_f)
66
+ out_url = f'https://omnibus-reverse-image.hf.space/file={frame_path}'
67
+
68
+ # Perform reverse image search on the extracted frame
69
  res = rev_img_searcher.search(out_url)
70
+ out_cnt = 0
71
+
72
+ # If results are found, generate HTML output
73
  if len(res) > 0:
 
74
  for search_item in res:
75
+ out_cnt += 1
76
+ html_out += f"""
 
 
 
 
 
 
 
77
  <div>
78
+ Title: {html.escape(search_item.page_title)}<br>
79
+ Site: <a href='{html.escape(search_item.page_url)}' target='_blank' rel='noopener noreferrer'>{html.escape(search_item.page_url)}</a><br>
80
+ Img: <a href='{html.escape(search_item.image_url)}' target='_blank' rel='noopener noreferrer'>{html.escape(search_item.image_url)}</a><br>
81
+ <img class='my_im' src='{html.escape(search_item.image_url)}'><br>
82
  </div>"""
83
+ return gr.HTML(f'<h1>Total Found: {out_cnt}</h1><br>{html_out}'), f"Found frame: {i}", i + int(every_n)
84
+ count += 1
 
 
 
 
85
  except Exception as e:
86
+ return gr.HTML(f'{e}'), "", ""
87
+ return gr.HTML('No frame matches found.'), "", ""
88
 
89
+ # Function to process an image file and convert it for reverse image search
90
+ def process_im(file, url):
91
+ # Check if the URL starts with the expected prefix
92
  if not url.startswith("https://omnibus"):
93
  return url
94
  else:
95
+ # Save the image to a temporary file
96
+ uid = uuid.uuid4()
97
  read_file = Image.open(file)
98
  read_file.save(f"{uid}-tmp.png")
99
  action_input = f"{uid}-tmp.png"
100
  out = os.path.abspath(action_input)
101
  out_url = f'https://omnibus-reverse-image.hf.space/file={out}'
102
+ return out_url
103
 
104
+ # Function to perform reverse image search on a given image
105
  def rev_im(image):
106
+ uid = uuid.uuid4() # Generate a unique ID for each run
107
+ html_out = """""" # Initialize HTML output
108
+
109
+ # Read the image using OpenCV and save it to a temporary file
110
+ image = cv2.imread(image)
111
  cv2.imwrite(f"{uid}-im_tmp.png", image)
112
  out = os.path.abspath(f"{uid}-im_tmp.png")
113
  out_url = f'https://omnibus-reverse-image.hf.space/file={out}'
114
+
115
+ # Perform reverse image search
116
  rev_img_searcher = ReverseImageSearcher()
117
  res = rev_img_searcher.search(out_url)
118
  count = 0
119
+
120
+ # If results are found, generate HTML output
121
  for search_item in res:
122
+ count += 1
123
+ html_out += f"""
 
 
 
 
 
 
124
  <div>
125
+ Title: {html.escape(search_item.page_title)}<br>
126
+ Site: <a href='{html.escape(search_item.page_url)}' target='_blank' rel='noopener noreferrer'>{html.escape(search_item.page_url)}</a><br>
127
+ Img: <a href='{html.escape(search_item.image_url)}' target='_blank' rel='noopener noreferrer'>{html.escape(search_item.image_url)}</a><br>
128
+ <img class='my_im' src='{html.escape(search_item.image_url)}'><br>
129
  </div>"""
130
 
131
+ return gr.HTML(f'<h1>Total Found: {count}</h1><br>{html_out}')
 
 
 
 
132
 
133
+ # Define the Gradio interface for the application
134
  with gr.Blocks() as app:
135
  with gr.Row():
136
  gr.Column()
137
  with gr.Column():
138
+ # Radio button to choose between Image or Video input
139
+ source_tog = gr.Radio(choices=["Image", "Video"], value="Image")
140
 
141
+ # Box to handle image-related input
142
  with gr.Box(visible=True) as im_box:
143
+ inp_url = gr.Textbox(label="Image URL")
144
+ load_im_btn = gr.Button("Load Image")
145
+ inp_im = gr.Image(label="Search Image", type='filepath')
146
+ go_btn_im = gr.Button("Start Image Search")
147
+
148
+ # Box to handle video-related input
149
  with gr.Box(visible=False) as vid_box:
150
+ vid_url = gr.Textbox(label="Video URL")
151
+ vid_url_btn = gr.Button("Load URL")
152
+ inp_vid = gr.Video(label="Search Video")
153
  with gr.Row():
154
+ every_n = gr.Number(label="Every /nth frame", value=10) # Input to select frame extraction frequency
155
+ stat_box = gr.Textbox(label="Status")
156
  with gr.Row():
157
+ go_btn_vid = gr.Button("Start Video Search")
158
+ next_btn = gr.Button("Next Frame Search")
159
+
160
+ gr.Column()
 
161
  with gr.Row():
162
+ html_out = gr.HTML("""
163
+ """)
164
  with gr.Row(visible=False):
165
+ hid_box = gr.Textbox()
166
+
167
+ # Function to shuffle between image and video input boxes based on user selection
168
  def shuf(tog):
169
  if tog == "Image":
170
+ return gr.update(visible=True), gr.update(visible=False)
171
  if tog == "Video":
172
+ return gr.update(visible=False), gr.update(visible=True)
173
+
174
+ # Function to load image from the URL
175
  def load_image(url):
176
  return url
 
 
 
 
 
 
 
177
 
178
+ # Gradio button interactions and linking functions
179
+ im_load = load_im_btn.click(load_image, inp_url, inp_im)
180
+ next_btn.click(process_vid, [inp_vid, hid_box, every_n], [html_out, stat_box, hid_box])
181
+ vid_load = vid_url_btn.click(dl, vid_url, [inp_vid, html_out, stat_box, hid_box])
182
+ vid_proc = go_btn_vid.click(process_vid, [inp_vid, hid_box, every_n], [html_out, stat_box, hid_box])
183
+ im_proc = go_btn_im.click(rev_im, inp_im, [html_out])
184
+ source_tog.change(shuf, [source_tog], [im_box, vid_box], cancels=[vid_proc, im_proc, im_load, vid_load])
185
+
186
+ # Launch the Gradio app with concurrency settings
187
  app.queue(concurrency_count=20).launch()