themblem/alg/server.py
2024-09-01 21:51:50 +01:00

116 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import json
import argparse
import subprocess
import tempfile
import base64
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/', methods=['GET'])
@app.route('/alg', methods=['GET'])
def index():
return make_resp({})
def oss_save_image(data_url, file_prefix):
ak = 'LTAI5tC2qXGxwHZUZP7DoD1A'
sk = 'qPo9O6ZvEfqo4t8oflGEm0DoxLHJhm'
auth = oss2.Auth(ak, sk)
endpoint = 'oss-cn-guangzhou.aliyuncs.com'
bucket_name = 'emblem-roi-samples'
bucket = oss2.Bucket(auth, endpoint, bucket_name)
pref = 'data:image/png;base64,'
if data_url.startswith(pref):
decoded = base64.b64decode(data_url[len(pref):])
fname = file_prefix + str(time.time()) + ".png"
bucket.put_object(fname, decoded)
def make_resp(content):
resp = Response(json.dumps(content))
resp.headers['Access-Control-Allow-Origin'] = "*"
resp.headers['Access-Control-Allow-Methods'] = '*'
resp.headers['Access-Control-Allow-Headers'] = '*'
resp.headers['Content-Type'] = 'application/json'
return resp
@app.route('/alg/angle', methods=['POST', 'OPTIONS'])
def angle():
try:
return handle_angle_request()
except Exception as e:
return make_resp({
"ok": False,
"err": str(e),
})
def handle_angle_request():
if request.method == 'OPTIONS':
return make_resp({})
body = request.stream.read()
pref = 'data:image/jpeg;base64,'
err = "Cannot detect angle"
angle = -1
try:
encoded = body.decode()
if encoded.startswith(pref):
decoded = base64.b64decode(encoded[len(pref):])
else:
decoded = body
except:
decoded = body
with tempfile.NamedTemporaryFile(dir="uploads", suffix=".jpg", delete=False) as tf:
tf.write(decoded)
tf.flush()
cmd = ['./qrtool', 'angle', tf.name]
print(" ".join(cmd))
r = subprocess.run(cmd, capture_output=True)
if r.returncode == 0:
lines = r.stdout.decode().splitlines()
return make_resp({
"ok": True,
"qrcode": lines[0].split()[1],
"angle": int(lines[1].split()[1])
})
else:
err = r.stderr.decode()
return make_resp({
"ok": False,
"err": err,
})
def handle_rectify_request():
body = request.stream.read()
with tempfile.NamedTemporaryFile() as tf:
tf.write(body)
tf.flush()
outf = tf.name + ".qr.jpg"
cmd = ['./qrtool', 'rectify', tf.name]
subprocess.check_call(cmd)
with open(outf, 'rb') as of:
resp = Response(of.read(), status=200, mimetype='image/jpeg')
os.unlink(outf)
return resp
@app.route('/alg/rectify', methods=['POST', 'OPTIONS'])
def rectify():
try:
return handle_rectify_request()
except Exception as e:
return make_resp({
"ok": False,
"err": str(e),
})
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--host", "-l", default="0.0.0.0")
parser.add_argument("--port", "-p", type=int, default=3028)
return parser.parse_args()
if __name__ == '__main__':
args = parse_args()
app.run(host=args.host, port=args.port)