sticker-convert 2.7.5__py3-none-any.whl → 2.7.7__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 CHANGED
@@ -135,7 +135,7 @@ class CLI:
135
135
  continue
136
136
  parser_comp.add_argument(
137
137
  f'--{k.replace("_", "-")}',
138
- **keyword_args, # type: ignore
138
+ **keyword_args,
139
139
  dest=k,
140
140
  help=v,
141
141
  )
@@ -154,7 +154,7 @@ class CLI:
154
154
  keyword_args = {"action": "store_true"}
155
155
  parser_cred.add_argument(
156
156
  f'--{k.replace("_", "-")}',
157
- **keyword_args, # type: ignore
157
+ **keyword_args,
158
158
  dest=k,
159
159
  help=v,
160
160
  )
sticker_convert/gui.py CHANGED
@@ -8,7 +8,7 @@ from json.decoder import JSONDecodeError
8
8
  from math import ceil
9
9
  from multiprocessing import Event, cpu_count
10
10
  from pathlib import Path
11
- from threading import Lock, Thread
11
+ from threading import Thread
12
12
  from typing import Any, Callable, Dict, Optional, Union
13
13
  from urllib.parse import urlparse
14
14
 
@@ -161,8 +161,6 @@ class GUI(Window):
161
161
  self.settings_save_cred_var = BooleanVar()
162
162
 
163
163
  # Other
164
- self.msg_lock = Lock()
165
- self.bar_lock = Lock()
166
164
  self.response_event = Event()
167
165
  self.response = None
168
166
  self.action: Optional[Callable[..., Any]] = None
@@ -550,9 +548,8 @@ class GUI(Window):
550
548
 
551
549
  def cancel_job(self) -> None:
552
550
  if self.job:
553
- self.cb_msg(msg="Cancelling job...")
554
- self.job.cancel()
555
- self.cb_bar(set_progress_mode="clear")
551
+ # Need to start new thread or else GUI may freeze
552
+ Thread(target=self.job.cancel, daemon=True).start()
556
553
 
557
554
  def set_inputs(self, state: str) -> None:
558
555
  # state: 'normal', 'disabled'
@@ -610,8 +607,7 @@ class GUI(Window):
610
607
  return False
611
608
 
612
609
  def cb_msg(self, *args: Any, **kwargs: Any) -> None:
613
- with self.msg_lock:
614
- self.progress_frame.update_message_box(*args, **kwargs)
610
+ self.progress_frame.update_message_box(*args, **kwargs)
615
611
 
616
612
  def cb_msg_block(
617
613
  self,
@@ -639,13 +635,12 @@ class GUI(Window):
639
635
  *args: Any,
640
636
  set_progress_mode: Optional[str] = None,
641
637
  steps: int = 0,
642
- update_bar: bool = False,
638
+ update_bar: int = 0,
643
639
  **kwargs: Any,
644
640
  ) -> None:
645
- with self.bar_lock:
646
- self.progress_frame.update_progress_bar(
647
- set_progress_mode, steps, update_bar, *args, **kwargs
648
- )
641
+ self.progress_frame.update_progress_bar(
642
+ set_progress_mode, steps, update_bar, *args, **kwargs
643
+ )
649
644
 
650
645
  def highlight_fields(self) -> bool:
651
646
  if not self.init_done:
@@ -42,7 +42,7 @@ class ConfigFrame(LabelFrame):
42
42
  )
43
43
 
44
44
  self.settings_restore_default_lbl = Label(
45
- self, text="Restore default config", width=18, justify="left", anchor="w"
45
+ self, text="Default config", width=18, justify="left", anchor="w"
46
46
  )
