DaDaDaTheoryNow commited on
Commit
3f5c763
1 Parent(s): 786a2c9

recreate animate qr code logic

Browse files
src/qr_generate/router.py CHANGED
@@ -1,8 +1,11 @@
1
  import base64
2
  import io
 
3
  from fastapi import APIRouter
4
- from qr_generate.schemas import QRCode, StaticQRCodeRequest, StaticQRCodeResponseModel, AnimatedQRCodeRequest, AnimatedQRCodeResponseModel
5
- from urllib.request import urlopen
 
 
6
 
7
  import segno
8
 
@@ -13,7 +16,7 @@ router = APIRouter(
13
 
14
 
15
  @router.post("/static", response_model=StaticQRCodeResponseModel)
16
- def generate_static_qr_code(qr_request: StaticQRCodeRequest):
17
  qrcode = segno.make_qr(qr_request.content)
18
  image_buffer = io.BytesIO()
19
 
@@ -26,22 +29,36 @@ def generate_static_qr_code(qr_request: StaticQRCodeRequest):
26
  data_dark=(qr_request.data_color.red, qr_request.data_color.green, qr_request.data_color.blue))
27
 
28
  image_buffer.seek(0)
29
- return StaticQRCodeResponseModel(status="success", data=QRCode(image_bytes=base64.b64encode(image_buffer.read()),
 
 
30
  content=qr_request.content))
31
 
 
 
 
32
  @router.post("/animated", response_model=AnimatedQRCodeResponseModel)
33
- def generate_animated_qr_code(qr_request: AnimatedQRCodeRequest):
34
- qrcode = segno.make_qr(qr_request.content)
35
  image_buffer = io.BytesIO()
36
-
37
- video_url = urlopen(qr_request.background_video_link)
38
- qrcode.to_artistic(
39
- background=video_url,
40
- target=image_buffer,
41
- scale=qr_request.scale,
42
- kind='gif'
43
- )
44
-
 
 
 
45
  image_buffer.seek(0)
46
- return AnimatedQRCodeResponseModel(status="success", data=QRCode(image_bytes=base64.b64encode(image_buffer.read()),
47
- content=qr_request.content))
 
 
 
 
 
 
 
1
  import base64
2
  import io
3
+ import os
4
  from fastapi import APIRouter
5
+ from qr_generate.schemas import QRCode, StaticQRCodeRequestModel, StaticQRCodeResponseModel, AnimatedQRCodeRequestModel, AnimatedQRCodeResponseModel
6
+ from qrcode_artistic import write_artistic
7
+ import random
8
+ import string
9
 
10
  import segno
11
 
 
16
 
17
 
18
  @router.post("/static", response_model=StaticQRCodeResponseModel)
19
+ def generate_static_qr_code(qr_request: StaticQRCodeRequestModel):
20
  qrcode = segno.make_qr(qr_request.content)
21
  image_buffer = io.BytesIO()
22
 
 
29
  data_dark=(qr_request.data_color.red, qr_request.data_color.green, qr_request.data_color.blue))
30
 
31
  image_buffer.seek(0)
32
+ base64_encoded_image = base64.b64encode(image_buffer.read())
33
+
34
+ return StaticQRCodeResponseModel(status="success", data=QRCode(image_base64=base64_encoded_image,
35
  content=qr_request.content))
36
 
37
+ def generate_random_digit_string(length):
38
+ return ''.join(random.choice(string.digits) for _ in range(length))
39
+
40
  @router.post("/animated", response_model=AnimatedQRCodeResponseModel)
41
+ def generate_animated_qr_code(qr_request: AnimatedQRCodeRequestModel):
42
+ try:
43
  image_buffer = io.BytesIO()
44
+ unique_picutre_name = generate_random_digit_string(30)
45
+
46
+ video_path = unique_picutre_name + ".gif"
47
+ print(video_path)
48
+ with open(video_path, "wb") as fh:
49
+ fh.write(base64.b64decode(qr_request.gif_base64))
50
+
51
+ # Создание QR-кода на основе видео
52
+ qrcode = segno.make(qr_request.content, error="h")
53
+ write_artistic(qrcode, background=video_path, scale=qr_request.scale, target=image_buffer, kind="gif")
54
+
55
+ # Перевод изображения в Base64
56
  image_buffer.seek(0)
57
+ base64_encoded_image = base64.b64encode(image_buffer.read())
58
+
59
+ return AnimatedQRCodeResponseModel(status="success", data=QRCode(image_base64=base64_encoded_image,
60
+ content=qr_request.content))
61
+ finally:
62
+ # Удаление временного файла
63
+ if os.path.exists(video_path):
64
+ os.remove(video_path)
src/qr_generate/schemas.py CHANGED
@@ -3,10 +3,10 @@ from pydantic import BaseModel
3
 
4
  class QRCode(BaseModel):
5
  content: str
6
- image_bytes: str
7
 
8
  ### models for generate static(without video) qr code / png
9
- class StaticQRCodeRequest(BaseModel):
10
  content: str
11
  border_size: int = 1
12
  scale: int = 15
@@ -20,11 +20,11 @@ class StaticQRCodeResponseModel(BaseModel):
20
  ### end
21
 
22
 
23
- ### models for generate static(without video) qr code / png
24
- class AnimatedQRCodeRequest(BaseModel):
25
  content: str
26
  scale: int = 15
27
- background_video_link: str
28
 
29
  class AnimatedQRCodeResponseModel(BaseModel):
30
  status: str
 
3
 
4
  class QRCode(BaseModel):
5
  content: str
6
+ image_base64: str
7
 
8
  ### models for generate static(without video) qr code / png
9
+ class StaticQRCodeRequestModel(BaseModel):
10
  content: str
11
  border_size: int = 1
12
  scale: int = 15
 
20
  ### end
21
 
22
 
23
+ ### models for animate qr code / gif
24
+ class AnimatedQRCodeRequestModel(BaseModel):
25
  content: str
26
  scale: int = 15
27
+ gif_base64: str
28
 
29
  class AnimatedQRCodeResponseModel(BaseModel):
30
  status: str
src/util/picture_type_enum.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ from enum import Enum
2
+
3
+ class PictureTypeEnum(Enum):
4
+ GIF = "gif",
5
+ PNG = "mp4"