sticker-convert 2.8.12__py3-none-any.whl → 2.17.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. sticker_convert/__main__.py +24 -24
  2. sticker_convert/auth/__init__.py +0 -0
  3. sticker_convert/auth/auth_base.py +19 -0
  4. sticker_convert/auth/auth_discord.py +149 -0
  5. sticker_convert/{utils/auth/get_kakao_auth.py → auth/auth_kakao_android_login.py} +331 -300
  6. sticker_convert/auth/auth_kakao_desktop_login.py +327 -0
  7. sticker_convert/auth/auth_kakao_desktop_memdump.py +281 -0
  8. sticker_convert/{utils/auth/get_line_auth.py → auth/auth_line.py} +98 -80
  9. sticker_convert/auth/auth_signal.py +139 -0
  10. sticker_convert/auth/auth_telethon.py +161 -0
  11. sticker_convert/auth/auth_viber.py +250 -0
  12. sticker_convert/auth/telegram_api.py +736 -0
  13. sticker_convert/cli.py +623 -509
  14. sticker_convert/converter.py +1093 -962
  15. sticker_convert/definitions.py +11 -0
  16. sticker_convert/downloaders/download_band.py +111 -0
  17. sticker_convert/downloaders/download_base.py +171 -130
  18. sticker_convert/downloaders/download_discord.py +92 -0
  19. sticker_convert/downloaders/download_kakao.py +417 -255
  20. sticker_convert/downloaders/download_line.py +484 -472
  21. sticker_convert/downloaders/download_ogq.py +80 -0
  22. sticker_convert/downloaders/download_signal.py +108 -92
  23. sticker_convert/downloaders/download_telegram.py +56 -130
  24. sticker_convert/downloaders/download_viber.py +121 -95
  25. sticker_convert/gui.py +788 -795
  26. sticker_convert/gui_components/frames/comp_frame.py +180 -165
  27. sticker_convert/gui_components/frames/config_frame.py +156 -113
  28. sticker_convert/gui_components/frames/control_frame.py +32 -30
  29. sticker_convert/gui_components/frames/cred_frame.py +232 -162
  30. sticker_convert/gui_components/frames/input_frame.py +139 -137
  31. sticker_convert/gui_components/frames/output_frame.py +112 -110
  32. sticker_convert/gui_components/frames/right_clicker.py +25 -23
  33. sticker_convert/gui_components/windows/advanced_compression_window.py +757 -715
  34. sticker_convert/gui_components/windows/base_window.py +7 -2
  35. sticker_convert/gui_components/windows/discord_get_auth_window.py +79 -0
  36. sticker_convert/gui_components/windows/kakao_get_auth_window.py +511 -186
  37. sticker_convert/gui_components/windows/line_get_auth_window.py +94 -102
  38. sticker_convert/gui_components/windows/signal_get_auth_window.py +84 -135
  39. sticker_convert/gui_components/windows/viber_get_auth_window.py +168 -0
  40. sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +3 -3
  41. sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  42. sticker_convert/ios-message-stickers-template/README.md +10 -10
  43. sticker_convert/ios-message-stickers-template/stickers/Info.plist +43 -43
  44. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +31 -31
  45. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +6 -6
  46. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +20 -20
  47. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +9 -9
  48. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  49. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +9 -9
  50. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  51. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +9 -9
  52. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  53. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  54. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +91 -91
  55. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  56. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  57. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  58. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  59. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  60. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  61. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  62. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  63. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  64. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  65. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  66. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  67. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +364 -364
  68. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -7
  69. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -8
  70. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  71. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +14 -14
  72. sticker_convert/job.py +279 -179
  73. sticker_convert/job_option.py +15 -2
  74. sticker_convert/locales/en_US/LC_MESSAGES/base.mo +0 -0
  75. sticker_convert/locales/ja_JP/LC_MESSAGES/base.mo +0 -0
  76. sticker_convert/locales/zh_CN/LC_MESSAGES/base.mo +0 -0
  77. sticker_convert/locales/zh_TW/LC_MESSAGES/base.mo +0 -0
  78. sticker_convert/py.typed +0 -0
  79. sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  80. sticker_convert/resources/compression.json +220 -16
  81. sticker_convert/resources/emoji.json +527 -77
  82. sticker_convert/resources/help.ja_JP.json +88 -0
  83. sticker_convert/resources/help.json +24 -10
  84. sticker_convert/resources/help.zh_CN.json +88 -0
  85. sticker_convert/resources/help.zh_TW.json +88 -0
  86. sticker_convert/resources/input.ja_JP.json +74 -0
  87. sticker_convert/resources/input.json +121 -71
  88. sticker_convert/resources/input.zh_CN.json +74 -0
  89. sticker_convert/resources/input.zh_TW.json +74 -0
  90. sticker_convert/resources/memdump_linux.sh +25 -0
  91. sticker_convert/resources/memdump_windows.ps1 +8 -0
  92. sticker_convert/resources/output.ja_JP.json +38 -0
  93. sticker_convert/resources/output.json +24 -0
  94. sticker_convert/resources/output.zh_CN.json +38 -0
  95. sticker_convert/resources/output.zh_TW.json +38 -0
  96. sticker_convert/uploaders/compress_wastickers.py +186 -156
  97. sticker_convert/uploaders/upload_base.py +44 -35
  98. sticker_convert/uploaders/upload_signal.py +218 -173
  99. sticker_convert/uploaders/upload_telegram.py +353 -388
  100. sticker_convert/uploaders/upload_viber.py +178 -0
  101. sticker_convert/uploaders/xcode_imessage.py +295 -285
  102. sticker_convert/utils/callback.py +238 -6
  103. sticker_convert/utils/chrome_remotedebug.py +219 -0
  104. sticker_convert/utils/chromiums/linux.py +52 -0
  105. sticker_convert/utils/chromiums/osx.py +68 -0
  106. sticker_convert/utils/chromiums/windows.py +45 -0
  107. sticker_convert/utils/emoji.py +28 -0
  108. sticker_convert/utils/files/json_resources_loader.py +24 -19
  109. sticker_convert/utils/files/metadata_handler.py +8 -7
  110. sticker_convert/utils/files/run_bin.py +1 -1
  111. sticker_convert/utils/media/codec_info.py +99 -67
  112. sticker_convert/utils/media/format_verify.py +33 -20
  113. sticker_convert/utils/process.py +231 -0
  114. sticker_convert/utils/translate.py +108 -0
  115. sticker_convert/utils/url_detect.py +40 -33
  116. sticker_convert/version.py +1 -1
  117. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/METADATA +189 -96
  118. sticker_convert-2.17.0.0.dist-info/RECORD +138 -0
  119. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/WHEEL +1 -1
  120. sticker_convert/utils/auth/get_signal_auth.py +0 -129
  121. sticker_convert-2.8.12.dist-info/RECORD +0 -101
  122. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/entry_points.txt +0 -0
  123. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info/licenses}/LICENSE +0 -0
  124. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/top_level.txt +0 -0
