sticker-convert 2.13.2.1__py3-none-any.whl → 2.13.3.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.
sticker_convert/cli.py CHANGED
@@ -141,7 +141,12 @@ class CLI:
141
141
  "quantize_method",
142
142
  "chromium_path",
143
143
  )
144
- flags_comp_bool = ("fake_vid",)
144
+ flags_comp_bool = (
145
+ "fake_vid",
146
+ "no_fake_vid",
147
+ "res_snap_pow2",
148
+ "no_res_snap_pow2",
149
+ )
145
150
  keyword_args: Dict[str, Any]
146
151
  for k, v in self.help["comp"].items():
147
152
  if k in flags_comp_int:
@@ -394,6 +399,9 @@ class CLI:
394
399
  res_power=self.compression_presets[preset]["res"]["power"]
395
400
  if args.res_power is None
396
401
  else args.res_power,
402
+ res_snap_pow2=self.compression_presets[preset]["res"]["snap_pow2"]
403
+ if args.res_snap_pow2 is None and args.no_res_snap_pow2 is None
404
+ else args.res_snap_pow2,
397
405
  quality_min=self.compression_presets[preset]["quality"]["min"]
398
406
  if args.quality_min is None
399
407
  else args.quality_min,
@@ -428,7 +436,7 @@ class CLI:
428
436
  if args.steps is None
429
437
  else args.steps,
430
438
  fake_vid=self.compression_presets[preset]["fake_vid"]
431
- if args.fake_vid is None
439
+ if args.fake_vid is None and args.no_fake_vid is None
432
440
  else args.fake_vid,
433
441
  chromium_path=args.chromium_path,
434
442
  cache_dir=args.cache_dir,
@@ -3,7 +3,7 @@ import json
3
3
  import os
4
4
  from fractions import Fraction
5
5
  from io import BytesIO
6
- from math import ceil, floor
6
+ from math import ceil, floor, log2
7
7
  from pathlib import Path
8
8
  from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union, cast
9
9
 
@@ -57,6 +57,7 @@ def get_step_value(
57
57
  steps: int,
58
58
  power: float = 1.0,
59
59
  even: bool = False,
60
+ snap_pow2: bool = False,
60
61
  ) -> Optional[int]:
61
62
  # Power should be between -1 and positive infinity
62
63
  # Smaller power = More 'importance' of the parameter
@@ -70,6 +71,15 @@ def get_step_value(
70
71
 
71
72
  if max_step is not None and min_step is not None:
72
73
  v = round((max_step - min_step) * step / steps * factor + min_step)
74
+ if snap_pow2 is True and floor(log2(max_step)) >= ceil(log2(min_step)):
75
+ lower_exp = max(floor(log2(v)), ceil(log2(min_step)))
76
+ lower_pow2 = 2**lower_exp
77
+ upper_exp = min(ceil(log2(v)), floor(log2(max_step)))
78
+ upper_pow2 = 2**upper_exp
79
+ if abs(v - lower_pow2) <= abs(v - upper_pow2):
80
+ return lower_pow2
81
+ else:
82
+ return upper_pow2
73
83
  if even is True and v % 2 == 1:
74
84
  return v + 1
75
85
  return v
@@ -342,6 +352,7 @@ class StickerConvert:
342
352
  self.opt_comp.steps,
343
353
  self.opt_comp.res_power,
344
354
  need_even,
355
+ self.opt_comp.res_snap_pow2,
345
356
  ),
346
357
  get_step_value(
347
358
  self.opt_comp.res_h_max,
@@ -350,6 +361,7 @@ class StickerConvert:
350
361
  self.opt_comp.steps,
351
362
  self.opt_comp.res_power,
352
363
  need_even,
364
+ self.opt_comp.res_snap_pow2,
353
365
  ),