47
47
  self.settings_restore_default_btn = Button(
48
48
  self,
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env python3
2
- from typing import TYPE_CHECKING, Any, Optional
2
+ from threading import Lock
3
+ from typing import TYPE_CHECKING, Any, List, Optional
3
4
 
4
5
  from tqdm import tqdm
5
6
  from ttkbootstrap import LabelFrame, Progressbar # type: ignore
@@ -16,6 +17,17 @@ class ProgressFrame(LabelFrame):
16
17
  progress_bar_steps = 0
17
18
  auto_scroll = True
18
19
 
20
+ msg_cls = False
21
+ msg_buffer: List[str] = []
22
+
23
+ bar_mode_changed = False
24
+ bar_mode = "clear"
25
+ bar_updates = 0
26
+ bar_steps = 0
27
+
28
+ msg_lock = Lock()
29
+ bar_lock = Lock()
30
+
19
31
  def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
20
32
  self.gui = gui
21
33
  super().__init__(*args, **kwargs) # type: ignore
@@ -31,64 +43,104 @@ class ProgressFrame(LabelFrame):
31
43
  self.message_box.pack(expand=True, fill="x")
32
44
  self.progress_bar.pack(expand=True, fill="x")
33
45
 
46
+ self.after(40, self.update_ui)
47
+
34
48
  def update_progress_bar(
35
49
  self,
36
50
  set_progress_mode: Optional[str] = None,
37
51
  steps: int = 0,
38
- update_bar: bool = False,
52
+ update_bar: int = 0,
39
53
  ) -> None:
40
- if update_bar and self.progress_bar_cli:
41
- self.progress_bar_cli.update()
42
- self.progress_bar["value"] += 100 / self.progress_bar_steps
43
- elif set_progress_mode == "determinate":
44
- self.progress_bar_cli = tqdm(total=steps)
45
- self.progress_bar.config(mode="determinate")
46
- self.progress_bar_steps = steps
47
- self.progress_bar.stop()
48
- self.progress_bar["value"] = 0
49
- elif set_progress_mode == "indeterminate":
50
- if self.progress_bar_cli:
51
- self.progress_bar_cli.close()
52
- self.progress_bar_cli = None
53
- self.progress_bar["value"] = 0
54
- self.progress_bar.config(mode="indeterminate")
55
- self.progress_bar.start(50)
56
- elif set_progress_mode == "clear":
57
- if self.progress_bar_cli:
58
- self.progress_bar_cli.reset()
59
- self.progress_bar.config(mode="determinate")
60
- self.progress_bar.stop()
61
- self.progress_bar["value"] = 0
54
+ if update_bar:
55
+ with self.bar_lock:
56
+ self.bar_updates += update_bar
57
+
58
+ elif set_progress_mode:
59
+ with self.bar_lock:
60
+ self.bar_mode = set_progress_mode
61
+ self.bar_steps = steps
62
+ self.bar_updates = 0
63
+ self.bar_mode_changed = True
62
64
 
63
65
  def update_message_box(self, *args: Any, **kwargs: Any) -> None:
64
66
  msg = kwargs.get("msg")
65
67
  cls = kwargs.get("cls")
66
- file = kwargs.get("file")
67
68
 
68
69
  if not msg and len(args) == 1:
69
70
  msg = str(args[0])
70
71
 
71
72
  if msg:
72
- if self.progress_bar_cli:
73
- self.progress_bar_cli.write(msg)
74
- elif file:
75
- print(msg, file=file)
76
- else:
77
- print(msg)
78
- msg += "\n"
79
-
80
- self.message_box._text.config(state="normal") # type: ignore
81
-
82
- if cls:
83
- self.message_box.delete(1.0, "end") # type: ignore
84
-
85
- if msg:
86
- self.message_box.insert("end", msg) # type: ignore
87
-
88
- if self.auto_scroll:
89
- self.message_box._text.yview_moveto(1.0) # type: ignore
90
-
91
- self.message_box._text.config(state="disabled") # type: ignore
73
+ with self.msg_lock:
74
+ self.msg_buffer.append(msg)
75
+
76
+ elif cls:
77
+ with self.msg_lock:
78
+ self.msg_cls = True
79
+ self.msg_buffer.clear()
80
+
81
+ def update_ui(self) -> None:
82
+ if self.msg_buffer or self.msg_cls:
83
+ with self.msg_lock:
84
+ msg_cls = self.msg_cls
85
+ msg = "\n".join(self.msg_buffer)
86
+
87
+ self.msg_cls = False
88
+ self.msg_buffer.clear()
89
+
90
+ self.message_box._text.config(state="normal") # type: ignore
91
+
92
+ if msg_cls:
93
+ self.message_box.delete(1.0, "end") # type: ignore
94
+
95
+ if msg:
96
+ if self.progress_bar_cli:
97
+ self.progress_bar_cli.write(msg)
98
+ else:
99
+ print(msg)
100
+
101
+ self.message_box.insert("end", msg + "\n") # type: ignore
102
+
103
+ if self.auto_scroll:
104
+ self.message_box._text.yview_moveto(1.0) # type: ignore
105
+
106
+ self.message_box._text.config(state="disabled") # type: ignore
107
+
108
+ if self.bar_mode_changed or self.bar_updates:
109
+ with self.bar_lock:
110
+ bar_mode_changed = self.bar_mode_changed
111
+ bar_mode = self.bar_mode
112
+ bar_updates = self.bar_updates
113
+ bar_steps = self.bar_steps
114
+
115
+ self.bar_mode_changed = False
116
+ self.bar_updates = 0
117
+
118
+ if bar_mode_changed:
119
+ if bar_mode == "determinate":
120
+ self.progress_bar_cli = tqdm(total=bar_steps)
121
+ self.progress_bar.config(mode="determinate")
122
+ self.progress_bar_steps = bar_steps
123
+ self.progress_bar.stop()
124
+ elif self.progress_bar_cli:
125
+ self.progress_bar_cli.close()
126
+ self.progress_bar_cli = None
127
+
128
+ if bar_mode == "indeterminate":
129
+ self.progress_bar.config(mode="indeterminate")
130
+ self.progress_bar.start(50)
131
+ elif bar_mode == "clear":
132
+ self.progress_bar.config(mode="determinate")
133
+ self.progress_bar.stop()
134
+
135
+ self.progress_bar["value"] = 0
136
+
137
+ if bar_updates and self.progress_bar_cli:
138
+ self.progress_bar_cli.update(bar_updates)
139
+ self.progress_bar["value"] += (
140
+ 100 / self.progress_bar_steps * bar_updates
141
+ )
142
+
143
+ self.after(40, self.update_ui)
92
144
 
93
145
  def cb_disable_autoscroll(self, *_: Any) -> None:
94
146
  self.auto_scroll = False
@@ -41,15 +41,21 @@ class SignalGetAuthWindow(BaseWindow):
41
41
 
42
42
  # Start button frame
43
43
  self.launch_btn = Button(
44
- self.frame_btns, text="Launch Signal Desktop", command=self.cb_launch_signal
44
+ self.frame_btns,
45
+ text="Launch Signal Desktop",
46
+ command=self.cb_launch_signal,
47
+ bootstyle="secondary", # type: ignore
45
48
  )
46
49
 
47
- self.login_btn = Button(
48
- self.frame_btns, text="Get uuid and password", command=self.cb_login
50
+ self.get_cred_btn = Button(
51
+ self.frame_btns,
52
+ text="Get uuid and password",
53
+ command=self.cb_get_cred,
54
+ bootstyle="default", # type: ignore
49
55
  )
50
56
 
51
57
  self.launch_btn.pack()
52
- self.login_btn.pack()
58
+ self.get_cred_btn.pack()
53
59
 
54
60
  # Config frame
55
61
  self.setdir_lbl = Label(
@@ -78,7 +84,7 @@ class SignalGetAuthWindow(BaseWindow):
78
84
 
79
85
  GUIUtils.finalize_window(self)
80
86
 
81
- def cb_login(self) -> None:
87
+ def cb_get_cred(self) -> None:
82
88
  m = GetSignalAuth()
83
89
 
84
90
  signal_bin_path = None
sticker_convert/job.py CHANGED
@@ -11,7 +11,7 @@ from multiprocessing.managers import ListProxy, SyncManager
11
11
  from pathlib import Path
12
12
  from queue import Queue
13
13
  from threading import Thread
14
- from typing import TYPE_CHECKING, Any, Callable, Dict, Generator, Iterator, List, Optional, Tuple
14
+ from typing import TYPE_CHECKING, Any, Callable, Dict, Generator, List, Optional, Tuple
15
15
  from urllib.parse import urlparse
16
16
 
17
17
  from sticker_convert.converter import StickerConvert
@@ -99,7 +99,7 @@ class Executor:
99
99
  elif action == "bar":
100
100
  self.cb_bar(*args, **kwargs)
101
101
  elif action == "update_bar":
102
- self.cb_bar(update_bar=True)
102
+ self.cb_bar(update_bar=1)
103
103
  elif action == "msg_block":
104
104
  cb_return.set_response(self.cb_msg_block(*args, **kwargs))
105
105
  elif action == "ask_bool":
@@ -143,6 +143,7 @@ class Executor:
143
143
  e += traceback.format_exc()
144
144
  e += "#####################"
145
145
  cb_queue.put(e)
146
+
146
147
  work_list.append(None)
147
148
 
148
149
  def start_workers(self, processes: int = 1) -> None:
@@ -175,12 +176,11 @@ class Executor:
175
176
  pass
176
177
 
177
178
  self.results_queue.put(None)
178
- self.work_list = self.manager.list()
179
+ self.work_list[:] = []
179
180
  self.processes.clear()
180
181
 
181
182
  def kill_workers(self, *_: Any, **__: Any) -> None:
182
183
  self.is_cancel_job.value = 1 # type: ignore
183
- self.work_list = self.manager.list()
184
184
 
185
185
  for process in self.processes:
186
186
  if platform.system() == "Windows":
@@ -189,16 +189,17 @@ class Executor:
189
189
  process.close()
190
190
  process.join()
191
191
 
192
- self.cleanup()
192
+ self.cleanup(killed=True)
193
193
 
194
- def cleanup(self) -> None:
194
+ def cleanup(self, killed: bool = False) -> None:
195
+ if killed:
196
+ self.cb_queue.put("Job cancelled.")
197
+ self.cb_queue.put(("bar", None, {"set_progress_mode": "clear"}))
195
198
  self.cb_queue.put(None)
196
199
  self.cb_thread_instance.join()
197
- self.work_list = self.manager.list()
198
200
 
199
201
  def get_result(self) -> Generator[Any, None, None]:
200
- gen: Iterator[Any] = iter(self.results_queue.get, None)
201
- yield from gen
202
+ yield from iter(self.results_queue.get, None)
202
203
 
203
204
  def cb(
204
205
  self,
@@ -268,14 +269,12 @@ class Job:
268
269
 
269
270
  if self.executor.is_cancel_job.value == 1: # type: ignore
270
271
  code = 2
271
- self.executor.cb("Job cancelled.")
272
272
  break
273
273
  if not success:
274
274
  code = 1
275
275
  self.executor.cb("An error occured during this run.")
276
276
  break
277
277
 
278
- self.executor.cb("bar", kwargs={"set_progress_mode": "clear"})
279
278
  self.executor.cleanup()
280
279
 
281
280
  return code
@@ -3,11 +3,11 @@ import copy
3
3
  import re
4
4
  from pathlib import Path
5
5
  from queue import Queue
6
- from typing import Any, Dict, List, Optional, Union, cast
6
+ from typing import Any, Dict, List, Optional, Tuple, Union, cast
7
7
 
8
8
  import anyio
9
- from telegram import InputFile, InputSticker, Sticker
10
- from telegram.error import TelegramError
9
+ from telegram import InputSticker, Sticker
10
+ from telegram.error import BadRequest, TelegramError
11
11
  from telegram.ext import AIORateLimiter, ApplicationBuilder
12
12
 
13
13
  from sticker_convert.converter import StickerConvert
@@ -128,7 +128,22 @@ class UploadTelegram(UploadBase):
128
128
 
129
129
  if response is True:
130
130
  self.cb.put(f"Deleting all stickers from pack {pack_short_name}")
131
- await bot.delete_sticker_set(pack_short_name)
131
+ try:
132
+ await bot.delete_sticker_set(pack_short_name)
133
+ except BadRequest as e:
134
+ self.cb.put(
135
+ f"Cannot delete sticker set {pack_short_name} due to {e}"
136
+ )
137
+ if str(e) == "Stickerpack_not_found":
138
+ self.cb.put(
139
+ "Hint: You might had deleted and recreated pack too quickly. Wait about 3 minutes and try again."
140
+ )
141
+ return None
142
+ except TelegramError as e:
143
+ self.cb.put(
144
+ f"Cannot delete sticker set {pack_short_name} due to {e}"
145
+ )
146
+ return None
132
147
  sticker_set = None
133
148
  else:
134
149
  self.cb.put(f"Not deleting existing pack {pack_short_name}")
@@ -138,7 +153,7 @@ class UploadTelegram(UploadBase):
138
153
  else:
139
154
  sticker_type = Sticker.REGULAR
140
155
 
141
- input_stickers: List[InputSticker] = []
156
+ input_stickers: List[Tuple[Path, InputSticker]] = []
142
157
  sticker_format = None
143
158
  cover_spec_choice = None
144
159
  ext = None
@@ -190,7 +205,7 @@ class UploadTelegram(UploadBase):
190
205
  sticker_bytes = cast(bytes, convert_result)
191
206
 
192
207
  input_stickers.append(
193
- InputSticker(sticker=sticker_bytes, emoji_list=emoji_list)
208
+ (src, InputSticker(sticker=sticker_bytes, emoji_list=emoji_list))
194
209
  )
195
210
 
196
211
  cover_path = MetadataHandler.get_cover(self.opt_output.dir)
@@ -208,9 +223,7 @@ class UploadTelegram(UploadBase):
208
223
  self.cb_return,
209
224
  )
210
225
 
211
- base_num = 1
212
226
  if sticker_set is None and sticker_format is not None:
213
- init_stickers = input_stickers[:50]
214
227
  if len(input_stickers) > 50:
215
228
  amount_str = "first 50"
216
229
  else:
@@ -224,35 +237,38 @@ class UploadTelegram(UploadBase):
224
237
  user_id=self.opt_cred.telegram_userid,
225
238
  name=pack_short_name,
226
239
  title=pack_title,
227
- stickers=init_stickers,
240
+ stickers=[a for _, a in input_stickers[:50]],
228
241
  sticker_format=sticker_format,
229
242
  sticker_type=sticker_type,
230
243
  )
231
244
  self.cb.put(finish_msg)
232
245
  input_stickers = input_stickers[50:]
233
- base_num = 51
234
246
  except TelegramError as e:
235
247
  self.cb.put(f"{error_msg} {e}")
236
248
  return None
237
249
 
238
- if len(input_stickers) > 0:
239
- self.cb.put(f"Uploading stickers of {pack_short_name} one-by-one")
240
- for i, sticker in enumerate(input_stickers):
241
- assert isinstance(sticker.sticker, InputFile)
242
- num = base_num + i
243
- try:
244
- # We could use tg.start_soon() here
245
- # But this would disrupt the order of stickers
246
- await bot.add_sticker_to_set(
247
- user_id=self.opt_cred.telegram_userid,
248
- name=pack_short_name,
249
- sticker=sticker,
250
- )
251
- self.cb.put(f"Uploaded sticker #{num} of {pack_short_name}")
252
- except TelegramError as e:
250
+ for src, sticker in input_stickers:
251
+ try:
252
+ # We could use tg.start_soon() here
253
+ # But this would disrupt the order of stickers
254
+ await bot.add_sticker_to_set(
255
+ user_id=self.opt_cred.telegram_userid,
256
+ name=pack_short_name,
257
+ sticker=sticker,
258
+ )
259
+ self.cb.put(f"Uploaded sticker {src} of {pack_short_name}")
260
+ except BadRequest as e:
261
+ self.cb.put(
262
+ f"Cannot upload sticker {src} of {pack_short_name} due to {e}"
263
+ )
264
+ if str(e) == "Stickerpack_not_found":
253
265
  self.cb.put(
254
- f"Cannot upload sticker #{num} of {pack_short_name} due to {e}"
266
+ "Hint: You might had deleted and recreated pack too quickly. Wait about 3 minutes and try again."
255
267
  )
268
+ except TelegramError as e:
269
+ self.cb.put(
270
+ f"Cannot upload sticker {src} of {pack_short_name} due to {e}"
271
+ )
256
272
 
257
273
  if thumbnail_bytes is not None:
258
274
  try:
@@ -36,10 +36,16 @@ class GetSignalAuth:
36
36
  "~/Library/Application Support/Signal Beta"
37
37
  )
38
38
  else:
39
- if not (signal_bin_path_prod := shutil.which("signal-desktop")): # type: ignore
39
+ prod_which = shutil.which("signal-desktop")
40
+ if prod_which is None:
40
41
  signal_bin_path_prod = "signal-desktop"
41
- if not (signal_bin_path_beta := shutil.which("signal-desktop-beta")): # type: ignore
42
+ else:
43
+ signal_bin_path_prod = prod_which
44
+ beta_which = shutil.which("signal-desktop-beta")
45
+ if beta_which is None:
42
46
  signal_bin_path_beta = "signal-desktop-beta"
47
+ else:
48
+ signal_bin_path_beta = beta_which
43
49
  signal_user_data_dir_prod = os.path.expanduser("~/.config/Signal")
44
50
  signal_user_data_dir_beta = os.path.expanduser("~/.config/Signal Beta")
45
51
 
@@ -79,7 +79,6 @@ class Callback:
79
79
  return
80
80
 
81
81
  msg = kwargs.get("msg")
82
- file = kwargs.get("file")
83
82
 
84
83
  if not msg and len(args) == 1:
85
84
  msg = str(args[0])
@@ -87,8 +86,6 @@ class Callback:
87
86
  if msg:
88
87
  if self.progress_bar:
89
88
  self.progress_bar.write(msg)
90
- elif file:
91
- print(msg, file=file)
92
89
  else:
93
90
  print(msg)
94
91
 
@@ -96,19 +93,17 @@ class Callback:
96
93
  self,
97
94
  set_progress_mode: Optional[str] = None,
98
95
  steps: int = 0,
99
- update_bar: bool = False,
96
+ update_bar: int = 0,
100
97
  ) -> None:
101
98
  if self.silent:
102
99
  return
103
100
 
104
101
  if self.progress_bar:
105
102
  if update_bar:
106
- self.progress_bar.update()
107
- elif set_progress_mode == "indeterminate":
103
+ self.progress_bar.update(update_bar)
104
+ elif set_progress_mode in ("indeterminate", "clear"):
108
105
  self.progress_bar.close()
109
106
  self.progress_bar = None
110
- elif set_progress_mode == "clear":
111
- self.progress_bar.reset()
112
107
  elif set_progress_mode == "determinate":
113
108
  self.progress_bar = tqdm(total=steps)
114
109
 
@@ -190,7 +185,7 @@ class Callback:
190
185
  elif action == "bar":
191
186
  self.bar(**kwargs)
192
187
  elif action == "update_bar":
193
- self.bar(update_bar=True)
188
+ self.bar(update_bar=1)
194
189
  elif action == "msg_block":
195
190
  return self.msg_block(*args, **kwargs)
196
191
  elif action == "ask_bool":
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.7.5"
3
+ __version__ = "2.7.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.7.5
3
+ Version: 2.7.7
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>
@@ -1,12 +1,12 @@
1
1
  sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
2
2
  sticker_convert/__main__.py,sha256=6RJauR-SCSSTT3TU7FFB6B6PVwsCxO2xZXtmZ3jc2Is,463