@@ -55,6 +55,7 @@ class CompOption(BaseOption):
55
55
  res_h_min: Optional[int] = None
56
56
  res_h_max: Optional[int] = None
57
57
  res_power: float = 3.0
58
+ res_snap_pow2: bool = False
58
59
 
59
60
  quality_min: Optional[int] = None
60
61
  quality_max: Optional[int] = None
@@ -75,12 +76,12 @@ class CompOption(BaseOption):
75
76
  fake_vid: Optional[bool] = None
76
77
  quantize_method: Optional[str] = None
77
78
  scale_filter: Optional[str] = None
79
+ chromium_path: Optional[str] = None
78
80
  cache_dir: Optional[str] = None
79
81
  default_emoji: str = "😀"
80
82
  no_compress: Optional[bool] = None
81
83
  processes: int = ceil(cpu_count() / 2)
82
84
  animated: Optional[bool] = None
83
- square: Optional[bool] = None
84
85
 
85
86
  def to_dict(self) -> Dict[Any, Any]:
86
87
  return {
@@ -92,6 +93,7 @@ class CompOption(BaseOption):
92
93
  "w": {"min": self.res_w_min, "max": self.res_w_max},
93
94
  "h": {"min": self.res_h_min, "max": self.res_h_max},
94
95
  "power": self.res_power,
96
+ "snap_pow2": self.res_snap_pow2,
95
97
  },
