sticker-convert 2.10.9__py3-none-any.whl → 2.11.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
sticker_convert/cli.py CHANGED
@@ -20,6 +20,7 @@ from sticker_convert.utils.auth.get_kakao_desktop_auth import GetKakaoDesktopAut
20
20
  from sticker_convert.utils.auth.get_line_auth import GetLineAuth
21
21
  from sticker_convert.utils.auth.get_signal_auth import GetSignalAuth
22
22
  from sticker_convert.utils.auth.get_viber_auth import GetViberAuth
23
+ from sticker_convert.utils.auth.telethon_setup import TelethonSetup
23
24
  from sticker_convert.utils.callback import Callback
24
25
  from sticker_convert.utils.files.json_manager import JsonManager
25
26
  from sticker_convert.utils.url_detect import UrlDetect
@@ -168,10 +169,12 @@ class CLI:
168
169
  parser_cred = parser.add_argument_group("Credentials options")
169
170
  flags_cred_bool = (
170
171
  "signal_get_auth",
172
+ "telethon_setup",
171
173
  "kakao_get_auth",
172
174
  "kakao_get_auth_desktop",
173
175
  "line_get_auth",
174
176
  "discord_get_auth",
177
+ "save_cred",
175
178
  )
176
179
  for k, v in self.help["cred"].items():
177
180
  keyword_args = {}
@@ -226,6 +229,7 @@ class CLI:
226
229
  "signal": args.download_signal,
227
230
  "line": args.download_line,
228
231
  "telegram": args.download_telegram,
232
+ "telegram_telethon": args.download_telegram_telethon,
229
233
  "kakao": args.download_kakao,
230
234
  "viber": args.download_viber,
231
235
  "discord": args.download_discord,
@@ -266,6 +270,14 @@ class CLI:
266
270
  export_option = "signal"
267
271
  elif args.export_telegram:
268
272
  export_option = "telegram"
273
+ elif args.export_telegram_emoji:
274
+ export_option = "telegram_emoji"
275
+ elif args.export_telegram_telethon:
276
+ export_option = "telegram_telethon"
277
+ elif args.export_telegram_emoji_telethon:
278
+ export_option = "telegram_emoji_telethon"
279
+ elif args.export_viber:
280
+ export_option = "viber"
269
281
  elif args.export_imessage:
270
282
  export_option = "imessage"
271
283
  else:
@@ -291,6 +303,10 @@ class CLI:
291
303
  args.export_whatsapp,
292
304
  args.export_signal,
293
305
  args.export_telegram,
306
+ args.export_telegram_emoji,
307
+ args.export_telegram_telethon,
308
+ args.export_telegram_emoji_telethon,
309
+ args.export_viber,
294
310
  args.export_imessage,
295
311
  )
296
312
  )
@@ -302,8 +318,12 @@ class CLI:
302
318
  preset = "whatsapp"
303
319
  elif args.export_signal:
304
320
  preset = "signal"
305
- elif args.export_telegram:
321
+ elif args.export_telegram or args.export_telegram_telethon:
306
322
  preset = "telegram"
323
+ elif args.export_telegram_emoji or args.export_telegram_emoji_telethon:
324
+ preset = "telegram_emoji"
325
+ elif args.export_viber:
326
+ preset = "viber"
307
327
  elif args.export_imessage:
308
328
  preset = "imessage_small"
309
329
  elif args.preset == "auto":
@@ -316,6 +336,12 @@ class CLI:
316
336
  self.cb.msg(
317
337
  "Auto compression option set to no_compress (Reason: Export to local directory only)"
318
338
  )
339
+ elif "telegram_emoji" in output_option:
340
+ preset = "telegram_emoji"
341
+ self.cb.msg(f"Auto compression option set to {preset}")
342
+ elif "telegram" in output_option:
343
+ preset = "telegram"
344
+ self.cb.msg(f"Auto compression option set to {preset}")
319
345
  elif output_option == "imessage":
320
346
  preset = "imessage_small"
321
347
  self.cb.msg(f"Auto compression option set to {preset}")
@@ -445,6 +471,8 @@ class CLI:
445
471
  telegram_userid=args.telegram_userid
