sticker-convert 2.7.7__py3-none-any.whl → 2.7.8__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/converter.py +68 -33
- sticker_convert/job.py +3 -4
- sticker_convert/resources/compression.json +11 -11
- sticker_convert/resources/help.json +1 -1
- sticker_convert/utils/media/codec_info.py +8 -8
- sticker_convert/version.py +1 -1
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/METADATA +4 -4
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/RECORD +12 -12
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/LICENSE +0 -0
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/WHEEL +0 -0
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/entry_points.txt +0 -0
- {sticker_convert-2.7.7.dist-info → sticker_convert-2.7.8.dist-info}/top_level.txt +0 -0
sticker_convert/converter.py
CHANGED
@@ -6,10 +6,11 @@ from io import BytesIO
|
|
6
6
|
from math import ceil, floor
|
7
7
|
from pathlib import Path
|
8
8
|
from queue import Queue
|
9
|
-
from typing import TYPE_CHECKING, Any, List, Literal, Optional, Tuple, Union, cast
|
9
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union, cast
|
10
10
|
|
11
11
|
import numpy as np
|
12
12
|
from PIL import Image
|
13
|
+
from PIL import __version__ as PillowVersion
|
13
14
|
|
14
15
|
from sticker_convert.job_option import CompOption
|
15
16
|
from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
|
@@ -378,10 +379,10 @@ class StickerConvert:
|
|
378
379
|
self.frames_raw.append(np.asarray(im.convert("RGBA")))
|
379
380
|
|
380
381
|
def _frames_import_pyav(self) -> None:
|
381
|
-
import av
|
382
|
-
from av.codec.context import CodecContext
|
383
|
-
from av.container.input import InputContainer
|
384
|
-
from av.video.codeccontext import VideoCodecContext
|
382
|
+
import av
|
383
|
+
from av.codec.context import CodecContext
|
384
|
+
from av.container.input import InputContainer
|
385
|
+
from av.video.codeccontext import VideoCodecContext
|
385
386
|
|
386
387
|
# Crashes when handling some webm in yuv420p and convert to rgba
|
387
388
|
# https://github.com/PyAV-Org/PyAV/issues/1166
|
@@ -390,16 +391,17 @@ class StickerConvert:
|
|
390
391
|
file = self.in_f.as_posix()
|
391
392
|
else:
|
392
393
|
file = BytesIO(self.in_f)
|
393
|
-
with av.open(file) as container:
|
394
|
+
with av.open(file) as container:
|
394
395
|
container = cast(InputContainer, container)
|
395
396
|
context = container.streams.video[0].codec_context
|
396
397
|
if context.name == "vp8":
|
397
|
-
context = CodecContext.create("libvpx", "r")
|
398
|
+
context = cast(VideoCodecContext, CodecContext.create("libvpx", "r"))
|
398
399
|
elif context.name == "vp9":
|
399
|
-
context =
|
400
|
-
|
400
|
+
context = cast(
|
401
|
+
VideoCodecContext, CodecContext.create("libvpx-vp9", "r")
|
402
|
+
)
|
401
403
|
|
402
|
-
for packet in container.demux(container.streams.video):
|
404
|
+
for packet in container.demux(container.streams.video):
|
403
405
|
for frame in context.decode(packet):
|
404
406
|
if frame.width % 2 != 0:
|
405
407
|
width = frame.width - 1
|
@@ -410,22 +412,22 @@ class StickerConvert:
|
|
410
412
|
else:
|
411
413
|
height = frame.height
|
412
414
|
if frame.format.name == "yuv420p":
|
413
|
-
rgb_array = frame.to_ndarray(format="rgb24")
|
415
|
+
rgb_array = frame.to_ndarray(format="rgb24")
|
414
416
|
cast("np.ndarray[Any, Any]", rgb_array)
|
415
417
|
rgba_array = np.dstack(
|
416
418
|
(
|
417
419
|
rgb_array,
|
418
420
|
np.zeros(rgb_array.shape[:2], dtype=np.uint8) + 255,
|
419
|
-
)
|
421
|
+
)
|
420
422
|
)
|
421
423
|
else:
|
422
424
|
# yuva420p may cause crash
|
423
425
|
# https://github.com/laggykiller/sticker-convert/issues/114
|
424
|
-
frame = frame.reformat(
|
426
|
+
frame = frame.reformat(
|
425
427
|
width=width,
|
426
428
|
height=height,
|
427
429
|
format="yuva420p",
|
428
|
-
dst_colorspace=1,
|
430
|
+
dst_colorspace=1,
|
429
431
|
)
|
430
432
|
|
431
433
|
# https://stackoverflow.com/questions/72308308/converting-yuv-to-rgb-in-python-coefficients-work-with-array-dont-work-with-n
|
@@ -522,7 +524,7 @@ class StickerConvert:
|
|
522
524
|
elif self.opt_comp.scale_filter == "lanczos":
|
523
525
|
resample = Image.LANCZOS
|
524
526
|
else:
|
525
|
-
resample = Image.
|
527
|
+
resample = Image.BICUBIC
|
526
528
|
|
527
529
|
for frame in frames_in:
|
528
530
|
with Image.fromarray(frame, "RGBA") as im: # type: ignore
|
@@ -615,6 +617,8 @@ class StickerConvert:
|
|
615
617
|
self._frames_export_png()
|
616
618
|
elif self.out_f.suffix == ".webp" and is_animated:
|
617
619
|
self._frames_export_webp()
|
620
|
+
elif self.out_f.suffix == ".gif":
|
621
|
+
self._frames_export_gif()
|
618
622
|
elif self.out_f.suffix in (".webm", ".mp4", ".mkv") or is_animated:
|
619
623
|
self._frames_export_pyav()
|
620
624
|
else:
|
@@ -629,22 +633,17 @@ class StickerConvert:
|
|
629
633
|
)
|
630
634
|
|
631
635
|
def _frames_export_pyav(self) -> None:
|
632
|
-
import av
|
633
|
-
from av.
|
634
|
-
from av.video.stream import VideoStream # type: ignore
|
636
|
+
import av
|
637
|
+
from av.video.stream import VideoStream
|
635
638
|
|
636
|
-
options = {}
|
639
|
+
options: Dict[str, str] = {}
|
637
640
|
|
638
641
|
if isinstance(self.quality, int):
|
639
642
|
# Seems not actually working
|
640
643
|
options["quality"] = str(self.quality)
|
641
644
|
options["lossless"] = "0"
|
642
645
|
|
643
|
-
if self.out_f.suffix
|
644
|
-
codec = "gif"
|
645
|
-
pixel_format = "rgb8"
|
646
|
-
options["loop"] = "0"
|
647
|
-
elif self.out_f.suffix in (".apng", ".png"):
|
646
|
+
if self.out_f.suffix in (".apng", ".png"):
|
648
647
|
codec = "apng"
|
649
648
|
pixel_format = "rgba"
|
650
649
|
options["plays"] = "0"
|
@@ -657,11 +656,10 @@ class StickerConvert:
|
|
657
656
|
pixel_format = "yuv420p"
|
658
657
|
options["loop"] = "0"
|
659
658
|
|
660
|
-
with av.open(
|
659
|
+
with av.open(
|
661
660
|
self.tmp_f, "w", format=self.out_f.suffix.replace(".", "")
|
662
661
|
) as output:
|
663
|
-
|
664
|
-
out_stream = output.add_stream(codec, rate=self.fps, options=options) # type: ignore
|
662
|
+
out_stream = output.add_stream(codec, rate=self.fps, options=options)
|
665
663
|
out_stream = cast(VideoStream, out_stream)
|
666
664
|
assert isinstance(self.res_w, int) and isinstance(self.res_h, int)
|
667
665
|
out_stream.width = self.res_w
|
@@ -669,12 +667,49 @@ class StickerConvert:
|
|
669
667
|
out_stream.pix_fmt = pixel_format
|
670
668
|
|
671
669
|
for frame in self.frames_processed:
|
672
|
-
av_frame = av.VideoFrame.from_ndarray(frame, format="rgba")
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
670
|
+
av_frame = av.VideoFrame.from_ndarray(frame, format="rgba")
|
671
|
+
output.mux(out_stream.encode(av_frame))
|
672
|
+
output.mux(out_stream.encode())
|
673
|
+
|
674
|
+
def _frames_export_gif(self) -> None:
|
675
|
+
extra_kwargs: Dict[str, Any] = {}
|
676
|
+
|
677
|
+
# disposal=2 on gif cause flicker in image with transparency
|
678
|
+
# Occurs in Pillow == 10.2.0
|
679
|
+
# https://github.com/python-pillow/Pillow/issues/7787
|
680
|
+
if PillowVersion == "10.2.0":
|
681
|
+
extra_kwargs["optimize"] = False
|
682
|
+
else:
|
683
|
+
extra_kwargs["optimize"] = True
|
684
|
+
|
685
|
+
# Only enable transparency if all pixels have alpha channel
|
686
|
+
# with value of 0 or 255
|
687
|
+
alpha_channel_values = np.unique(np.array(self.frames_raw)[:, :, :, 3])
|
688
|
+
illegals = np.setxor1d(
|
689
|
+
alpha_channel_values, [0, 255]
|
690
|
+
) # Find all values not 0 or 255
|
691
|
+
if illegals.size == 0:
|
692
|
+
extra_kwargs["transparency"] = 0
|
693
|
+
extra_kwargs["disposal"] = 2
|
694
|
+
im_out = [self.quantize(Image.fromarray(i)) for i in self.frames_processed]
|
695
|
+
else:
|
696
|
+
im_out = [
|
697
|
+
self.quantize(Image.fromarray(i).convert("RGB")).convert("RGB")
|
698
|
+
for i in self.frames_processed
|
699
|
+
]
|
700
|
+
|
701
|
+
if self.fps:
|
702
|
+
extra_kwargs["save_all"] = True
|
703
|
+
extra_kwargs["append_images"] = im_out[1:]
|
704
|
+
extra_kwargs["duration"] = int(1000 / self.fps)
|
705
|
+
extra_kwargs["loop"] = 0
|
706
|
+
|
707
|
+
im_out[0].save(
|
708
|
+
self.tmp_f,
|
709
|
+
format="GIF",
|
710
|
+
quality=self.quality,
|
711
|
+
**extra_kwargs,
|
712
|
+
)
|
678
713
|
|
679
714
|
def _frames_export_webp(self) -> None:
|
680
715
|
import webp # type: ignore
|
sticker_convert/job.py
CHANGED
@@ -29,7 +29,6 @@ from sticker_convert.utils.files.json_resources_loader import OUTPUT_JSON
|
|
29
29
|
from sticker_convert.utils.files.metadata_handler import MetadataHandler
|
30
30
|
from sticker_convert.utils.media.codec_info import CodecInfo
|
31
31
|
|
32
|
-
CbQueueType = Queue[CbQueueItemType]
|
33
32
|
WorkListItemType = Optional[Tuple[Callable[..., Any], Tuple[Any, ...]]]
|
34
33
|
if TYPE_CHECKING:
|
35
34
|
# mypy complains about this
|
@@ -59,7 +58,7 @@ class Executor:
|
|
59
58
|
# Especially when using scale_filter=nearest
|
60
59
|
self.work_list: WorkListType = self.manager.list()
|
61
60
|
self.results_queue: Queue[Any] = self.manager.Queue()
|
62
|
-
self.cb_queue:
|
61
|
+
self.cb_queue: Queue[CbQueueItemType] = self.manager.Queue()
|
63
62
|
self.cb_return = CallbackReturn()
|
64
63
|
self.processes: List[Process] = []
|
65
64
|
|
@@ -76,7 +75,7 @@ class Executor:
|
|
76
75
|
|
77
76
|
def cb_thread(
|
78
77
|
self,
|
79
|
-
cb_queue:
|
78
|
+
cb_queue: Queue[CbQueueItemType],
|
80
79
|
cb_return: CallbackReturn,
|
81
80
|
) -> None:
|
82
81
|
for i in iter(cb_queue.get, None):
|
@@ -113,7 +112,7 @@ class Executor:
|
|
113
112
|
def worker(
|
114
113
|
work_list: WorkListType,
|
115
114
|
results_queue: Queue[Any],
|
116
|
-
cb_queue:
|
115
|
+
cb_queue: Queue[CbQueueItemType],
|
117
116
|
cb_return: CallbackReturn,
|
118
117
|
) -> None:
|
119
118
|
while True:
|
@@ -40,7 +40,7 @@
|
|
40
40
|
},
|
41
41
|
"steps": 16,
|
42
42
|
"fake_vid": false,
|
43
|
-
"scale_filter": "
|
43
|
+
"scale_filter": "bicubic",
|
44
44
|
"quantize_method": "imagequant",
|
45
45
|
"default_emoji": "😀"
|
46
46
|
},
|
@@ -85,7 +85,7 @@
|
|
85
85
|
},
|
86
86
|
"steps": 16,
|
87
87
|
"fake_vid": false,
|
88
|
-
"scale_filter": "
|
88
|
+
"scale_filter": "bicubic",
|
89
89
|
"quantize_method": "imagequant",
|
90
90
|
"default_emoji": "😀"
|
91
91
|
},
|
@@ -130,7 +130,7 @@
|
|
130
130
|
},
|
131
131
|
"steps": 16,
|
132
132
|
"fake_vid": false,
|
133
|
-
"scale_filter": "
|
133
|
+
"scale_filter": "bicubic",
|
134
134
|
"quantize_method": "imagequant",
|
135
135
|
"default_emoji": "😀"
|
136
136
|
},
|
@@ -175,7 +175,7 @@
|
|
175
175
|
},
|
176
176
|
"steps": 16,
|
177
177
|
"fake_vid": false,
|
178
|
-
"scale_filter": "
|
178
|
+
"scale_filter": "bicubic",
|
179
179
|
"quantize_method": "imagequant",
|
180
180
|
"default_emoji": "😀"
|
181
181
|
},
|
@@ -220,7 +220,7 @@
|
|
220
220
|
},
|
221
221
|
"steps": 16,
|
222
222
|
"fake_vid": true,
|
223
|
-
"scale_filter": "
|
223
|
+
"scale_filter": "bicubic",
|
224
224
|
"quantize_method": "imagequant",
|
225
225
|
"default_emoji": "😀"
|
226
226
|
},
|
@@ -265,7 +265,7 @@
|
|
265
265
|
},
|
266
266
|
"steps": 16,
|
267
267
|
"fake_vid": false,
|
268
|
-
"scale_filter": "
|
268
|
+
"scale_filter": "bicubic",
|
269
269
|
"quantize_method": "imagequant",
|
270
270
|
"default_emoji": "😀"
|
271
271
|
},
|
@@ -310,7 +310,7 @@
|
|
310
310
|
},
|
311
311
|
"steps": 16,
|
312
312
|
"fake_vid": false,
|
313
|
-
"scale_filter": "
|
313
|
+
"scale_filter": "bicubic",
|
314
314
|
"quantize_method": "imagequant",
|
315
315
|
"default_emoji": "😀"
|
316
316
|
},
|
@@ -355,7 +355,7 @@
|
|
355
355
|
},
|
356
356
|
"steps": 16,
|
357
357
|
"fake_vid": false,
|
358
|
-
"scale_filter": "
|
358
|
+
"scale_filter": "bicubic",
|
359
359
|
"quantize_method": "imagequant",
|
360
360
|
"default_emoji": "😀"
|
361
361
|
},
|
@@ -400,7 +400,7 @@
|
|
400
400
|
},
|
401
401
|
"steps": 16,
|
402
402
|
"fake_vid": false,
|
403
|
-
"scale_filter": "
|
403
|
+
"scale_filter": "bicubic",
|
404
404
|
"quantize_method": "imagequant",
|
405
405
|
"default_emoji": "😀"
|
406
406
|
},
|
@@ -445,7 +445,7 @@
|
|
445
445
|
},
|
446
446
|
"steps": 16,
|
447
447
|
"fake_vid": false,
|
448
|
-
"scale_filter": "
|
448
|
+
"scale_filter": "bicubic",
|
449
449
|
"quantize_method": "imagequant",
|
450
450
|
"default_emoji": "😀"
|
451
451
|
},
|
@@ -490,7 +490,7 @@
|
|
490
490
|
},
|
491
491
|
"steps": 16,
|
492
492
|
"fake_vid": false,
|
493
|
-
"scale_filter": "
|
493
|
+
"scale_filter": "bicubic",
|
494
494
|
"quantize_method": "imagequant",
|
495
495
|
"default_emoji": "😀"
|
496
496
|
}
|
@@ -45,7 +45,7 @@
|
|
45
45
|
"vid_format": "Set file format if input is animated.",
|
46
46
|
"img_format": "Set file format if input is static.",
|
47
47
|
"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.",
|
48
|
-
"scale_filter": "Set scale filter. Default as
|
48
|
+
"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",
|
49
49
|
"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",
|
50
50
|
"cache_dir": "Set custom cache directory.\nUseful for debugging, or speed up conversion if cache_dir is on RAM disk.",
|
51
51
|
"default_emoji": "Set the default emoji for uploading Signal and Telegram sticker packs."
|
@@ -230,8 +230,8 @@ class CodecInfo:
|
|
230
230
|
frames_to_iterate: Optional[int] = None,
|
231
231
|
frames_only: bool = False,
|
232
232
|
) -> Tuple[int, int]:
|
233
|
-
import av
|
234
|
-
from av.container.input import InputContainer
|
233
|
+
import av
|
234
|
+
from av.container.input import InputContainer
|
235
235
|
|
236
236
|
# Getting fps and frame count from metadata is not reliable
|
237
237
|
# Example: https://github.com/laggykiller/sticker-convert/issues/114
|
@@ -242,7 +242,7 @@ class CodecInfo:
|
|
242
242
|
else:
|
243
243
|
file_ref = BytesIO(file)
|
244
244
|
|
245
|
-
with av.open(file_ref) as container:
|
245
|
+
with av.open(file_ref) as container:
|
246
246
|
container = cast(InputContainer, container)
|
247
247
|
stream = container.streams.video[0]
|
248
248
|
if container.duration:
|
@@ -257,7 +257,7 @@ class CodecInfo:
|
|
257
257
|
|
258
258
|
frame_count = 0
|
259
259
|
last_frame = None
|
260
|
-
for frame_count, frame in enumerate(container.decode(stream)):
|
260
|
+
for frame_count, frame in enumerate(container.decode(stream)):
|
261
261
|
if frames_to_iterate is not None and frame_count == frames_to_iterate:
|
262
262
|
break
|
263
263
|
last_frame = frame
|
@@ -310,11 +310,11 @@ class CodecInfo:
|
|
310
310
|
if codec is not None:
|
311
311
|
return codec.lower()
|
312
312
|
|
313
|
-
import av
|
314
|
-
from av.error import InvalidDataError
|
313
|
+
import av
|
314
|
+
from av.error import InvalidDataError
|
315
315
|
|
316
316
|
try:
|
317
|
-
with av.open(file_ref) as container:
|
317
|
+
with av.open(file_ref) as container:
|
318
318
|
return container.streams.video[0].codec_context.name.lower()
|
319
319
|
except InvalidDataError:
|
320
320
|
pass
|
@@ -354,7 +354,7 @@ class CodecInfo:
|
|
354
354
|
else:
|
355
355
|
file_ref = BytesIO(file)
|
356
356
|
|
357
|
-
with av.open(file_ref) as container:
|
357
|
+
with av.open(file_ref) as container:
|
358
358
|
stream = container.streams.video[0]
|
359
359
|
width = stream.width
|
360
360
|
height = stream.height
|
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.8
|
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>
|
@@ -367,13 +367,13 @@ License-File: LICENSE
|
|
367
367
|
Requires-Dist: aiolimiter ~=1.1.0
|
368
368
|
Requires-Dist: anyio ~=3.7.1
|
369
369
|
Requires-Dist: apngasm-python ~=1.2.3
|
370
|
-
Requires-Dist: av ~=
|
370
|
+
Requires-Dist: av ~=12.0.0
|
371
371
|
Requires-Dist: beautifulsoup4 ~=4.12.3
|
372
372
|
Requires-Dist: rookiepy ~=0.3.6
|
373
373
|
Requires-Dist: imagequant ~=1.1.1
|
374
374
|
Requires-Dist: memory-tempfile ~=2.2.3
|
375
375
|
Requires-Dist: numpy >=1.22.4
|
376
|
-
Requires-Dist: Pillow
|
376
|
+
Requires-Dist: Pillow ==10.1.0
|
377
377
|
Requires-Dist: pyoxipng ~=9.0.0
|
378
378
|
Requires-Dist: python-telegram-bot ~=20.5
|
379
379
|
Requires-Dist: requests ~=2.31.0
|
@@ -592,7 +592,7 @@ Compression options:
|
|
592
592
|
(1) Size limit for video is larger than image;
|
593
593
|
(2) Mix image and video into same pack.
|
594
594
|
--scale-filter SCALE_FILTER
|
595
|
-
Set scale filter. Default as
|
595
|
+
Set scale filter. Default as bicubic. Valid options are:
|
596
596
|
- nearest = Use nearest neighbour (Suitable for pixel art)
|
597
597
|
-box = Similar to nearest, but better downscaling
|
598
598
|
- bilinear = Linear interpolation
|
@@ -1,12 +1,12 @@
|
|
1
1
|
sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
|
2
2
|
sticker_convert/__main__.py,sha256=6RJauR-SCSSTT3TU7FFB6B6PVwsCxO2xZXtmZ3jc2Is,463
|
3
3
|
sticker_convert/cli.py,sha256=LXX-LPlFeFKZLc7LKjdtDDLtOqmognEze0kMSr8Vj50,17543
|
4
|
-
sticker_convert/converter.py,sha256=
|
4
|
+
sticker_convert/converter.py,sha256=5NUaWk7V0cvckC1wo_snnLGnvEQSAOcGksKOlpVIaxw,32178
|
5
5
|
sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
|
6
6
|
sticker_convert/gui.py,sha256=N3JTsxYtzcHIjrY1FrMczCe3U_bt8E_-3BAdHH0t8L8,30104
|
7
|
-
sticker_convert/job.py,sha256=
|
7
|
+
sticker_convert/job.py,sha256=tJXqQYL_Px300SkUBUwmublxW3q93AaAe217UTNAaEQ,25829
|
8
8
|
sticker_convert/job_option.py,sha256=niPTGZ4X1iUdkxyVc29oM67bpsUNBX9Um7OOJNa3piE,7521
|
9
|
-
sticker_convert/version.py,sha256=
|
9
|
+
sticker_convert/version.py,sha256=TL28GjTJoXzq0tO0CxkKJG8vE1gVrvMnHwexp2lsNSs,46
|
10
10
|
sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
sticker_convert/downloaders/download_base.py,sha256=5R7c8kwahAflOOYrtSQPnBVQ4T-DsprPUMP7G9wcJX4,2824
|
12
12
|
sticker_convert/downloaders/download_kakao.py,sha256=RYrebTxEjKjXAr9xw18r0dMW0dFjSqZxzi8dpaq56TY,8581
|
@@ -66,9 +66,9 @@ sticker_convert/resources/NotoColorEmoji.ttf,sha256=LurIVaCIA8bSCfjrdO1feYr0bhKL
|
|
66
66
|
sticker_convert/resources/appicon.icns,sha256=FB2DVTOQcFfQNZ9RcyG3z9c9k7eOiI1qw0IJhXMRFg4,5404
|
67
67
|
sticker_convert/resources/appicon.ico,sha256=-ldugcl2Yq2pBRTktnhGKWInpKyWzRjCiPvMr3XPTlc,38078
|
68
68
|
sticker_convert/resources/appicon.png,sha256=6XBEQz7PnerqS43aRkwpWolFG4WvKMuQ-st1ly-_JPg,5265
|
69
|
-
sticker_convert/resources/compression.json,sha256=
|
69
|
+
sticker_convert/resources/compression.json,sha256=CRTqstXu-9Ybr-zrL2PHaQWeaN1ZPlAQ_j19GunC7Qw,10569
|
70
70
|
sticker_convert/resources/emoji.json,sha256=sXSuKusyG1L2Stuf9BL5ZqfzOIOdeAeE3RXcrXAsLdY,413367
|
71
|
-
sticker_convert/resources/help.json,sha256=
|
71
|
+
sticker_convert/resources/help.json,sha256=nBu8OtZAJUz7Gp7RFDfBYmOPjfwJ_6vgyzXJDRpKCng,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
|
@@ -89,12 +89,12 @@ sticker_convert/utils/files/metadata_handler.py,sha256=TJpQ-7KdnqQh09hwR6xB_scRL
|
|
89
89
|
sticker_convert/utils/files/run_bin.py,sha256=QalA9je6liHxiOtxsjsFsIkc2t59quhcJCVpP1X3p50,1743
|
90
90
|
sticker_convert/utils/files/sanitize_filename.py,sha256=HBklPGsHRJjFQUIC5rYTQsUrsuTtezZXIEA8CPhLP8A,2156
|
91
91
|
sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE4l0MygBA1jB-PFiYLEkzk,3657
|
92
|
-
sticker_convert/utils/media/codec_info.py,sha256=
|
92
|
+
sticker_convert/utils/media/codec_info.py,sha256=JHHlfCLSpepYFv6TSL1XqwUJoVOpOPFxurRtduplPGY,12856
|
93
93
|
sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
|
94
94
|
sticker_convert/utils/media/format_verify.py,sha256=Xf94jyqk_6M9IlFGMy0wYIgQKn_yg00nD4XW0CgAbew,5732
|
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.
|
100
|
-
sticker_convert-2.7.
|
95
|
+
sticker_convert-2.7.8.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
|
96
|
+
sticker_convert-2.7.8.dist-info/METADATA,sha256=WONUxj7AhacJPSsg1y9Viqi6hKmytMRVqaub2MS5VAU,48379
|
97
|
+
sticker_convert-2.7.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
98
|
+
sticker_convert-2.7.8.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
|
99
|
+
sticker_convert-2.7.8.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
|
100
|
+
sticker_convert-2.7.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|