3
- sticker_convert/cli.py,sha256=9juw31O8oVRWHMs8YgUtzX0bLamouDiO4xiqFkjWNP8,17575
3
+ sticker_convert/cli.py,sha256=LXX-LPlFeFKZLc7LKjdtDDLtOqmognEze0kMSr8Vj50,17543
4
4
  sticker_convert/converter.py,sha256=ZAuRO6Ic6e1nhJc_pBsBlPMVyHZzy87q5Gk_naCRShI,31241
5
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
6
+ sticker_convert/gui.py,sha256=N3JTsxYtzcHIjrY1FrMczCe3U_bt8E_-3BAdHH0t8L8,30104
7
+ sticker_convert/job.py,sha256=tvK2JrL33DX4swErEihw1sLFv-IP_JQPoPpIpg6JSQ0,25833
8
8
  sticker_convert/job_option.py,sha256=niPTGZ4X1iUdkxyVc29oM67bpsUNBX9Um7OOJNa3piE,7521
9
- sticker_convert/version.py,sha256=OU4NULBRqVERpg0r3F33hEKKnN8MhplQOCl0tkHJ9ak,46
9
+ sticker_convert/version.py,sha256=jSfFumyqVCtgQ0gUWQGbYTxqs9lhLwaV1Vi6ncCy0cY,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
@@ -17,19 +17,19 @@ sticker_convert/gui_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
17
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
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
20
+ sticker_convert/gui_components/frames/config_frame.py,sha256=b3X4QAnGpde0OhthXHmjSyU_Yb5tYRUFXmy04Yi8Zmo,4316
21
21
  sticker_convert/gui_components/frames/control_frame.py,sha256=_XiOJ9JPUfiysDghGG04sEVLrXG9TMVlDZ60W0LhYVI,835
