File size: 7,196 Bytes
01c9143
 
 
2ea7049
 
e500d0d
 
 
 
 
00847f1
e500d0d
 
 
00847f1
 
e500d0d
 
00847f1
01c9143
e500d0d
01c9143
 
c95dcd6
 
00847f1
e500d0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7bd5273
e500d0d
01c9143
2ea7049
 
 
 
 
 
 
e500d0d
 
 
 
2ea7049
 
 
e500d0d
2ea7049
 
 
 
 
 
 
 
 
3b17d42
 
 
 
 
2ea7049
e500d0d
2ea7049
 
6c86cd2
e500d0d
 
 
 
6c86cd2
 
 
 
 
 
 
 
3b17d42
6587425
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df2ac0e
d48e478
 
 
 
 
 
 
 
 
 
 
e500d0d
387ffba
6c86cd2
 
 
 
 
 
 
387ffba
 
 
e500d0d
764dcd6
904e021
 
e500d0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01c9143
6c86cd2
e500d0d
 
 
 
 
 
 
 
 
 
 
2ea7049
387ffba
2ea7049
 
 
 
 
e500d0d
 
 
 
 
6c86cd2
e500d0d
01c9143
6c86cd2
c95dcd6
2ea7049
6c86cd2
 
00847f1
6587425
 
01c9143
e500d0d
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
import os
import gradio as gr
from io import BytesIO
import zipfile
import tempfile
import random  
import json
from gradio_client import Client, handle_file
import base64
from PIL import Image

BACKEND = os.getenv("BACKEND")
TOKEN = os.getenv("TOKEN")
BUY_PREMIUM = "πŸ₯‡ Get Premium Token to Unlock"

STATUS_MESSAGES = {
    201: "Not satisfied with the results? Get a Premium Token for instant, deeper results including social profiles.", 
    301: "Invalid token! Get Premium Token using link in page"
}

backend = Client(BACKEND, hf_token=TOKEN)

def base64_to_image(base64_str):
    return base64.b64decode(base64_str + '=' * (-len(base64_str) % 4))

def search_face(file, token=None):
    result_text = backend.predict(
            file=handle_file(file),
            token=token, 
            api_name="/search_face"
    )
   
    result = json.loads(result_text)
    outarray = []
    if result['status'] > 300:
        raise gr.Error(STATUS_MESSAGES[result['status']])
    
    for item in result['result']:
        image = Image.open(BytesIO(base64_to_image(item['image'])))
        outarray.append((image, item['url']))
    
    if result['status'] == 201:
        gr.Info(STATUS_MESSAGES[result['status']], duration=11)
    return outarray

def export_images(items):
    if not items:
        return None
    # Create a zip file in memory
    zip_buffer = BytesIO()
    with zipfile.ZipFile(zip_buffer, 'w') as zip_file:
        url_text = ""
        i = 1
        for item in items:
            if item[1] == BUY_PREMIUM:
                continue
            with open(item[0], 'rb') as img_file:
                zip_file.writestr(f'image_{i}.jpg', img_file.read())
            url_text += f"image_{i}.jpg: {item[1]}\n"
            i += 1
        zip_file.writestr("urls.txt", url_text)
    zip_buffer.seek(0)

    with tempfile.NamedTemporaryFile(delete=False, suffix=".zip") as temp_file:
        temp_file.write(zip_buffer.getvalue())
        temp_file_path = temp_file.name

    return temp_file_path

custom_css = """
caption.caption {
    user-select: text;
    cursor: text;
}

div#component-21 {
    max-height: 63.39px;
}

div#component-9 {
    background-color: tomato;
}

.svelte-snayfm {
    height: auto;
}

.icon.svelte-snayfm {
    width: 48px;
    height: 48px;
}
"""

js = """
function aff() {
const links = document.querySelectorAll('a');

const currentUrl = new URL(window.location.href);
const currentParams = currentUrl.searchParams.toString();

links.forEach(link => {
    const href = link.getAttribute('href');
    if (href && (href.startsWith('https://faceonlive.pocketsflow.com') || href.startsWith('https://faceonlive.com'))) {
        const targetUrl = new URL(href);
        // Append current page parameters to the link
        currentParams.split('&').forEach(param => {
            if (param) {
                const [key, value] = param.split('=');
                targetUrl.searchParams.set(key, value);
            }
        });
        link.setAttribute('href', targetUrl.toString());
    }
});

  return ''
}
"""