96
98
  "quality": {
97
99
  "min": self.quality_min,
@@ -110,12 +112,12 @@ class CompOption(BaseOption):
110
112
  "fake_vid": self.fake_vid,
111
113
  "quantize_method": self.quantize_method,
112
114
  "scale_filter": self.scale_filter,
115
+ "chromium_path": self.chromium_path,
113
116
  "cache_dir": self.cache_dir,
114
117
  "default_emoji": self.default_emoji,
115
118
  "no_compress": self.no_compress,
116
119
  "processes": self.processes,
117
120
  "animated": self.animated,
118
- "square": self.square,
119
121
  }
120
122
 
121
123
  def get_size_max(self) -> Tuple[Optional[int], Optional[int]]:
@@ -216,17 +218,26 @@ class CredOption(BaseOption):
216
218
  signal_password: str = ""
217
219
  telegram_token: str = ""
218
220
  telegram_userid: str = ""
221
+ telethon_api_id: int = 0
222
+ telethon_api_hash: str = ""
219
223
  kakao_auth_token: str = ""
220
224
  kakao_username: str = ""
221
225
  kakao_password: str = ""
226
+ kakao_device_uuid: str = ""
222
227
  kakao_country_code: str = ""
223
228
  kakao_phone_number: str = ""
224
229
  line_cookies: str = ""
230
+ viber_auth: str = ""
231
+ discord_token: str = ""
225
232
 
226
233
  def to_dict(self) -> Dict[Any, Any]:
227
234
  return {
228
235
  "signal": {"uuid": self.signal_uuid, "password": self.signal_password},
229
236
  "telegram": {"token": self.telegram_token, "userid": self.telegram_userid},
237
+ "telethon": {
238
+ "api_id": self.telethon_api_id,
239
+ "api_hash": self.telethon_api_hash,
240
+ },
230
241
  "kakao": {
231
242
  "auth_token": self.kakao_auth_token,
232
243
  "username": self.kakao_username,
@@ -235,4 +246,6 @@ class CredOption(BaseOption):
235
246
  "phone_number": self.kakao_phone_number,
236
247
  },
237
248
  "line": {"cookies": self.line_cookies},
249
+ "viber": {"auth": self.viber_auth},
250
+ "discord": {"token": self.discord_token},
238
251
  }
File without changes
@@ -22,7 +22,8 @@
22
22
  "min": 512,
23
23
  "max": 512
24
24
  },
25
- "power": 3
25
+ "power": 3,
26
+ "snap_pow2": false
26
27
  },
27
28
  "quality": {
28
29
  "min": 10,
@@ -69,7 +70,8 @@
69
70
  "min": 64,
70
71
  "max": 512
71
72
  },
72
- "power": 3
73
+ "power": 3,
74
+ "snap_pow2": false
73
75
  },
74
76
  "quality": {
75
77
  "min": 10,
@@ -116,7 +118,8 @@
116
118
  "min": 512,
117
119
  "max": 512
118
120
  },
119
- "power": 3
121
+ "power": 3,
122
+ "snap_pow2": false
120
123
  },
121
124
  "quality": {
122
125
  "min": 10,
@@ -163,7 +166,8 @@
163
166
  "min": 100,
164
167
  "max": 100
165
168
  },
166
- "power": 1
169
+ "power": 1,
170
+ "snap_pow2": false
167
171
  },
168
172
  "quality": {
169
173
  "min": 10,
@@ -210,11 +214,12 @@
210
214
  "min": 512,
211
215
  "max": 512
212
216
  },
