sticker-convert 2.7.2__py3-none-any.whl → 2.7.4__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 (56) hide show
  1. sticker_convert/__init__.py +1 -0
  2. sticker_convert/__main__.py +3 -1
  3. sticker_convert/cli.py +20 -24
  4. sticker_convert/converter.py +108 -119
  5. sticker_convert/definitions.py +8 -12
  6. sticker_convert/downloaders/download_base.py +14 -31
  7. sticker_convert/downloaders/download_kakao.py +25 -39
  8. sticker_convert/downloaders/download_line.py +24 -33
  9. sticker_convert/downloaders/download_signal.py +7 -16
  10. sticker_convert/downloaders/download_telegram.py +6 -15
  11. sticker_convert/gui.py +53 -61
  12. sticker_convert/gui_components/frames/comp_frame.py +11 -20
  13. sticker_convert/gui_components/frames/config_frame.py +9 -9
  14. sticker_convert/gui_components/frames/control_frame.py +3 -3
  15. sticker_convert/gui_components/frames/cred_frame.py +12 -18
  16. sticker_convert/gui_components/frames/input_frame.py +9 -15
  17. sticker_convert/gui_components/frames/output_frame.py +9 -15
  18. sticker_convert/gui_components/frames/progress_frame.py +8 -8
  19. sticker_convert/gui_components/frames/right_clicker.py +2 -2
  20. sticker_convert/gui_components/gui_utils.py +6 -8
  21. sticker_convert/gui_components/windows/advanced_compression_window.py +23 -32
  22. sticker_convert/gui_components/windows/base_window.py +6 -6
  23. sticker_convert/gui_components/windows/kakao_get_auth_window.py +5 -11
  24. sticker_convert/gui_components/windows/line_get_auth_window.py +5 -5
  25. sticker_convert/gui_components/windows/signal_get_auth_window.py +6 -6
  26. sticker_convert/job.py +84 -90
  27. sticker_convert/job_option.py +36 -32
  28. sticker_convert/resources/emoji.json +334 -70
  29. sticker_convert/resources/help.json +1 -1
  30. sticker_convert/uploaders/compress_wastickers.py +19 -30
  31. sticker_convert/uploaders/upload_base.py +19 -13
  32. sticker_convert/uploaders/upload_signal.py +20 -33
  33. sticker_convert/uploaders/upload_telegram.py +21 -28
  34. sticker_convert/uploaders/xcode_imessage.py +30 -95
  35. sticker_convert/utils/auth/get_kakao_auth.py +7 -8
  36. sticker_convert/utils/auth/get_line_auth.py +5 -6
  37. sticker_convert/utils/auth/get_signal_auth.py +7 -7
  38. sticker_convert/utils/callback.py +31 -23
  39. sticker_convert/utils/files/cache_store.py +6 -8
  40. sticker_convert/utils/files/json_manager.py +6 -7
  41. sticker_convert/utils/files/json_resources_loader.py +12 -0
  42. sticker_convert/utils/files/metadata_handler.py +93 -84
  43. sticker_convert/utils/files/run_bin.py +11 -10
  44. sticker_convert/utils/files/sanitize_filename.py +30 -28
  45. sticker_convert/utils/media/apple_png_normalize.py +3 -2
  46. sticker_convert/utils/media/codec_info.py +41 -44
  47. sticker_convert/utils/media/decrypt_kakao.py +7 -7
  48. sticker_convert/utils/media/format_verify.py +14 -14
  49. sticker_convert/utils/url_detect.py +4 -5
  50. sticker_convert/version.py +2 -1
  51. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/METADATA +19 -17
  52. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/RECORD +56 -55
  53. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/WHEEL +1 -1
  54. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/LICENSE +0 -0
  55. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/entry_points.txt +0 -0
  56. {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/top_level.txt +0 -0
@@ -5,13 +5,15 @@ import mmap
5
5
  from decimal import ROUND_HALF_UP, Decimal
6
6
  from io import BytesIO
7
7
  from pathlib import Path
8
- from typing import BinaryIO, Optional, Union, cast
8
+ from typing import BinaryIO, Optional, Tuple, Union, cast
9
9
 
10
10
  from PIL import Image, UnidentifiedImageError
11
11
 
12
12
 
13
13
  class CodecInfo:
14
- def __init__(self, file: Union[Path, bytes], file_ext: Optional[str] = None):
14
+ def __init__(
15
+ self, file: Union[Path, bytes], file_ext: Optional[str] = None
16
+ ) -> None:
15
17
  self.file_ext: Optional[str]
16
18
  if file_ext is None and isinstance(file, Path):
17
19
  self.file_ext = CodecInfo.get_file_ext(file)
@@ -22,12 +24,12 @@ class CodecInfo:
22
24
  )
23
25
  self.codec = CodecInfo.get_file_codec(file)
24
26
  self.res = CodecInfo.get_file_res(file)
25
- self.is_animated = True if self.fps > 1 else False
27
+ self.is_animated = self.fps > 1
26
28
 
27
29
  @staticmethod
28
30
  def get_file_fps_frames_duration(
29
31
  file: Union[Path, bytes], file_ext: Optional[str] = None
30
- ) -> tuple[float, int, int]:
32
+ ) -> Tuple[float, int, int]:
31
33
  fps: float