354
366
  get_step_value(
355
367
  self.opt_comp.quality_max,
@@ -597,12 +609,12 @@ class StickerConvert:
597
609
  else:
598
610
  frame_resized = frame
599
611
 
600
- # yuva420p may cause crash for pyav < 14
612
+ # yuva420p may cause crash
601
613
  # Not safe to directly call frame.to_ndarray(format="rgba")
602
614
  # https://github.com/PyAV-Org/PyAV/discussions/1510
603
- if int(av.__version__.split(".")[0]) >= 14:
604
- rgba_array = frame_resized.to_ndarray(format="rgba")
605
- elif frame_resized.format.name == "yuv420p":
615
+ # if int(av.__version__.split(".")[0]) >= 14:
616
+ # rgba_array = frame_resized.to_ndarray(format="rgba")
617
+ if frame_resized.format.name == "yuv420p":
606
618
  rgb_array = frame_resized.to_ndarray(format="rgb24")
607
619
  rgba_array = np.dstack(
608
620
  (
@@ -932,13 +944,19 @@ class StickerConvert:
932
944
  self.tmp_f.write(frame_optimized)
933
945
 
934
946
  def _frames_export_apng(self) -> None:
935
- from apngasm_python._apngasm_python import APNGAsm, create_frame_from_rgba # type: ignore
947
+ from apngasm_python._apngasm_python import APNGAsm, create_frame_from_rgb, create_frame_from_rgba # type: ignore
936
948
 
937
949
  assert self.fps
938
950
  assert self.res_h
939
951
 
940
952
  frames_concat = np.concatenate(self.frames_processed)
941
953
  with Image.fromarray(frames_concat, "RGBA") as image_concat: # type: ignore
954
+ if image_concat.getextrema()[3][0] < 255: # type: ignore
955
+ mode = "RGBA"
956
+ create_frame_method = create_frame_from_rgba
957
+ else:
958
+ mode = "RGB"
959
+ create_frame_method = create_frame_from_rgb
942
960
  image_quant = self.quantize(image_concat)
943
961
 
944
962
  if self.apngasm is None:
@@ -947,15 +965,10 @@ class StickerConvert:
947
965
 
948
966
  delay_num = int(1000 / self.fps)
949
967
  for i in range(0, image_quant.height, self.res_h):
950
- with BytesIO() as f:
951
- crop_dimension = (0, i, image_quant.width, i + self.res_h)
952
- image_cropped = image_quant.crop(crop_dimension)
953
- image_cropped.save(f, format="png")
954
- f.seek(0)
955
- frame_optimized = self.optimize_png(f.read())
956
- with Image.open(BytesIO(frame_optimized)) as im:
957
- image_final = im.convert("RGBA")
958
- frame_final = create_frame_from_rgba(
968
+ crop_dimension = (0, i, image_quant.width, i + self.res_h)
969
+ image_cropped = image_quant.crop(crop_dimension)
970
+ image_final = image_cropped.convert(mode)
971
+ frame_final = create_frame_method(
959
972
  np.array(image_final),
960
973
  width=image_final.width,
961
974
  height=image_final.height,
@@ -969,7 +982,8 @@ class StickerConvert:
969
982
  self.apngasm.assemble(tmp_apng.as_posix())
970
983
 
971
984
  with open(tmp_apng, "rb") as f:
972
- self.tmp_f.write(f.read())
985
+ apng_optimized = self.optimize_png(f.read())
986
+ self.tmp_f.write(apng_optimized)
973
987
 
974
988
  self.apngasm.reset()
975
989
 
@@ -978,7 +992,7 @@ class StickerConvert:
978
992
 
979
993
  return oxipng.optimize_from_memory(
980
994
  image_bytes,
981
- level=4,
995
+ level=6,
982
996
  fix_errors=True,
983
997
  filter=[oxipng.RowFilter.Brute],
984
998
  optimize_alpha=True,
@@ -990,8 +1004,8 @@ class StickerConvert:
990
1004
  return image.copy()
991
1005
  if self.opt_comp.quantize_method == "imagequant":
992
1006
  return self._quantize_by_imagequant(image)
993
- if self.opt_comp.quantize_method == "fastoctree":
994
- return self._quantize_by_fastoctree(image)
1007
+ if self.opt_comp.quantize_method in ("mediancut", "maxcoverage", "fastoctree"):
1008
+ return self._quantize_by_pillow(image)
995
1009
 
996
1010
  return image
997
1011
 
@@ -1022,10 +1036,24 @@ class StickerConvert:
1022
1036
 
1023
1037
  return image
1024
1038
 
1025
- def _quantize_by_fastoctree(self, image: Image.Image) -> Image.Image:
1039
+ def _quantize_by_pillow(self, image: Image.Image) -> Image.Image:
1026
1040
  assert self.color
1027
1041
 
1028
- return image.quantize(colors=self.color, method=2)
1042
+ if image.mode == "RGBA" and self.opt_comp.quantize_method in (
1043
+ "mediancut",
1044
+ "maxcoverage",
1045
+ ):
1046
+ self.cb.put(
1047
+ f"[W] {self.opt_comp.quantize_method} does not support RGBA, defaulted to fastoctree quantization"
1048
+ )
1049
+ method = Image.Quantize.FASTOCTREE
1050
+ elif self.opt_comp.quantize_method == "mediancut":
1051
+ method = Image.Quantize.MEDIANCUT
1052
+ elif self.opt_comp.quantize_method == "maxcoverage":
1053
+ method = Image.Quantize.MAXCOVERAGE
1054
+ else:
1055
+ method = Image.Quantize.FASTOCTREE
1056
+ return image.quantize(colors=self.color, method=method)
1029
1057
 
1030
1058
  def fix_fps(self, fps: float) -> Fraction:
1031
1059
  # After rounding fps/duration during export,
@@ -252,7 +252,7 @@ class DownloadLine(DownloadBase):
252
252
  )
253
253
 
254
254
  for num, sticker in enumerate(self.pack_files):
255
- if self.resource_type == "ANIMATION":
255
+ if self.has_animation is True:
256
256
  f_path = str(sticker) + "_animation.png"
257
257
  else:
258
258
  f_path = str(sticker) + ".png"
@@ -273,13 +273,13 @@ class DownloadLine(DownloadBase):
273
273
  )
274
274
 
275
275
  for num, sticker in enumerate(self.pack_files):
276
- if self.resource_type in ("ANIMATION", "ANIMATION_SOUND"):
277
- f_path = "animation@2x/" + str(sticker["id"]) + "@2x.png"
278
- elif self.resource_type == "POPUP":
276
+ if self.resource_type == "POPUP":
279
277
  if sticker.get("popup", {}).get("layer") == "BACKGROUND":
280
278
  f_path = str(sticker["id"]) + "@2x.png"
281
279
  self.decompress(zf, f_path, num, "preview-")
282
280
  f_path = "popup/" + str(sticker["id"]) + ".png"
281
+ elif self.has_animation is True:
282
+ f_path = "animation@2x/" + str(sticker["id"]) + "@2x.png"
283
283
  else:
284
284
  f_path = str(sticker["id"]) + "@2x.png"
285
285
  self.decompress(zf, f_path, num)
sticker_convert/gui.py CHANGED
@@ -116,6 +116,7 @@ class GUI(Window):
116
116
  self.res_h_max_var = IntVar(self)
117
117
  self.res_h_disable_var = BooleanVar()
118
118
  self.res_power_var = DoubleVar()
119
+ self.res_snap_pow2_var = BooleanVar()
119
120
  self.quality_min_var = IntVar(self)
120
121
  self.quality_max_var = IntVar(self)
121
122
  self.quality_disable_var = BooleanVar()
@@ -547,6 +548,7 @@ class GUI(Window):
547
548
  if not self.res_h_disable_var.get()
548
549
  else None,
549
550
  res_power=self.res_power_var.get(),
551
+ res_snap_pow2=self.res_snap_pow2_var.get(),
550
552
  quality_min=self.quality_min_var.get()
551
553
  if not self.quality_disable_var.get()
552
554
  else None,
@@ -119,6 +119,7 @@ class CompFrame(LabelFrame):
119
119
  self.gui.res_h_min_var.set(preset.get("res", {}).get("h", {}).get("min"))
120
120
  self.gui.res_h_max_var.set(preset.get("res", {}).get("h", {}).get("max"))
121
121
  self.gui.res_power_var.set(preset.get("res", {}).get("power"))
122
+ self.gui.res_snap_pow2_var.set(preset.get("res", {}).get("snap_pow2"))
122
123
  self.gui.quality_min_var.set(preset.get("quality", {}).get("min"))
123
124
  self.gui.quality_max_var.set(preset.get("quality", {}).get("max"))
124
125
  self.gui.quality_power_var.set(preset.get("quality", {}).get("power"))
@@ -15,7 +15,6 @@ from sticker_convert.gui_components.windows.base_window import BaseWindow
15
15
 
16
16
 
17
17
  class AdvancedCompressionWindow(BaseWindow):
18
- emoji_column_per_row = 8
19
18
  emoji_visible_rows = 5
20
19
  emoji_btns: List[Tuple[Button, ImageTk.PhotoImage]] = []
21
20
 
@@ -101,6 +100,20 @@ class AdvancedCompressionWindow(BaseWindow):
101
100
  bootstyle="danger-round-toggle", # type: ignore
102
101
  )
103
102
 
103
+ self.res_snap_pow2_help_btn = self.add_help_btn(
104
+ self.gui.help["comp"]["res_snap_pow2"]
105
+ )
106
+ self.res_snap_pow2_lbl = Label(
107
+ self.frame_advcomp, text="Snap resolution to power of 2"
108
+ )
109
+ self.res_snap_pow2_cbox = Checkbutton(
110
+ self.frame_advcomp,
111
+ variable=self.gui.res_snap_pow2_var,
112
+ onvalue=True,
113
+ offvalue=False,
114
+ bootstyle="success-round-toggle", # type: ignore
115
+ )
116
+
104
117
  self.quality_help_btn = self.add_help_btn(self.gui.help["comp"]["quality"])
105
118
  self.quality_lbl = Label(self.frame_advcomp, text="Output quality (0-100)")
106
119
  self.quality_min_lbl = Label(self.frame_advcomp, text="Min:")
@@ -289,6 +302,8 @@ class AdvancedCompressionWindow(BaseWindow):
289
302
  self.gui.quantize_method_var.get(),
290
303
  "imagequant",
291
304
  "fastoctree",
305
+ "maxcoverage",
306
+ "mediancut",
292
307
  "none",
293
308
  bootstyle="secondary", # type: ignore
294
309
  )
@@ -326,7 +341,7 @@ class AdvancedCompressionWindow(BaseWindow):
326
341
  self.fps_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
327
342
  self.fps_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
328
343
  self.fps_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
329
- self.fps_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
344
+ self.fps_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
330
345
  r += 1
331
346
  self.res_w_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
332
347
  self.res_w_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -334,7 +349,7 @@ class AdvancedCompressionWindow(BaseWindow):
334
349
  self.res_w_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
335
350
  self.res_w_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
336
351
  self.res_w_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
337
- self.res_w_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
352
+ self.res_w_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
338
353
  r += 1
339
354
  self.res_h_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
340
355
  self.res_h_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -342,7 +357,11 @@ class AdvancedCompressionWindow(BaseWindow):
342
357
  self.res_h_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
343
358
  self.res_h_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
344
359
  self.res_h_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
345
- self.res_h_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
360
+ self.res_h_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
361
+ r += 1
362
+ self.res_snap_pow2_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
363
+ self.res_snap_pow2_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
364
+ self.res_snap_pow2_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
346
365
  r += 1
347
366
  self.quality_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
348
367
  self.quality_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -350,7 +369,7 @@ class AdvancedCompressionWindow(BaseWindow):
350
369
  self.quality_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
351
370
  self.quality_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
352
371
  self.quality_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
353
- self.quality_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
372
+ self.quality_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
354
373
  r += 1
355
374
  self.color_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
356
375
  self.color_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -358,7 +377,7 @@ class AdvancedCompressionWindow(BaseWindow):
358
377
  self.color_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
359
378
  self.color_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
360
379
  self.color_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
361
- self.color_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
380
+ self.color_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
362
381
  r += 1
363
382
  self.duration_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
364
383
  self.duration_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -366,7 +385,7 @@ class AdvancedCompressionWindow(BaseWindow):
366
385
  self.duration_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
367
386
  self.duration_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
368
387
  self.duration_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
369
- self.duration_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
388
+ self.duration_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
370
389
  r += 1
371
390
  self.size_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
372
391
  self.size_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -374,14 +393,14 @@ class AdvancedCompressionWindow(BaseWindow):
374
393
  self.img_size_max_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
375
394
  self.vid_size_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
376
395
  self.vid_size_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
377
- self.size_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
396
+ self.size_disable_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
378
397
  r += 1
379
398
  self.format_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
380
399
  self.format_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
381
400
  self.img_format_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
382
401
  self.img_format_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
383
402
  self.vid_format_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
384
- self.vid_format_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
403
+ self.vid_format_entry.grid(column=5, row=r, sticky="w", padx=3, pady=3)
385
404
  r += 1
386
405
  self.power_help_btn1.grid(column=0, row=r, sticky="w", padx=3, pady=3)
387
406
  self.power_lbl1.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -404,12 +423,12 @@ class AdvancedCompressionWindow(BaseWindow):
404
423
  r += 1
405
424
  self.fake_vid_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
406
425
  self.fake_vid_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
407
- self.fake_vid_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
426
+ self.fake_vid_cbox.grid(column=6, row=r, sticky="w", padx=3, pady=3)
408
427
  r += 1
409
428
  self.bg_color_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
410
429
  self.bg_color_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
411
430
  self.bg_color_entry.grid(column=5, row=r, sticky="w", padx=3, pady=3)
412
- self.bg_color_btn.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
431
+ self.bg_color_btn.grid(column=6, row=r, sticky="w", padx=3, pady=3)
413
432
  r += 1
414
433
  self.scale_filter_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
415
434
  self.scale_filter_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
@@ -662,6 +681,7 @@ class AdvancedCompressionWindow(BaseWindow):
662
681
 
663
682
  column = 0
664
683
  row = 0
684
+ emoji_column_per_row = 0
665
685
 
666
686
  self.emoji_btns = []
667
687
  for entry in self.gui.emoji_list:
@@ -702,7 +722,12 @@ class AdvancedCompressionWindow(BaseWindow):
702
722
 
703
723
  column += 1
704
724
 
705
- if column == self.emoji_column_per_row:
725
+ if emoji_column_per_row == 0:
726
+ self.emoji_canvas.update_idletasks()
727
+ emoji_column_per_row = int(
728
+ self.emoji_canvas.winfo_width() / button.winfo_width()
729
+ )
730
+ if column == emoji_column_per_row:
706
731
  column = 0
707
732
  row += 1
708
733
 
@@ -714,7 +739,7 @@ class AdvancedCompressionWindow(BaseWindow):
714
739
  # Resize the canvas frame to show specified number of buttons and the scrollbar
715
740
  if len(self.emoji_btns) > 0:
716
741
  in_view_columns_width = (
717
- self.emoji_btns[0][0].winfo_width() * self.emoji_column_per_row
742
+ self.emoji_btns[0][0].winfo_width() * emoji_column_per_row
718
743
  )
719
744
  in_view_rows_height = (
720
745
  self.emoji_btns[0][0].winfo_height() * self.emoji_visible_rows
sticker_convert/job.py CHANGED
@@ -422,16 +422,22 @@ class Job:
422
422
  ):
423
423
  error_msg += "\n"
424
424
  error_msg += (
425
- f"[X] scale_filter {self.opt_comp.scale_filter} is not valid option"
425
+ f"[X] scale_filter {self.opt_comp.scale_filter} is not valid option\n"
426
426
  )
427
427
  error_msg += (
428
428
  " Valid options: nearest, box, bilinear, hamming, bicubic, lanczos"
429
429
  )
430
430
 
431
- if self.opt_comp.quantize_method not in ("imagequant", "fastoctree", "none"):
431
+ if self.opt_comp.quantize_method not in (
432
+ "imagequant",
433
+ "fastoctree",
434
+ "maxcoverage",
435
+ "mediancut",
436
+ "none",
437
+ ):
432
438
  error_msg += "\n"
433
- error_msg += f"[X] quantize_method {self.opt_comp.quantize_method} is not valid option"
434
- error_msg += " Valid options: imagequant, fastoctree, none"
439
+ error_msg += f"[X] quantize_method {self.opt_comp.quantize_method} is not valid option\n"
440
+ error_msg += " Valid options: imagequant, fastoctree, maxcoverage, mediancut, none"
435
441
 
436
442
  if self.opt_comp.bg_color:
437
443
  try:
@@ -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
@@ -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,
@@ -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,7 +214,8 @@
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
221
  "min": 0,
@@ -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,
@@ -351,7 +358,8 @@
351
358
  "min": 100,
352
359
  "max": 320
353
360
  },
354
- "power": 3
361
+ "power": 3,
362
+ "snap_pow2": false
355
363
  },