head = """
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8YPXF4536P"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8YPXF4536P');
</script>
"""

output = gr.Gallery(label="Found Images (The search may take a couple of minutes.)", columns=[3], object_fit="contain", height="480px", interactive=False)
col2 = gr.Column(scale=2, visible=False)

def init_ui():
    return gr.update(visible=True), gr.update(visible=False)

def search_ui():
    return gr.update(visible=False), gr.update(visible=True)

def search_face_examples(image):
    return search_face(image), gr.update(visible=False), gr.update(visible=True)

MARKDOWN0 = """
    # Free Face Search Online - ❀️Like above if this space helps
    #### [Learn more about our Reverse Face Search](https://faceonlive.com/face-search-online)
    #### [Check out our Face Search API integration and Affiliate Program here.](https://portfolio.faceonlive.com/#face_search)
"""
MARKDOWN1 = """
    ### [Get Premium Token - Deep Search & Social Media Access](https://faceonlive.pocketsflow.com/checkout?productId=676c15b1971244a587ca07cb)  
    ### [Protect Your Privacy – Start Your Takedown Now](https://faceonlive.pocketsflow.com/checkout?productId=676d7e7597f8b3b699f84820)
"""
MARKDOWN2 = """
### [Why Get the Premium Token?](https://faceonlive.pocketsflow.com/checkout?productId=676c15b1971244a587ca07cb)  
βœ… **Deep Search**  
βœ… **Social Media and Deep Web Scan**  
βœ… **Exclusive Access to Hidden Profiles**  
βœ… **No Subscription Needed**
"""
MARKDOWN3 = """
<div align="right"><a href="https://faceonlive.com/reverse-image-search" target='_blank' style='font-size: 16px;'>Looking For Reverse Image Search</div>
"""
with gr.Blocks(css=custom_css, head=head, delete_cache=(3600, 3600)) as demo:
    gr.Markdown(MARKDOWN0)
    with gr.Row():
        with gr.Column(scale=1) as col1:
            image = gr.Image(type='filepath', height=360)
            with gr.Row():
              with gr.Column():
                token = gr.Textbox(placeholder="(Optional) Get Premium Token Below.", label="Premium Token")
                gr.Markdown(MARKDOWN1)
              with gr.Column():
                md_premium1 = gr.Markdown(MARKDOWN2)
            with gr.Row():
                search_face_button = gr.Button("Reverse Face Search")
            gr.HTML(MARKDOWN3)
            gr.Examples(['examples/1.jpg', 'examples/2.jpg'], inputs=image, cache_examples=True, fn=search_face_examples, outputs=[output, col1, col2])
            
        with col2.render():
            gr.Markdown("> ### **⚠️ Reminder:** Export images before refreshing the page by clicking the 'Export Images' button.")
            output.render()
            with gr.Row():
                export_button = gr.Button("Export Images")
                export_file = gr.File(label="Download")
            with gr.Row():
                with gr.Column():
                    gr.Markdown(MARKDOWN1)
                with gr.Column():
                    md_premium2 = gr.Markdown(MARKDOWN2)
            new_search_button = gr.Button("πŸš€ Try New Search")
            gr.HTML(MARKDOWN3)

    search_face_button.click(search_ui, inputs=[], outputs=[col1, col2], api_name=False)
    search_face_button.click(search_face, inputs=[image, token], outputs=[output], api_name=False)
    export_button.click(export_images, inputs=[output], outputs=export_file, api_name=False)
    new_search_button.click(init_ui, inputs=[], outputs=[col1, col2], api_name=False)

    gr.HTML('<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FFaceOnLive%2FFace-Search-Online"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FFaceOnLive%2FFace-Search-Online&labelColor=%23ff8a65&countColor=%2337d67a&style=flat&labelStyle=upper" /></a>')
    html = gr.HTML()
    demo.load(None, inputs=None, outputs=html, js=js)

demo.queue(api_open=False, default_concurrency_limit=8).launch(show_api=False)