446
472
  if args.telegram_userid
447
473
  else creds.get("telegram", {}).get("userid"),
474
+ telethon_api_id=creds.get("telethon", {}).get("api_id"),
475
+ telethon_api_hash=creds.get("telethon", {}).get("api_hash"),
448
476
  kakao_auth_token=args.kakao_auth_token
449
477
  if args.kakao_auth_token
450
478
  else creds.get("kakao", {}).get("auth_token"),
@@ -511,6 +539,16 @@ class CLI:
511
539
 
512
540
  self.cb.msg("Failed to get uuid and password")
513
541
 
542
+ if args.telethon_setup:
543
+ telethon_setup = TelethonSetup(opt_cred, self.cb.ask_str)
544
+ success, _, telethon_api_id, telethon_api_hash = telethon_setup.start()
545
+
546
+ if success:
547
+ opt_cred.telethon_api_id = telethon_api_id
548
+ opt_cred.telethon_api_hash = telethon_api_hash
549
+
550
+ self.cb.msg("Telethon setup successful")
551
+
514
552
  if args.line_get_auth:
515
553
  get_line_auth = GetLineAuth()
516
554
 
@@ -434,7 +434,7 @@ class StickerConvert:
434
434
  # Pillow is not reliable for getting webp frame durations
435
435
  durations: Optional[List[int]]
436
436
  if im.format == "WEBP":
437
- _, _, _, durations = CodecInfo._get_file_fps_frames_duration_webp(
437
+ _, _, _, durations = CodecInfo._get_file_fps_frames_duration_webp( # type: ignore
438
438
  self.in_f
439
439
  )
440
440
  else:
@@ -764,7 +764,7 @@ class StickerConvert:
764
764
  format=self.out_f.suffix.replace(".", ""),
765
765
  options=options_container,
766
766
  ) as output:
767
- out_stream = output.add_stream(codec, rate=self.fps, options=options_stream)
767
+ out_stream = output.add_stream(codec, rate=self.fps, options=options_stream) # type: ignore
768
768
  out_stream = cast(VideoStream, out_stream)
769
769
  assert isinstance(self.res_w, int) and isinstance(self.res_h, int)
770
770
  out_stream.width = self.res_w
@@ -811,9 +811,12 @@ class StickerConvert:
811
811
  elif self.out_f.suffix == ".webp":
812
812
  im_out = [Image.fromarray(i) for i in self.frames_processed] # type: ignore
813
813
  extra_kwargs["format"] = "WebP"
814
- # Enabling below is too slow
815
- # extra_kwargs["minimize_size"] = True
816
- # extra_kwargs["method"] = 6
814
+ extra_kwargs["allow_mixed"] = True
815
+ if self.quality:
816
+ if self.quality < 20:
817
+ extra_kwargs["minimize_size"] = True
818
+ extra_kwargs["method"] = 4 + int(2 * (100 - self.quality) / 100)
819
+ extra_kwargs["alpha_quality"] = self.quality
817
820
  else:
818
821
  raise RuntimeError(f"Invalid format {self.out_f.suffix}")
819
822
 
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  from functools import partial
5
5
  from pathlib import Path
6
- from typing import Any, List, Optional, Tuple
6
+ from typing import Any, Dict, List, Optional, Tuple
7
7
 
8
8
  import anyio
9
9
  import httpx
@@ -34,8 +34,8 @@ class DownloadBase:
34
34
  retries: int = 3,
35
35
  headers: Optional[dict[Any, Any]] = None,
36
36
  **kwargs: Any,
