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.
- sticker_convert/__init__.py +1 -0
- sticker_convert/__main__.py +3 -1
- sticker_convert/cli.py +20 -24
- sticker_convert/converter.py +108 -119
- sticker_convert/definitions.py +8 -12
- sticker_convert/downloaders/download_base.py +14 -31
- sticker_convert/downloaders/download_kakao.py +25 -39
- sticker_convert/downloaders/download_line.py +24 -33
- sticker_convert/downloaders/download_signal.py +7 -16
- sticker_convert/downloaders/download_telegram.py +6 -15
- sticker_convert/gui.py +53 -61
- sticker_convert/gui_components/frames/comp_frame.py +11 -20
- sticker_convert/gui_components/frames/config_frame.py +9 -9
- sticker_convert/gui_components/frames/control_frame.py +3 -3
- sticker_convert/gui_components/frames/cred_frame.py +12 -18
- sticker_convert/gui_components/frames/input_frame.py +9 -15
- sticker_convert/gui_components/frames/output_frame.py +9 -15
- sticker_convert/gui_components/frames/progress_frame.py +8 -8
- sticker_convert/gui_components/frames/right_clicker.py +2 -2
- sticker_convert/gui_components/gui_utils.py +6 -8
- sticker_convert/gui_components/windows/advanced_compression_window.py +23 -32
- sticker_convert/gui_components/windows/base_window.py +6 -6
- sticker_convert/gui_components/windows/kakao_get_auth_window.py +5 -11
- sticker_convert/gui_components/windows/line_get_auth_window.py +5 -5
- sticker_convert/gui_components/windows/signal_get_auth_window.py +6 -6
- sticker_convert/job.py +84 -90
- sticker_convert/job_option.py +36 -32
- sticker_convert/resources/emoji.json +334 -70
- sticker_convert/resources/help.json +1 -1
- sticker_convert/uploaders/compress_wastickers.py +19 -30
- sticker_convert/uploaders/upload_base.py +19 -13
- sticker_convert/uploaders/upload_signal.py +20 -33
- sticker_convert/uploaders/upload_telegram.py +21 -28
- sticker_convert/uploaders/xcode_imessage.py +30 -95
- sticker_convert/utils/auth/get_kakao_auth.py +7 -8
- sticker_convert/utils/auth/get_line_auth.py +5 -6
- sticker_convert/utils/auth/get_signal_auth.py +7 -7
- sticker_convert/utils/callback.py +31 -23
- sticker_convert/utils/files/cache_store.py +6 -8
- sticker_convert/utils/files/json_manager.py +6 -7
- sticker_convert/utils/files/json_resources_loader.py +12 -0
- sticker_convert/utils/files/metadata_handler.py +93 -84
- sticker_convert/utils/files/run_bin.py +11 -10
- sticker_convert/utils/files/sanitize_filename.py +30 -28
- sticker_convert/utils/media/apple_png_normalize.py +3 -2
- sticker_convert/utils/media/codec_info.py +41 -44
- sticker_convert/utils/media/decrypt_kakao.py +7 -7
- sticker_convert/utils/media/format_verify.py +14 -14
- sticker_convert/utils/url_detect.py +4 -5
- sticker_convert/version.py +2 -1
- {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/METADATA +19 -17
- {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/RECORD +56 -55
- {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/WHEEL +1 -1
- {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/LICENSE +0 -0
- {sticker_convert-2.7.2.dist-info → sticker_convert-2.7.4.dist-info}/entry_points.txt +0 -0
- {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__(
|
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 =
|
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
|
-
) ->
|
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
|
-
|
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
|
-
|
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
|
-
|
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]) ->
|
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
|
-
) ->
|
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
|
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
|
-
|
193
|
-
|
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
|
-
) ->
|
199
|
+
) -> Tuple[int, int]:
|
199
200
|
total_duration = 0
|
200
201
|
frames = 0
|
201
202
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
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
|
-
|
227
|
-
|
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
|
-
) ->
|
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
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
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
|
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
|
-
|
311
|
-
|
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
|
-
|
318
|
+
return container.streams.video[0].codec_context.name.lower()
|
321
319
|
except InvalidDataError:
|
322
|
-
|
320
|
+
pass
|
323
321
|
|
324
|
-
return
|
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
|
-
) ->
|
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
|
-
|
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
|
-
|
6
|
-
|
7
|
-
https://github.com/
|
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) ->
|
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:
|
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
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
-
|
186
|
+
if file_ext in valid_fmt:
|
186
187
|
return True
|
187
|
-
|
188
|
+
if file_ext in jpg_exts and (".jpg" in valid_fmt or ".jpeg" in valid_fmt):
|
188
189
|
return True
|
189
|
-
|
190
|
+
if file_ext in png_exts and (".png" in valid_fmt or ".apng" in valid_fmt):
|
190
191
|
return True
|
191
|
-
|
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
|
-
|
15
|
+
if domain in ("telegram.me", "t.me"):
|
16
16
|
return "telegram"
|
17
17
|
|
18
|
-
|
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
|
-
|
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
|
-
|
31
|
-
return None
|
30
|
+
return None
|
sticker_convert/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: sticker-convert
|
3
|
-
Version: 2.7.
|
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.
|
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
|
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.
|
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]
|
482
|
-
[--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN]
|
483
|
-
[--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER]
|
484
|
-
[--quality-
|
485
|
-
[--color-
|
486
|
-
[--duration-
|
487
|
-
[--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid]
|
488
|
-
[--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR]
|
489
|
-
[--
|
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]
|
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
|
-
-
|
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=
|
2
|
-
sticker_convert/__main__.py,sha256=
|
3
|
-
sticker_convert/cli.py,sha256=
|
4
|
-
sticker_convert/converter.py,sha256=
|
5
|
-
sticker_convert/definitions.py,sha256=
|
6
|
-
sticker_convert/gui.py,sha256=
|
7
|
-
sticker_convert/job.py,sha256=
|
8
|
-
sticker_convert/job_option.py,sha256=
|
9
|
-
sticker_convert/version.py,sha256=
|
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=
|
12
|
-
sticker_convert/downloaders/download_kakao.py,sha256=
|
13
|
-
sticker_convert/downloaders/download_line.py,sha256=
|
14
|
-
sticker_convert/downloaders/download_signal.py,sha256=
|
15
|
-
sticker_convert/downloaders/download_telegram.py,sha256=
|
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=
|
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=
|
20
|
-
sticker_convert/gui_components/frames/config_frame.py,sha256=
|
21
|
-
sticker_convert/gui_components/frames/control_frame.py,sha256=
|
22
|
-
sticker_convert/gui_components/frames/cred_frame.py,sha256=
|
23
|
-
sticker_convert/gui_components/frames/input_frame.py,sha256=
|
24
|
-
sticker_convert/gui_components/frames/output_frame.py,sha256=
|
25
|
-
sticker_convert/gui_components/frames/progress_frame.py,sha256=
|
26
|
-
sticker_convert/gui_components/frames/right_clicker.py,sha256=
|
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=
|
29
|
-
sticker_convert/gui_components/windows/base_window.py,sha256=
|
30
|
-
sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=
|
31
|
-
sticker_convert/gui_components/windows/line_get_auth_window.py,sha256=
|
32
|
-
sticker_convert/gui_components/windows/signal_get_auth_window.py,sha256=
|
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=
|
71
|
-
sticker_convert/resources/help.json,sha256
|
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=
|
76
|
-
sticker_convert/uploaders/upload_base.py,sha256=
|
77
|
-
sticker_convert/uploaders/upload_signal.py,sha256=
|
78
|
-
sticker_convert/uploaders/upload_telegram.py,sha256=
|
79
|
-
sticker_convert/uploaders/xcode_imessage.py,sha256=
|
80
|
-
sticker_convert/utils/callback.py,sha256=
|
81
|
-
sticker_convert/utils/url_detect.py,sha256=
|
82
|
-
sticker_convert/utils/auth/get_kakao_auth.py,sha256=
|
83
|
-
sticker_convert/utils/auth/get_line_auth.py,sha256=
|
84
|
-
sticker_convert/utils/auth/get_signal_auth.py,sha256=
|
85
|
-
sticker_convert/utils/files/cache_store.py,sha256=
|
86
|
-
sticker_convert/utils/files/json_manager.py,sha256=
|
87
|
-
sticker_convert/utils/files/
|
88
|
-
sticker_convert/utils/files/
|
89
|
-
sticker_convert/utils/files/
|
90
|
-
sticker_convert/utils/
|
91
|
-
sticker_convert/utils/media/
|
92
|
-
sticker_convert/utils/media/
|
93
|
-
sticker_convert/utils/media/
|
94
|
-
sticker_convert
|
95
|
-
sticker_convert-2.7.
|
96
|
-
sticker_convert-2.7.
|
97
|
-
sticker_convert-2.7.
|
98
|
-
sticker_convert-2.7.
|
99
|
-
sticker_convert-2.7.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|