22
22
  sticker_convert/gui_components/frames/cred_frame.py,sha256=I3XrOv7kUOsvFWquuzWWpZWbLclqKQXgD7dx5pcTuY4,6499
23
23
  sticker_convert/gui_components/frames/input_frame.py,sha256=5Vz1d6J1jkofvvzm43DxeIW_CjWfxa2QPYFnkAAiAfM,5040
24
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
25
+ sticker_convert/gui_components/frames/progress_frame.py,sha256=LWUZg_iL7iiNTfu7N5Ct_pklZdghxihENi7DP9YozOE,4915
26
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
28
  sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=1UulI_3ZtXdc34aq-hzFyV2WBZOC5OWGFUAMdf7ipU0,32105
29
29
  sticker_convert/gui_components/windows/base_window.py,sha256=xBE1peGMPvWsdrFej0CJUVhmQ57GJGvz-cX03nIIhkE,1108
30
30
  sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=AvXB2Q8pAPkKILHTvlLGV9jfBcvskCA4arko4nvBTdo,7115
31
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
32
+ sticker_convert/gui_components/windows/signal_get_auth_window.py,sha256=kbJPe558lLP4PbPT2mCw4Xgh06FX5mBEZXoW-Q1LvWY,4584
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
@@ -75,13 +75,13 @@ sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
75
75
  sticker_convert/uploaders/compress_wastickers.py,sha256=vrrd2huRGEw0Dbd3EqS162MsQHuzFk5rhB6GnD9zhfU,6062
