sticker-convert 2.11.0__py3-none-any.whl → 2.11.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sticker_convert/cli.py +7 -7
- sticker_convert/converter.py +5 -6
- sticker_convert/downloaders/download_base.py +2 -2
- sticker_convert/job.py +2 -2
- sticker_convert/uploaders/compress_wastickers.py +76 -56
- sticker_convert/uploaders/upload_viber.py +18 -19
- sticker_convert/utils/auth/telegram_api.py +4 -2
- sticker_convert/utils/files/metadata_handler.py +3 -3
- sticker_convert/version.py +1 -1
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/METADATA +5 -5
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/RECORD +15 -15
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/WHEEL +1 -1
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/LICENSE +0 -0
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/entry_points.txt +0 -0
- {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/top_level.txt +0 -0
sticker_convert/cli.py
CHANGED
@@ -71,26 +71,26 @@ class CLI:
|
|
71
71
|
|
72
72
|
parser_input = parser.add_argument_group("Input options")
|
73
73
|
for k, v_str in self.help["input"].items():
|
74
|
-
parser_input.add_argument(f
|
74
|
+
parser_input.add_argument(f"--{k.replace('_', '-')}", dest=k, help=v_str)
|
75
75
|
parser_input_src = parser_input.add_mutually_exclusive_group()
|
76
76
|
for k, v_dict in self.input_presets.items():
|
77
77
|
if k == "local":
|
78
78
|
continue
|
79
79
|
parser_input_src.add_argument(
|
80
|
-
f
|
80
|
+
f"--download-{k.replace('_', '-')}",
|
81
81
|
dest=f"download_{k}",
|
82
|
-
help=f
|
82
|
+
help=f"{v_dict['help']}\n({v_dict['example']})",
|
83
83
|
)
|
84
84
|
|
85
85
|
parser_output = parser.add_argument_group("Output options")
|
86
86
|
for k, v_str in self.help["output"].items():
|
87
|
-
parser_output.add_argument(f
|
87
|
+
parser_output.add_argument(f"--{k.replace('_', '-')}", dest=k, help=v_str)
|
88
88
|
parser_output_dst = parser_output.add_mutually_exclusive_group()
|
89
89
|
for k, v_dict in self.output_presets.items():
|
90
90
|
if k == "local":
|
91
91
|
continue
|
92
92
|
parser_output_dst.add_argument(
|
93
|
-
f
|
93
|
+
f"--export-{k.replace('_', '-')}",
|
94
94
|
dest=f"export_{k}",
|
95
95
|
action="store_true",
|
96
96
|
help=v_dict["help"],
|
@@ -154,7 +154,7 @@ class CLI:
|
|
154
154
|
else:
|
155
155
|
continue
|
156
156
|
parser_comp.add_argument(
|
157
|
-
f
|
157
|
+
f"--{k.replace('_', '-')}",
|
158
158
|
**keyword_args,
|
159
159
|
dest=k,
|
160
160
|
help=v,
|
@@ -181,7 +181,7 @@ class CLI:
|
|
181
181
|
if k in flags_cred_bool:
|
182
182
|
keyword_args = {"action": "store_true"}
|
183
183
|
parser_cred.add_argument(
|
184
|
-
f
|
184
|
+
f"--{k.replace('_', '-')}",
|
185
185
|
**keyword_args,
|
186
186
|
dest=k,
|
187
187
|
help=v,
|
sticker_convert/converter.py
CHANGED
@@ -24,8 +24,7 @@ if TYPE_CHECKING:
|
|
24
24
|
MSG_START_COMP = "[I] Start compressing {} -> {}"
|
25
25
|
MSG_SKIP_COMP = "[S] Compatible file found, skip compress and just copy {} -> {}"
|
26
26
|
MSG_COMP = (
|
27
|
-
"[C] Compressing {} -> {} res={}x{}, "
|
28
|
-
"quality={}, fps={}, color={} (step {}-{}-{})"
|
27
|
+
"[C] Compressing {} -> {} res={}x{}, quality={}, fps={}, color={} (step {}-{}-{})"
|
29
28
|
)
|
30
29
|
MSG_REDO_COMP = "[{}] Compressed {} -> {} but size {} {} limit {}, recompressing"
|
31
30
|
MSG_DONE_COMP = "[S] Successful compression {} -> {} size {} (step {})"
|
@@ -909,10 +908,10 @@ class StickerConvert:
|
|
909
908
|
def _quantize_by_imagequant(self, image: Image.Image) -> Image.Image:
|
910
909
|
import imagequant # type: ignore
|
911
910
|
|
912
|
-
assert self.quality
|
913
|
-
assert self.opt_comp.quality_min
|
914
|
-
assert self.opt_comp.quality_max
|
915
|
-
assert self.color
|
911
|
+
assert isinstance(self.quality, int)
|
912
|
+
assert isinstance(self.opt_comp.quality_min, int)
|
913
|
+
assert isinstance(self.opt_comp.quality_max, int)
|
914
|
+
assert isinstance(self.color, int)
|
916
915
|
|
917
916
|
dither = 1 - (self.quality - self.opt_comp.quality_min) / (
|
918
917
|
self.opt_comp.quality_max - self.opt_comp.quality_min
|
@@ -104,7 +104,7 @@ class DownloadBase:
|
|
104
104
|
self.cb.put(f"Downloaded {url}")
|
105
105
|
else:
|
106
106
|
self.cb.put(
|
107
|
-
f"Error {response.status_code}: {url} (tried {retry+1}/{retries} times)"
|
107
|
+
f"Error {response.status_code}: {url} (tried {retry + 1}/{retries} times)"
|
108
108
|
)
|
109
109
|
|
110
110
|
if results is not None:
|
@@ -153,7 +153,7 @@ class DownloadBase:
|
|
153
153
|
break
|
154
154
|
except requests.exceptions.RequestException as e:
|
155
155
|
self.cb.put(
|
156
|
-
f"Cannot download {url} (tried {retry+1}/{retries} times): {e}"
|
156
|
+
f"Cannot download {url} (tried {retry + 1}/{retries} times): {e}"
|
157
157
|
)
|
158
158
|
|
159
159
|
if not result:
|
sticker_convert/job.py
CHANGED
@@ -346,7 +346,7 @@ class Job:
|
|
346
346
|
if not MetadataHandler.check_metadata_provided(
|
347
347
|
self.opt_input.dir, input_option, metadata
|
348
348
|
):
|
349
|
-
error_msg += f
|
349
|
+
error_msg += f"[X] {output_presets[output_option]['full_name']} requires {metadata}\n"
|
350
350
|
if self.opt_input.option == "local":
|
351
351
|
error_msg += f" {metadata} was not supplied and {metadata}.txt is absent\n"
|
352
352
|
else:
|
@@ -356,7 +356,7 @@ class Job:
|
|
356
356
|
)
|
357
357
|
error_msg += f" Create {metadata}.txt with the {metadata} name\n"
|
358
358
|
else:
|
359
|
-
info_msg += f
|
359
|
+
info_msg += f"[!] {output_presets[output_option]['full_name']} requires {metadata}\n"
|
360
360
|
if self.opt_input.option == "local":
|
361
361
|
info_msg += f" {metadata} was not supplied but {metadata}.txt is present\n"
|
362
362
|
info_msg += f" Using {metadata} name in {metadata}.txt\n"
|
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
import copy
|
3
|
-
import shutil
|
4
3
|
import zipfile
|
5
4
|
from pathlib import Path
|
6
5
|
from typing import Any, List, Tuple
|
@@ -9,7 +8,6 @@ from sticker_convert.converter import StickerConvert
|
|
9
8
|
from sticker_convert.job_option import CompOption, CredOption, OutputOption
|
10
9
|
from sticker_convert.uploaders.upload_base import UploadBase
|
11
10
|
from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
|
12
|
-
from sticker_convert.utils.files.cache_store import CacheStore
|
13
11
|
from sticker_convert.utils.files.metadata_handler import MetadataHandler
|
14
12
|
from sticker_convert.utils.files.sanitize_filename import sanitize_filename
|
15
13
|
from sticker_convert.utils.media.codec_info import CodecInfo
|
@@ -70,8 +68,65 @@ class CompressWastickers(UploadBase):
|
|
70
68
|
stickers_total = 0
|
71
69
|
for pack_title, stickers in packs.items():
|
72
70
|
stickers_total += len(stickers)
|
73
|
-
|
74
|
-
|
71
|
+
out_f = Path(
|
72
|
+
self.opt_output.dir, sanitize_filename(pack_title + ".wastickers")
|
73
|
+
).as_posix()
|
74
|
+
|
75
|
+
MetadataHandler.set_metadata(
|
76
|
+
self.opt_output.dir, author=author, title=title, newline=True
|
77
|
+
)
|
78
|
+
with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
|
79
|
+
cover_opt_comp_merged = copy.deepcopy(self.opt_comp)
|
80
|
+
cover_opt_comp_merged.merge(self.spec_cover)
|
81
|
+
|
82
|
+
cover_path_old = MetadataHandler.get_cover(self.opt_output.dir)
|
83
|
+
cover_path_new = Path("bytes.png")
|
84
|
+
if cover_path_old is None:
|
85
|
+
# First image in the directory, extracting first frame
|
86
|
+
first_image = [
|
87
|
+
i
|
88
|
+
for i in sorted(self.opt_output.dir.iterdir())
|
89
|
+
if Path(self.opt_output.dir, i.name).is_file()
|
90
|
+
and i.suffix not in (".txt", ".m4a", ".wastickers")
|
91
|
+
][0]
|
92
|
+
self.cb.put(f"Creating cover using {first_image.name}")
|
93
|
+
success, _, cover_data, _ = StickerConvert.convert(
|
94
|
+
Path(self.opt_output.dir, first_image),
|
95
|
+
cover_path_new,
|
96
|
+
cover_opt_comp_merged,
|
97
|
+
self.cb,
|
98
|
+
self.cb_return,
|
99
|
+
)
|
100
|
+
if not success:
|
101
|
+
self.cb.put(
|
102
|
+
f"Warning: Cannot compress cover {first_image.name}, unable to create .wastickers"
|
103
|
+
)
|
104
|
+
continue
|
105
|
+
else:
|
106
|
+
if not FormatVerify.check_file(
|
107
|
+
cover_path_old, spec=self.spec_cover
|
108
|
+
):
|
109
|
+
success, _, cover_data, _ = StickerConvert.convert(
|
110
|
+
cover_path_old,
|
111
|
+
cover_path_new,
|
112
|
+
cover_opt_comp_merged,
|
113
|
+
self.cb,
|
114
|
+
self.cb_return,
|
115
|
+
)
|
116
|
+
if not success:
|
117
|
+
self.cb.put(
|
118
|
+
f"Warning: Cannot compress cover {cover_path_old.name}, unable to create .wastickers"
|
119
|
+
)
|
120
|
+
continue
|
121
|
+
else:
|
122
|
+
with open(cover_path_old, "rb") as f:
|
123
|
+
cover_data = f.read()
|
124
|
+
|
125
|
+
assert isinstance(cover_data, bytes)
|
126
|
+
zipf.writestr("tray.png", cover_data)
|
127
|
+
zipf.write(Path(self.opt_output.dir, "author.txt"), "author.txt")
|
128
|
+
zipf.write(Path(self.opt_output.dir, "title.txt"), "title.txt")
|
129
|
+
|
75
130
|
for num, src in enumerate(stickers):
|
76
131
|
self.cb.put(f"Verifying {src} for compressing into .wastickers")
|
77
132
|
|
@@ -79,72 +134,37 @@ class CompressWastickers(UploadBase):
|
|
79
134
|
ext = ".webp"
|
80
135
|
else:
|
81
136
|
ext = ".png"
|
137
|
+
dst = f"bytes{ext}"
|
82
138
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
shutil.copy(src, dst)
|
89
|
-
else:
|
90
|
-
StickerConvert.convert(
|
139
|
+
if not (
|
140
|
+
FormatVerify.check_file(src, spec=self.webp_spec)
|
141
|
+
or FormatVerify.check_file(src, spec=self.png_spec)
|
142
|
+
):
|
143
|
+
success, _, image_data, _ = StickerConvert.convert(
|
91
144
|
Path(src),
|
92
145
|
Path(dst),
|
93
146
|
self.opt_comp_merged,
|
94
147
|
self.cb,
|
95
148
|
self.cb_return,
|
96
149
|
)
|
150
|
+
assert isinstance(image_data, bytes)
|
151
|
+
if not success:
|
152
|
+
self.cb.put(
|
153
|
+
f"Warning: Cannot compress file {Path(src).name}, skip this file..."
|
154
|
+
)
|
155
|
+
continue
|
156
|
+
else:
|
157
|
+
with open(src, "rb") as f:
|
158
|
+
image_data = f.read()
|
97
159
|
|
98
|
-
|
99
|
-
|
100
|
-
).as_posix()
|
101
|
-
|
102
|
-
self.add_metadata(Path(tempdir), pack_title, author)
|
103
|
-
with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
|
104
|
-
for file in Path(tempdir).iterdir():
|
105
|
-
file_path = Path(tempdir, file.name)
|
106
|
-
zipf.write(file_path, arcname=file_path.name)
|
160
|
+
# Originally the Sticker Maker application name the files with int(time.time())
|
161
|
+
zipf.writestr(f"sticker_{num + 1}{ext}", image_data)
|
107
162
|
|
108
163
|
self.cb.put((out_f))
|
109
164
|
urls.append(out_f)
|
110
165
|
|
111
166
|
return stickers_total, stickers_total, urls
|
112
167
|
|
113
|
-
def add_metadata(self, pack_dir: Path, title: str, author: str) -> None:
|
114
|
-
opt_comp_merged = copy.deepcopy(self.opt_comp)
|
115
|
-
opt_comp_merged.merge(self.spec_cover)
|
116
|
-
|
117
|
-
cover_path_old = MetadataHandler.get_cover(self.opt_output.dir)
|
118
|
-
cover_path_new = Path(pack_dir, "tray.png")
|
119
|
-
if cover_path_old:
|
120
|
-
if FormatVerify.check_file(cover_path_old, spec=self.spec_cover):
|
121
|
-
shutil.copy(cover_path_old, cover_path_new)
|
122
|
-
else:
|
123
|
-
StickerConvert.convert(
|
124
|
-
cover_path_old,
|
125
|
-
cover_path_new,
|
126
|
-
opt_comp_merged,
|
127
|
-
self.cb,
|
128
|
-
self.cb_return,
|
129
|
-
)
|
130
|
-
else:
|
131
|
-
# First image in the directory, extracting first frame
|
132
|
-
first_image = [
|
133
|
-
i
|
134
|
-
for i in sorted(self.opt_output.dir.iterdir())
|
135
|
-
if Path(self.opt_output.dir, i.name).is_file()
|
136
|
-
and i.suffix not in (".txt", ".m4a", ".wastickers")
|
137
|
-
][0]
|
138
|
-
StickerConvert.convert(
|
139
|
-
Path(self.opt_output.dir, first_image),
|
140
|
-
cover_path_new,
|
141
|
-
opt_comp_merged,
|
142
|
-
self.cb,
|
143
|
-
self.cb_return,
|
144
|
-
)
|
145
|
-
|
146
|
-
MetadataHandler.set_metadata(pack_dir, author=author, title=title, newline=True)
|
147
|
-
|
148
168
|
@staticmethod
|
149
169
|
def start(
|
150
170
|
opt_output: OutputOption,
|
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env python3
|
2
2
|
import copy
|
3
3
|
import json
|
4
|
-
import shutil
|
5
4
|
import zipfile
|
6
5
|
from pathlib import Path
|
7
6
|
from typing import Any, Dict, List, Tuple
|
@@ -12,7 +11,6 @@ from sticker_convert.converter import StickerConvert
|
|
12
11
|
from sticker_convert.job_option import CompOption, CredOption, OutputOption
|
13
12
|
from sticker_convert.uploaders.upload_base import UploadBase
|
14
13
|
from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
|
15
|
-
from sticker_convert.utils.files.cache_store import CacheStore
|
16
14
|
from sticker_convert.utils.files.metadata_handler import MetadataHandler
|
17
15
|
from sticker_convert.utils.files.sanitize_filename import sanitize_filename
|
18
16
|
from sticker_convert.utils.media.format_verify import FormatVerify
|
@@ -96,31 +94,32 @@ class UploadViber(UploadBase):
|
|
96
94
|
stickers_ok = 0
|
97
95
|
for pack_title, stickers in packs.items():
|
98
96
|
stickers_total += len(stickers)
|
99
|
-
|
97
|
+
out_f = Path(
|
98
|
+
self.opt_output.dir, sanitize_filename(pack_title + ".zip")
|
99
|
+
).as_posix()
|
100
|
+
with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
|
100
101
|
for num, src in enumerate(stickers):
|
101
102
|
self.cb.put(f"Verifying {src} for uploading to Viber")
|
102
103
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
else:
|
108
|
-
StickerConvert.convert(
|
109
|
-
Path(src),
|
110
|
-
Path(dst),
|
104
|
+
if not FormatVerify.check_file(src, spec=self.png_spec):
|
105
|
+
success, _, image_data, _ = StickerConvert.convert(
|
106
|
+
src,
|
107
|
+
Path("bytes.png"),
|
111
108
|
self.opt_comp_merged,
|
112
109
|
self.cb,
|
113
110
|
self.cb_return,
|
114
111
|
)
|
112
|
+
assert isinstance(image_data, bytes)
|
113
|
+
if not success:
|
114
|
+
self.cb.put(
|
115
|
+
f"Warning: Cannot compress file {src.name}, skip this file..."
|
116
|
+
)
|
117
|
+
continue
|
118
|
+
else:
|
119
|
+
with open(src, "rb") as f:
|
120
|
+
image_data = f.read()
|
115
121
|
|
116
|
-
|
117
|
-
self.opt_output.dir, sanitize_filename(pack_title + ".zip")
|
118
|
-
).as_posix()
|
119
|
-
|
120
|
-
with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
|
121
|
-
for file in Path(tempdir).iterdir():
|
122
|
-
file_path = Path(tempdir, file.name)
|
123
|
-
zipf.write(file_path, arcname=file_path.name)
|
122
|
+
zipf.writestr(f"{str(num).zfill(2)}.png", image_data)
|
124
123
|
|
125
124
|
upload_data = copy.deepcopy(upload_data_base)
|
126
125
|
upload_data["title"] = pack_title
|
@@ -76,7 +76,7 @@ class BotAPI(TelegramAPI):
|
|
76
76
|
self.application = ( # type: ignore
|
77
77
|
ApplicationBuilder()
|
78
78
|
.token(opt_cred.telegram_token)
|
79
|
-
.rate_limiter(AIORateLimiter(max_retries=3))
|
79
|
+
.rate_limiter(AIORateLimiter(overall_max_rate=4, max_retries=3))
|
80
80
|
.connect_timeout(self.timeout)
|
81
81
|
.pool_timeout(self.timeout)
|
82
82
|
.read_timeout(self.timeout)
|
@@ -389,13 +389,15 @@ class TelethonAPI(TelegramAPI):
|
|
389
389
|
sent_message = cast(Message, await self.client.send_file("Stickers", msg)) # type: ignore
|
390
390
|
|
391
391
|
for _ in range(5):
|
392
|
+
# https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this
|
393
|
+
# In a single chat, avoid sending more than one message per second.
|
394
|
+
time.sleep(1)
|
392
395
|
last_message = cast(
|
393
396
|
List[Message],
|
394
397
|
await self.client.get_messages("Stickers", 1), # type: ignore
|
395
398
|
)[0]
|
396
399
|
if sent_message.id != last_message.id:
|
397
400
|
return last_message.message
|
398
|
-
time.sleep(1)
|
399
401
|
|
400
402
|
return "timeout"
|
401
403
|
|
@@ -264,7 +264,7 @@ class MetadataHandler:
|
|
264
264
|
if len(anim_stickers) == file_per_anim_pack or (
|
265
265
|
finished_all and len(anim_stickers) > 0
|
266
266
|
):
|
267
|
-
suffix = f'
|
267
|
+
suffix = f"{'-anim' if image_present else ''}{'-' + str(anim_pack_count) if anim_pack_count > 0 else ''}"
|
268
268
|
title_current = str(title) + suffix
|
269
269
|
packs[title_current] = anim_stickers.copy()
|
270
270
|
anim_stickers = []
|
@@ -272,7 +272,7 @@ class MetadataHandler:
|
|
272
272
|
if len(image_stickers) == file_per_image_pack or (
|
273
273
|
finished_all and len(image_stickers) > 0
|
274
274
|
):
|
275
|
-
suffix = f'
|
275
|
+
suffix = f"{'-image' if anim_present else ''}{'-' + str(image_pack_count) if image_pack_count > 0 else ''}"
|
276
276
|
title_current = str(title) + suffix
|
277
277
|
packs[title_current] = image_stickers.copy()
|
278
278
|
image_stickers = []
|
@@ -292,7 +292,7 @@ class MetadataHandler:
|
|
292
292
|
if len(stickers) == file_per_pack or (
|
293
293
|
finished_all and len(stickers) > 0
|
294
294
|
):
|
295
|
-
suffix = f'
|
295
|
+
suffix = f"{'-' + str(pack_count) if pack_count > 0 else ''}"
|
296
296
|
title_current = str(title) + suffix
|
297
297
|
packs[title_current] = stickers.copy()
|
298
298
|
stickers = []
|
sticker_convert/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: sticker-convert
|
3
|
-
Version: 2.11.
|
3
|
+
Version: 2.11.1
|
4
4
|
Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, Viber, Discord, iMessage. Written in Python.
|
5
5
|
Author-email: laggykiller <chaudominic2@gmail.com>
|
6
6
|
Maintainer-email: laggykiller <chaudominic2@gmail.com>
|
@@ -364,7 +364,7 @@ Requires-Python: >=3.9
|
|
364
364
|
Description-Content-Type: text/markdown
|
365
365
|
License-File: LICENSE
|
366
366
|
Requires-Dist: aiolimiter~=1.2.1
|
367
|
-
Requires-Dist: anyio~=4.
|
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
370
|
Requires-Dist: beautifulsoup4~=4.12.3
|
@@ -376,9 +376,9 @@ Requires-Dist: memory-tempfile~=2.2.3
|
|
376
376
|
Requires-Dist: mergedeep~=1.3.4
|
377
377
|
Requires-Dist: mini-racer~=0.12.4
|
378
378
|
Requires-Dist: numpy>=1.22.4
|
379
|
-
Requires-Dist: Pillow~=
|
379
|
+
Requires-Dist: Pillow~=11.1.0
|
380
380
|
Requires-Dist: pyoxipng~=9.0.0
|
381
|
-
Requires-Dist: python-telegram-bot~=21.
|
381
|
+
Requires-Dist: python-telegram-bot~=21.10
|
382
382
|
Requires-Dist: psutil~=6.1.1
|
383
383
|
Requires-Dist: PyMemoryEditor~=1.5.22
|
384
384
|
Requires-Dist: requests~=2.32.3
|
@@ -1,14 +1,14 @@
|
|
1
1
|
sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
|
2
2
|
sticker_convert/__main__.py,sha256=elDCMvU27letiYs8jPUpxaCq5puURnvcDuqGsAAb6_w,592
|
3
|
-
sticker_convert/cli.py,sha256=
|
4
|
-
sticker_convert/converter.py,sha256=
|
3
|
+
sticker_convert/cli.py,sha256=MWzq9QJJ7HYBD73DmSgRIPo-u58mTGEIoUUpJKNjI0Q,22358
|
4
|
+
sticker_convert/converter.py,sha256=Y2Ypvy1GjGAteLDLEXcbRXP6Z0sgdIjJk3ZssYwa1jw,36291
|
5
5
|
sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
|
6
6
|
sticker_convert/gui.py,sha256=7nQ9yxxuTU6EiFicErXA-igVAz3-0qmevvLVHsweJF0,33656
|
7
|
-
sticker_convert/job.py,sha256=
|
7
|
+
sticker_convert/job.py,sha256=9J2a-yEqdISHUmPI1gw5CAdwmlJ9cIecJfzVU40A9VU,27617
|
8
8
|
sticker_convert/job_option.py,sha256=NysZtKVVG7EzRkLnVaeYJY0uNlYKFmjoststB1cvVrY,8020
|
9
|
-
sticker_convert/version.py,sha256=
|
9
|
+
sticker_convert/version.py,sha256=B1A0zdNjEP5npHwLfEerwv890gLeBzul8X8eOXThNYg,47
|
10
10
|
sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
sticker_convert/downloaders/download_base.py,sha256=
|
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
|
@@ -78,11 +78,11 @@ sticker_convert/resources/memdump_linux.sh,sha256=YbdX5C5RyCnoeDUE6JgTo8nQXKhrUw
|
|
78
78
|
sticker_convert/resources/memdump_windows.ps1,sha256=CfyNSSEW3HJOkTu-mKrP3qh5aprN-1VCBfj-R1fELA0,302
|
79
79
|
sticker_convert/resources/output.json,sha256=SC_3vtEBJ79R7q0vy_p33eLsGFEyBsSOai0Hy7mLqG8,2208
|
80
80
|
sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
81
|
-
sticker_convert/uploaders/compress_wastickers.py,sha256=
|
81
|
+
sticker_convert/uploaders/compress_wastickers.py,sha256=Rgl3WzIDJn7oa00nNqeBFDqIHP-cWvgQqET2-kDbf9c,7417
|
82
82
|
sticker_convert/uploaders/upload_base.py,sha256=uQupPn6r4zrlAzpKzzX7CgvZb69ATyrwPKahWOQj0ds,1203
|
83
83
|
sticker_convert/uploaders/upload_signal.py,sha256=Qhay8HS3b9J7DGETcLtNg9kV16BGoSgYC5cX5wJd0ew,6674
|
84
84
|
sticker_convert/uploaders/upload_telegram.py,sha256=WlUyLJlW83XZz6RhA76jHMXA6TNUIEVbPwhi14RTnds,12482
|
85
|
-
sticker_convert/uploaders/upload_viber.py,sha256=
|
85
|
+
sticker_convert/uploaders/upload_viber.py,sha256=kRvZZCv5WcalOJvz9Mdl2yqi3L5n4joovA39WMWn4qs,6420
|
86
86
|
sticker_convert/uploaders/xcode_imessage.py,sha256=iTTT8gDYOTNkKqXeSWUBuWfxu7xeE418t2Z1YQFR5L0,11365
|
87
87
|
sticker_convert/utils/callback.py,sha256=spYUGlklOs1yPZAxoqwOWgR1sdimpfM8a27if3TaVYk,6155
|
88
88
|
sticker_convert/utils/chrome_remotedebug.py,sha256=tLc1C1u7U3kJvAi1WFK5_3gKcdfg4x6SAkTIX2g87VE,4765
|
@@ -95,21 +95,21 @@ sticker_convert/utils/auth/get_kakao_desktop_auth.py,sha256=VbEec-yujlLJOBeM55Rm
|
|
95
95
|
sticker_convert/utils/auth/get_line_auth.py,sha256=8l8ha2vQmk3rHGvDE7PkcxQXbH3oe62LKbI3qVUtvqc,2196
|
96
96
|
sticker_convert/utils/auth/get_signal_auth.py,sha256=9L9kqpfJ4j9B10nJ8iLFKolPd6r_8TsGUDxCpTLR43o,4306
|
97
97
|
sticker_convert/utils/auth/get_viber_auth.py,sha256=mUTrcxq5bTrzSXEVaeTPqVQIdZdwvIhrbMgBUb7dU30,8173
|
98
|
-
sticker_convert/utils/auth/telegram_api.py,sha256=
|
98
|
+
sticker_convert/utils/auth/telegram_api.py,sha256=WQi3dat8IZy13nXfyDS25XTS3HKp5BhVzgHimgbPnmw,24169
|
99
99
|
sticker_convert/utils/auth/telethon_setup.py,sha256=3hH0KglsotFBxT3gwFjHiDuREyahFIlmx-ZL1_-zM2A,2714
|
100
100
|
sticker_convert/utils/files/cache_store.py,sha256=etfe614OAhAyrnM5fGeESKq6R88YLNqkqkxSzEmZ0V0,1047
|
101
101
|
sticker_convert/utils/files/json_manager.py,sha256=Vr6pZJdLMkrJJWN99210aduVHb0ILyf0SSTaw4TZqgc,541
|
102
102
|
sticker_convert/utils/files/json_resources_loader.py,sha256=flZFixUXRTrOAhvRQpuSQgmJ69yXL94sxukcowLT1JQ,1049
|
103
|
-
sticker_convert/utils/files/metadata_handler.py,sha256=
|
103
|
+
sticker_convert/utils/files/metadata_handler.py,sha256=UNCfsbAmN-s4LhMUGlAj-CVCsoDCv4BaP5yQG7R81Jk,10108
|
104
104
|
sticker_convert/utils/files/run_bin.py,sha256=C_KKGtMUTajJnKo4Ia9e6WuWCXSQRdGsVPG-r5GXT_I,1784
|
105
105
|
sticker_convert/utils/files/sanitize_filename.py,sha256=HBklPGsHRJjFQUIC5rYTQsUrsuTtezZXIEA8CPhLP8A,2156
|
106
106
|
sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE4l0MygBA1jB-PFiYLEkzk,3657
|
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.1.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
|
111
|
+
sticker_convert-2.11.1.dist-info/METADATA,sha256=KIoxhhqLPn8bsyfpwTptU5l0hxAKsEQYMjUIBvpHZhY,53575
|
112
|
+
sticker_convert-2.11.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
113
|
+
sticker_convert-2.11.1.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
|
114
|
+
sticker_convert-2.11.1.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
|
115
|
+
sticker_convert-2.11.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|