sticker-convert 2.8.12__py3-none-any.whl → 2.17.0.0__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.
Files changed (124) hide show
  1. sticker_convert/__main__.py +24 -24
  2. sticker_convert/auth/__init__.py +0 -0
  3. sticker_convert/auth/auth_base.py +19 -0
  4. sticker_convert/auth/auth_discord.py +149 -0
  5. sticker_convert/{utils/auth/get_kakao_auth.py → auth/auth_kakao_android_login.py} +331 -300
  6. sticker_convert/auth/auth_kakao_desktop_login.py +327 -0
  7. sticker_convert/auth/auth_kakao_desktop_memdump.py +281 -0
  8. sticker_convert/{utils/auth/get_line_auth.py → auth/auth_line.py} +98 -80
  9. sticker_convert/auth/auth_signal.py +139 -0
  10. sticker_convert/auth/auth_telethon.py +161 -0
  11. sticker_convert/auth/auth_viber.py +250 -0
  12. sticker_convert/auth/telegram_api.py +736 -0
  13. sticker_convert/cli.py +623 -509
  14. sticker_convert/converter.py +1093 -962
  15. sticker_convert/definitions.py +11 -0
  16. sticker_convert/downloaders/download_band.py +111 -0
  17. sticker_convert/downloaders/download_base.py +171 -130
  18. sticker_convert/downloaders/download_discord.py +92 -0
  19. sticker_convert/downloaders/download_kakao.py +417 -255
  20. sticker_convert/downloaders/download_line.py +484 -472
  21. sticker_convert/downloaders/download_ogq.py +80 -0
  22. sticker_convert/downloaders/download_signal.py +108 -92
  23. sticker_convert/downloaders/download_telegram.py +56 -130
  24. sticker_convert/downloaders/download_viber.py +121 -95
  25. sticker_convert/gui.py +788 -795
  26. sticker_convert/gui_components/frames/comp_frame.py +180 -165
  27. sticker_convert/gui_components/frames/config_frame.py +156 -113
  28. sticker_convert/gui_components/frames/control_frame.py +32 -30
  29. sticker_convert/gui_components/frames/cred_frame.py +232 -162
  30. sticker_convert/gui_components/frames/input_frame.py +139 -137
  31. sticker_convert/gui_components/frames/output_frame.py +112 -110
  32. sticker_convert/gui_components/frames/right_clicker.py +25 -23
  33. sticker_convert/gui_components/windows/advanced_compression_window.py +757 -715
  34. sticker_convert/gui_components/windows/base_window.py +7 -2
  35. sticker_convert/gui_components/windows/discord_get_auth_window.py +79 -0
  36. sticker_convert/gui_components/windows/kakao_get_auth_window.py +511 -186
  37. sticker_convert/gui_components/windows/line_get_auth_window.py +94 -102
  38. sticker_convert/gui_components/windows/signal_get_auth_window.py +84 -135
  39. sticker_convert/gui_components/windows/viber_get_auth_window.py +168 -0
  40. sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +3 -3
  41. sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  42. sticker_convert/ios-message-stickers-template/README.md +10 -10
  43. sticker_convert/ios-message-stickers-template/stickers/Info.plist +43 -43
  44. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +31 -31
  45. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +6 -6
  46. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +20 -20
  47. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +9 -9
  48. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  49. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +9 -9
  50. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  51. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +9 -9
  52. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  53. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  54. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +91 -91
  55. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  56. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  57. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  58. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  59. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  60. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  61. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  62. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  63. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  64. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  65. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  66. sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  67. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +364 -364
  68. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -7
  69. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -8
  70. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  71. sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +14 -14
  72. sticker_convert/job.py +279 -179
  73. sticker_convert/job_option.py +15 -2
  74. sticker_convert/locales/en_US/LC_MESSAGES/base.mo +0 -0
  75. sticker_convert/locales/ja_JP/LC_MESSAGES/base.mo +0 -0
  76. sticker_convert/locales/zh_CN/LC_MESSAGES/base.mo +0 -0
  77. sticker_convert/locales/zh_TW/LC_MESSAGES/base.mo +0 -0
  78. sticker_convert/py.typed +0 -0
  79. sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  80. sticker_convert/resources/compression.json +220 -16
  81. sticker_convert/resources/emoji.json +527 -77
  82. sticker_convert/resources/help.ja_JP.json +88 -0
  83. sticker_convert/resources/help.json +24 -10
  84. sticker_convert/resources/help.zh_CN.json +88 -0
  85. sticker_convert/resources/help.zh_TW.json +88 -0
  86. sticker_convert/resources/input.ja_JP.json +74 -0
  87. sticker_convert/resources/input.json +121 -71
  88. sticker_convert/resources/input.zh_CN.json +74 -0
  89. sticker_convert/resources/input.zh_TW.json +74 -0
  90. sticker_convert/resources/memdump_linux.sh +25 -0
  91. sticker_convert/resources/memdump_windows.ps1 +8 -0
  92. sticker_convert/resources/output.ja_JP.json +38 -0
  93. sticker_convert/resources/output.json +24 -0
  94. sticker_convert/resources/output.zh_CN.json +38 -0
  95. sticker_convert/resources/output.zh_TW.json +38 -0
  96. sticker_convert/uploaders/compress_wastickers.py +186 -156
  97. sticker_convert/uploaders/upload_base.py +44 -35
  98. sticker_convert/uploaders/upload_signal.py +218 -173
  99. sticker_convert/uploaders/upload_telegram.py +353 -388
  100. sticker_convert/uploaders/upload_viber.py +178 -0
  101. sticker_convert/uploaders/xcode_imessage.py +295 -285
  102. sticker_convert/utils/callback.py +238 -6
  103. sticker_convert/utils/chrome_remotedebug.py +219 -0
  104. sticker_convert/utils/chromiums/linux.py +52 -0
  105. sticker_convert/utils/chromiums/osx.py +68 -0
  106. sticker_convert/utils/chromiums/windows.py +45 -0
  107. sticker_convert/utils/emoji.py +28 -0
  108. sticker_convert/utils/files/json_resources_loader.py +24 -19
  109. sticker_convert/utils/files/metadata_handler.py +8 -7
  110. sticker_convert/utils/files/run_bin.py +1 -1
  111. sticker_convert/utils/media/codec_info.py +99 -67
  112. sticker_convert/utils/media/format_verify.py +33 -20
  113. sticker_convert/utils/process.py +231 -0
  114. sticker_convert/utils/translate.py +108 -0
  115. sticker_convert/utils/url_detect.py +40 -33
  116. sticker_convert/version.py +1 -1
  117. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/METADATA +189 -96
  118. sticker_convert-2.17.0.0.dist-info/RECORD +138 -0
  119. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/WHEEL +1 -1
  120. sticker_convert/utils/auth/get_signal_auth.py +0 -129
  121. sticker_convert-2.8.12.dist-info/RECORD +0 -101
  122. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/entry_points.txt +0 -0
  123. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info/licenses}/LICENSE +0 -0
  124. {sticker_convert-2.8.12.dist-info → sticker_convert-2.17.0.0.dist-info}/top_level.txt +0 -0