32
34
 
33
35
  if not file_ext and isinstance(file, Path):
@@ -61,7 +63,7 @@ class CodecInfo:
61
63
 
62
64
  if file_ext == ".tgs":
63
65
  return CodecInfo._get_file_fps_tgs(file)
64
- elif file_ext == ".webp":
66
+ if file_ext == ".webp":
65
67
  frames, duration = CodecInfo._get_file_frames_duration_webp(file)
66
68
  elif file_ext in (".gif", ".apng", ".png"):
67
69
  frames, duration = CodecInfo._get_file_frames_duration_pillow(file)
@@ -72,8 +74,7 @@ class CodecInfo:
72
74
 
73
75
  if duration > 0:
74
76
  return frames / duration * 1000
75
- else:
76
- return 0
77
+ return 0
77
78
 
78
79
  @staticmethod
79
80
  def get_file_frames(
@@ -87,7 +88,7 @@ class CodecInfo:
87
88
 
88
89
  if file_ext == ".tgs":
89
90
  return CodecInfo._get_file_frames_tgs(file)
90
- elif file_ext in (".gif", ".webp", ".png", ".apng"):
91
+ if file_ext in (".gif", ".webp", ".png", ".apng"):
91
92
  frames, _ = CodecInfo._get_file_frames_duration_pillow(
92
93
  file, frames_only=True
93
94
  )
@@ -156,7 +157,7 @@ class CodecInfo:
156
157
  return anim.lottie_animation_get_totalframe()
157
158
 
158
159
  @staticmethod
159
- def _get_file_fps_frames_tgs(file: Union[Path, bytes]) -> tuple[int, int]:
160
+ def _get_file_fps_frames_tgs(file: Union[Path, bytes]) -> Tuple[int, int]:
160
161
  from rlottie_python.rlottie_wrapper import LottieAnimation
161
162
 
162
163
  if isinstance(file, Path):
@@ -177,11 +178,11 @@ class CodecInfo:
177
178
  @staticmethod
178
179
  def _get_file_frames_duration_pillow(
179
180
  file: Union[Path, bytes], frames_only: bool = False
180
- ) -> tuple[int, int]:
181
+ ) -> Tuple[int, int]:
181
182
  total_duration = 0
182
183
 
183
184
  with Image.open(file) as im:
184
- if "n_frames" in im.__dir__():
185
+ if "n_frames" in dir(im):
185
186
  frames = im.n_frames
186
187
  if frames_only is True:
187
188
  return frames, 1
@@ -189,23 +190,22 @@ class CodecInfo:
189
190
  im.seek(i)
190
191
  total_duration += im.info.get("duration", 1000)
191
192
  return frames, total_duration
192
- else:
193
- return 1, 0
193
+
194
+ return 1, 0
194
195
 
195
196
  @staticmethod
196
197
  def _get_file_frames_duration_webp(
197
198
  file: Union[Path, bytes],
198
- ) -> tuple[int, int]:
199
+ ) -> Tuple[int, int]:
199
200
  total_duration = 0
200
201
  frames = 0
201
202
 
202
- f: BinaryIO
203
- if isinstance(file, Path):
204
- f = open(file, "r+b")
205
- else:
206
- f = BytesIO(file)
203
+ def _open_f(file: Union[Path, bytes]) -> BinaryIO:
204
+ if isinstance(file, Path):
205
+ return open(file, "r+b")
206
+ return BytesIO(file)
207
207
 
208
- try:
208
+ with _open_f(file) as f:
209
209
  with mmap.mmap(f.fileno(), 0) as mm:
210
210
  while True:
211
211
  anmf_pos = mm.find(b"ANMF")
@@ -218,22 +218,20 @@ class CodecInfo:
218
218
  )
219
219
  total_duration += int.from_bytes(frame_duration, "little")
220
220
  frames += 1
221
- finally:
222
- f.close()
223
221
 
224
222
  if frames == 0:
225
223
  return 1, 0
226
- else:
227
- return frames, total_duration
224
+
225
+ return frames, total_duration
228
226
 
229
227
  @staticmethod
230
228
  def _get_file_frames_duration_av(
231
229
  file: Union[Path, bytes],
232
230
  frames_to_iterate: Optional[int] = None,
233
231
  frames_only: bool = False,
234
- ) -> tuple[int, int]:
235
- import av
236
- from av.container.input import InputContainer
232
+ ) -> Tuple[int, int]:
233
+ import av # type: ignore
234
+ from av.container.input import InputContainer # type: ignore
237
235
 
238
236
  # Getting fps and frame count from metadata is not reliable
239
237
  # Example: https://github.com/laggykiller/sticker-convert/issues/114
@@ -272,11 +270,12 @@ class CodecInfo:
272
270
  )
273
271
  if frame_count <= 1 or duration_metadata != 0:
274
272
  return frame_count, duration_metadata