37
- ) -> dict[str, bool]:
38
- results: dict[str, bool] = {}
37
+ ) -> Dict[str, bool]:
38
+ results: Dict[str, bool] = {}
39
39
  anyio.run(
40
40
  partial(
41
41
  self.download_multiple_files_async,
@@ -63,11 +63,13 @@ class DownloadSignal(DownloadBase):
63
63
  )
64
64
 
65
65
  def download_stickers_signal(self) -> Tuple[int, int]:
66
- if "signal.art" not in self.url:
66
+ if "signal.art" not in self.url or not self.url.startswith(
67
+ "sgnl://addstickers/"
68
+ ):
67
69
  self.cb.put("Download failed: Unrecognized URL format")
68
70
  return 0, 0
69
71
 
70
- pack_id = self.url.split("#pack_id=")[1].split("&pack_key=")[0]
72
+ pack_id = self.url.split("pack_id=")[1].split("&pack_key=")[0]
71
73
  pack_key = self.url.split("&pack_key=")[1]
72
74
 
73
75
  try:
@@ -1,15 +1,13 @@
1
1
  #!/usr/bin/env python3
2
2
  from pathlib import Path
3
- from typing import Dict, Optional, Tuple, Union
3
+ from typing import Optional, Tuple
4
4
  from urllib.parse import urlparse
5
5
 
6
6
  import anyio
7
- from telegram import PhotoSize, Sticker, StickerSet
8
- from telegram.error import TelegramError
9
- from telegram.ext import AIORateLimiter, ApplicationBuilder
10
7
 
11
8
  from sticker_convert.downloaders.download_base import DownloadBase
12
9
  from sticker_convert.job_option import CredOption, InputOption
10
+ from sticker_convert.utils.auth.telegram_api import BotAPI, TelegramAPI, TelethonAPI
13
11
  from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
14
12
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
15
13
 
@@ -19,114 +17,32 @@ class DownloadTelegram(DownloadBase):
19
17
  # super().__init__(*args, **kwargs)
20
18
 
21
19
  def download_stickers_telegram(self) -> Tuple[int, int]:
22
- self.token = ""
23
-
24
- if self.opt_cred:
25
- self.token = self.opt_cred.telegram_token.strip()
26
- if not self.token:
27
- self.cb.put("Download failed: Token required for downloading from telegram")
28
- return 0, 0
29
-
30
20
  if not ("telegram.me" in self.url or "t.me" in self.url):
31
21
  self.cb.put("Download failed: Unrecognized URL format")
32
22
  return 0, 0
33
23
 
34
- self.title = Path(urlparse(self.url).path).name
35
-
36
- self.emoji_dict: Dict[str, str] = {}
37
-
38
24
  return anyio.run(self.save_stickers)
39
25
 
40
26
  async def save_stickers(self) -> Tuple[int, int]:
41
- results: dict[str, bool] = {}
42
- timeout = 30
43
- application = ( # type: ignore
44
- ApplicationBuilder()
45
- .token(self.token)
46
- .rate_limiter(AIORateLimiter(max_retries=3))
47
- .connect_timeout(timeout)
48
- .pool_timeout(timeout)
49
- .read_timeout(timeout)
50
- .write_timeout(timeout)
51
- .connection_pool_size(20)
52
- .build()
53
- )
54
-
55
- async with application:
56
- bot = application.bot
57
- try:
58
- sticker_set: StickerSet = await bot.get_sticker_set(
59
- self.title,
60
- read_timeout=timeout,
61
- write_timeout=timeout,
62
- connect_timeout=timeout,
63
- pool_timeout=timeout,
64
- )
65
- except TelegramError as e:
66
- self.cb.put(
67
- f"Failed to download telegram sticker set {self.title} due to: {e}"
68
- )
69
- return 0, 0
70
-
71
- self.cb.put(
72
- (
73
- "bar",
74
- None,
75
- {
76
- "set_progress_mode": "determinate",
77
- "steps": len(sticker_set.stickers),
78
- },
79
- )
80
- )
81
-
82
- async def download_sticker(
83
- sticker: Union[PhotoSize, Sticker], f_id: str, results: dict[str, bool]
84
- ) -> None:
85
- try:
86
- sticker_file = await sticker.get_file(
87
- read_timeout=timeout,
88
- write_timeout=timeout,
89
- connect_timeout=timeout,
90
- pool_timeout=timeout,
91
- )
92
- except TelegramError as e:
93
- self.cb.put(f"Failed to download {f_id}: {str(e)}")
94
- results[f_id] = False
95
- return
96
- fpath = sticker_file.file_path
97
- assert fpath is not None
98
- ext = Path(fpath).suffix
99
- f_name = f_id + ext
100
- f_path = Path(self.out_dir, f_name)
101
- await sticker_file.download_to_drive(
102
- custom_path=f_path,
103
- read_timeout=timeout,
104
- write_timeout=timeout,
105
- connect_timeout=timeout,
106
- pool_timeout=timeout,
107
- )
108
- if isinstance(sticker, Sticker) and sticker.emoji is not None:
109
- self.emoji_dict[f_id] = sticker.emoji
110
- self.cb.put(f"Downloaded {f_name}")
111
- results[f_id] = True
112
- if f_id != "cover":
113
- self.cb.put("update_bar")
114
-
115
- async with anyio.create_task_group() as tg:
116
- for num, sticker in enumerate(sticker_set.stickers):
117
- f_id = str(num).zfill(3)
118
- tg.start_soon(download_sticker, sticker, f_id, results)
27
+ tg_api: TelegramAPI
28
+ if self.input_option.endswith("telethon"):
29
+ tg_api = TelethonAPI()
30
+ else:
31
+ tg_api = BotAPI()
32
+
33
+ if self.opt_cred is None:
34
+ self.cb.put("Download failed: No credentials")
35
+ return 0, 0
119
36
 
120
- if sticker_set.thumbnail is not None:
121
- results_thumb: dict[str, bool] = {}
122
- tg.start_soon(
123
- download_sticker, sticker_set.thumbnail, "cover", results_thumb
124
- )
37
+ success = await tg_api.setup(self.opt_cred, False, self.cb, self.cb_return)
38
+ if success is False:
39
+ self.cb.put("Download failed: Invalid credentials")
40
+ return 0, 0
125
41
 
126
- MetadataHandler.set_metadata(
127
- self.out_dir, title=self.title, emoji_dict=self.emoji_dict
128
- )
129
- return sum(results.values()), len(sticker_set.stickers)
42
+ title = Path(urlparse(self.url).path).name
43
+ results, emoji_dict = await tg_api.pack_dl(title, self.out_dir)
44
+ MetadataHandler.set_metadata(self.out_dir, title=title, emoji_dict=emoji_dict)
45
+ return sum(results.values()), len(results)
130
46
 
131
47
  @staticmethod
132
48
  def start(
sticker_convert/gui.py CHANGED
@@ -154,6 +154,8 @@ class GUI(Window):
154
154
  self.signal_password_var = StringVar(self)
155
155
  self.telegram_token_var = StringVar(self)
156
156
  self.telegram_userid_var = StringVar(self)
157
+ self.telethon_api_id_var = IntVar(self)
158
+ self.telethon_api_hash_var = StringVar(self)
157
159
  self.kakao_auth_token_var = StringVar(self)
158
160
  self.kakao_username_var = StringVar(self)
159
161
  self.kakao_password_var = StringVar(self)
@@ -406,6 +408,10 @@ class GUI(Window):
406
408
  self.signal_password_var.set(self.creds.get("signal", {}).get("password", ""))
407
409
  self.telegram_token_var.set(self.creds.get("telegram", {}).get("token", ""))
408
410
  self.telegram_userid_var.set(self.creds.get("telegram", {}).get("userid", ""))
411
+ self.telethon_api_id_var.set(self.creds.get("telethon", {}).get("api_id", 0))
412
+ self.telethon_api_hash_var.set(
413
+ self.creds.get("telethon", {}).get("api_hash", "")
414
+ )
409
415
  self.kakao_auth_token_var.set(self.creds.get("kakao", {}).get("auth_token", ""))
410
416
  self.kakao_username_var.set(self.creds.get("kakao", {}).get("username", ""))
411
417
  self.kakao_password_var.set(self.creds.get("kakao", {}).get("password", ""))
@@ -451,6 +457,10 @@ class GUI(Window):
451
457
  selection = self.comp_preset_var.get()
452
458
  if selection == "auto":
453
459
  output_option = self.get_output_name()
460
+ if "telegram_emoji" in output_option:
461
+ return "telegram_emoji"
462
+ if "telegram" in output_option:
463
+ return "telegram"
454
464
  if output_option == "imessage":
455
465
  return "imessage_small"
456
466
  if output_option == "local":
@@ -572,6 +582,8 @@ class GUI(Window):
572
582
  signal_password=self.signal_password_var.get(),
573
583
  telegram_token=self.telegram_token_var.get(),
574
584
  telegram_userid=self.telegram_userid_var.get(),
585
+ telethon_api_id=self.telethon_api_id_var.get(),
586
+ telethon_api_hash=self.telethon_api_hash_var.get(),
575
587
  kakao_auth_token=self.kakao_auth_token_var.get(),
576
588
  kakao_username=self.kakao_username_var.get(),
577
589
  kakao_password=self.kakao_password_var.get(),
@@ -10,6 +10,7 @@ from sticker_convert.gui_components.windows.kakao_get_auth_window import KakaoGe
10
10
  from sticker_convert.gui_components.windows.line_get_auth_window import LineGetAuthWindow
11
11
  from sticker_convert.gui_components.windows.signal_get_auth_window import SignalGetAuthWindow
12
12
  from sticker_convert.gui_components.windows.viber_get_auth_window import ViberGetAuthWindow
13
+ from sticker_convert.utils.auth.telethon_setup import TelethonSetup
13
14
 
14
15
  if TYPE_CHECKING:
15
16
  from sticker_convert.gui import GUI # type: ignore
@@ -77,6 +78,16 @@ class CredFrame(LabelFrame):
77
78
  )
78
79
  self.telegram_userid_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
79
80
 
81
+ self.telethon_auth_lbl = Label(
82
+ self, text="Telethon authorization", justify="left", anchor="w"
83
+ )
84
+ self.telethon_auth_btn = Button(
85
+ self,
86
+ text="Generate",
87
+ command=self.cb_telethon_get_auth,
88
+ bootstyle="secondary", # type: ignore
89
+ )
90
+
80
91
  self.kakao_auth_token_lbl = Label(
81
92
  self, text="Kakao auth_token", justify="left", anchor="w"
82
93
  )
@@ -157,19 +168,21 @@ class CredFrame(LabelFrame):
157
168
  self.telegram_userid_entry.grid(
158
169
  column=1, row=4, columnspan=2, sticky="w", padx=3, pady=3
159
170
  )
160
- self.kakao_auth_token_lbl.grid(column=0, row=5, sticky="w", padx=3, pady=3)
161
- self.kakao_auth_token_entry.grid(column=1, row=5, sticky="w", padx=3, pady=3)
162
- self.kakao_get_auth_btn.grid(column=2, row=5, sticky="e", padx=3, pady=3)
163
- self.line_cookies_lbl.grid(column=0, row=6, sticky="w", padx=3, pady=3)
164
- self.line_cookies_entry.grid(column=1, row=6, sticky="w", padx=3, pady=3)
165
- self.line_get_auth_btn.grid(column=2, row=6, sticky="e", padx=3, pady=3)
166
- self.viber_auth_lbl.grid(column=0, row=7, sticky="w", padx=3, pady=3)
167
- self.viber_auth_entry.grid(column=1, row=7, sticky="w", padx=3, pady=3)
168
- self.viber_get_auth_btn.grid(column=2, row=7, sticky="e", padx=3, pady=3)
169
- self.discord_token_lbl.grid(column=0, row=8, sticky="w", padx=3, pady=3)
170
- self.discord_token_entry.grid(column=1, row=8, sticky="w", padx=3, pady=3)
171
- self.discord_get_auth_btn.grid(column=2, row=8, sticky="e", padx=3, pady=3)
172
- self.help_btn.grid(column=2, row=9, sticky="e", padx=3, pady=3)
171
+ self.telethon_auth_lbl.grid(column=0, row=5, sticky="w", padx=3, pady=3)
172
+ self.telethon_auth_btn.grid(column=2, row=5, sticky="e", padx=3, pady=3)
173
+ self.kakao_auth_token_lbl.grid(column=0, row=6, sticky="w", padx=3, pady=3)
174
+ self.kakao_auth_token_entry.grid(column=1, row=6, sticky="w", padx=3, pady=3)
175
+ self.kakao_get_auth_btn.grid(column=2, row=6, sticky="e", padx=3, pady=3)
176
+ self.line_cookies_lbl.grid(column=0, row=7, sticky="w", padx=3, pady=3)
177
+ self.line_cookies_entry.grid(column=1, row=7, sticky="w", padx=3, pady=3)
178
+ self.line_get_auth_btn.grid(column=2, row=7, sticky="e", padx=3, pady=3)
179
+ self.viber_auth_lbl.grid(column=0, row=8, sticky="w", padx=3, pady=3)
180
+ self.viber_auth_entry.grid(column=1, row=8, sticky="w", padx=3, pady=3)
181
+ self.viber_get_auth_btn.grid(column=2, row=8, sticky="e", padx=3, pady=3)
182
+ self.discord_token_lbl.grid(column=0, row=9, sticky="w", padx=3, pady=3)
183
+ self.discord_token_entry.grid(column=1, row=9, sticky="w", padx=3, pady=3)
184
+ self.discord_get_auth_btn.grid(column=2, row=9, sticky="e", padx=3, pady=3)
185
+ self.help_btn.grid(column=2, row=10, sticky="e", padx=3, pady=3)
173
186
 
174
187
  def cb_cred_help(self, *_: Any) -> None:
175
188
  faq_site = "https://github.com/laggykiller/sticker-convert#faq"
@@ -177,6 +190,18 @@ class CredFrame(LabelFrame):
177
190
  if not success:
178
191
  self.gui.cb_ask_str("You can get help from:", initialvalue=faq_site)
179
192
 
193
+ def cb_telethon_get_auth(self, *_: Any) -> None:
194
+ success, _client, api_id, api_hash = TelethonSetup(
195
+ self.gui.get_opt_cred(), self.gui.cb_ask_str
196
+ ).start()
197
+ if success:
198
+ self.gui.telethon_api_id_var.set(api_id)
199
+ self.gui.telethon_api_hash_var.set(api_hash)
200
+ self.gui.save_creds()
201
+ self.gui.cb_msg_block("Telethon setup successful")
202
+ else:
203
+ self.gui.cb_msg_block("Telethon setup failed")
204
+
180
205
  def cb_kakao_get_auth(self, *_: Any) -> None:
181
206
  KakaoGetAuthWindow(self.gui)
182
207
 
sticker_convert/job.py CHANGED
@@ -379,7 +379,10 @@ class Job:
379
379
  not self.opt_comp.no_compress
380
380
  and self.opt_output.option != "local"
381
381
  and self.opt_comp.preset != "custom"
382
- and self.opt_output.option not in self.opt_comp.preset
382
+ and (
383
+ self.opt_output.option not in self.opt_comp.preset
384
+ and self.opt_comp.preset not in self.opt_output.option
385
+ )
383
386
  ):