356
364
  "quality": {
357
365
  "min": 10,
@@ -398,7 +406,8 @@
398
406
  "min": 480,
399
407
  "max": 480
400
408
  },
401
- "power": 3
409
+ "power": 3,
410
+ "snap_pow2": false
402
411
  },
403
412
  "quality": {
404
413
  "min": 10,
@@ -445,7 +454,8 @@
445
454
  "min": 490,
446
455
  "max": 490
447
456
  },
448
- "power": 1
457
+ "power": 1,
458
+ "snap_pow2": false
449
459
  },
450
460
  "quality": {
451
461
  "min": 95,
@@ -492,7 +502,8 @@
492
502
  "min": 320,
493
503
  "max": 320
494
504
  },
495
- "power": 1
505
+ "power": 1,
506
+ "snap_pow2": false
496
507
  },
497
508
  "quality": {
498
509
  "min": 10,
@@ -539,7 +550,8 @@
539
550
  "min": 32,
540
551
  "max": 128
541
552
  },
542
- "power": 1
553
+ "power": 1,
554
+ "snap_pow2": false
543
555
  },
544
556
  "quality": {
545
557
  "min": 10,
@@ -586,7 +598,8 @@
586
598
  "min": 300,
587
599
  "max": 300
588
600
  },
589
- "power": 1
601
+ "power": 1,
602
+ "snap_pow2": false
590
603
  },