275
- else:
276
- duration_n_minus_one = last_frame.pts * time_base_ms
277
- ms_per_frame = duration_n_minus_one / (frame_count - 1)
278
- duration = frame_count * ms_per_frame
279
- return frame_count, int(Decimal(duration).quantize(0, ROUND_HALF_UP))
273
+ duration_n_minus_one = last_frame.pts * time_base_ms
274
+ ms_per_frame = duration_n_minus_one / (frame_count - 1)
275
+ duration = frame_count * ms_per_frame
276
+ return frame_count, int(Decimal(duration).quantize(0, ROUND_HALF_UP))
277
+
278
+ return 0, 0
280
279
 
281
280
  @staticmethod
282
281
  def get_file_codec(file: Union[Path, bytes], file_ext: Optional[str] = None) -> str:
@@ -296,7 +295,7 @@ class CodecInfo:
296
295
  try:
297
296
  with Image.open(file) as im:
298
297
  codec = im.format
299
- if "is_animated" in im.__dir__():
298
+ if "is_animated" in dir(im):
300
299
  animated = im.is_animated
301
300
  else:
302
301
  animated = False
@@ -307,26 +306,25 @@ class CodecInfo:
307
306
  # Unable to distinguish apng and png
308
307
  if animated:
309
308
  return "apng"
310
- else:
311
- return "png"
312
- elif codec is not None:
309
+ return "png"
310
+ if codec is not None:
313
311
  return codec.lower()
314
312
 
315
- import av
316
- from av.error import InvalidDataError
313
+ import av # type: ignore
314
+ from av.error import InvalidDataError # type: ignore
317
315
 
318
316
  try:
319
317
  with av.open(file_ref) as container: # type: ignore
320
- codec = container.streams.video[0].codec_context.name
318
+ return container.streams.video[0].codec_context.name.lower()
321
319
  except InvalidDataError:
322
- return ""
320
+ pass
323
321
 
324
- return codec.lower()
322
+ return ""
325
323
 
326
324
  @staticmethod
327
325
  def get_file_res(
328
326
  file: Union[Path, bytes], file_ext: Optional[str] = None
329
- ) -> tuple[int, int]:
327
+ ) -> Tuple[int, int]:
330
328
  if not file_ext and isinstance(file, Path):
331
329
  file_ext = CodecInfo.get_file_ext(file)
332
330
 
@@ -371,5 +369,4 @@ class CodecInfo:
371
369
  def is_anim(file: Union[Path, bytes]) -> bool:
372
370
  if CodecInfo.get_file_frames(file, check_anim=True) > 1:
373
371
  return True
374
- else:
375
- return False
372
+ return False
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env python3
2
2
  from __future__ import annotations
3
3
 
4
- """
5
- References:
6
- https://github.com/blluv/KakaoTalkEmoticonDownloader
7
- https://github.com/star-39/moe-sticker-bot
8
- """
4
+ from typing import List
5
+
6
+ # References:
7
+ # https://github.com/blluv/KakaoTalkEmoticonDownloader
8
+ # https://github.com/star-39/moe-sticker-bot
9
9
 
10
10
 
11
11
  class DecryptKakao:
12
12
  @staticmethod
13
- def generate_lfsr(key: str) -> list[int]:
13
+ def generate_lfsr(key: str) -> List[int]:
14
14
  d = list(key * 2)
15
15
  seq = [0, 0, 0]
16
16
 
@@ -32,7 +32,7 @@ class DecryptKakao:
32
32
  return seq
33
33
 
34
34
  @staticmethod
35
- def xor_byte(b: int, seq: list[int]) -> int:
35
+ def xor_byte(b: int, seq: List[int]) -> int:
36
36
  flag1 = 1
37
37
  flag2 = 0
38
38
  result = 0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  import os
3
3
  from pathlib import Path
4
- from typing import Optional, Union
4
+ from typing import Optional, Tuple, Union
5
5
 
6
6
  from sticker_convert.job_option import CompOption
7
7
  from sticker_convert.utils.media.codec_info import CodecInfo
@@ -40,13 +40,14 @@ class FormatVerify:
40
40
  def check_presence(file: Union[Path, bytes]) -> bool:
41
41
  if isinstance(file, Path):
42
42
  return Path(file).is_file()
43
- else:
44
- return True
43
+ return True
45
44
 
46
45
  @staticmethod
47
46
  def check_file_res(
48
47
  file: Union[Path, bytes],
49
- res: tuple[tuple[Optional[int], Optional[int]], tuple[Optional[int], Optional[int]]],
48
+ res: Tuple[
49
+ Tuple[Optional[int], Optional[int]], Tuple[Optional[int], Optional[int]]
50
+ ],
50
51
  square: Optional[bool] = None,
51
52
  file_info: Optional[CodecInfo] = None,
52
53
  ) -> bool:
@@ -72,7 +73,7 @@ class FormatVerify:
72
73
  @staticmethod
73
74
  def check_file_fps(
74
75
  file: Union[Path, bytes],
75
- fps: tuple[Optional[int], Optional[int]],
76
+ fps: Tuple[Optional[int], Optional[int]],
76
77
  file_info: Optional[CodecInfo] = None,
77
78
  ) -> bool:
78
79
  if file_info:
@@ -90,7 +91,7 @@ class FormatVerify:
90
91
  @staticmethod
91
92
  def check_file_duration(
92
93
  file: Union[Path, bytes],
93
- duration: tuple[Optional[int], Optional[int]],
94
+ duration: Tuple[Optional[int], Optional[int]],
94
95
  file_info: Optional[CodecInfo] = None,
95
96
  ) -> bool:
96
97
  if file_info:
@@ -110,7 +111,7 @@ class FormatVerify:
110
111
  @staticmethod
111
112
  def check_file_size(
112
113
  file: Union[Path, bytes],
113
- size: tuple[Optional[int], Optional[int]],
114
+ size: Tuple[Optional[int], Optional[int]],
114
115
  file_info: Optional[CodecInfo] = None,
115
116
  ) -> bool:
116
117
  if isinstance(file, Path):
@@ -159,9 +160,9 @@ class FormatVerify:
159
160
  @staticmethod
160
161
  def check_format(
161
162
  file: Union[Path, bytes],
162
- fmt: tuple[tuple[str, ...], tuple[str, ...]],
163
+ fmt: Tuple[Tuple[str, ...], Tuple[str, ...]],
163
164
  file_info: Optional[CodecInfo] = None,
164
- ):
165
+ ) -> bool:
165
166
  if file_info:
166
167
  file_animated = file_info.is_animated
167
168
  file_ext = file_info.file_ext
@@ -182,11 +183,10 @@ class FormatVerify:
182
183
 
183
184
  if len(valid_fmt) == 0:
184
185
  return True
185
- elif file_ext in valid_fmt:
186
+ if file_ext in valid_fmt:
186
187
  return True
187
- elif file_ext in jpg_exts and (".jpg" in valid_fmt or ".jpeg" in valid_fmt):
188
+ if file_ext in jpg_exts and (".jpg" in valid_fmt or ".jpeg" in valid_fmt):
188
189
  return True
189
- elif file_ext in png_exts and (".png" in valid_fmt or ".apng" in valid_fmt):
190
+ if file_ext in png_exts and (".png" in valid_fmt or ".apng" in valid_fmt):
190
191
  return True
191
- else:
192
- return False
192
+ return False
@@ -12,20 +12,19 @@ class UrlDetect:
12
12
  if domain == "signal.art":
13
13
  return "signal"
14
14
 
15
- elif domain in ("telegram.me", "t.me"):
15
+ if domain in ("telegram.me", "t.me"):
16
16
  return "telegram"
17
17
 