384
387
  msg = "Compression preset does not match export option\n"
385
388
  msg += "You may continue, but the files will need to be compressed again before export\n"
@@ -551,7 +554,7 @@ class Job:
551
554
  if self.opt_input.option == "line":
552
555
  downloaders.append(DownloadLine.start)
553
556
 
554
- if self.opt_input.option == "telegram":
557
+ if self.opt_input.option.startswith("telegram"):
555
558
  downloaders.append(DownloadTelegram.start)
556
559
 
557
560
  if self.opt_input.option == "kakao":
@@ -702,10 +705,7 @@ class Job:
702
705
  if self.opt_output.option == "signal":
703
706
  exporters.append(UploadSignal.start)
704
707
 
705
- if self.opt_output.option == "telegram":
706
- exporters.append(UploadTelegram.start)
707
-
708
- if self.opt_output.option == "telegram_emoji":
708
+ if self.opt_output.option.startswith("telegram"):
709
709
  exporters.append(UploadTelegram.start)
710
710
 
711
711
  if self.opt_output.option == "imessage":
@@ -214,6 +214,8 @@ class CredOption(BaseOption):
214
214
  signal_password: str = ""
215
215
  telegram_token: str = ""
216
216
  telegram_userid: str = ""
217
+ telethon_api_id: int = 0
218
+ telethon_api_hash: str = ""
217
219
  kakao_auth_token: str = ""