213
- "power": 3
217
+ "power": 3,
218
+ "snap_pow2": false
214
219
  },
215
220
  "quality": {
216
- "min": 10,
217
- "max": 95,
221
+ "min": 0,
222
+ "max": 100,
218
223
  "power": 5
219
224
  },
220
225
  "color": {
@@ -257,7 +262,8 @@
257
262
  "min": 100,
258
263
  "max": 320
259
264
  },
260
- "power": 3
265
+ "power": 3,
266
+ "snap_pow2": false
261
267
  },
262
268
  "quality": {
263
269
  "min": 10,
@@ -304,7 +310,8 @@
304
310
  "min": 360,
305
311
  "max": 360
306
312
  },
307
- "power": 3
313
+ "power": 3,
314
+ "snap_pow2": false
308
315
  },
309
316
  "quality": {
310
317
  "min": 10,
@@ -328,7 +335,7 @@
328
335
  "quantize_method": "imagequant",
329
336
  "default_emoji": "😀"
330
337
  },
331
- "viber": {
338
+ "band": {
332
339
  "size_max": {
333
340
  "img": 0,
334
341
  "vid": 0
@@ -339,7 +346,103 @@
339
346
  },
340
347
  "fps": {
341
348
  "min": 1,
342
- "max": 1,
349
+ "max": 30,
350
+ "power": -0.5
351
+ },
352
+ "res": {
353
+ "w": {
354
+ "min": 100,
355
+ "max": 370
356
+ },
357
+ "h": {
358
+ "min": 100,
359
+ "max": 320
360
+ },
361
+ "power": 3,
362
+ "snap_pow2": false
363
+ },
364
+ "quality": {
365
+ "min": 10,
366
+ "max": 95,
367
+ "power": 5
368
+ },
369
+ "color": {
370
+ "min": 32,
371
+ "max": 257,
372
+ "power": 3
373
+ },
374
+ "duration": {
375
+ "min": 83,
376
+ "max": 4000
377
+ },
378
+ "padding_percent": 0,
379
+ "bg_color": "",
380
+ "steps": 16,
381
+ "fake_vid": false,
382
+ "scale_filter": "bicubic",
383
+ "quantize_method": "imagequant",
384
+ "default_emoji": "😀"
385
+ },
386
+ "ogq": {
387
+ "size_max": {
388
+ "img": 0,
389
+ "vid": 0
390
+ },
391
+ "format": {
392
+ "img": ".png",
393
+ "vid": ".gif"
394
+ },
395
+ "fps": {
396
+ "min": 1,
397
+ "max": 30,
398
+ "power": -0.5
399
+ },
400
+ "res": {
401
+ "w": {
402
+ "min": 480,
403
+ "max": 480
404
+ },
405
+ "h": {
406
+ "min": 480,
407
+ "max": 480
408
+ },
409
+ "power": 3,
410
+ "snap_pow2": false
411
+ },
412
+ "quality": {
413
+ "min": 10,
414
+ "max": 95,
415
+ "power": 5
416
+ },
417
+ "color": {
418
+ "min": 32,
419
+ "max": 257,
420
+ "power": 3
421
+ },
422
+ "duration": {
423
+ "min": 83,
424
+ "max": 4000
425
+ },
426
+ "padding_percent": 0,
427
+ "bg_color": "",
428
+ "steps": 16,
429
+ "fake_vid": false,
430
+ "scale_filter": "bicubic",
431
+ "quantize_method": "imagequant",
432
+ "default_emoji": "😀"
433
+ },
434
+ "viber": {
435
+ "size_max": {
436
+ "img": 0,
437
+ "vid": 0
438
+ },
439
+ "format": {
440
+ "img": ".png",
441
+ "vid": ".png"
442
+ },
443
+ "fps": {
444
+ "min": 0,
445
+ "max": 0,
343
446
  "power": 1
344
447
  },
345
448
  "res": {
@@ -351,7 +454,8 @@
351
454
  "min": 490,
352
455
  "max": 490
353
456
  },
354
- "power": 1
457
+ "power": 1,
458
+ "snap_pow2": false
355
459
  },
356
460
  "quality": {
357
461
  "min": 95,
@@ -375,6 +479,102 @@
375
479
  "quantize_method": "imagequant",
376
480
  "default_emoji": "😀"
377
481
  },
482
+ "discord": {
483
+ "size_max": {
484
+ "img": 512000,
485
+ "vid": 512000
486
+ },
487
+ "format": {
488
+ "img": ".png",
489
+ "vid": ".png"
490
+ },
491
+ "fps": {
492
+ "min": 1,
493
+ "max": 60,
494
+ "power": -0.3
495
+ },
496
+ "res": {
497
+ "w": {
498
+ "min": 320,
499
+ "max": 320
500
+ },
501
+ "h": {
502
+ "min": 320,
503
+ "max": 320
504
+ },
505
+ "power": 1,
506
+ "snap_pow2": false
507
+ },
508
+ "quality": {
509
+ "min": 10,
510
+ "max": 95,
511
+ "power": 5
512
+ },
513
+ "color": {
514
+ "min": 32,
515
+ "max": 257,
516
+ "power": 3
517
+ },
518
+ "duration": {
519
+ "min": 0,
520
+ "max": 5000
521
+ },
522
+ "padding_percent": 0,
523
+ "bg_color": "",
524
+ "steps": 16,
525
+ "fake_vid": false,
526
+ "scale_filter": "bicubic",
527
+ "quantize_method": "imagequant",
528
+ "default_emoji": "😀"
529
+ },
530
+ "discord_emoji": {
531
+ "size_max": {
532
+ "img": 256000,
533
+ "vid": 256000
534
+ },
535
+ "format": {
536
+ "img": ".png",
537
+ "vid": ".gif"
538
+ },
539
+ "fps": {
540
+ "min": 1,
541
+ "max": 60,
542
+ "power": -0.3
543
+ },
544
+ "res": {
545
+ "w": {
546
+ "min": 32,
547
+ "max": 128
548
+ },
549
+ "h": {
550
+ "min": 32,
551
+ "max": 128
552
+ },
553
+ "power": 1,
554
+ "snap_pow2": false
555
+ },
556
+ "quality": {
557
+ "min": 10,
558
+ "max": 95,
559
+ "power": 5
560
+ },
561
+ "color": {
562
+ "min": 32,
563
+ "max": 257,
564
+ "power": 3
565
+ },
566
+ "duration": {
567
+ "min": 0,
568
+ "max": 5000
569
+ },
570
+ "padding_percent": 0,
571
+ "bg_color": "",
572
+ "steps": 16,
573
+ "fake_vid": false,
574
+ "scale_filter": "bicubic",
575
+ "quantize_method": "imagequant",
576
+ "default_emoji": "😀"
577
+ },
378
578
  "imessage_small": {
379
579
  "size_max": {
380
580
  "img": 500000,
@@ -398,7 +598,8 @@
398
598
  "min": 300,
399
599
  "max": 300
400
600
  },
401
- "power": 1
601
+ "power": 1,
602
+ "snap_pow2": false
402
603
  },
403
604
  "quality": {
404
605
  "min": 10,
@@ -445,7 +646,8 @@
445
646
  "min": 408,
446
647
  "max": 408
447
648
  },
448
- "power": 1
649
+ "power": 1,
650
+ "snap_pow2": false
449
651
  },
450
652
  "quality": {
451
653
  "min": 10,
@@ -492,7 +694,8 @@
492
694
  "min": 618,
493
695
  "max": 618
494
696
  },
495
- "power": 1
697
+ "power": 1,
698
+ "snap_pow2": false
496
699
  },
497
700
  "quality": {
498
701
  "min": 10,
@@ -539,7 +742,8 @@
539
742
  "min": 256,
540
743
  "max": 512
541
744
  },
542
- "power": 3
745
+ "power": 3,
746
+ "snap_pow2": false
543
747
  },
544
748
  "quality": {
545
749
  "min": 10,