Pi 4 месяцев назад
Родитель
Сommit
1080937ff5
3 измененных файлов с 16 добавлено и 11 удалено
  1. 6 5
      rest/pyapi.py
  2. 9 5
      rest/qr.py
  3. 1 1
      util-sqlpage/code/form-fuel.sql

+ 6 - 5
rest/pyapi.py

@@ -11,14 +11,13 @@ from bottle import (
     HTTPResponse,
 )
 from itertools import chain
-from base64 import urlsafe_b64decode as b64decode
+from base64 import b64decode, b64encode
 from linkpreview import link_preview
 
 from .hash_util import B32REGEX, normalize_base32, blake, bytes_to_base32
 from .qr import get_qr_code
 from .bar import get_bar_code
 from json import dumps, load, loads
-
 from sqlite3 import connect
 
 SCHEME = "https://"
@@ -66,11 +65,13 @@ def get_goto_preview():
 @route('/code/preview', method=['POST'])
 def get_code_preview():
     body = load(request.body)
-    response.content_type = 'image/svg+xml'
     if not body:
         abort(404, 'Empty request')
-
-    return get_bar_code(body).decode('utf-8')
+    
+    response.content_type = 'text/plain'
+    if body['format'] == 'QR_CODE':
+        return b64encode(get_qr_code(body['content'], err_lvl=body['errorCorrectionLevel']))
+    return b64encode(get_bar_code(body))
 
 
 @route('/<route:re:(clip|goto|upload|code)>/hash', method=['POST'])

+ 9 - 5
rest/qr.py

@@ -2,8 +2,7 @@ from io import BytesIO
 from typing import Union
 from qrcode import QRCode
 from qrcode.constants import ERROR_CORRECT_L, ERROR_CORRECT_M, ERROR_CORRECT_Q, ERROR_CORRECT_H
-from qrcode.image.styledpil import StyledPilImage
-from qrcode.image.svg import SvgPathImage
+from qrcode.image.svg import SvgPathFillImage
 from qrcode.image.styles.moduledrawers.svg import SvgCircleDrawer
 from qrcode.image.styles.colormasks import RadialGradiantColorMask
 
@@ -13,8 +12,13 @@ QR_MAX_BYTES = {
     ERROR_CORRECT_M: 2331,
     ERROR_CORRECT_L: 2953,
 }
-def get_qr_code(data: Union[bytes, str], fallback: Union[bytes, str] = None):
-    err_lvl = ERROR_CORRECT_H
+QR_QUALITY_MAP = {
+  q: locals().get(f'ERROR_CORRECT_{q}') for q in (
+    'H', 'Q', 'M', 'L'
+  )
+}
+def get_qr_code(data: Union[bytes, str], fallback: Union[bytes, str] = None, err_lvl='H'):
+    err_lvl = QR_QUALITY_MAP.get(err_lvl, err_lvl)
     qr = QRCode(error_correction=err_lvl)
     if data is not None and isinstance(data, str):
         data = data.encode('utf-8')
@@ -25,7 +29,7 @@ def get_qr_code(data: Union[bytes, str], fallback: Union[bytes, str] = None):
     else:
         qr.add_data(data or fallback, optimize=0)
 
-    img_1 = qr.make_image(image_factory=SvgPathImage)
+    img_1 = qr.make_image(image_factory=SvgPathFillImage)
     with BytesIO() as f:
         img_1.save(f)
         f.flush()

+ 1 - 1
util-sqlpage/code/form-fuel.sql

@@ -9,7 +9,7 @@ SET ":content" = (SELECT json(content) FROM code WHERE hash = $hash);
 SET ":validate" = 'Update';
 SET "$action" = 'Update';
 SET ":method" = 'post';
-SET ":preview" = (SELECT 'data:image/svg+xml,'||svg FROM code WHERE hash = $hash);
+SET ":preview" = (SELECT 'data:image/svg+xml;base64,'||svg FROM code WHERE hash = $hash);
 SET ":autofill" = TRUE;
 SET ":filter_config" = '[
   {"name": "store", "required": true},