218
220
  kakao_username: str = ""
219
221
  kakao_password: str = ""
@@ -227,6 +229,10 @@ class CredOption(BaseOption):
227
229
  return {
228
230
  "signal": {"uuid": self.signal_uuid, "password": self.signal_password},
229
231
  "telegram": {"token": self.telegram_token, "userid": self.telegram_userid},
232
+ "telethon": {
233
+ "api_id": self.telethon_api_id,
234
+ "api_hash": self.telethon_api_hash,
235
+ },
230
236
  "kakao": {
231
237
  "auth_token": self.kakao_auth_token,
232
238
  "username": self.kakao_username,
@@ -213,8 +213,8 @@
213
213
  "power": 3
214
214
  },
215
215
  "quality": {
216
- "min": 10,
217
- "max": 95,
216
+ "min": 0,
217
+ "max": 100,
218
218
  "power": 5
219
219
  },
220
220
  "color": {
@@ -59,7 +59,8 @@
59
59
  "signal_password": "Set Signal password. Required for uploading Signal stickers.",
60
60
  "signal_get_auth": "Generate Signal uuid and password.",
61
61
  "telegram_token": "Set Telegram token. Required for uploading and downloading Telegram stickers.",
62
- "telegram_userid": "Set telegram user_id (From real account, not bot account). Required for uploading Telegram stickers.",
62
+ "telegram_userid": "Set Telegram user_id (From real account, not bot account). Required for uploading Telegram stickers.",
63
+ "telethon_setup": "Setup Telethon",
63
64
  "kakao_auth_token": "Set Kakao auth_token. Required for downloading animated stickers from https://e.kakao.com/t/xxxxx",
64
65
  "kakao_get_auth": "Generate Kakao auth_token by simulating login. Kakao username, password, country code and phone number are also required.",
65
66
  "kakao_get_auth_desktop": "Get Kakao auth_token from Kakao Desktop application.\n(Only working on Windows.)",
@@ -75,6 +76,6 @@
75
76
  "viber_bin_path": "Specify location of Viber Desktop application.\nUseful for portable installation.",
76
77
  "discord_get_auth": "Get Discord token.",
77
78
  "discord_token": "Set Discord token. Required for downloading Discord stickers and emojis.",
78
- "save_cred": "Save Signal and Telegram credentials."
79
+ "save_cred": "Save credentials."
79
80
  }
80
81
  }