76
76
  sticker_convert/uploaders/upload_base.py,sha256=FDNZdMUcamLtnxy1XNMHk1N1MJapTlODLDhod5wqo7g,1386
77
77
  sticker_convert/uploaders/upload_signal.py,sha256=6H4GT10d_J9rEA0Ov1CTdNagxuRDjGYtuQYZADV05Lo,6606
78
- sticker_convert/uploaders/upload_telegram.py,sha256=aKkAgzQCPDXI0AO-sGz-tK7mlj9ZbUlaosF9A6qqkY8,13853
78
+ sticker_convert/uploaders/upload_telegram.py,sha256=JXgnIQcyoMjgAOfZ9TatMn4CeeOkk1Nytc7FdbN7DBA,14679
79
79
  sticker_convert/uploaders/xcode_imessage.py,sha256=mwnUTNclq4SFGX8JgFoM-bsvAtsYtrjg6gFPNdRgbWk,11319
80
- sticker_convert/utils/callback.py,sha256=qMGboov4bd6MnrMrQkIlS4TadgbKaF9R8yeR5twMItU,5450
80
+ sticker_convert/utils/callback.py,sha256=JnwrgaSNdl-74Nd-fz6EH-r6ePLLb-4a5C1P0OAPjNQ,5279
81
81
  sticker_convert/utils/url_detect.py,sha256=Cw3SzHj0xQTgCY8KvXbgFGRn_VhDJuZvH0mWsiQOg5s,769