591
604
  "quality": {
592
605
  "min": 10,
@@ -633,7 +646,8 @@
633
646
  "min": 408,
634
647
  "max": 408
635
648
  },
636
- "power": 1
649
+ "power": 1,
650
+ "snap_pow2": false
637
651
  },
638
652
  "quality": {
639
653
  "min": 10,
@@ -680,7 +694,8 @@
680
694
  "min": 618,
681
695
  "max": 618
682
696
  },
683
- "power": 1
697
+ "power": 1,
698
+ "snap_pow2": false
684
699
  },
685
700
  "quality": {
686
701
  "min": 10,
@@ -727,7 +742,8 @@
727
742
  "min": 256,
728
743
  "max": 512
729
744
  },
730
- "power": 3
745
+ "power": 3,
746
+ "snap_pow2": false
731
747
  },
732
748
  "quality": {
733
749
  "min": 10,
@@ -29,6 +29,8 @@
29
29
  "res_h_min": "Set minimum height.",
30
30
  "res_h_max": "Set maximum height.",
31
31
  "res_power": "Between -1 and positive infinity.\nPower lower = More importance of the parameter,\ntry harder to keep higher and not sacrifice.",
32
+ "res_snap_pow2": "Snap resolution to nearest power of 2 (1,2,4,8,16,...).\nIgnored if no power of 2 present between minimum and maximum resolutions",
33
+ "no_res_snap_pow2": "Disable res_snap_pow2",
32
34
  "quality": "Quality higher = Clearer but larger size.",
33
35
  "quality_min": "Set minimum quality.",
34
36
  "quality_max": "Set maximum quality.",
@@ -49,8 +51,9 @@
49
51
  "vid_format": "Set file format if input is animated.",
50
52
  "img_format": "Set file format if input is static.",
51
53
  "fake_vid": "Convert (faking) image to video.\nUseful if:\n(1) Size limit for video is larger than image;\n(2) Mix image and video into same pack.",
54
+ "no_fake_vid": "Disable fake_vid",
52
55
  "scale_filter": "Set scale filter. Default as bicubic. Valid options are:\n- nearest = Use nearest neighbour (Suitable for pixel art)\n- box = Similar to nearest, but better downscaling\n- bilinear = Linear interpolation\n- hamming = Similar to bilinear, but better downscaling\n- bicubic = Cubic spline interpolation\n- lanczos = A high-quality downsampling filter",
53
- "quantize_method": "Set method for quantizing image. Default as imagequant. Valid options are:\n- imagequant = Best quality but slow\n- fastoctree = Fast but image looks chunky\n- none = No image quantizing, large image size as result",
56
+ "quantize_method": "Set method for quantizing image. Default as imagequant. Valid options are:\n- imagequant = Speed+ Compression+ Quality++++ RGBA Supported\n- fastoctree = Speed++, Compression++++ Quality+ RGBA Supported\n- maxcoverage = Speed+++, Compression+++ Quality++ RGBA unsupported\n- mediancut = Speed++++ Compression++ Quality+++ RGBA unsupported\n- none = No image quantizing, large image size as result\nLower quality would make image chunky",
54
57
  "cache_dir": "Set custom cache directory.\nUseful for debugging, or speed up conversion if cache_dir is on RAM disk.",
55
58
  "chromium_path": "Set Chromium(-based)/Chrome browser path.\nRequired for converting from SVG files.\nLeave blank to auto detect",
56
59
  "default_emoji": "Set the default emoji for uploading Signal and Telegram sticker packs."
@@ -165,22 +165,32 @@ class UploadTelegram(UploadBase):
165
165
  src, fmt=spec_choice.get_format(), file_info=file_info
166
166
  )
