sticker-convert 2.7.5__tar.gz → 2.7.6__tar.gz

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.
Files changed (111) hide show
  1. {sticker-convert-2.7.5/src/sticker_convert.egg-info → sticker-convert-2.7.6}/PKG-INFO +1 -1
  2. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/cli.py +2 -2
  3. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui.py +3 -4
  4. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/config_frame.py +1 -1
  5. sticker-convert-2.7.6/src/sticker_convert/gui_components/frames/progress_frame.py +129 -0
  6. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/signal_get_auth_window.py +11 -5
  7. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/job.py +10 -11
  8. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/upload_telegram.py +42 -26
  9. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/auth/get_signal_auth.py +8 -2
  10. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/callback.py +4 -9
  11. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/version.py +1 -1
  12. {sticker-convert-2.7.5 → sticker-convert-2.7.6/src/sticker_convert.egg-info}/PKG-INFO +1 -1
  13. sticker-convert-2.7.5/src/sticker_convert/gui_components/frames/progress_frame.py +0 -97
  14. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/LICENSE +0 -0
  15. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/MANIFEST.in +0 -0
  16. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/README.md +0 -0
  17. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/pyproject.toml +0 -0
  18. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/requirements.txt +0 -0
  19. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/setup.cfg +0 -0
  20. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/__init__.py +0 -0
  21. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/__main__.py +0 -0
  22. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/converter.py +0 -0
  23. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/definitions.py +0 -0
  24. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/__init__.py +0 -0
  25. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/download_base.py +0 -0
  26. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/download_kakao.py +0 -0
  27. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/download_line.py +0 -0
  28. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/download_signal.py +0 -0
  29. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/downloaders/download_telegram.py +0 -0
  30. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/__init__.py +0 -0
  31. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/__init__.py +0 -0
  32. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/comp_frame.py +0 -0
  33. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/control_frame.py +0 -0
  34. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/cred_frame.py +0 -0
  35. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/input_frame.py +0 -0
  36. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/output_frame.py +0 -0
  37. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/frames/right_clicker.py +0 -0
  38. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/gui_utils.py +0 -0
  39. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/__init__.py +0 -0
  40. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/advanced_compression_window.py +0 -0
  41. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/base_window.py +0 -0
  42. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/kakao_get_auth_window.py +0 -0
  43. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/gui_components/windows/line_get_auth_window.py +0 -0
  44. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +0 -0
  45. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  46. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/README.md +0 -0
  47. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers/Info.plist +0 -0
  48. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +0 -0
  49. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +0 -0
  50. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +0 -0
  51. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +0 -0
  52. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  53. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +0 -0
  54. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  55. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +0 -0
  56. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  57. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  58. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +0 -0
  59. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  60. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  61. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  62. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  63. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  64. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  65. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  66. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  67. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  68. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  69. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  70. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  71. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +0 -0
  72. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  73. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  74. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  75. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  76. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/job_option.py +0 -0
  77. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  78. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/appicon.icns +0 -0
  79. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/appicon.ico +0 -0
  80. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/appicon.png +0 -0
  81. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/compression.json +0 -0
  82. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/emoji.json +0 -0
  83. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/help.json +0 -0
  84. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/input.json +0 -0
  85. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/resources/output.json +0 -0
  86. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/__init__.py +0 -0
  87. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/compress_wastickers.py +0 -0
  88. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/upload_base.py +0 -0
  89. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/upload_signal.py +0 -0
  90. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/uploaders/xcode_imessage.py +0 -0
  91. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/auth/get_kakao_auth.py +0 -0
  92. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/auth/get_line_auth.py +0 -0
  93. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/cache_store.py +0 -0
  94. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/json_manager.py +0 -0
  95. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/json_resources_loader.py +0 -0
  96. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/metadata_handler.py +0 -0
  97. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/run_bin.py +0 -0
  98. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/files/sanitize_filename.py +0 -0
  99. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/media/apple_png_normalize.py +0 -0
  100. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/media/codec_info.py +0 -0
  101. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/media/decrypt_kakao.py +0 -0
  102. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/media/format_verify.py +0 -0
  103. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert/utils/url_detect.py +0 -0
  104. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert.egg-info/SOURCES.txt +0 -0
  105. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert.egg-info/dependency_links.txt +0 -0
  106. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert.egg-info/entry_points.txt +0 -0
  107. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert.egg-info/requires.txt +0 -0
  108. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/src/sticker_convert.egg-info/top_level.txt +0 -0
  109. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/tests/test_compression.py +0 -0
  110. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/tests/test_download.py +0 -0
  111. {sticker-convert-2.7.5 → sticker-convert-2.7.6}/tests/test_export.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.7.5