82
82
  sticker_convert/utils/auth/get_kakao_auth.py,sha256=ipAZ1DUd5CMTpUoxRXHVOFC3DKIpxwxpTYAfrOJ6UZ8,9829
83
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
84
+ sticker_convert/utils/auth/get_signal_auth.py,sha256=6Sx-lMuyBHeX1RpjAWI8u03qnRu9fmO4p89pd7fowOE,4925
85
85
  sticker_convert/utils/files/cache_store.py,sha256=etfe614OAhAyrnM5fGeESKq6R88YLNqkqkxSzEmZ0V0,1047
86
86
  sticker_convert/utils/files/json_manager.py,sha256=Vr6pZJdLMkrJJWN99210aduVHb0ILyf0SSTaw4TZqgc,541
87
87
  sticker_convert/utils/files/json_resources_loader.py,sha256=H3uMn-77wtALwiGAPhA31OIohcZtWvvzXO7rFmM8EMg,535
@@ -92,9 +92,9 @@ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE
92
92
  sticker_convert/utils/media/codec_info.py,sha256=slKvwLxgJz1txJIN4gJ5dAFDLvZLhnTP29Pm8GYveSM,12984
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.5.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
96
- sticker_convert-2.7.5.dist-info/METADATA,sha256=LzCoYvSkqEvfNym3Xwvz3WjiUzJcX7DriyKhHX-e1sc,48379
97
- sticker_convert-2.7.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
98
- sticker_convert-2.7.5.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
99
- sticker_convert-2.7.5.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
100
- sticker_convert-2.7.5.dist-info/RECORD,,
95
+ sticker_convert-2.7.7.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
96
+ sticker_convert-2.7.7.dist-info/METADATA,sha256=oLKVy7XCVQ5m6S2WDRiynT_ATYnahnL5PmG4t7tU7Ak,48379
97
+ sticker_convert-2.7.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
98
+ sticker_convert-2.7.7.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
99
+ sticker_convert-2.7.7.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
100
+ sticker_convert-2.7.7.dist-info/RECORD,,