167
167
  )
168
- if sticker_format == "video":
169
- # For video stickers (Only)
170
- # Allow file with one of the dimension = 512 but another <512
171
- # https://core.telegram.org/stickers#video-requirements
172
- check_file_result = check_file_result and (
173
- file_info.res[0] == 512 or file_info.res[1] == 512
174
- )
175
- check_file_result = check_file_result and (
176
- file_info.res[0] <= 512 and file_info.res[1] <= 512
177
- )
168
+ if self.opt_output.option == "telegram":
169
+ if sticker_format == "animated":
170
+ check_file_result = (
171
+ check_file_result
172
+ and file_info.res[0] == 512
173
+ and file_info.res[1] == 512
174
+ )
175
+ else:
176
+ # For video and static stickers (Not animated)
177
+ # Allow file with one of the dimension = 512 but another <512
178
+ # https://core.telegram.org/stickers#video-requirements
179
+ check_file_result = check_file_result and (
180
+ file_info.res[0] == 512 or file_info.res[1] == 512
181
+ )
182
+ check_file_result = check_file_result and (
183
+ file_info.res[0] <= 512 and file_info.res[1] <= 512
184
+ )
178
185
  else:
186
+ # telegram_emoji
179
187
  check_file_result = (
180
188
  check_file_result
181
- and file_info.res[0] == 512
182
- and file_info.res[1] == 512
189
+ and file_info.res[0] == 100
190
+ and file_info.res[1] == 100
183
191
  )
192
+
193
+ if sticker_format == "static":
184
194
  # It is important to check if webp and png are static only