18
- elif (
18
+ if (
19
19
  domain in ("store.line.me", "line.me")
20
20
  or url.startswith("line://shop/detail/")
21
21
  or (len(url) == 24 and all(c in string.hexdigits for c in url))
22
22
  ):
23
23
  return "line"
24
24
 
25
- elif domain in ("e.kakao.com", "emoticon.kakao.com") or url.startswith(
25
+ if domain in ("e.kakao.com", "emoticon.kakao.com") or url.startswith(
26
26
  "kakaotalk://store/emoticon/"
27
27
  ):
28
28
  return "kakao"
29
29
 
30
- else:
31
- return None
30
+ return None
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env python3
2
- __version__ = "2.7.2"
2
+
3
+ __version__ = "2.7.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.7.2
3
+ Version: 2.7.4
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -361,7 +361,7 @@ Classifier: Programming Language :: Python :: 3.10
361
361
  Classifier: Programming Language :: Python :: 3.11
362
362
  Classifier: Programming Language :: Python :: 3.12
363
363
  Classifier: Programming Language :: Python :: 3 :: Only
364
- Requires-Python: >=3.7
364
+ Requires-Python: >=3.8
365
365
  Description-Content-Type: text/markdown
366
366
  License-File: LICENSE
367
367
  Requires-Dist: apngasm-python ~=1.2.3
@@ -370,12 +370,12 @@ Requires-Dist: beautifulsoup4 ~=4.12.3
370
370
  Requires-Dist: rookiepy ~=0.3.6
371
371
  Requires-Dist: imagequant ~=1.1.1
372
372
  Requires-Dist: memory-tempfile ~=2.2.3
373
- Requires-Dist: numpy ~=1.26.4
373
+ Requires-Dist: numpy >=1.22.4
374
374
  Requires-Dist: Pillow ~=10.2.0
375
375
  Requires-Dist: pyoxipng ~=9.0.0
376
376
  Requires-Dist: python-telegram-bot ~=20.5
377
377
  Requires-Dist: requests ~=2.31.0
378
- Requires-Dist: rlottie-python ~=1.3.2
378
+ Requires-Dist: rlottie-python ~=1.3.3
379
379
  Requires-Dist: signalstickers-client ~=3.3.0
380
380
  Requires-Dist: sqlcipher3-wheels ~=0.5.2.post1
381
381
  Requires-Dist: tqdm ~=4.66.2
@@ -478,20 +478,20 @@ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--input-dir INPUT_DIR
478
478
  [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
479
479
  [--no-compress]
480
480
  [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}]
481
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER]
482
- [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX]
483
- [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--quality-min QUALITY_MIN]
484
- [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER] [--color-min COLOR_MIN]
485
- [--color-max COLOR_MAX] [--color-power COLOR_POWER] [--duration-min DURATION_MIN]
486
- [--duration-max DURATION_MAX] [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX]
487
- [--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid] [--scale-filter SCALE_FILTER]
488
- [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI]
489
- [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
490
- [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN]
481
+ [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
482
+ [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN]
483
+ [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER]
484
+ [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
485
+ [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER]
486
+ [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--vid-size-max VID_SIZE_MAX]
487
+ [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid]
488
+ [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR]
489
+ [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD]
490
+ [--signal-get-auth] [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN]
491
491
  [--telegram-userid TELEGRAM_USERID] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
492
492
  [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD]
493
- [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
494
- [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
493
+ [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER]
494
+ [--line-get-auth] [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
495
495
 
496
496
  CLI for stickers-convert
497
497
 
@@ -592,7 +592,9 @@ Compression options:
592
592
  --scale-filter SCALE_FILTER
593
593
  Set scale filter. Default as lanczos. Valid options are:
594
594
  - nearest = Use nearest neighbour (Suitable for pixel art)
595
- - bilinear = linear interpolation
595
+ -box = Similar to nearest, but better downscaling
596
+ - bilinear = Linear interpolation
597
+ - hamming = Similar to bilinear, but better downscaling
596
598
  - bicubic = Cubic spline interpolation
597
599
  - lanczos = A high-quality downsampling filter
598
600
  --quantize-method QUANTIZE_METHOD
@@ -1,35 +1,35 @@
1
- sticker_convert/__init__.py,sha256=ZVbMC58kjlCUoBtJA0q9WQLLsqewlMaorkjZpAEAu5U,101
2
- sticker_convert/__main__.py,sha256=hoYnwaH4RGBjx4EA6gwbOviTjy5dhtPkeBbl3QsjNe8,453
3
- sticker_convert/cli.py,sha256=J8NXogh6mP6uebf3be9s138faSitpuYaagA_kwnfwu4,17725
4
- sticker_convert/converter.py,sha256=Ze58juyA3hPaQtgSF4buVJ61GUpSTmVZ1q3OluLwe5I,31141
5
- sticker_convert/definitions.py,sha256=Cci0bh9zSnoNKBmGreT7mkzUoM8SLj_92LqV5ByrkOw,2153
6
- sticker_convert/gui.py,sha256=oBJx1BLoC1F84p7HwIkzvY4h80pd_u8bgnHRmRCUmz0,30233
7
- sticker_convert/job.py,sha256=3o3EAgNbRa3fkNf6GkY3EWmx0lzoOlnKlGPY7d62GN8,25959
8
- sticker_convert/job_option.py,sha256=bPBGesOWRhK0ChXqzklzEoSjy0lIwX39O0OCY44AdPI,7387
9
- sticker_convert/version.py,sha256=s4_I8wYmKNBxy2R8LWmXkKR8-DEM6IrrWSAvOn_qJkA,45
1
+ sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
2
+ sticker_convert/__main__.py,sha256=6RJauR-SCSSTT3TU7FFB6B6PVwsCxO2xZXtmZ3jc2Is,463
3
+ sticker_convert/cli.py,sha256=9juw31O8oVRWHMs8YgUtzX0bLamouDiO4xiqFkjWNP8,17575
4
+ sticker_convert/converter.py,sha256=ZAuRO6Ic6e1nhJc_pBsBlPMVyHZzy87q5Gk_naCRShI,31241
5
+ sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
6
+ sticker_convert/gui.py,sha256=5nl_OYmYTIHgmgX_ctrh-Xjys0geCntVtJj2OWQWoY4,30253
7
+ sticker_convert/job.py,sha256=sibFn95LenFa4CR29txM9FImP6Ib4fUffILGd_r6kK0,25931
8
+ sticker_convert/job_option.py,sha256=niPTGZ4X1iUdkxyVc29oM67bpsUNBX9Um7OOJNa3piE,7521
9
+ sticker_convert/version.py,sha256=BgvWx-3rkv80bo8ilxFsN4mqSAsTcZt0QXEqm7n2uK0,46
10
10
  sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- sticker_convert/downloaders/download_base.py,sha256=V_9Hf8lhNURnYgDRM4bx4BXaiZjltPjKWjofY66xoDI,3289
12
- sticker_convert/downloaders/download_kakao.py,sha256=9YbS-cT95_bbJkE7JjBYZHpuI-iAF2w6_KVAidivNmA,8919
13
- sticker_convert/downloaders/download_line.py,sha256=XJiZh-4LkDozE0Vt_pEKqjGt4sb1DBXxvwlRhXGJmpk,18073
14
- sticker_convert/downloaders/download_signal.py,sha256=2fE0_H8ITwGbK8kJKSbzc9z6akemj-4Ib5qaA-bGFuc,3410
15
- sticker_convert/downloaders/download_telegram.py,sha256=SH4JcdJ7VpELWUFWv6_cmdQilzTEQu7arOnVwfIYbkg,4435
11
+ sticker_convert/downloaders/download_base.py,sha256=5R7c8kwahAflOOYrtSQPnBVQ4T-DsprPUMP7G9wcJX4,2824
12
+ sticker_convert/downloaders/download_kakao.py,sha256=RYrebTxEjKjXAr9xw18r0dMW0dFjSqZxzi8dpaq56TY,8581
13
+ sticker_convert/downloaders/download_line.py,sha256=iQwCWqZBnoKFuQqgTR2JPnxE1RJWMu9eRmg38wST-kM,17918
14
+ sticker_convert/downloaders/download_signal.py,sha256=HMV5SV-WnfJkZ0lC65yY45xlE7_GK1b_ELOPwNTptG8,3225
15
+ sticker_convert/downloaders/download_telegram.py,sha256=ImGveyYoS2NtPiYHUQPEUOXciG76MD9iGAwvC_akXYw,4240
16
16
  sticker_convert/gui_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- sticker_convert/gui_components/gui_utils.py,sha256=bUMPOfKTJpfy5Y3UHjOP_1_8fetpq8LTqw_fmUXHZGY,3459
17
+ sticker_convert/gui_components/gui_utils.py,sha256=okho2cA1Scem_m6rPiYifreFzpFrM21-yUkiAv64EUI,3431
18
18
  sticker_convert/gui_components/frames/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- sticker_convert/gui_components/frames/comp_frame.py,sha256=6gJ-tLnm67yXswnP_SiVa_zYxMZFlSZFKYKsKgm2ZZc,8151
20
- sticker_convert/gui_components/frames/config_frame.py,sha256=vj_Hpe89KF4fFipvriO-wYtqwgucyP-UDPzYVxRzcNs,4310
21
- sticker_convert/gui_components/frames/control_frame.py,sha256=gso3wRBIpdMmjEt4DDoXG09LrhaK9oI6tv9hmqAUkSg,837
22
- sticker_convert/gui_components/frames/cred_frame.py,sha256=_sGyk1pGEPgBbPpxLdIwOJy145O51SGdiF2z1sDiHpw,6505
23
- sticker_convert/gui_components/frames/input_frame.py,sha256=4cjjkgEg8Vbfqb8ZjDyVWrvjdO_6vm-yWkobfElaCHk,5051
24
- sticker_convert/gui_components/frames/output_frame.py,sha256=p7RTtfeTp5qEY8AFlpvBsvwC-ImrTee5IUSU2XpuEBI,4272
25
- sticker_convert/gui_components/frames/progress_frame.py,sha256=uqvVH39j5W_Ego-TXLew0gykQZEwGEzvp1s6XQ7cfL0,3459
26
- sticker_convert/gui_components/frames/right_clicker.py,sha256=HI-1DtZITfkgrihTqoTWXudn9--ug6ht3VzjdQfrStc,705
19
+ sticker_convert/gui_components/frames/comp_frame.py,sha256=Bqdw1cRVIq1ub0TanXN7zBhQdxGuRzR9UvOgOMG5oWA,8137
20
+ sticker_convert/gui_components/frames/config_frame.py,sha256=I2mHL8vJe5E0YKXuN9rb9sXtNq7grpLuvud6g-Aaac8,4324
21
+ sticker_convert/gui_components/frames/control_frame.py,sha256=_XiOJ9JPUfiysDghGG04sEVLrXG9TMVlDZ60W0LhYVI,835
22
+ sticker_convert/gui_components/frames/cred_frame.py,sha256=I3XrOv7kUOsvFWquuzWWpZWbLclqKQXgD7dx5pcTuY4,6499
23
+ sticker_convert/gui_components/frames/input_frame.py,sha256=5Vz1d6J1jkofvvzm43DxeIW_CjWfxa2QPYFnkAAiAfM,5040
24
+ sticker_convert/gui_components/frames/output_frame.py,sha256=n2WLk22h61DoZli8WbFhd-h2CqWAebDXnBa051JBuOc,4260
25
+ sticker_convert/gui_components/frames/progress_frame.py,sha256=UpEPdxsV6knL1d5Y7k2BXKdkav2LAiv6lDFqNSQ-7_U,3474
26
+ sticker_convert/gui_components/frames/right_clicker.py,sha256=dGIvSzEChrkguR80pzUemBNJ39uzJjVJQKeDNUoW3Gk,721
27
27
  sticker_convert/gui_components/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=FSAXuS6d_AWqmFgQgd9P_wO-IlJMgriNmvNBe_CFsVw,32015
29
- sticker_convert/gui_components/windows/base_window.py,sha256=f8TXU8bX54L5T3URZtowSsgkU2fA2d0yIPEEaB5-8-Y,1109
30
- sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=cmXRTPD3dmfyFElbDejGakB9G13UXVBrb0O-lDqelkI,7143
31
- sticker_convert/gui_components/windows/line_get_auth_window.py,sha256=QfuBCX8vSjWAGeVaGMWXmFxeGp4YeNA_o-hZmZCpJHE,3369
32
- sticker_convert/gui_components/windows/signal_get_auth_window.py,sha256=hagP1fhq_63rLOJi5Dt0ZDValuyx2PeTCsmhpyvXQbE,4427
28
+ sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=1UulI_3ZtXdc34aq-hzFyV2WBZOC5OWGFUAMdf7ipU0,32105
29
+ sticker_convert/gui_components/windows/base_window.py,sha256=xBE1peGMPvWsdrFej0CJUVhmQ57GJGvz-cX03nIIhkE,1108
30
+ sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=AvXB2Q8pAPkKILHTvlLGV9jfBcvskCA4arko4nvBTdo,7115
31
+ sticker_convert/gui_components/windows/line_get_auth_window.py,sha256=S4ES_lk2-GDvPokZtYALnUc5zW1VbS4WulNqO9K1aSs,3375
32
+ sticker_convert/gui_components/windows/signal_get_auth_window.py,sha256=oucmrXushgFqIk7qLhFO1toBZ47D_2ciGoQ4jWc8YvI,4422
33
33
  sticker_convert/ios-message-stickers-template/.gitignore,sha256=4uuTph_9eHfqXHUavLOmGOji6aIHOif2bUEU_hCBn4Y,9
34
34
  sticker_convert/ios-message-stickers-template/README.md,sha256=oN0FvJkCWWjSZ3PMrCvY3T1zCsdkZYFgGHAoFh0Kmt8,467
35
35
  sticker_convert/ios-message-stickers-template/.github/FUNDING.yml,sha256=3LlmdSAGDsBA2o_C1iBYTNLwkABnyZuN0zxgPPyd-f8,70
@@ -67,33 +67,34 @@ sticker_convert/resources/appicon.icns,sha256=FB2DVTOQcFfQNZ9RcyG3z9c9k7eOiI1qw0
67
67
  sticker_convert/resources/appicon.ico,sha256=-ldugcl2Yq2pBRTktnhGKWInpKyWzRjCiPvMr3XPTlc,38078
68
68
  sticker_convert/resources/appicon.png,sha256=6XBEQz7PnerqS43aRkwpWolFG4WvKMuQ-st1ly-_JPg,5265
69
69
  sticker_convert/resources/compression.json,sha256=WxC_KejpEreXrd_3YfW0NhDKn6xqBSaRqalVohLq5eI,10569
70
- sticker_convert/resources/emoji.json,sha256=vIRB-0ICtH8ZvyWhUPqc4VU5po-G-z8bTMrfCLBPPdM,408777
71
- sticker_convert/resources/help.json,sha256=-1qYNbjk_APMn-WF0n01PhbMWdYZXv6Lgc_4k366Vz4,5880
70
+ sticker_convert/resources/emoji.json,sha256=sXSuKusyG1L2Stuf9BL5ZqfzOIOdeAeE3RXcrXAsLdY,413367
71
+ sticker_convert/resources/help.json,sha256=PQcISwdoGTZhyxgOBhNJ47z8t3rCiawewbDFHE53f3k,5988
72
72
  sticker_convert/resources/input.json,sha256=sRz8qWaLh2KTjjlPIxz2UfynVn2Bn0olywbb8-qT_Hc,2251
73
73
  sticker_convert/resources/output.json,sha256=QYP2gqDvEaAm5I9bH4NReaB1XMLboevv69u-V8YdZUs,1373
74
74
  sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- sticker_convert/uploaders/compress_wastickers.py,sha256=OpXyUi2-P6n8GOfGAM5fmoYdNcNIl8n1xOwJktdue6Y,6217
76
- sticker_convert/uploaders/upload_base.py,sha256=bqi-jAdijf7ggg6ypQpHkgHEYlxmdY0-soX8z3bJKWA,932
77
- sticker_convert/uploaders/upload_signal.py,sha256=U9Kr0L_yfJZzw3S7K6GVz1O4P5Wyk1an1jnZ90m5KTQ,6790
78
- sticker_convert/uploaders/upload_telegram.py,sha256=HZi1rURmbfXEJI23dvSLD7buXFFw48eZS1ADJFr_r7c,11793
79
- sticker_convert/uploaders/xcode_imessage.py,sha256=q_qhhF7t9W_gPzV8fazgNmcUkKJ3IgGJ3NDd3cqP2i0,13605
80
- sticker_convert/utils/callback.py,sha256=HXgYUzCjLVjFqMH4NAOro6MPLF8_Cdr54V5jCT8LGtg,5360
81
- sticker_convert/utils/url_detect.py,sha256=qu4Yav6r5Ca1X5seFiu--gnMX3VASRSbkBnlljHgCYI,793
82
- sticker_convert/utils/auth/get_kakao_auth.py,sha256=tyCwLanU5ALGLHDX1EklgoiokJ2mIXniz-6j3ISmu6w,9839
83
- sticker_convert/utils/auth/get_line_auth.py,sha256=X41AaRf823fWSuwrnkdMcDT6Yx1GnHWdrH5nc4EdASk,2426
84
- sticker_convert/utils/auth/get_signal_auth.py,sha256=G9kG6zKu92dwYI-qaV_hnMvli43VXz6vuAAHEF0lVRQ,4787
85
- sticker_convert/utils/files/cache_store.py,sha256=ZXB71ODZwPCqxgtQGhl3kR_xJzPsfJ_RrLoSXR7jEGc,1020
86
- sticker_convert/utils/files/json_manager.py,sha256=VbsbMKuLu2bN0lMuaeIXB7o9nqdTyqEteDVHKtVPEqs,553
87
- sticker_convert/utils/files/metadata_handler.py,sha256=eUG-hYyUF0gvW2ofAXIFAZqJuKVSqCNOdXAocCw3NUk,9784
88
- sticker_convert/utils/files/run_bin.py,sha256=XCMc8qKReadv0oKW83lZnhHxXoz4aLvRkqexQKJtUXA,1658
89
- sticker_convert/utils/files/sanitize_filename.py,sha256=xhwqhRc7vqDMLSaPfmmS-GX6n_uXRfRbKaTBUj_-_mM,2228
90
- sticker_convert/utils/media/apple_png_normalize.py,sha256=MdvKZDBxF8W1N60_UiU1G86g77V6wIi7Me_RWbrESgI,3654
91
- sticker_convert/utils/media/codec_info.py,sha256=A9dx0s5c81bU03n4APMZ2p85LndFdaqsc4kpuY2oSLE,13028
92
- sticker_convert/utils/media/decrypt_kakao.py,sha256=0zk5ybSmePRJ_eYl-oVyRZs6dV_Sk9mgKI-oTpd9gsY,1924
93
- sticker_convert/utils/media/format_verify.py,sha256=qKjJN_T4L4nDbQ_LQ1rbnD6jBN8S1fOW1jblQzFYJhc,5737
94
- sticker_convert-2.7.2.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
95
- sticker_convert-2.7.2.dist-info/METADATA,sha256=p0dL9mHOEVinxipMjHjdF-TsvLNcHovUbyNSxjkICas,48162
96
- sticker_convert-2.7.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
97
- sticker_convert-2.7.2.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
98
- sticker_convert-2.7.2.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
99
- sticker_convert-2.7.2.dist-info/RECORD,,
75
+ sticker_convert/uploaders/compress_wastickers.py,sha256=vrrd2huRGEw0Dbd3EqS162MsQHuzFk5rhB6GnD9zhfU,6062
76
+ sticker_convert/uploaders/upload_base.py,sha256=FDNZdMUcamLtnxy1XNMHk1N1MJapTlODLDhod5wqo7g,1386
77
+ sticker_convert/uploaders/upload_signal.py,sha256=6H4GT10d_J9rEA0Ov1CTdNagxuRDjGYtuQYZADV05Lo,6606
78
+ sticker_convert/uploaders/upload_telegram.py,sha256=HC6G5vgOqwoabA-VYSxeQHDg_8SgAcCCaG9iZScuAvo,11716
79
+ sticker_convert/uploaders/xcode_imessage.py,sha256=mwnUTNclq4SFGX8JgFoM-bsvAtsYtrjg6gFPNdRgbWk,11319
80
+ sticker_convert/utils/callback.py,sha256=qMGboov4bd6MnrMrQkIlS4TadgbKaF9R8yeR5twMItU,5450
81
+ sticker_convert/utils/url_detect.py,sha256=Cw3SzHj0xQTgCY8KvXbgFGRn_VhDJuZvH0mWsiQOg5s,769
82
+ sticker_convert/utils/auth/get_kakao_auth.py,sha256=ipAZ1DUd5CMTpUoxRXHVOFC3DKIpxwxpTYAfrOJ6UZ8,9829
83
+ sticker_convert/utils/auth/get_line_auth.py,sha256=WzO5aGL1-_KHTcBA6ymOZLD3vLp35MUj0pG7w08K5Wo,2436
84
+ sticker_convert/utils/auth/get_signal_auth.py,sha256=xTNRouhWIYysNYz13H9nBZr6QzVUjwrhdJAH70CzwzU,4793
85
+ sticker_convert/utils/files/cache_store.py,sha256=etfe614OAhAyrnM5fGeESKq6R88YLNqkqkxSzEmZ0V0,1047
86
+ sticker_convert/utils/files/json_manager.py,sha256=Vr6pZJdLMkrJJWN99210aduVHb0ILyf0SSTaw4TZqgc,541
87
+ sticker_convert/utils/files/json_resources_loader.py,sha256=H3uMn-77wtALwiGAPhA31OIohcZtWvvzXO7rFmM8EMg,535
88
+ sticker_convert/utils/files/metadata_handler.py,sha256=TJpQ-7KdnqQh09hwR6xB_scRLhbJ6D3zgORy3dkf858,9933
89
+ sticker_convert/utils/files/run_bin.py,sha256=QalA9je6liHxiOtxsjsFsIkc2t59quhcJCVpP1X3p50,1743
90
+ sticker_convert/utils/files/sanitize_filename.py,sha256=HBklPGsHRJjFQUIC5rYTQsUrsuTtezZXIEA8CPhLP8A,2156
91
+ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE4l0MygBA1jB-PFiYLEkzk,3657
92
+ sticker_convert/utils/media/codec_info.py,sha256=slKvwLxgJz1txJIN4gJ5dAFDLvZLhnTP29Pm8GYveSM,12984
93
+ sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
94
+ sticker_convert/utils/media/format_verify.py,sha256=Xf94jyqk_6M9IlFGMy0wYIgQKn_yg00nD4XW0CgAbew,5732
95
+ sticker_convert-2.7.4.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
96
+ sticker_convert-2.7.4.dist-info/METADATA,sha256=cHUc7sVAVAmcq5oRqssPho1AfmSXCVaPrEfl8ot1hnk,48316
97
+ sticker_convert-2.7.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
98
+ sticker_convert-2.7.4.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
99
+ sticker_convert-2.7.4.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
100
+ sticker_convert-2.7.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5