sticker-convert 2.11.1__py3-none-any.whl → 2.11.3__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- sticker_convert/converter.py +9 -5
- sticker_convert/downloaders/download_signal.py +13 -1
- sticker_convert/gui.py +2 -4
- sticker_convert/job.py +6 -1
- sticker_convert/uploaders/upload_signal.py +62 -36
- sticker_convert/version.py +1 -1
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/METADATA +7 -4
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/RECORD +12 -12
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/LICENSE +0 -0
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/WHEEL +0 -0
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/entry_points.txt +0 -0
- {sticker_convert-2.11.1.dist-info → sticker_convert-2.11.3.dist-info}/top_level.txt +0 -0
sticker_convert/converter.py
CHANGED
@@ -284,10 +284,14 @@ class StickerConvert:
|
|
284
284
|
return self.compress_fail()
|
285
285
|
|
286
286
|
def check_if_compatible(self) -> Optional[bytes]:
|
287
|
+
f_fmt = self.opt_comp.get_format()
|
287
288
|
if (
|
288
|
-
|
289
|
+
# Issue #260: Some webp file not accepted by Whatsapp
|
290
|
+
".webp" not in f_fmt[0]
|
291
|
+
and ".webp" not in f_fmt[1]
|
292
|
+
and FormatVerify.check_format(
|
289
293
|
self.in_f,
|
290
|
-
fmt=
|
294
|
+
fmt=f_fmt,
|
291
295
|
file_info=self.codec_info_orig,
|
292
296
|
)
|
293
297
|
and FormatVerify.check_file_res(
|
@@ -577,9 +581,9 @@ class StickerConvert:
|
|
577
581
|
colors = colors[colors[:, 3] != 0]
|
578
582
|
if colors.shape[0] != 0:
|
579
583
|
alphas = colors[:, 3] / 255
|
580
|
-
r_mean = np.mean(colors[:, 0] * alphas)
|
581
|
-
g_mean = np.mean(colors[:, 1] * alphas)
|
582
|
-
b_mean = np.mean(colors[:, 2] * alphas)
|
584
|
+
r_mean = cast(float, np.mean(colors[:, 0] * alphas))
|
585
|
+
g_mean = cast(float, np.mean(colors[:, 1] * alphas))
|
586
|
+
b_mean = cast(float, np.mean(colors[:, 2] * alphas))
|
583
587
|
mean_total += (r_mean + g_mean + b_mean) / 3
|
584
588
|
|
585
589
|
if mean_total / len(self.frames_raw) < 128:
|
@@ -58,12 +58,24 @@ class DownloadSignal(DownloadBase):
|
|
58
58
|
|
59
59
|
self.cb.put("update_bar")
|
60
60
|
|
61
|
+
if pack.cover is not None and pack.cover.image_data is not None:
|
62
|
+
cover_path = Path(self.out_dir, "cover")
|
63
|
+
with open(cover_path, "wb") as f:
|
64
|
+
f.write(pack.cover.image_data)
|
65
|
+
|
66
|
+
cover_codec = CodecInfo.get_file_codec(cover_path)
|
67
|
+
if cover_codec == "":
|
68
|
+
cover_codec = "png"
|
69
|
+
cover_path_new = Path(self.out_dir, f"cover.{cover_codec}")
|
70
|
+
cover_path.rename(cover_path_new)
|
71
|
+
self.cb.put(f"Downloaded cover.{cover_codec}")
|
72
|
+
|
61
73
|
MetadataHandler.set_metadata(
|
62
74
|
self.out_dir, title=pack.title, author=pack.author, emoji_dict=emoji_dict
|
63
75
|
)
|
64
76
|
|
65
77
|
def download_stickers_signal(self) -> Tuple[int, int]:
|
66
|
-
if "signal.art" not in self.url
|
78
|
+
if "signal.art" not in self.url and not self.url.startswith(
|
67
79
|
"sgnl://addstickers/"
|
68
80
|
):
|
69
81
|
self.cb.put("Download failed: Unrecognized URL format")
|
sticker_convert/gui.py
CHANGED
@@ -701,9 +701,9 @@ class GUI(Window):
|
|
701
701
|
set_progress_mode, steps, update_bar, *args, **kwargs
|
702
702
|
)
|
703
703
|
|
704
|
-
def highlight_fields(self)
|
704
|
+
def highlight_fields(self):
|
705
705
|
if not self.init_done:
|
706
|
-
return
|
706
|
+
return
|
707
707
|
|
708
708
|
input_option = self.get_input_name()
|
709
709
|
input_option_display = self.get_input_display_name()
|
@@ -853,5 +853,3 @@ class GUI(Window):
|
|
853
853
|
else:
|
854
854
|
self.comp_frame.comp_preset_opt.config(bootstyle="secondary") # type: ignore
|
855
855
|
self.output_frame.output_option_opt.config(bootstyle="secondary") # type: ignore
|
856
|
-
|
857
|
-
return True
|
sticker_convert/job.py
CHANGED
@@ -642,7 +642,12 @@ class Job:
|
|
642
642
|
|
643
643
|
if not in_f.is_file():
|
644
644
|
continue
|
645
|
-
if
|
645
|
+
if (
|
646
|
+
CodecInfo.get_file_ext(i) in (".txt", ".m4a")
|
647
|
+
or (
|
648
|
+
self.opt_comp.preset != "signal" and Path(i).stem == "cover"
|
649
|
+
) # Signal cover has same spec as normal sticker
|
650
|
+
):
|
646
651
|
shutil.copy(in_f, output_dir / i.name)
|
647
652
|
else:
|
648
653
|
in_fs.append(i)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
import copy
|
3
3
|
from pathlib import Path
|
4
|
-
from typing import Any, Dict, List, Tuple
|
4
|
+
from typing import Any, Dict, List, Optional, Tuple
|
5
5
|
|
6
6
|
import anyio
|
7
7
|
from signalstickers_client.errors import SignalException
|
@@ -46,51 +46,77 @@ class UploadSignal(UploadBase):
|
|
46
46
|
)
|
47
47
|
return result
|
48
48
|
|
49
|
-
def
|
50
|
-
self,
|
51
|
-
) ->
|
52
|
-
|
53
|
-
self.cb.put(f"Verifying {src} for uploading to signal")
|
49
|
+
def create_sticker(
|
50
|
+
self, src: Path, emoji_dict: Dict[str, str]
|
51
|
+
) -> Optional[Sticker]:
|
52
|
+
self.cb.put(f"Verifying {src} for uploading to signal")
|
54
53
|
|
55
|
-
|
56
|
-
sticker.id = pack.nb_stickers
|
54
|
+
sticker = Sticker()
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
56
|
+
emoji = extract_emojis(emoji_dict.get(Path(src).stem, ""))
|
57
|
+
if emoji == "":
|
58
|
+
self.cb.put(
|
59
|
+
f"Warning: Cannot find emoji for file {Path(src).name}, using default emoji..."
|
60
|
+
)
|
61
|
+
emoji = self.opt_comp.default_emoji
|
62
|
+
sticker.emoji = emoji[:1]
|
65
63
|
|
66
|
-
|
67
|
-
|
64
|
+
if Path(src).suffix == ".webp":
|
65
|
+
spec_choice = self.webp_spec
|
66
|
+
else:
|
67
|
+
spec_choice = self.png_spec
|
68
|
+
|
69
|
+
if not FormatVerify.check_file(src, spec=spec_choice):
|
70
|
+
if self.opt_comp.fake_vid or CodecInfo.is_anim(src):
|
71
|
+
dst = "bytes.apng"
|
68
72
|
else:
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
success, _, image_data, _ = StickerConvert.convert(
|
77
|
-
Path(src), Path(dst), self.opt_comp_merged, self.cb, self.cb_return
|
73
|
+
dst = "bytes.png"
|
74
|
+
success, _, image_data, _ = StickerConvert.convert(
|
75
|
+
Path(src), Path(dst), self.opt_comp_merged, self.cb, self.cb_return
|
76
|
+
)
|
77
|
+
if not success:
|
78
|
+
self.cb.put(
|
79
|
+
f"Warning: Cannot compress file {Path(src).name}, skip uploading this file..."
|
78
80
|
)
|
79
|
-
|
80
|
-
self.cb.put(
|
81
|
-
f"Warning: Cannot compress file {Path(src).name}, skip uploading this file..."
|
82
|
-
)
|
83
|
-
continue
|
81
|
+
return None
|
84
82
|
|
85
|
-
|
83
|
+
assert isinstance(image_data, bytes)
|
86
84
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
85
|
+
sticker.image_data = image_data
|
86
|
+
else:
|
87
|
+
with open(src, "rb") as f:
|
88
|
+
sticker.image_data = f.read()
|
89
|
+
|
90
|
+
return sticker
|
91
91
|
|
92
|
+
def add_stickers_to_pack(
|
93
|
+
self, pack: LocalStickerPack, stickers: List[Path], emoji_dict: Dict[str, str]
|
94
|
+
) -> None:
|
95
|
+
cover_file = MetadataHandler.get_cover(self.opt_output.dir)
|
96
|
+
cover_file_bytes = None
|
97
|
+
if cover_file:
|
98
|
+
with open(cover_file, "rb") as f:
|
99
|
+
cover_file_bytes = f.read()
|
100
|
+
for src in stickers:
|
101
|
+
sticker = self.create_sticker(src, emoji_dict)
|
102
|
+
if sticker is None:
|
103
|
+
continue
|
104
|
+
sticker.id = pack.nb_stickers
|
92
105
|
pack._addsticker(sticker) # type: ignore
|
93
106
|
|
107
|
+
if (
|
108
|
+
cover_file
|
109
|
+
and pack.cover is None
|
110
|
+
and sticker.image_data == cover_file_bytes
|
111
|
+
):
|
112
|
+
pack.cover = sticker
|
113
|
+
|
114
|
+
if cover_file and pack.cover is None:
|
115
|
+
sticker = self.create_sticker(cover_file, emoji_dict)
|
116
|
+
if sticker is not None:
|
117
|
+
sticker.id = pack.nb_stickers
|
118
|
+
pack.cover = sticker
|
119
|
+
|
94
120
|
def upload_stickers_signal(self) -> Tuple[int, int, List[str]]:
|
95
121
|
urls: List[str] = []
|
96
122
|
|
sticker_convert/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: sticker-convert
|
3
|
-
Version: 2.11.
|
3
|
+
Version: 2.11.3
|
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>
|
@@ -367,7 +367,7 @@ Requires-Dist: aiolimiter~=1.2.1
|
|
367
367
|
Requires-Dist: anyio~=4.8.0
|
368
368
|
Requires-Dist: apngasm_python~=1.3.1
|
369
369
|
Requires-Dist: av~=13.1.0
|
370
|
-
Requires-Dist: beautifulsoup4~=4.
|
370
|
+
Requires-Dist: beautifulsoup4~=4.13.3
|
371
371
|
Requires-Dist: cryptg~=0.5.0.post0
|
372
372
|
Requires-Dist: rookiepy~=0.5.6
|
373
373
|
Requires-Dist: httpx~=0.28.1
|
@@ -379,7 +379,7 @@ Requires-Dist: numpy>=1.22.4
|
|
379
379
|
Requires-Dist: Pillow~=11.1.0
|
380
380
|
Requires-Dist: pyoxipng~=9.0.0
|
381
381
|
Requires-Dist: python-telegram-bot~=21.10
|
382
|
-
Requires-Dist: psutil~=
|
382
|
+
Requires-Dist: psutil~=7.0.0
|
383
383
|
Requires-Dist: PyMemoryEditor~=1.5.22
|
384
384
|
Requires-Dist: requests~=2.32.3
|
385
385
|
Requires-Dist: rlottie_python~=1.3.6
|
@@ -402,7 +402,10 @@ Requires-Dist: websocket_client~=1.8.0
|
|
402
402
|
- [Pre-compiled releases](https://github.com/laggykiller/sticker-convert/releases) for Windows, MacOS and Linux (As AppImage).
|
403
403
|
- Windows: Unzip the downloaded file and run `sticker-convert.exe`
|
404
404
|
- MacOS: Unzip the downloaded file, hold control and open `hold_control_and_click_open_me.command` for the first time, then `sticker-convert.app` in the future
|
405
|
-
- Linux:
|
405
|
+
- Linux:
|
406
|
+
- AppImage: `chmod +x` the downloaded AppImage and run it
|
407
|
+
- Zip: unzip and run `sticker-convert.bin`
|
408
|
+
- [AUR package](https://aur.archlinux.org/packages/sticker-convert): `makepkg -si`
|
406
409
|
- [pip package](https://pypi.org/project/sticker-convert/): `pip install sticker-convert`. Launch with `sticker-convert` or `python -m sticker_convert`
|
407
410
|
- [Docker image](https://hub.docker.com/r/laggykiller/sticker-convert) for running on Linux.
|
408
411
|
- [Try in Google Colab without downloading](https://colab.research.google.com/github/laggykiller/sticker-convert/blob/master/sticker_convert_colab.ipynb) (Requires Google account), which runs the code on Google server and get the result from Google Drive. However, it maybe slower than running on your computer. (~15 seconds per file if not converting to .apng, ~1 minute per file if you convert to .apng)
|
@@ -1,18 +1,18 @@
|
|
1
1
|
sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
|
2
2
|
sticker_convert/__main__.py,sha256=elDCMvU27letiYs8jPUpxaCq5puURnvcDuqGsAAb6_w,592
|
3
3
|
sticker_convert/cli.py,sha256=MWzq9QJJ7HYBD73DmSgRIPo-u58mTGEIoUUpJKNjI0Q,22358
|
4
|
-
sticker_convert/converter.py,sha256=
|
4
|
+
sticker_convert/converter.py,sha256=9_CLB_nK0Vzoe_5EM8WBEyLbz0F7rhncPqCTSvjSQKc,36498
|
5
5
|
sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
|
6
|
-
sticker_convert/gui.py,sha256=
|
7
|
-
sticker_convert/job.py,sha256=
|
6
|
+
sticker_convert/gui.py,sha256=5bWppylhVc3ndPtyKIgYRj0VtbCp-MDmEgA8XPcWZqI,33622
|
7
|
+
sticker_convert/job.py,sha256=FAjQPYr7anibaGovLwuFJdquq5ameDkcn7fQQpFIYQY,27790
|
8
8
|
sticker_convert/job_option.py,sha256=NysZtKVVG7EzRkLnVaeYJY0uNlYKFmjoststB1cvVrY,8020
|
9
|
-
sticker_convert/version.py,sha256=
|
9
|
+
sticker_convert/version.py,sha256=Otx1L7zeABIBikqvJcbKyTNGrFAQurXh9XikzWCdg94,47
|
10
10
|
sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
sticker_convert/downloaders/download_base.py,sha256=MI5pCT_tkfoaFlrD1oNynDj1Rv1CK0APuNVElTEAEis,5110
|
12
12
|
sticker_convert/downloaders/download_discord.py,sha256=6AFpLAYL2hRvVcsqUtzDUC31U66U02ZcnKXDnZRi2jk,3496
|
13
13
|
sticker_convert/downloaders/download_kakao.py,sha256=qc2Ldv_zrM6H_o0dVI8Qp8xuakTNuEYPwqFfC7l_ehc,12530
|
14
14
|
sticker_convert/downloaders/download_line.py,sha256=c-hTzEarGQP0b-pnPl29NuSKcaZWUeRo_94YpJzz72M,17911
|
15
|
-
sticker_convert/downloaders/download_signal.py,sha256=
|
15
|
+
sticker_convert/downloaders/download_signal.py,sha256=3wv-BLd4qggly4AdtwV8f3vUpCVZ-8GnoPLoWngY3Pk,3728
|
16
16
|
sticker_convert/downloaders/download_telegram.py,sha256=iGmOcVjU2Ai19t1lyDY2JhQIc--O5XMyNCGXZAA4DVY,2028
|
17
17
|
sticker_convert/downloaders/download_viber.py,sha256=SKWyrd2E2QH3aOvMJT2YEVLiCU-jqC-S4hKIrdFvG34,3161
|
18
18
|
sticker_convert/gui_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -80,7 +80,7 @@ sticker_convert/resources/output.json,sha256=SC_3vtEBJ79R7q0vy_p33eLsGFEyBsSOai0
|
|
80
80
|
sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
81
81
|
sticker_convert/uploaders/compress_wastickers.py,sha256=Rgl3WzIDJn7oa00nNqeBFDqIHP-cWvgQqET2-kDbf9c,7417
|
82
82
|
sticker_convert/uploaders/upload_base.py,sha256=uQupPn6r4zrlAzpKzzX7CgvZb69ATyrwPKahWOQj0ds,1203
|
83
|
-
sticker_convert/uploaders/upload_signal.py,sha256=
|
83
|
+
sticker_convert/uploaders/upload_signal.py,sha256=TGL-fZGX8_gaZ6xw6wmc4fvXKkOZMbjn7iEPR0ua104,7447
|
84
84
|
sticker_convert/uploaders/upload_telegram.py,sha256=WlUyLJlW83XZz6RhA76jHMXA6TNUIEVbPwhi14RTnds,12482
|
85
85
|
sticker_convert/uploaders/upload_viber.py,sha256=kRvZZCv5WcalOJvz9Mdl2yqi3L5n4joovA39WMWn4qs,6420
|
86
86
|
sticker_convert/uploaders/xcode_imessage.py,sha256=iTTT8gDYOTNkKqXeSWUBuWfxu7xeE418t2Z1YQFR5L0,11365
|
@@ -107,9 +107,9 @@ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE
|
|
107
107
|
sticker_convert/utils/media/codec_info.py,sha256=XoEWBfPWTzr4zSVQIU1XF1yh5viHxH5FytNEpdZR38c,14874
|
108
108
|
sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
|
109
109
|
sticker_convert/utils/media/format_verify.py,sha256=oM32P186tWe9YxvBQRPr8D3FEmBN3b2rEe_2S_MwxyQ,6236
|
110
|
-
sticker_convert-2.11.
|
111
|
-
sticker_convert-2.11.
|
112
|
-
sticker_convert-2.11.
|
113
|
-
sticker_convert-2.11.
|
114
|
-
sticker_convert-2.11.
|
115
|
-
sticker_convert-2.11.
|
110
|
+
sticker_convert-2.11.3.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
|
111
|
+
sticker_convert-2.11.3.dist-info/METADATA,sha256=YfsB7KHZGLnax-cZ1ZGwsu6DHUSgc4us0jRZVBb2hYY,53737
|
112
|
+
sticker_convert-2.11.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
113
|
+
sticker_convert-2.11.3.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
|
114
|
+
sticker_convert-2.11.3.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
|
115
|
+
sticker_convert-2.11.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|