185
195
  check_file_result = check_file_result and FormatVerify.check_animated(
186
196
  src, animated=spec_choice.animated, file_info=file_info
@@ -298,7 +308,6 @@ class UploadTelegram(UploadBase):
298
308
  stickers_total = 0
299
309
  stickers_ok = 0
300
310
  for pack_title, stickers in packs.items():
301
- stickers_total += len(stickers)
302
311
  self.cb.put(f"Uploading pack {pack_title}")
303
312
  result, stickers_total_pack, stickers_ok_pack = anyio.run(
304
313
  self.upload_pack, pack_title, stickers, emoji_dict
@@ -215,6 +215,10 @@ class GetKakaoDesktopAuth:
215
215
  kakao_bin_path = os.path.expandvars(
216
216
  "%programfiles(x86)%\\Kakao\\KakaoTalk\\KakaoTalk.exe"
217
217
  )
218
+ if Path(kakao_bin_path).exists() is False:
219
+ kakao_bin_path = os.path.expandvars(
220
+ "%programfiles%\\Kakao\\KakaoTalk\\KakaoTalk.exe"
221
+ )
218
222
  elif platform.system() == "Darwin":
219
223
  kakao_bin_path = "/Applications/KakaoTalk.app"
220
224
  else:
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.13.2.1"
3
+ __version__ = "2.13.3.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sticker-convert
3
- Version: 2.13.2.1
3
+ Version: 2.13.3.0
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, Viber, Discord, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -364,22 +364,22 @@ Requires-Python: >=3.9
364
364
  Description-Content-Type: text/markdown
365
365
  License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
- Requires-Dist: anyio~=4.9.0
367
+ Requires-Dist: anyio~=4.10.0
368
368
  Requires-Dist: apngasm_python~=1.3.2
369
369
  Requires-Dist: av>=13.1.0
370
370
  Requires-Dist: beautifulsoup4~=4.13.4
371
- Requires-Dist: cryptg~=0.5.0.post0
371
+ Requires-Dist: cryptg~=0.5.1
372
372
  Requires-Dist: rookiepy~=0.5.6
373
373
  Requires-Dist: httpx~=0.28.1
374
374
  Requires-Dist: imagequant~=1.1.4
375
375
  Requires-Dist: memory-tempfile~=2.2.3
376
376
  Requires-Dist: mergedeep~=1.3.4
377
377
  Requires-Dist: numpy>=1.22.4
378
- Requires-Dist: Pillow~=11.2.1
378
+ Requires-Dist: Pillow~=11.3.0
379
379
  Requires-Dist: pyoxipng~=9.1.0
380
- Requires-Dist: python-telegram-bot~=22.1
380
+ Requires-Dist: python-telegram-bot~=22.3
381
381
  Requires-Dist: psutil~=7.0.0
382
- Requires-Dist: PyMemoryEditor~=1.5.22
382
+ Requires-Dist: PyMemoryEditor~=1.5.24
383
383
  Requires-Dist: requests~=2.32.4
384
384
  Requires-Dist: rlottie_python~=1.3.7
385
385
  Requires-Dist: signalstickers-client-fork-laggykiller~=3.3.0.post2
@@ -497,27 +497,37 @@ Dynamic: license-file
497
497
  To run in CLI mode, pass on any arguments
498
498
 
499
499
  ```
500
- usage: sticker-convert.py [-h] [--version] [--no-confirm] [--no-progress] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
500
+ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--no-progress]
501
+ [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
501
502
  [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-telegram-telethon DOWNLOAD_TELEGRAM_TELETHON | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO | --download-band DOWNLOAD_BAND | --download-ogq DOWNLOAD_OGQ | --download-viber DOWNLOAD_VIBER | --download-discord DOWNLOAD_DISCORD | --download-discord-emoji DOWNLOAD_DISCORD_EMOJI]
502
503
  [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
503
504
  [--export-signal | --export-telegram | --export-telegram-emoji | --export-telegram-telethon | --export-telegram-emoji-telethon | --export-viber | --export-whatsapp | --export-imessage]
504
505
  [--no-compress]
505
506
  [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,band,ogq,viber,discord,discord_emoji,imessage_small,imessage_medium,imessage_large,custom}]
506
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER]
507
- [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN]
508
- [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
509
- [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER]
510
- [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
511
- [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT]
512
- [--img-format IMG_FORMAT] [--fake-vid] [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
513
- [--cache-dir CACHE_DIR] [--chromium-path CHROMIUM_PATH] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
514
- [--signal-password SIGNAL_PASSWORD] [--signal-get-auth] [--telegram-token TELEGRAM_TOKEN]
515
- [--telegram-userid TELEGRAM_USERID] [--telethon-setup] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
516
- [--kakao-get-auth-desktop] [--kakao-bin-path KAKAO_BIN_PATH] [--kakao-username KAKAO_USERNAME]
517
- [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE]
518
- [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth] [--line-cookies LINE_COOKIES] [--viber-auth VIBER_AUTH]
519
- [--viber-get-auth VIBER_GET_AUTH] [--viber-bin-path VIBER_BIN_PATH] [--discord-get-auth]
520
- [--discord-token DISCORD_TOKEN] [--save-cred]
507
+ [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
508
+ [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX]
509
+ [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN]
510
+ [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--res-snap-pow2]
511
+ [--no-res-snap-pow2] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
512
+ [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX]
513
+ [--color-power COLOR_POWER] [--duration-min DURATION_MIN]
514
+ [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
515
+ [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX]
516
+ [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT]
517
+ [--img-format IMG_FORMAT] [--fake-vid] [--no-fake-vid]
518
+ [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
519
+ [--cache-dir CACHE_DIR] [--chromium-path CHROMIUM_PATH]
520
+ [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
521
+ [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
522
+ [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID]
523
+ [--telethon-setup] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
524
+ [--kakao-get-auth-desktop] [--kakao-bin-path KAKAO_BIN_PATH]
525
+ [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD]
526
+ [--kakao-country-code KAKAO_COUNTRY_CODE]
527
+ [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
528
+ [--line-cookies LINE_COOKIES] [--viber-auth VIBER_AUTH]
529
+ [--viber-get-auth VIBER_GET_AUTH] [--viber-bin-path VIBER_BIN_PATH]
530
+ [--discord-get-auth] [--discord-token DISCORD_TOKEN] [--save-cred]
521
531
 
522
532
  CLI for stickers-convert
523
533
 
@@ -619,6 +629,9 @@ Compression options:
619
629
  Between -1 and positive infinity.
620
630
  Power lower = More importance of the parameter,
621
631
  try harder to keep higher and not sacrifice.
632
+ --res-snap-pow2 Snap resolution to nearest power of 2 (1,2,4,8,16,...).
633
+ Ignored if no power of 2 present between minimum and maximum resolutions
634
+ --no-res-snap-pow2 Disable res_snap_pow2
622
635
  --quality-min QUALITY_MIN
623
636
  Set minimum quality.
624
637
  --quality-max QUALITY_MAX
@@ -653,6 +666,7 @@ Compression options:
653
666
  Useful if:
654
667
  (1) Size limit for video is larger than image;
655
668
  (2) Mix image and video into same pack.
669
+ --no-fake-vid Disable fake_vid
656
670
  --scale-filter SCALE_FILTER
657
671
  Set scale filter. Default as bicubic. Valid options are:
658
672
  - nearest = Use nearest neighbour (Suitable for pixel art)
@@ -663,9 +677,12 @@ Compression options:
663
677
  - lanczos = A high-quality downsampling filter
664
678
  --quantize-method QUANTIZE_METHOD
665
679
  Set method for quantizing image. Default as imagequant. Valid options are:
666
- - imagequant = Best quality but slow
667
- - fastoctree = Fast but image looks chunky
680
+ - imagequant = Speed+ Compression+ Quality++++ RGBA Supported
681
+ - fastoctree = Speed++, Compression++++ Quality+ RGBA Supported
682
+ - maxcoverage = Speed+++, Compression+++ Quality++ RGBA unsupported
683
+ - mediancut = Speed++++ Compression++ Quality+++ RGBA unsupported
668
684
  - none = No image quantizing, large image size as result
685
+ Lower quality would make image chunky
669
686
  --cache-dir CACHE_DIR
670
687
  Set custom cache directory.
671
688
  Useful for debugging, or speed up conversion if cache_dir is on RAM disk.
@@ -1,18 +1,18 @@
1
1
  sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
2
2
  sticker_convert/__main__.py,sha256=elDCMvU27letiYs8jPUpxaCq5puURnvcDuqGsAAb6_w,592
3
- sticker_convert/cli.py,sha256=RG62v3JFSokhKZo1J7zbc1NL0oY43ufVrIub8nT_f_A,22582
4
- sticker_convert/converter.py,sha256=6_FGXW-S6t2xs56fid49z2FaEc1VFtJ-jJOA-SUKSH8,39760
3
+ sticker_convert/cli.py,sha256=XsP-GE2XxOeseryXukIMR9MVdPOd7nhjO3Bp37WDxBM,22913
4
+ sticker_convert/converter.py,sha256=6Yqq7nt0mYxoiuyF7nhDxuhvrAOOU8qCsiREWE1qf9M,41077
5
5
  sticker_convert/definitions.py,sha256=BqROmOvqIqw8ANaqZXIxJAXGD0HgjAvCfFouQ4SaWHc,2254
6
- sticker_convert/gui.py,sha256=bd8rMgFaXrn41y6aOHNlD6gPBDleDmiHMsGMZNfz1jk,34239
7
- sticker_convert/job.py,sha256=jK65lOuPyevQ6Pt9Qw029bGcgYLMuaHlexpc1n1qFxE,28416
8
- sticker_convert/job_option.py,sha256=yI_uKWJEAul2XTC6pucz9PfW0iNwwOr0aVC-PAHkMA4,8109
9
- sticker_convert/version.py,sha256=f-IGg55P9iTzFu-qVlNDW5ioRe04BJzemQ14gfGLoEQ,49
6
+ sticker_convert/gui.py,sha256=4Yz9F57MhPgzODFYikT73aMBevcnEB4dwKvUsJnSJwY,34341
7
+ sticker_convert/job.py,sha256=AJoxWg61ZxQRHzKyGIrQaaCGs-S6NDO6lvWjddYemH8,28543
8
+ sticker_convert/job_option.py,sha256=gWE7oV1azPcMeri-BrKbqMjpL0hbHE8yRPtOosRG580,8190
9
+ sticker_convert/version.py,sha256=zkaUkSx4GNtFkhpch_kcfHX4GwPuBtPB9jxk7EqNaDw,49
10
10
  sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  sticker_convert/downloaders/download_band.py,sha256=JPjwwdxbMXPBM9TXF76wT9mtoDCLssYnrm1iS2C6uVM,3629
12
12
  sticker_convert/downloaders/download_base.py,sha256=MI5pCT_tkfoaFlrD1oNynDj1Rv1CK0APuNVElTEAEis,5110
13
13
  sticker_convert/downloaders/download_discord.py,sha256=6AFpLAYL2hRvVcsqUtzDUC31U66U02ZcnKXDnZRi2jk,3496
14
14
  sticker_convert/downloaders/download_kakao.py,sha256=lRmpEcYjHizIRM0uFBDvjMqNEpur0VmOTKAmiir9eB0,15181
15
- sticker_convert/downloaders/download_line.py,sha256=751-g6BH0ITwNlYNsZuBxyB92Q8f3o6Qv9VHmHDoLps,18161
15
+ sticker_convert/downloaders/download_line.py,sha256=yISEgSpFtQtLUdWH5b8Qby9l3qY5U6o34DgTt9aqmIw,18126
16
16
  sticker_convert/downloaders/download_ogq.py,sha256=-iSTQaCUlROfY7a9EFhJGq6fenY48AZEevfQLT9-pAk,2951
17
17
  sticker_convert/downloaders/download_signal.py,sha256=3wv-BLd4qggly4AdtwV8f3vUpCVZ-8GnoPLoWngY3Pk,3728
18
18
  sticker_convert/downloaders/download_telegram.py,sha256=iGmOcVjU2Ai19t1lyDY2JhQIc--O5XMyNCGXZAA4DVY,2028
@@ -20,7 +20,7 @@ sticker_convert/downloaders/download_viber.py,sha256=SFnyaVEd_33J1KvRhcHDJqnLKGs
20
20
  sticker_convert/gui_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  sticker_convert/gui_components/gui_utils.py,sha256=okho2cA1Scem_m6rPiYifreFzpFrM21-yUkiAv64EUI,3431
22
22
  sticker_convert/gui_components/frames/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- sticker_convert/gui_components/frames/comp_frame.py,sha256=9k_UntKKi2G_g0byzoj1rdTqOq7q9mcnXiy799bYnr0,7257
23
+ sticker_convert/gui_components/frames/comp_frame.py,sha256=jutMKt1cvKPRabVsrutfIjKFgPlU8DYl75ne346ubxs,7336
24
24
  sticker_convert/gui_components/frames/config_frame.py,sha256=b3X4QAnGpde0OhthXHmjSyU_Yb5tYRUFXmy04Yi8Zmo,4316
25
25
  sticker_convert/gui_components/frames/control_frame.py,sha256=_XiOJ9JPUfiysDghGG04sEVLrXG9TMVlDZ60W0LhYVI,835
26
26
  sticker_convert/gui_components/frames/cred_frame.py,sha256=pQldn05cIgxK_pE899DgxMOe56KN9MTteDF-L6-DquI,9646
@@ -29,7 +29,7 @@ sticker_convert/gui_components/frames/output_frame.py,sha256=n2WLk22h61DoZli8WbF
29
29
  sticker_convert/gui_components/frames/progress_frame.py,sha256=LWUZg_iL7iiNTfu7N5Ct_pklZdghxihENi7DP9YozOE,4915
30
30
  sticker_convert/gui_components/frames/right_clicker.py,sha256=dGIvSzEChrkguR80pzUemBNJ39uzJjVJQKeDNUoW3Gk,721
31
31
  sticker_convert/gui_components/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=il1ZenzjZuL94MFOTR3vfCCTlZ7BIZfsVmC16CLLwI4,32734
32
+ sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=mIkapYo93Kw7oa10in1yH-DwR3hX0D2JYJ7cTAs48bk,33748
33
33
  sticker_convert/gui_components/windows/base_window.py,sha256=xBE1peGMPvWsdrFej0CJUVhmQ57GJGvz-cX03nIIhkE,1108
34
34
  sticker_convert/gui_components/windows/discord_get_auth_window.py,sha256=a9ptBqtpZslQJ87-ZPotcT6gigouIHWAFijfkWv2rZQ,2786
35
35
  sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=9YfzuKQE6bjfqFxkpCa4XxMnw2T1UPPI_A6Z8E75J_M,11953
@@ -68,13 +68,13 @@ sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworks
68
68
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist,sha256=36D5u4W5XMupxoEa2t-MtAf7XVIIjonbg-vDCOxEhUI,238
69
69
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate,sha256=GB0zcEgI5Ot4Djb1WUSpYFyBomrwM3I-9zlQ0tdonWQ,21835
70
70
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist,sha256=uHJbEexYAQ1YSuNrCh2mYY_h67_OoJGLGlP0Fuo7lls,364
71
- sticker_convert/resources/NotoColorEmoji.ttf,sha256=LurIVaCIA8bSCfjrdO1feYr0bhKLyT3TkT4E3ldSOnw,10353636
71
+ sticker_convert/resources/NotoColorEmoji.ttf,sha256=Ptd4EMID4aZ3NdwZ05XzLCPy18DDaWaQ9PeOFeV6uBY,10195752
72
72
  sticker_convert/resources/appicon.icns,sha256=FB2DVTOQcFfQNZ9RcyG3z9c9k7eOiI1qw0IJhXMRFg4,5404
73
73
  sticker_convert/resources/appicon.ico,sha256=-ldugcl2Yq2pBRTktnhGKWInpKyWzRjCiPvMr3XPTlc,38078
74
74
  sticker_convert/resources/appicon.png,sha256=6XBEQz7PnerqS43aRkwpWolFG4WvKMuQ-st1ly-_JPg,5265
75
- sticker_convert/resources/compression.json,sha256=UUY375C1PDHVrbaHO0V3O2TCayNBkrIHchKNjfc10Aw,16183
75
+ sticker_convert/resources/compression.json,sha256=X3b3KCpf9KdHWjmV9KzXFf8KQYq7MSFk9O8WmzahVZg,16695
76
76
  sticker_convert/resources/emoji.json,sha256=q9DRFdVJfm7feZW7ZM6Xa5P1QsMvrn0PbBVU9jKcJKI,422720
77
- sticker_convert/resources/help.json,sha256=28m5oMhybN3yg7EhmjBlPJq1HtHYa0joG355Ie1Zn10,7336
77
+ sticker_convert/resources/help.json,sha256=oDg0JghzaNrsVCzQ0BB_XKW3flsWfeQXrUd9WA34IDw,7811
78
78
  sticker_convert/resources/input.json,sha256=cpLQQ-jwXSHQUd8faLn-e-mAEvJViKs_d7UuqIvF7ZQ,4575
79
79
  sticker_convert/resources/memdump_linux.sh,sha256=SFKXiE0ztZyGvpFYPOrdQ0wmY3ndgJuqfiofC7BQon0,625
80
80
  sticker_convert/resources/memdump_windows.ps1,sha256=CfyNSSEW3HJOkTu-mKrP3qh5aprN-1VCBfj-R1fELA0,302
@@ -83,7 +83,7 @@ sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
83
83
  sticker_convert/uploaders/compress_wastickers.py,sha256=Rgl3WzIDJn7oa00nNqeBFDqIHP-cWvgQqET2-kDbf9c,7417
84
84
  sticker_convert/uploaders/upload_base.py,sha256=uQupPn6r4zrlAzpKzzX7CgvZb69ATyrwPKahWOQj0ds,1203
85
85
  sticker_convert/uploaders/upload_signal.py,sha256=k9XS6oU0gYCXEph-LzWvUP3IDINAVaQzzzNgDRp_YNM,7443
86
- sticker_convert/uploaders/upload_telegram.py,sha256=WlUyLJlW83XZz6RhA76jHMXA6TNUIEVbPwhi14RTnds,12482
86
+ sticker_convert/uploaders/upload_telegram.py,sha256=CAZI0cOXImFjKL6MIeIfY2Xfhil8sqntQBxOrnROooo,12862
87
87
  sticker_convert/uploaders/upload_viber.py,sha256=_vOK0UgP7V7ZeFG6pR3sVf3A744Q6J19qzO-2hDvt5w,6583
88
88
  sticker_convert/uploaders/xcode_imessage.py,sha256=iTTT8gDYOTNkKqXeSWUBuWfxu7xeE418t2Z1YQFR5L0,11365
89
89
  sticker_convert/utils/callback.py,sha256=spYUGlklOs1yPZAxoqwOWgR1sdimpfM8a27if3TaVYk,6155
@@ -94,7 +94,7 @@ sticker_convert/utils/singletons.py,sha256=SiV374FxU68DpysGoj_ytU1ErINkeOBbP4s9Q
94
94
  sticker_convert/utils/url_detect.py,sha256=_wmI28hUyngq8TVz1bw7YM90qPLd3bIynawVlbr_lcI,939
95
95
  sticker_convert/utils/auth/get_discord_auth.py,sha256=8H9Z0c7pl6JjzkP8lo0-lCFnBAT5Eql-LYc6M92FY_k,4283
96
96
  sticker_convert/utils/auth/get_kakao_auth.py,sha256=Wok5sp0GGBgTwwlfYB7lVq82ndBAOGTcqsWEaWAXFNE,10760
97
- sticker_convert/utils/auth/get_kakao_desktop_auth.py,sha256=a-P0sXXjZRnGwqcdgGZc_idnAvUXYx0EMCKpUXOuqJo,8659
97
+ sticker_convert/utils/auth/get_kakao_desktop_auth.py,sha256=GNT-Y0lZwqRHuXfItmxRFC7kH81DuPRMDSfrbS-YSrw,8855
98
98
  sticker_convert/utils/auth/get_line_auth.py,sha256=8l8ha2vQmk3rHGvDE7PkcxQXbH3oe62LKbI3qVUtvqc,2196
99
99
  sticker_convert/utils/auth/get_signal_auth.py,sha256=I6od2aj8yl1eLV8S2TtNQEPM77DC7FpkRKex0pXY2II,4580
100
100
  sticker_convert/utils/auth/get_viber_auth.py,sha256=aQiv1JI2RKiPVoo_JjbjcWwsUr2OK2FXMsFLPb3TtGU,8123
@@ -113,9 +113,9 @@ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE
113
113
  sticker_convert/utils/media/codec_info.py,sha256=HwA6eVh7cLhOlUoR_K9d_wyBRJ_ocGtB3GAyne_iZAU,16483
114
114
  sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
115
115
  sticker_convert/utils/media/format_verify.py,sha256=oM32P186tWe9YxvBQRPr8D3FEmBN3b2rEe_2S_MwxyQ,6236
116
- sticker_convert-2.13.2.1.dist-info/licenses/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
117
- sticker_convert-2.13.2.1.dist-info/METADATA,sha256=f9Um0rHP7eNK8ImI6GdGFiJ3DaOss54vE3XpBOA_r90,55170
118
- sticker_convert-2.13.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
119
- sticker_convert-2.13.2.1.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
120
- sticker_convert-2.13.2.1.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
121
- sticker_convert-2.13.2.1.dist-info/RECORD,,
116
+ sticker_convert-2.13.3.0.dist-info/licenses/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
117
+ sticker_convert-2.13.3.0.dist-info/METADATA,sha256=StsXvUrWQSbRtZnrr57V-gKsVo2xB-fIionKSa3g-q4,56034
118
+ sticker_convert-2.13.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
119
+ sticker_convert-2.13.3.0.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
120
+ sticker_convert-2.13.3.0.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
121
+ sticker_convert-2.13.3.0.dist-info/RECORD,,