3
+ Version: 2.7.6
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>
@@ -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
  )
@@ -550,9 +550,8 @@ class GUI(Window):
550
550
 
551
551
  def cancel_job(self) -> None:
552
552
  if self.job:
553
- self.cb_msg(msg="Cancelling job...")
554
- self.job.cancel()
555
- self.cb_bar(set_progress_mode="clear")
553
+ # Need to start new thread or else GUI may freeze
554
+ Thread(target=self.job.cancel, daemon=True).start()
556
555
 
557
556
  def set_inputs(self, state: str) -> None:
558
557
  # state: 'normal', 'disabled'
@@ -639,7 +638,7 @@ class GUI(Window):
639
638
  *args: Any,
640
639
  set_progress_mode: Optional[str] = None,
641
640
  steps: int = 0,
642
- update_bar: bool = False,
641
+ update_bar: int = 0,
643
642
  **kwargs: Any,
644
643
  ) -> None:
645
644
  with self.bar_lock:
@@ -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,
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env python3
2
+ from typing import TYPE_CHECKING, Any, Optional
3
+
4
+ from tqdm import tqdm
5
+ from ttkbootstrap import LabelFrame, Progressbar # type: ignore
6
+ from ttkbootstrap.scrolled import ScrolledText # type: ignore
7
+
8
+ from sticker_convert.gui_components.frames.right_clicker import RightClicker
9
+
10
+ if TYPE_CHECKING:
11
+ from sticker_convert.gui import GUI # type: ignore
12
+
13
+
14
+ class ProgressFrame(LabelFrame):
15
+ progress_bar_cli = None
16
+ progress_bar_steps = 0
17
+ auto_scroll = True
18
+ msg_cls = False
19
+ msg_buffer = ""
20
+ bar_mode_changed = False
21
+ bar_mode = "clear"
22
+ bar_updates = 0
23
+ bar_steps = 0
24
+
25
+ def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
26
+ self.gui = gui
27
+ super().__init__(*args, **kwargs) # type: ignore
28
+
29
+ self.message_box = ScrolledText(self, height=15, wrap="word")
30
+ self.message_box._text.bind("<Button-3><ButtonRelease-3>", RightClicker) # type: ignore
31
+ self.message_box._text.config(state="disabled") # type: ignore
32
+ self.progress_bar = Progressbar(self, orient="horizontal", mode="determinate")
33
+
34
+ self.message_box.bind("<Enter>", self.cb_disable_autoscroll)
35
+ self.message_box.bind("<Leave>", self.cb_enable_autoscroll)
36
+
37
+ self.message_box.pack(expand=True, fill="x")
38
+ self.progress_bar.pack(expand=True, fill="x")
39
+
40
+ self.after(40, self.update_ui)
41
+
42
+ def update_progress_bar(
43
+ self,
44
+ set_progress_mode: Optional[str] = None,
45
+ steps: int = 0,
46
+ update_bar: int = 0,
47
+ ) -> None:
48
+ if update_bar:
49
+ self.bar_updates += update_bar
50
+ elif set_progress_mode:
51
+ self.bar_mode = set_progress_mode
52
+ self.bar_steps = steps
53
+ self.bar_updates = 0
54
+ self.bar_mode_changed = True
55
+
56
+ def update_message_box(self, *args: Any, **kwargs: Any) -> None:
57
+ msg = kwargs.get("msg")
58
+ cls = kwargs.get("cls")
59
+
60
+ if not msg and len(args) == 1:
61
+ msg = str(args[0])
62
+
63
+ if cls:
64
+ self.msg_cls = True
65
+ self.msg_buffer = ""
66
+
67
+ if msg:
68
+ self.msg_buffer += msg + "\n"
69
+
70
+ def update_ui(self) -> None:
71
+ if self.msg_cls or self.msg_buffer:
72
+ self.message_box._text.config(state="normal") # type: ignore
73
+
74
+ if self.msg_cls:
75
+ self.message_box.delete(1.0, "end") # type: ignore
76
+
77
+ if self.msg_buffer:
78
+ msg = self.msg_buffer.strip()
79
+ if self.progress_bar_cli:
80
+ self.progress_bar_cli.write(msg)
81
+ else:
82
+ print(msg)
83
+
84
+ self.message_box.insert("end", msg + "\n") # type: ignore
85
+
86
+ if self.auto_scroll:
87
+ self.message_box._text.yview_moveto(1.0) # type: ignore
88
+
89
+ self.msg_cls = False
90
+ self.msg_buffer = ""
91
+
92
+ self.message_box._text.config(state="disabled") # type: ignore
93
+
94
+ if self.bar_mode_changed:
95
+ if self.bar_mode == "determinate":
96
+ self.progress_bar_cli = tqdm(total=self.bar_steps)
97
+ self.progress_bar.config(mode="determinate")
98
+ self.progress_bar_steps = self.bar_steps
99
+ self.progress_bar.stop()
100
+ elif self.progress_bar_cli:
101
+ self.progress_bar_cli.close()
102
+ self.progress_bar_cli = None
103
+
104
+ if self.bar_mode == "indeterminate":
105
+ self.progress_bar.config(mode="indeterminate")
106
+ self.progress_bar.start(50)
107
+ elif self.bar_mode == "clear":
108
+ self.progress_bar.config(mode="determinate")
109
+ self.progress_bar.stop()
110
+
111
+ self.progress_bar["value"] = 0
112
+
113
+ if self.bar_updates and self.progress_bar_cli:
114
+ self.progress_bar_cli.update(self.bar_updates)
115
+ self.progress_bar["value"] += (
116
+ 100 / self.progress_bar_steps * self.bar_updates
117
+ )
118
+ self.update_progress_bar(update_bar=self.bar_updates)
119
+
120
+ self.bar_mode_changed = False
121
+ self.bar_updates = 0
122
+
123
+ self.after(40, self.update_ui)
124
+
125
+ def cb_disable_autoscroll(self, *_: Any) -> None:
126
+ self.auto_scroll = False
127
+
128
+ def cb_enable_autoscroll(self, *_: Any) -> None:
129
+ self.auto_scroll = True
@@ -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
@@ -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.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.7.5
3
+ Version: 2.7.6
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,97 +0,0 @@
1
- #!/usr/bin/env python3
2
- from typing import TYPE_CHECKING, Any, Optional
3
-
4
- from tqdm import tqdm
5
- from ttkbootstrap import LabelFrame, Progressbar # type: ignore
6
- from ttkbootstrap.scrolled import ScrolledText # type: ignore
7
-
8
- from sticker_convert.gui_components.frames.right_clicker import RightClicker
9
-
10
- if TYPE_CHECKING:
11
- from sticker_convert.gui import GUI # type: ignore
12
-
13
-
14
- class ProgressFrame(LabelFrame):
15
- progress_bar_cli = None
16
- progress_bar_steps = 0
17
- auto_scroll = True
18
-
19
- def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
20
- self.gui = gui
21
- super().__init__(*args, **kwargs) # type: ignore
22
-
23
- self.message_box = ScrolledText(self, height=15, wrap="word")
24
- self.message_box._text.bind("<Button-3><ButtonRelease-3>", RightClicker) # type: ignore
25
- self.message_box._text.config(state="disabled") # type: ignore
26
- self.progress_bar = Progressbar(self, orient="horizontal", mode="determinate")
27
-
28
- self.message_box.bind("<Enter>", self.cb_disable_autoscroll)
29
- self.message_box.bind("<Leave>", self.cb_enable_autoscroll)
30
-
31
- self.message_box.pack(expand=True, fill="x")
32
- self.progress_bar.pack(expand=True, fill="x")
33
-
34
- def update_progress_bar(
35
- self,
36
- set_progress_mode: Optional[str] = None,
37
- steps: int = 0,
38
- update_bar: bool = False,
39
- ) -> 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
62
-
63
- def update_message_box(self, *args: Any, **kwargs: Any) -> None:
64
- msg = kwargs.get("msg")
65
- cls = kwargs.get("cls")
66
- file = kwargs.get("file")
67
-
68
- if not msg and len(args) == 1:
69
- msg = str(args[0])
70
-
71
- 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
92
-
93
- def cb_disable_autoscroll(self, *_: Any) -> None:
94
- self.auto_scroll = False
95
-
96
- def cb_enable_autoscroll(self, *_: Any) -> None:
97
- self.auto_scroll = True
File without changes