@@ -1,165 +1,180 @@
1
- #!/usr/bin/env python3
2
- from typing import TYPE_CHECKING, Any
3
-
4
- from ttkbootstrap import Button, Checkbutton, Entry, Label, LabelFrame, OptionMenu # type: ignore
5
-
6
- from sticker_convert.gui_components.frames.right_clicker import RightClicker
7
- from sticker_convert.gui_components.windows.advanced_compression_window import AdvancedCompressionWindow
8
-
9
- if TYPE_CHECKING:
10
- from sticker_convert.gui import GUI # type: ignore
11
-
12
-
13
- class CompFrame(LabelFrame):
14
- def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
15
- self.gui = gui
16
- super().__init__(*args, **kwargs)
17
-
18
- self.grid_columnconfigure(2, weight=1)
19
-
20
- self.no_compress_help_btn = Button(
21
- self,
22
- text="?",
23
- width=1,
24
- command=lambda: self.gui.cb_msg_block(self.gui.help["comp"]["no_compress"]),
25
- bootstyle="secondary", # type: ignore
26
- )
27
- self.no_compress_lbl = Label(self, text="No compression")
28
- self.no_compress_cbox = Checkbutton(
29
- self,
30
- variable=self.gui.no_compress_var,
31
- command=self.cb_no_compress,
32
- onvalue=True,
33
- offvalue=False,
34
- bootstyle="danger-round-toggle", # type: ignore
35
- )
36
-
37
- self.comp_preset_help_btn = Button(
38
- self,
39
- text="?",
40
- width=1,
41
- command=lambda: self.gui.cb_msg_block(self.gui.help["comp"]["preset"]),
42
- bootstyle="secondary", # type: ignore
43
- )
44
- self.comp_preset_lbl = Label(self, text="Preset")
45
- self.comp_preset_opt = OptionMenu(
46
- self,
47
- self.gui.comp_preset_var,
48
- self.gui.comp_preset_var.get(),
49
- *self.gui.compression_presets.keys(),
50
- command=self.cb_comp_apply_preset,
51
- bootstyle="secondary", # type: ignore
52
- )
53
- self.comp_preset_opt.config(width=15)
54
-
55
- self.steps_help_btn = Button(
56
- self,
57
- text="?",
58
- width=1,
59
- command=lambda: self.gui.cb_msg_block(self.gui.help["comp"]["steps"]),
60
- bootstyle="secondary", # type: ignore
61
- )
62
- self.steps_lbl = Label(self, text="Number of steps")
63
- self.steps_entry = Entry(self, textvariable=self.gui.steps_var, width=8)
64
- self.steps_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
65
-
66
- self.processes_help_btn = Button(
67
- self,
68
- text="?",
69
- width=1,
70
- command=lambda: self.gui.cb_msg_block(self.gui.help["comp"]["processes"]),
71
- bootstyle="secondary", # type: ignore
72
- )
73
- self.processes_lbl = Label(self, text="Number of processes")
74
- self.processes_entry = Entry(self, textvariable=self.gui.processes_var, width=8)
75
- self.processes_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
76
-
77
- self.comp_advanced_btn = Button(
78
- self,
79
- text="Advanced...",
80
- command=self.cb_compress_advanced,
81
- bootstyle="secondary", # type: ignore
82
- )
83
-
84
- self.no_compress_help_btn.grid(column=0, row=0, sticky="w", padx=3, pady=3)
85
- self.no_compress_lbl.grid(column=1, row=0, sticky="w", padx=3, pady=3)
86
- self.no_compress_cbox.grid(column=2, row=0, sticky="nes", padx=3, pady=3)
87
-
88
- self.comp_preset_help_btn.grid(column=0, row=1, sticky="w", padx=3, pady=3)
89
- self.comp_preset_lbl.grid(column=1, row=1, sticky="w", padx=3, pady=3)
90
- self.comp_preset_opt.grid(column=2, row=1, sticky="nes", padx=3, pady=3)
91
-
92
- self.steps_help_btn.grid(column=0, row=2, sticky="w", padx=3, pady=3)
93
- self.steps_lbl.grid(column=1, row=2, sticky="w", padx=3, pady=3)
94
- self.steps_entry.grid(column=2, row=2, sticky="nes", padx=3, pady=3)
95
-
96
- self.processes_help_btn.grid(column=0, row=3, sticky="w", padx=3, pady=3)
97
- self.processes_lbl.grid(column=1, row=3, sticky="w", padx=3, pady=3)
98
- self.processes_entry.grid(column=2, row=3, sticky="nes", padx=3, pady=3)
99
-
100
- self.comp_advanced_btn.grid(column=2, row=4, sticky="nes", padx=3, pady=3)
101
-
102
- self.cb_comp_apply_preset()
103
- self.cb_no_compress()
104
-
105
- def cb_comp_apply_preset(self, *_: Any) -> None:
106
- selection = self.gui.get_preset()
107
- if selection == "auto":
108
- if self.gui.get_input_name() == "local":
109
- self.gui.no_compress_var.set(True)
110
- else:
111
- self.gui.no_compress_var.set(False)
112
-
113
- preset = self.gui.compression_presets[selection]
114
- self.gui.fps_min_var.set(preset.get("fps", {}).get("min"))
115
- self.gui.fps_max_var.set(preset.get("fps", {}).get("max"))
116
- self.gui.fps_power_var.set(preset.get("fps", {}).get("power"))
117
- self.gui.res_w_min_var.set(preset.get("res", {}).get("w", {}).get("min"))
118
- self.gui.res_w_max_var.set(preset.get("res", {}).get("w", {}).get("max"))
119
- self.gui.res_h_min_var.set(preset.get("res", {}).get("h", {}).get("min"))
120
- self.gui.res_h_max_var.set(preset.get("res", {}).get("h", {}).get("max"))
121
- self.gui.res_power_var.set(preset.get("res", {}).get("power"))
122
- self.gui.quality_min_var.set(preset.get("quality", {}).get("min"))
123
- self.gui.quality_max_var.set(preset.get("quality", {}).get("max"))
124
- self.gui.quality_power_var.set(preset.get("quality", {}).get("power"))
125
- self.gui.color_min_var.set(preset.get("color", {}).get("min"))
126
- self.gui.color_max_var.set(preset.get("color", {}).get("max"))
127
- self.gui.color_power_var.set(preset.get("color", {}).get("power"))
128
- self.gui.duration_min_var.set(preset.get("duration", {}).get("min"))
129
- self.gui.duration_max_var.set(preset.get("duration", {}).get("max"))
130
- self.gui.img_size_max_var.set(preset.get("size_max", {}).get("img"))
131
- self.gui.vid_size_max_var.set(preset.get("size_max", {}).get("vid"))
132
- self.gui.img_format_var.set(preset.get("format", {}).get("img"))
133
- self.gui.vid_format_var.set(preset.get("format", {}).get("vid"))
134
- self.gui.bg_color_var.set(preset.get("bg_color"))
135
- self.gui.fake_vid_var.set(preset.get("fake_vid"))
136
- self.gui.scale_filter_var.set(preset.get("scale_filter"))
137
- self.gui.quantize_method_var.set(preset.get("quantize_method"))
138
- self.gui.default_emoji_var.set(preset.get("default_emoji"))
139
- self.gui.steps_var.set(preset.get("steps"))
140
-
141
- self.cb_no_compress()
142
- self.gui.highlight_fields()
143
-
144
- def cb_compress_advanced(self, *_: Any) -> None:
145
- AdvancedCompressionWindow(self.gui)
146
-
147
- def cb_no_compress(self, *_: Any) -> None:
148
- if self.gui.no_compress_var.get() is True:
149
- state = "disabled"
150
- else:
151
- state = "normal"
152
-
153
- self.comp_advanced_btn.config(state=state)
154
- self.steps_entry.config(state=state)
155
- self.processes_entry.config(state=state)
156
-
157
- def set_inputs_comp(self, state: str) -> None:
158
- self.comp_preset_opt.config(state=state)
159
- self.comp_advanced_btn.config(state=state)
160
- self.steps_entry.config(state=state)
161
- self.processes_entry.config(state=state)
162
-
163
- def set_states(self, state: str) -> None:
164
- self.no_compress_cbox.config(state=state)
165
- self.set_inputs_comp(state=state)
1
+ #!/usr/bin/env python3
2
+ from typing import TYPE_CHECKING, Any
3
+
4
+ from ttkbootstrap import Button, Checkbutton, Entry, Label, LabelFrame, OptionMenu # type: ignore
5
+
6
+ from sticker_convert.gui_components.frames.right_clicker import RightClicker
7
+ from sticker_convert.gui_components.windows.advanced_compression_window import AdvancedCompressionWindow
8
+ from sticker_convert.utils.translate import I
9
+
10
+ if TYPE_CHECKING:
11
+ from sticker_convert.gui import GUI # type: ignore
12
+
13
+
14
+ class CompFrame(LabelFrame):
15
+ def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
16
+ self.gui = gui
17
+ super().__init__(*args, **kwargs)
18
+
19
+ self.grid_columnconfigure(2, weight=1)
20
+
21
+ self.no_compress_help_btn = Button(
22
+ self,
23
+ text="?",
24
+ width=1,
25
+ command=lambda: self.gui.cb.put(
26
+ ("msg_block", (self.gui.help["comp"]["no_compress"],), None)
27
+ ),
28
+ bootstyle="secondary", # type: ignore
29
+ )
30
+ self.no_compress_lbl = Label(self, text=I("No compression"))
31
+ self.no_compress_cbox = Checkbutton(
32
+ self,
33
+ variable=self.gui.no_compress_var,
34
+ command=self.cb_no_compress,
35
+ onvalue=True,
36
+ offvalue=False,
37
+ bootstyle="danger-round-toggle", # type: ignore
38
+ )
39
+
40
+ self.comp_preset_help_btn = Button(
41
+ self,
42
+ text="?",
43
+ width=1,
44
+ command=lambda: self.gui.cb.put(
45
+ ("msg_block", (self.gui.help["comp"]["preset"],), None)
46
+ ),
47
+ bootstyle="secondary", # type: ignore
48
+ )
49
+ self.comp_preset_lbl = Label(self, text=I("Preset"))
50
+ self.comp_preset_opt = OptionMenu(
51
+ self,
52
+ self.gui.comp_preset_var,
53
+ self.gui.comp_preset_var.get(),
54
+ *self.gui.compression_presets.keys(),
55
+ command=self.cb_comp_apply_preset,
56
+ bootstyle="secondary", # type: ignore
57
+ )
58
+ self.comp_preset_opt.config(width=15)
59
+
60
+ self.steps_help_btn = Button(
61
+ self,
62
+ text="?",
63
+ width=1,
64
+ command=lambda: self.gui.cb.put(
65
+ ("msg_block", (self.gui.help["comp"]["steps"],), None)
66
+ ),
67
+ bootstyle="secondary", # type: ignore
68
+ )
69
+ self.steps_lbl = Label(self, text=I("Number of steps"))
70
+ self.steps_entry = Entry(self, textvariable=self.gui.steps_var, width=8)
71
+ self.steps_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
72
+
73
+ self.processes_help_btn = Button(
74
+ self,
75
+ text="?",
76
+ width=1,
77
+ command=lambda: self.gui.cb.put(
78
+ ("msg_block", (self.gui.help["comp"]["processes"],), None)
79
+ ),
80
+ bootstyle="secondary", # type: ignore
81
+ )
82
+ self.processes_lbl = Label(self, text=I("Number of processes"))
83
+ self.processes_entry = Entry(self, textvariable=self.gui.processes_var, width=8)
84
+ self.processes_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
85
+
86
+ self.comp_advanced_btn = Button(
87
+ self,
88
+ text=I("Advanced..."),
89
+ command=self.cb_compress_advanced,
90
+ bootstyle="secondary", # type: ignore
91
+ )
92
+
93
+ self.no_compress_help_btn.grid(column=0, row=0, sticky="w", padx=3, pady=3)
94
+ self.no_compress_lbl.grid(column=1, row=0, sticky="w", padx=3, pady=3)
95
+ self.no_compress_cbox.grid(column=2, row=0, sticky="nes", padx=3, pady=3)
96
+
97
+ self.comp_preset_help_btn.grid(column=0, row=1, sticky="w", padx=3, pady=3)
98
+ self.comp_preset_lbl.grid(column=1, row=1, sticky="w", padx=3, pady=3)
99
+ self.comp_preset_opt.grid(column=2, row=1, sticky="nes", padx=3, pady=3)
100
+
101
+ self.steps_help_btn.grid(column=0, row=2, sticky="w", padx=3, pady=3)
102
+ self.steps_lbl.grid(column=1, row=2, sticky="w", padx=3, pady=3)
103
+ self.steps_entry.grid(column=2, row=2, sticky="nes", padx=3, pady=3)
104
+
105
+ self.processes_help_btn.grid(column=0, row=3, sticky="w", padx=3, pady=3)
106
+ self.processes_lbl.grid(column=1, row=3, sticky="w", padx=3, pady=3)
107
+ self.processes_entry.grid(column=2, row=3, sticky="nes", padx=3, pady=3)
108
+
109
+ self.comp_advanced_btn.grid(column=2, row=4, sticky="nes", padx=3, pady=3)
110
+
111
+ self.cb_comp_apply_preset()
112
+
113
+ def cb_comp_apply_preset(self, *_: Any) -> None:
114
+ selection = self.gui.get_preset()
115
+
116
+ preset = self.gui.compression_presets[selection]
117
+ self.gui.fps_min_var.set(preset.get("fps", {}).get("min"))
118
+ self.gui.fps_max_var.set(preset.get("fps", {}).get("max"))
119
+ self.gui.fps_power_var.set(preset.get("fps", {}).get("power"))
120
+ self.gui.res_w_min_var.set(preset.get("res", {}).get("w", {}).get("min"))
121
+ self.gui.res_w_max_var.set(preset.get("res", {}).get("w", {}).get("max"))
122
+ self.gui.res_h_min_var.set(preset.get("res", {}).get("h", {}).get("min"))
123
+ self.gui.res_h_max_var.set(preset.get("res", {}).get("h", {}).get("max"))
124
+ self.gui.res_power_var.set(preset.get("res", {}).get("power"))
125
+ self.gui.res_snap_pow2_var.set(preset.get("res", {}).get("snap_pow2"))
126
+ self.gui.quality_min_var.set(preset.get("quality", {}).get("min"))
127
+ self.gui.quality_max_var.set(preset.get("quality", {}).get("max"))
128
+ self.gui.quality_power_var.set(preset.get("quality", {}).get("power"))
129
+ self.gui.color_min_var.set(preset.get("color", {}).get("min"))
130
+ self.gui.color_max_var.set(preset.get("color", {}).get("max"))
131
+ self.gui.color_power_var.set(preset.get("color", {}).get("power"))
132
+ self.gui.duration_min_var.set(preset.get("duration", {}).get("min"))
133
+ self.gui.duration_max_var.set(preset.get("duration", {}).get("max"))
134
+ self.gui.img_size_max_var.set(preset.get("size_max", {}).get("img"))
135
+ self.gui.vid_size_max_var.set(preset.get("size_max", {}).get("vid"))
136
+ self.gui.img_format_var.set(preset.get("format", {}).get("img"))
137
+ self.gui.vid_format_var.set(preset.get("format", {}).get("vid"))
138
+ self.gui.bg_color_var.set(preset.get("bg_color"))
139
+ self.gui.fake_vid_var.set(preset.get("fake_vid"))
140
+ self.gui.scale_filter_var.set(preset.get("scale_filter"))
141
+ self.gui.quantize_method_var.set(preset.get("quantize_method"))
142
+ self.gui.default_emoji_var.set(preset.get("default_emoji"))
143
+ self.gui.steps_var.set(preset.get("steps"))
144
+
145
+ self.gui.highlight_fields()
146
+ self.cb_no_compress_toggle()
147
+ self.cb_no_compress()
148
+
149
+ def cb_compress_advanced(self, *_: Any) -> None:
150
+ AdvancedCompressionWindow(self.gui)
151
+
152
+ def cb_no_compress_toggle(self, *_: Any) -> None:
153
+ if (
154
+ self.gui.comp_preset_var.get() == "auto"
155
+ and self.gui.get_output_name() == "local"
156
+ ):
157
+ self.gui.no_compress_var.set(True)
158
+ else:
159
+ self.gui.no_compress_var.set(False)
160
+
161
+ def cb_no_compress(self, *_: Any) -> None:
162
+ if self.gui.no_compress_var.get() is True:
163
+ state = "disabled"
164
+ else:
165
+ state = "normal"
166
+
167
+ self.comp_advanced_btn.config(state=state)
168
+ self.steps_entry.config(state=state)
169
+ self.processes_entry.config(state=state)
170
+
171
+ def set_inputs_comp(self, state: str) -> None:
172
+ self.comp_preset_opt.config(state=state)
173
+ self.comp_advanced_btn.config(state=state)
174
+ self.steps_entry.config(state=state)
175
+ self.processes_entry.config(state=state)
176
+
177
+ def set_states(self, state: str) -> None:
178
+ self.no_compress_cbox.config(state=state)
179
+ self.set_inputs_comp(state=state)
180
+ self.cb_no_compress()
@@ -1,113 +1,156 @@
1
- #!/usr/bin/env python3
2
- import os
3
- import platform
4
- from typing import TYPE_CHECKING, Any
5
-
6
- from ttkbootstrap import Button, Checkbutton, Label, LabelFrame # type: ignore
7
-
8
- from sticker_convert.definitions import CONFIG_DIR
9
- from sticker_convert.utils.files.run_bin import RunBin
10
-
11
- if TYPE_CHECKING:
12
- from sticker_convert.gui import GUI # type: ignore
13
-
14
-
15
- class ConfigFrame(LabelFrame):
16
- def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
17
- self.gui = gui
18
- super().__init__(*args, **kwargs)
19
-
20
- self.grid_columnconfigure(1, weight=1)
21
- self.grid_columnconfigure(3, weight=1)
22
-
23
- self.settings_save_cred_lbl = Label(
24
- self, text="Save credentials", width=18, justify="left", anchor="w"
25
- )
26
- self.settings_save_cred_cbox = Checkbutton(
27
- self,
28
- variable=self.gui.settings_save_cred_var,
29
- onvalue=True,
30
- offvalue=False,
31
- bootstyle="success-round-toggle", # type: ignore
32
- )
33
-
34
- self.settings_clear_cred_lbl = Label(
35
- self, text="Clear credentials", width=18, justify="left", anchor="w"
36
- )
37
- self.settings_clear_cred_btn = Button(
38
- self,
39
- text="Clear...",
40
- command=self.cb_clear_cred,
41
- bootstyle="secondary", # type: ignore
42
- )
43
-
44
- self.settings_restore_default_lbl = Label(
45
- self, text="Default config", width=18, justify="left", anchor="w"
46
- )
47
- self.settings_restore_default_btn = Button(
48
- self,
49
- text="Restore...",
50
- command=self.cb_restore_default,
51
- bootstyle="secondary", # type: ignore
52
- )
53
-
54
- self.settings_open_dir_lbl = Label(
55
- self, text="Config directory", width=18, justify="left", anchor="w"
56
- )
57
- self.settings_open_dir_btn = Button(
58
- self,
59
- text="Open...",
60
- command=self.cb_open_config_directory,
61
- bootstyle="secondary", # type: ignore
62
- )
63
-
64
- self.settings_save_cred_lbl.grid(column=0, row=0, sticky="w", padx=3, pady=3)
65
- self.settings_save_cred_cbox.grid(column=1, row=0, sticky="w", padx=3, pady=3)
66
-
67
- self.settings_clear_cred_lbl.grid(column=2, row=0, sticky="w", padx=3, pady=3)
68
- self.settings_clear_cred_btn.grid(column=3, row=0, sticky="w", padx=3, pady=3)
69
-
70
- self.settings_open_dir_lbl.grid(column=0, row=1, sticky="w", padx=3, pady=3)
71
- self.settings_open_dir_btn.grid(column=1, row=1, sticky="w", padx=3, pady=3)
72
-
73
- self.settings_restore_default_lbl.grid(
74
- column=2, row=1, sticky="w", padx=3, pady=3
75
- )
76
- self.settings_restore_default_btn.grid(
77
- column=3, row=1, sticky="w", padx=3, pady=3
78
- )
79
-
80
- def cb_clear_cred(self, *_: Any, **kwargs: Any) -> None:
81
- response = self.gui.cb_ask_bool("Are you sure you want to clear credentials?")
82
- if response is True:
83
- self.gui.delete_creds()
84
- self.gui.load_jsons()
85
- self.gui.apply_creds()
86
- self.gui.highlight_fields()
87
- self.gui.cb_msg_block("Credentials cleared.")
88
-
89
- def cb_restore_default(self, *_: Any, **kwargs: Any) -> None:
90
- response = self.gui.cb_ask_bool(
91
- "Are you sure you want to restore default config? (This will not clear credentials.)"
92
- )
93
- if response is True:
94
- self.gui.delete_config()
95
- self.gui.load_jsons()
96
- self.gui.apply_config()
97
- self.gui.highlight_fields()
98
- self.gui.cb_msg_block("Restored to default config.")
99
-
100
- def cb_open_config_directory(self, *_: Any, **kwargs: Any) -> None:
101
- self.gui.cb_msg(msg=f"Config is located at {CONFIG_DIR}")
102
- if platform.system() == "Windows":
103
- os.startfile(CONFIG_DIR) # type: ignore
104
- elif platform.system() == "Darwin":
105
- RunBin.run_cmd(["open", str(CONFIG_DIR)], silence=True)
106
- else:
107
- RunBin.run_cmd(["xdg-open", str(CONFIG_DIR)], silence=True)
108
-
109
- def set_states(self, state: str) -> None:
110
- self.settings_save_cred_cbox.config(state=state)
111
- self.settings_clear_cred_btn.config(state=state)
112
- self.settings_restore_default_btn.config(state=state)
113
- self.settings_open_dir_btn.config(state=state)
1
+ #!/usr/bin/env python3
2
+ import os
3
+ import platform
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from ttkbootstrap import Button, Checkbutton, Label, LabelFrame, OptionMenu # type: ignore
7
+
8
+ from sticker_convert.definitions import CONFIG_DIR, RUNTIME_STATE
9
+ from sticker_convert.utils.files.run_bin import RunBin
10
+ from sticker_convert.utils.translate import SUPPORTED_LANG, I, get_lang
11
+
12
+ if TYPE_CHECKING:
13
+ from sticker_convert.gui import GUI # type: ignore
14
+
15
+
16
+ class ConfigFrame(LabelFrame):
17
+ def __init__(self, gui: "GUI", *args: Any, **kwargs: Any) -> None:
18
+ self.gui = gui
19
+ super().__init__(*args, **kwargs)
20
+
21
+ self.grid_columnconfigure(1, weight=1)
22
+ self.grid_columnconfigure(3, weight=1)
23
+
24
+ self.settings_save_cred_lbl = Label(
25
+ self, text=I("Save credentials"), width=18, justify="left", anchor="w"
26
+ )
27
+ self.settings_save_cred_cbox = Checkbutton(
28
+ self,
29
+ variable=self.gui.settings_save_cred_var,
30
+ onvalue=True,
31
+ offvalue=False,
32
+ bootstyle="success-round-toggle", # type: ignore
33
+ )
34
+
35
+ self.settings_clear_cred_lbl = Label(
36
+ self,
37
+ text=I("Clear credentials"),
38
+ width=18,
39
+ justify="left",
40
+ anchor="w",
41
+ )
42
+ self.settings_clear_cred_btn = Button(
43
+ self,
44
+ text=I("Clear..."),
45
+ command=self.cb_clear_cred,
46
+ bootstyle="secondary", # type: ignore
47
+ )
48
+
49
+ self.settings_restore_default_lbl = Label(
50
+ self, text=I("Default config"), width=18, justify="left", anchor="w"
51
+ )
52
+ self.settings_restore_default_btn = Button(
53
+ self,
54
+ text=I("Restore..."),
55
+ command=self.cb_restore_default,
56
+ bootstyle="secondary", # type: ignore
57
+ )
58
+
59
+ self.settings_open_dir_lbl = Label(
60
+ self, text=I("Config directory"), width=18, justify="left", anchor="w"
61
+ )
62
+ self.settings_open_dir_btn = Button(
63
+ self,
64
+ text=I("Open..."),
65
+ command=self.cb_open_config_directory,
66
+ bootstyle="secondary", # type: ignore
67
+ )
68
+
69
+ self.settings_lang_lbl = Label(
70
+ self, text=I("Language"), width=18, justify="left", anchor="w"
71
+ )
72
+ self.settings_lang_opt = OptionMenu(
73
+ self,
74
+ self.gui.lang_display_var,
75
+ self.gui.lang_display_var.get(),
76
+ *list(SUPPORTED_LANG.keys()),
77
+ command=self.cb_lang,
78
+ bootstyle="secondary", # type: ignore
79
+ )
80
+ self.settings_lang_opt.config(width=8)
81
+
82
+ self.settings_save_cred_lbl.grid(column=0, row=0, sticky="w", padx=3, pady=3)
83
+ self.settings_save_cred_cbox.grid(column=1, row=0, sticky="w", padx=3, pady=3)
84
+
85
+ self.settings_clear_cred_lbl.grid(column=2, row=0, sticky="w", padx=3, pady=3)
86
+ self.settings_clear_cred_btn.grid(column=3, row=0, sticky="w", padx=3, pady=3)
87
+
88
+ self.settings_open_dir_lbl.grid(column=0, row=1, sticky="w", padx=3, pady=3)
89
+ self.settings_open_dir_btn.grid(column=1, row=1, sticky="w", padx=3, pady=3)
90
+
91
+ self.settings_restore_default_lbl.grid(
92
+ column=2, row=1, sticky="w", padx=3, pady=3
93
+ )
94
+ self.settings_restore_default_btn.grid(
95
+ column=3, row=1, sticky="w", padx=3, pady=3
96
+ )
97
+
98
+ self.settings_lang_lbl.grid(column=0, row=2, sticky="w", padx=3, pady=3)
99
+ self.settings_lang_opt.grid(column=1, row=2, sticky="w", padx=3, pady=3)
100
+
101
+ def cb_clear_cred(self, *_: Any, **kwargs: Any) -> None:
102
+ response = self.gui.cb.put(
103
+ (
104
+ "ask_bool",
105
+ (I("Are you sure you want to clear credentials?"),),
106
+ None,
107
+ )
108
+ )
109
+ if response is True:
110
+ self.gui.delete_creds()
111
+ self.gui.load_jsons()
112
+ self.gui.apply_creds()
113
+ self.gui.highlight_fields()
114
+ self.gui.cb.put(("msg_block", ("Credentials cleared.",), None))
115
+
116
+ def cb_restore_default(self, *_: Any, **kwargs: Any) -> None:
117
+ response = self.gui.cb.put(
118
+ (
119
+ "ask_bool",
120
+ (
121
+ I(
122
+ "Are you sure you want to restore default config? (This will not clear credentials.)"
123
+ ),
124
+ ),
125
+ None,
126
+ )
127
+ )
128
+ if response is True:
129
+ self.gui.delete_config()
130
+ self.gui.load_jsons()
131
+ self.gui.apply_config()
132
+ self.gui.highlight_fields()
133
+ self.gui.cb.put(("msg_block", (I("Restored to default config."),), None))
134
+
135
+ def cb_open_config_directory(self, *_: Any, **kwargs: Any) -> None:
136
+ self.gui.cb.put(I("Config is located at {}").format(CONFIG_DIR))
137
+ if platform.system() == "Windows":
138
+ os.startfile(CONFIG_DIR) # type: ignore
139
+ elif platform.system() == "Darwin":
140
+ RunBin.run_cmd(["open", str(CONFIG_DIR)], silence=True)
141
+ else:
142
+ RunBin.run_cmd(["xdg-open", str(CONFIG_DIR)], silence=True)
143
+
144
+ def cb_lang(self, *_: Any, **kwargs: Any) -> None:
145
+ self.gui.lang_true_var.set(SUPPORTED_LANG[self.gui.lang_display_var.get()])
146
+ self.gui.save_config()
147
+ RUNTIME_STATE["LANG"] = get_lang()
148
+ RUNTIME_STATE["TRANS"] = None
149
+ self.gui.reset()
150
+
151
+ def set_states(self, state: str) -> None:
152
+ self.settings_save_cred_cbox.config(state=state)
153
+ self.settings_clear_cred_btn.config(state=state)
154
+ self.settings_restore_default_btn.config(state=state)
155
+ self.settings_open_dir_btn.config(state=state)
156
+ self.settings_lang_opt.config(state=state)