@@ -29,6 +29,16 @@
29
29
  "author": false
30
30
  }
31
31
  },
32
+ "telegram_telethon": {
33
+ "full_name": "Download from Telegram with Telethon",
34
+ "help": "Download telegram stickers from a URL as input with Telethon",
35
+ "example": "Example: https://telegram.me/addstickers/xxxxx\n OR https://telegram.me/addemoji/xxxxx",
36
+ "address_lbls": "URL address",
37
+ "metadata_provides": {
38
+ "title": true,
39
+ "author": false
40
+ }
41
+ },
32
42
  "line": {
33
43
  "full_name": "Download from Line",
34
44
  "help": "Download line stickers from a URL / ID as input",
@@ -23,6 +23,22 @@
23
23
  "author": false
24
24
  }
25
25
  },
26
+ "telegram_telethon": {
27
+ "full_name": "Upload to Telegram with Telethon",
28
+ "help": "Upload to Telegram with Telethon *Not recommended, but allow link not end with _by_xxxbot*",
29
+ "metadata_requirements": {
30
+ "title": true,
31
+ "author": false
32
+ }
33
+ },
34
+ "telegram_emoji_telethon": {
35
+ "full_name": "Upload to Telegram with Telethon (Custom emoji)",
36
+ "help": "Upload to Telegram with Telethon (Custom emoji) *Not recommended, but allow link not end with _by_xxxbot*",
37
+ "metadata_requirements": {
38
+ "title": true,
39
+ "author": false
40
+ }
41
+ },
26
42
  "viber": {
27
43
  "full_name": "Upload to Viber",
28
44
  "help": "Upload to Viber",