File size: 1,408 Bytes
21f5137
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""MathSnap deblur Space (Gradio on ZeroGPU). Only callers holding DEBLUR_KEY (the Supabase function) may use it."""
import base64
import binascii
import hmac
import os

import gradio as gr
import spaces

import deblur

MAX_BASE64 = 11_000_000  # ~8 MB JPEG


@spaces.GPU(duration=30)
def restore(rgb):
    return deblur.deblur_array(rgb)


def run(image_base64, key):
    expected = os.environ.get("DEBLUR_KEY", "")
    # The key is checked before any GPU time is requested, so strangers cannot spend the quota.
    if len(expected) < 32 or not hmac.compare_digest((key or "").encode(), expected.encode()):
        raise gr.Error("Forbidden")
    if not image_base64 or len(image_base64) > MAX_BASE64:
        raise gr.Error("Invalid image")
    try:
        rgb = deblur.decode(base64.b64decode(image_base64, validate=True))
    except (binascii.Error, ValueError, OSError):
        raise gr.Error("Invalid image")
    return base64.b64encode(deblur.encode(restore(rgb))).decode()


with gr.Blocks(title="MathSnap Deblur") as demo:
    gr.Markdown("Private endpoint for the MathSnap app. Requests without the app's key are refused.")
    image = gr.Textbox(label="JPEG (base64)")
    key = gr.Textbox(label="Key", type="password")
    result = gr.Textbox(label="Result (base64)")
    gr.Button("Deblur").click(run, [image, key], result, api_name="deblur")

demo.queue(default_concurrency_limit=1).launch()