sticker-convert 2.12.2__tar.gz → 2.12.4__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 (125) hide show
  1. {sticker_convert-2.12.2/src/sticker_convert.egg-info → sticker_convert-2.12.4}/PKG-INFO +5 -4
  2. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/requirements.txt +4 -3
  3. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/cli.py +2 -0
  4. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/converter.py +7 -2
  5. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_viber.py +13 -3
  6. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui.py +8 -0
  7. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/advanced_compression_window.py +17 -0
  8. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/kakao_get_auth_window.py +2 -6
  9. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/job_option.py +2 -0
  10. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/help.json +1 -0
  11. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_discord_auth.py +4 -1
  12. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_kakao_desktop_auth.py +118 -34
  13. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/telegram_api.py +2 -2
  14. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/chrome_remotedebug.py +31 -41
  15. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/version.py +1 -1
  16. {sticker_convert-2.12.2 → sticker_convert-2.12.4/src/sticker_convert.egg-info}/PKG-INFO +5 -4
  17. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert.egg-info/requires.txt +4 -3
  18. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/tests/test_download.py +7 -5
  19. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/LICENSE +0 -0
  20. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/MANIFEST.in +0 -0
  21. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/README.md +0 -0
  22. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/pyproject.toml +0 -0
  23. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/setup.cfg +0 -0
  24. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/__init__.py +0 -0
  25. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/__main__.py +0 -0
  26. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/definitions.py +0 -0
  27. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/__init__.py +0 -0
  28. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_base.py +0 -0
  29. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_discord.py +0 -0
  30. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_kakao.py +0 -0
  31. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_line.py +0 -0
  32. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_signal.py +0 -0
  33. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/downloaders/download_telegram.py +0 -0
  34. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/__init__.py +0 -0
  35. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/__init__.py +0 -0
  36. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/comp_frame.py +0 -0
  37. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/config_frame.py +0 -0
  38. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/control_frame.py +0 -0
  39. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/cred_frame.py +0 -0
  40. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/input_frame.py +0 -0
  41. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/output_frame.py +0 -0
  42. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/progress_frame.py +0 -0
  43. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/frames/right_clicker.py +0 -0
  44. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/gui_utils.py +0 -0
  45. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/__init__.py +0 -0
  46. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/base_window.py +0 -0
  47. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/discord_get_auth_window.py +0 -0
  48. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/line_get_auth_window.py +0 -0
  49. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/signal_get_auth_window.py +0 -0
  50. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/gui_components/windows/viber_get_auth_window.py +0 -0
  51. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +0 -0
  52. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  53. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/README.md +0 -0
  54. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers/Info.plist +0 -0
  55. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +0 -0
  56. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +0 -0
  57. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +0 -0
  58. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +0 -0
  59. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  60. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +0 -0
  61. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  62. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +0 -0
  63. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  64. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  65. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +0 -0
  66. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  67. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  68. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  69. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  70. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  71. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  72. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  73. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  74. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  75. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  76. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  77. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  78. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +0 -0
  79. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  80. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  81. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  82. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  83. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/job.py +0 -0
  84. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  85. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/appicon.icns +0 -0
  86. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/appicon.ico +0 -0
  87. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/appicon.png +0 -0
  88. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/compression.json +0 -0
  89. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/emoji.json +0 -0
  90. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/input.json +0 -0
  91. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/memdump_linux.sh +0 -0
  92. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/memdump_windows.ps1 +0 -0
  93. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/resources/output.json +0 -0
  94. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/__init__.py +0 -0
  95. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/compress_wastickers.py +0 -0
  96. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/upload_base.py +0 -0
  97. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/upload_signal.py +0 -0
  98. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/upload_telegram.py +0 -0
  99. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/upload_viber.py +0 -0
  100. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/uploaders/xcode_imessage.py +0 -0
  101. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_kakao_auth.py +0 -0
  102. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_line_auth.py +0 -0
  103. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_signal_auth.py +0 -0
  104. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/get_viber_auth.py +0 -0
  105. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/auth/telethon_setup.py +0 -0
  106. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/callback.py +0 -0
  107. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/emoji.py +0 -0
  108. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/cache_store.py +0 -0
  109. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/json_manager.py +0 -0
  110. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/json_resources_loader.py +0 -0
  111. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/metadata_handler.py +0 -0
  112. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/run_bin.py +0 -0
  113. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/files/sanitize_filename.py +0 -0
  114. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/media/apple_png_normalize.py +0 -0
  115. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/media/codec_info.py +0 -0
  116. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/media/decrypt_kakao.py +0 -0
  117. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/media/format_verify.py +0 -0
  118. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/process.py +0 -0
  119. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert/utils/url_detect.py +0 -0
  120. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert.egg-info/SOURCES.txt +0 -0
  121. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert.egg-info/dependency_links.txt +0 -0
  122. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert.egg-info/entry_points.txt +0 -0
  123. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/src/sticker_convert.egg-info/top_level.txt +0 -0
  124. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/tests/test_compression.py +0 -0
  125. {sticker_convert-2.12.2 → sticker_convert-2.12.4}/tests/test_export.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sticker-convert
3
- Version: 2.12.2
3
+ Version: 2.12.4
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, Viber, Discord, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -365,7 +365,7 @@ Description-Content-Type: text/markdown
365
365
  License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
367
  Requires-Dist: anyio~=4.9.0
368
- Requires-Dist: apngasm_python~=1.3.1
368
+ Requires-Dist: apngasm_python~=1.3.2
369
369
  Requires-Dist: av~=13.1.0
370
370
  Requires-Dist: beautifulsoup4~=4.13.3
371
371
  Requires-Dist: cryptg~=0.5.0.post0
@@ -376,12 +376,13 @@ Requires-Dist: memory-tempfile~=2.2.3
376
376
  Requires-Dist: mergedeep~=1.3.4
377
377
  Requires-Dist: numpy>=1.22.4
378
378
  Requires-Dist: Pillow~=11.1.0
379
- Requires-Dist: pyoxipng~=9.0.0
379
+ Requires-Dist: pybrowsers~=0.7.0
380
+ Requires-Dist: pyoxipng~=9.1.0
380
381
  Requires-Dist: python-telegram-bot~=22.0
381
382
  Requires-Dist: psutil~=7.0.0
382
383
  Requires-Dist: PyMemoryEditor~=1.5.22
383
384
  Requires-Dist: requests~=2.32.3
384
- Requires-Dist: rlottie_python~=1.3.6
385
+ Requires-Dist: rlottie_python~=1.3.7
385
386
  Requires-Dist: signalstickers-client-fork-laggykiller~=3.3.0.post2
386
387
  Requires-Dist: socksio~=1.0.0
387
388
  Requires-Dist: telethon~=1.39.0
@@ -1,6 +1,6 @@
1
1
  aiolimiter~=1.2.1
2
2
  anyio~=4.9.0
3
- apngasm_python~=1.3.1
3
+ apngasm_python~=1.3.2
4
4
  av~=13.1.0
5
5
  beautifulsoup4~=4.13.3
6
6
  cryptg~=0.5.0.post0
@@ -11,12 +11,13 @@ memory-tempfile~=2.2.3
11
11
  mergedeep~=1.3.4
12
12
  numpy>=1.22.4
13
13
  Pillow~=11.1.0
14
- pyoxipng~=9.0.0
14
+ pybrowsers~=0.7.0
15
+ pyoxipng~=9.1.0
15
16
  python-telegram-bot~=22.0
16
17
  psutil~=7.0.0
17
18
  PyMemoryEditor~=1.5.22
18
19
  requests~=2.32.3
19
- rlottie_python~=1.3.6
20
+ rlottie_python~=1.3.7
20
21
  signalstickers-client-fork-laggykiller~=3.3.0.post2
21
22
  socksio~=1.0.0
22
23
  telethon~=1.39.0
@@ -139,6 +139,7 @@ class CLI:
139
139
  "cache_dir",
140
140
  "scale_filter",
141
141
  "quantize_method",
142
+ "chromium_path",
142
143
  )
143
144
  flags_comp_bool = ("fake_vid",)
144
145
  keyword_args: Dict[str, Any]
@@ -427,6 +428,7 @@ class CLI:
427
428
  fake_vid=self.compression_presets[preset]["fake_vid"]
428
429
  if args.fake_vid is None
429
430
  else args.fake_vid,
431
+ chromium_path=args.chromium_path,
430
432
  cache_dir=args.cache_dir,
431
433
  scale_filter=self.compression_presets[preset]["scale_filter"]
432
434
  if args.scale_filter is None
@@ -435,15 +435,20 @@ class StickerConvert:
435
435
  width = self.codec_info_orig.res[0]
436
436
  height = self.codec_info_orig.res[1]
437
437
 
438
- chrome_path = CRD.get_chrome_path()
438
+ chrome_path: Optional[str]
439
+ if self.opt_comp.chromium_path:
440
+ chrome_path = self.opt_comp.chromium_path
441
+ else:
442
+ chrome_path = CRD.get_chrome_path()
439
443
  args = [
440
444
  "--headless",
445
+ "--kiosk",
441
446
  "--disable-extensions",
442
447
  "--disable-infobars",
443
448
  "--disable-gpu",
444
449
  "--disable-gpu-rasterization",
445
450
  "--hide-scrollbars",
446
- f"--window-size={width + 100},{height + 100}",
451
+ f"--window-size={width + 200},{height + 200}",
447
452
  "about:blank",
448
453
  ]
449
454
  if chrome_path is None:
@@ -19,7 +19,7 @@ class DownloadViber(DownloadBase):
19
19
  # def __init__(self, *args: Any, **kwargs: Any) -> None:
20
20
  # super().__init__(*args, **kwargs)
21
21
 
22
- def get_pack_info(self, url: str) -> Optional[Tuple[str, str, str]]:
22
+ def get_pack_info(self, url: str) -> Optional[Tuple[str, str, str, str]]:
23
23
  r = requests.get(url, allow_redirects=True)
24
24
  soup = BeautifulSoup(r.text, "html.parser")
25
25
 
@@ -42,8 +42,17 @@ class DownloadViber(DownloadBase):
42
42
  first_sticker_url = cast(str, pack_dict["stickerFirstItemUrl"])
43
43
  zip_url = "/".join(first_sticker_url.split("/")[:-1]) + ".zip"
44
44
  pack_id = pack_dict["id"].split(".")[-1]
45
+ if is_custom:
46
+ cover_url = (
47
+ "https://custom-sticker-pack.cdn.viber.com/custom-stickers/{}/thumb.png"
48
+ )
49
+ else:
50
+ cover_url = (
51
+ "https://sm-content.viber.com/static/images/product/{}/sticker.png"
52
+ )
53
+ cover_url = cover_url.format(pack_dict["id"])
45
54
 
46
- return title, zip_url, pack_id
55
+ return title, zip_url, cover_url, pack_id
47
56
 
48
57
  def decompress(
49
58
  self, zip_file: bytes, exts: Optional[Tuple[str, ...]] = None
@@ -84,7 +93,7 @@ class DownloadViber(DownloadBase):
84
93
  if pack_info is None:
85
94
  self.cb.put("Download failed: Cannot get pack info")
86
95
  return 0, 0
87
- title, zip_url, pack_id = pack_info
96
+ title, zip_url, cover_url, pack_id = pack_info
88
97
 
89
98
  anim_url = f"https://content.cdn.viber.com/stickers/ASVG/{pack_id}.zip"
90
99
  anim_file = self.download_file(anim_url)
@@ -94,6 +103,7 @@ class DownloadViber(DownloadBase):
94
103
  count += self.decompress(zip_file, (".mp3",))
95
104
  else:
96
105
  count = self.decompress(zip_file, (".mp3", ".png"))
106
+ self.download_file(cover_url, self.out_dir / "cover.png")
97
107
 
98
108
  MetadataHandler.set_metadata(self.out_dir, title=title)
99
109
 
@@ -137,6 +137,7 @@ class GUI(Window):
137
137
  self.fake_vid_var = BooleanVar()
138
138
  self.scale_filter_var = StringVar(self)
139
139
  self.quantize_method_var = StringVar(self)
140
+ self.chromium_path_var = StringVar(self)
140
141
  self.cache_dir_var = StringVar(self)
141
142
  self.default_emoji_var = StringVar(self)
142
143
  self.steps_var = IntVar(self)
@@ -321,6 +322,7 @@ class GUI(Window):
321
322
  "comp": {
322
323
  "no_compress": self.no_compress_var.get(),
323
324
  "preset": self.comp_preset_var.get(),
325
+ "chromium_path": self.chromium_path_var.get(),
324
326
  "cache_dir": self.cache_dir_var.get(),
325
327
  "processes": self.processes_var.get(),
326
328
  },
@@ -377,6 +379,9 @@ class GUI(Window):
377
379
  self.compression_presets["custom"], comp_custom
378
380
  )
379
381
  self.cache_dir_var.set(self.settings.get("comp", {}).get("cache_dir", ""))
382
+ self.chromium_path_var.set(
383
+ self.settings.get("comp", {}).get("chromium_path", "")
384
+ )
380
385
  self.processes_var.set(
381
386
  self.settings.get("comp", {}).get("processes", ceil(cpu_count() / 2))
382
387
  )
@@ -568,6 +573,9 @@ class GUI(Window):
568
573
  fake_vid=self.fake_vid_var.get(),
569
574
  scale_filter=self.scale_filter_var.get(),
570
575
  quantize_method=self.quantize_method_var.get(),
576
+ chromium_path=self.chromium_path_var.get()
577
+ if self.chromium_path_var.get() != ""
578
+ else None,
571
579
  cache_dir=self.cache_dir_var.get()
572
580
  if self.cache_dir_var.get() != ""
573
581
  else None,
@@ -293,6 +293,17 @@ class AdvancedCompressionWindow(BaseWindow):
293
293
  bootstyle="secondary", # type: ignore
294
294
  )
295
295
 
296
+ self.chromium_path_help_btn = self.add_help_btn(
297
+ self.gui.help["comp"]["chromium_path"]
298
+ )
299
+ self.chromium_path_lbl = Label(
300
+ self.frame_advcomp, text="Chromium/Chrome directory"
301
+ )
302
+ self.chromium_path_entry = Entry(
303
+ self.frame_advcomp, textvariable=self.gui.chromium_path_var, width=30
304
+ )
305
+ self.chromium_path_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
306
+
296
307
  self.cache_dir_help_btn = self.add_help_btn(self.gui.help["comp"]["cache_dir"])
297
308
  self.cache_dir_lbl = Label(self.frame_advcomp, text="Custom cache directory")
298
309
  self.cache_dir_entry = Entry(
@@ -412,6 +423,12 @@ class AdvancedCompressionWindow(BaseWindow):
412
423
  column=2, row=r, columnspan=4, sticky="nes", padx=3, pady=3
413
424
  )
414
425
  r += 1
426
+ self.chromium_path_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
427
+ self.chromium_path_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
428
+ self.chromium_path_entry.grid(
429
+ column=2, row=r, columnspan=4, sticky="nes", padx=3, pady=3
430
+ )
431
+ r += 1
415
432
  self.cache_dir_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
416
433
  self.cache_dir_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
417
434
  self.cache_dir_entry.grid(
@@ -1,6 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- import platform
3
- import subprocess
4
2
  from functools import partial
5
3
  from threading import Thread
6
4
  from typing import Any, Optional
@@ -37,7 +35,7 @@ class KakaoGetAuthWindow(BaseWindow):
37
35
  # Method 1 frame
38
36
  self.explanation1_1_lbl = Label(
39
37
  self.frame_from_desktop,
40
- text="This will get Kakao auth_token from Kakao Desktop (Windows only)",
38
+ text="This will get Kakao auth_token from Kakao Desktop",
41
39
  justify="left",
42
40
  anchor="w",
43
41
  )
@@ -70,14 +68,12 @@ class KakaoGetAuthWindow(BaseWindow):
70
68
  command=self.cb_launch_desktop,
71
69
  width=24,
72
70
  bootstyle="secondary", # type: ignore
73
- state="normal" if platform.system() == "Windows" else "disabled",
74
71
  )
75
72
  self.get_auth_desktop_btn = Button(
76
73
  self.frame_from_desktop,
77
74
  text="Get auth_token",
78
75
  command=self.cb_from_desktop,
79
76
  width=24,
80
- state="normal" if platform.system() == "Windows" else "disabled",
81
77
  )
82
78
 
83
79
  self.explanation1_1_lbl.grid(
@@ -270,7 +266,7 @@ class KakaoGetAuthWindow(BaseWindow):
270
266
  bin_path = m.get_kakao_desktop()
271
267
 
272
268
  if bin_path is not None:
273
- subprocess.Popen([bin_path])
269
+ m.launch_kakao(bin_path)
274
270
  else:
275
271
  self.cb_msg_block_kakao(
276
272
  "Error: Cannot launch Kakao Desktop. Is it installed?"
@@ -75,6 +75,7 @@ class CompOption(BaseOption):
75
75
  fake_vid: Optional[bool] = None
76
76
  quantize_method: Optional[str] = None
77
77
  scale_filter: Optional[str] = None
78
+ chromium_path: Optional[str] = None
78
79
  cache_dir: Optional[str] = None
79
80
  default_emoji: str = "😀"
80
81
  no_compress: Optional[bool] = None
@@ -109,6 +110,7 @@ class CompOption(BaseOption):
109
110
  "fake_vid": self.fake_vid,
110
111
  "quantize_method": self.quantize_method,
111
112
  "scale_filter": self.scale_filter,
113
+ "chromium_path": self.chromium_path,
112
114
  "cache_dir": self.cache_dir,
113
115
  "default_emoji": self.default_emoji,
114
116
  "no_compress": self.no_compress,
@@ -52,6 +52,7 @@
52
52
  "scale_filter": "Set scale filter. Default as bicubic. Valid options are:\n- nearest = Use nearest neighbour (Suitable for pixel art)\n- box = Similar to nearest, but better downscaling\n- bilinear = Linear interpolation\n- hamming = Similar to bilinear, but better downscaling\n- bicubic = Cubic spline interpolation\n- lanczos = A high-quality downsampling filter",
53
53
  "quantize_method": "Set method for quantizing image. Default as imagequant. Valid options are:\n- imagequant = Best quality but slow\n- fastoctree = Fast but image looks chunky\n- none = No image quantizing, large image size as result",
54
54
  "cache_dir": "Set custom cache directory.\nUseful for debugging, or speed up conversion if cache_dir is on RAM disk.",
55
+ "chromium_path": "Set Chromium(-based)/Chrome browser path.\nRequired for converting from SVG files.\nLeave blank to auto detect",
55
56
  "default_emoji": "Set the default emoji for uploading Signal and Telegram sticker packs."
56
57
  },
57
58
  "cred": {
@@ -74,7 +74,10 @@ class GetDiscordAuth:
74
74
  else:
75
75
  chrome_path = CRD.get_chrome_path()
76
76
  if chrome_path is None:
77
- return None, "Please install Discord Desktop or Chrome and try again"
77
+ return (
78
+ None,
79
+ "Please install Discord Desktop or Chrome/Chromium and try again",
80
+ )
78
81
 
79
82
  token = None
80
83
  if using_discord_app:
@@ -18,21 +18,33 @@ then login to Kakao Desktop and try again."""
18
18
  MSG_NO_AUTH = """Kakao Desktop installed,
19
19
  but kakao_auth not found.
20
20
  Please login to Kakao Desktop and try again."""
21
+ MSG_SIP_ENABLED = """You need to disable SIP:
22
+ 1. Restart computer in Recovery mode
23
+ 2. Launch Terminal from the Utilities menu
24
+ 3. Run the command `csrutil disable`
25
+ 4. Restart your computer"""
21
26
  MSG_LAUNCH_FAIL = "Failed to launch Kakao"
22
27
  MSG_PERMISSION_ERROR = "Failed to read Kakao process memory"
23
- MSG_UNSUPPORTED = "Only Windows is supported for this method"
24
28
 
25
29
 
26
30
  class GetKakaoDesktopAuth:
27
31
  def __init__(self, cb_ask_str: Callable[..., str] = input):
28
32
  self.cb_ask_str = cb_ask_str
29
33
 
34
+ def launch_kakao(self, kakao_bin_path: str):
35
+ if platform.system() == "Windows":
36
+ subprocess.Popen([kakao_bin_path])
37
+ elif platform.system() == "Darwin":
38
+ subprocess.Popen(["open", kakao_bin_path])
39
+ else:
40
+ subprocess.Popen(["wine", kakao_bin_path])
41
+
30
42
  def relaunch_kakao(self, kakao_bin_path: str) -> Optional[int]:
31
43
  killed = killall("kakaotalk")
32
44
  if killed:
33
45
  time.sleep(5)
34
46
 
35
- subprocess.Popen([kakao_bin_path])
47
+ self.launch_kakao(kakao_bin_path)
36
48
  time.sleep(20)
37
49
 
38
50
  return find_pid_by_name("kakaotalk")
@@ -54,7 +66,7 @@ class GetKakaoDesktopAuth:
54
66
  try:
55
67
  with OpenProcess(pid=int(kakao_pid)) as process:
56
68
  for address in process.search_by_value( # type: ignore
57
- str, 15, "\x00authorization\x00"
69
+ str, 15, "authorization: "
58
70
  ):
59
71
  auth_token_addr = cast(int, address) + 15
60
72
  auth_token_bytes = process.read_process_memory(
@@ -127,11 +139,77 @@ class GetKakaoDesktopAuth:
127
139
 
128
140
  return auth_token, msg
129
141
 
130
- def get_kakao_desktop(self) -> Optional[str]:
131
- kakao_bin_path = os.path.expandvars(
132
- "%programfiles(x86)%\\Kakao\\KakaoTalk\\KakaoTalk.exe"
142
+ def get_auth_darwin(self, kakao_bin_path: str) -> Tuple[Optional[str], str]:
143
+ killall("kakaotalk")
144
+
145
+ subprocess.run(
146
+ [
147
+ "lldb",
148
+ kakao_bin_path,
149
+ "-o",
150
+ "b ptrace",
151
+ "-o",
152
+ "r",
153
+ "-o",
154
+ "thread return",
155
+ "-o",
156
+ "con",
157
+ "-o",
158
+ "process save-core /tmp/memdump.kakaotalk.dmp",
159
+ "-o",
160
+ "con",
161
+ "-o",
162
+ "quit",
163
+ ],
164
+ stdout=subprocess.DEVNULL,
165
+ stderr=subprocess.DEVNULL,
133
166
  )
134
- if Path(kakao_bin_path).is_file():
167
+
168
+ with open("/tmp/memdump.kakaotalk.dmp", "rb") as f:
169
+ mem = f.read()
170
+
171
+ os.remove("/tmp/memdump.kakaotalk.dmp")
172
+
173
+ auth_token = None
174
+ for i in re.finditer(b"]mac/", mem):
175
+ auth_token_term = i.start()
176
+
177
+ auth_token_bytes = mem[auth_token_term - 200 : auth_token_term]
178
+ auth_token_start = auth_token_bytes.find(b"application/json_\x10\x8a") + 19
179
+ if auth_token_start == -1:
180
+ continue
181
+ try:
182
+ auth_token_candidate = auth_token_bytes[auth_token_start:].decode(
183
+ encoding="ascii"
184
+ )
185
+ except UnicodeDecodeError:
186
+ continue
187
+
188
+ if 150 > len(auth_token_candidate) > 100:
189
+ auth_token = auth_token_candidate
190
+ break
191
+
192
+ if auth_token is None:
193
+ return None, MSG_NO_AUTH
194
+ else:
195
+ msg = "Got auth_token successfully:\n"
196
+ msg += f"{auth_token=}\n"
197
+
198
+ return auth_token, msg
199
+
200
+ def get_kakao_desktop(self) -> Optional[str]:
201
+ if platform.system() == "Windows":
202
+ kakao_bin_path = os.path.expandvars(
203
+ "%programfiles(x86)%\\Kakao\\KakaoTalk\\KakaoTalk.exe"
204
+ )
205
+ elif platform.system() == "Darwin":
206
+ kakao_bin_path = "/Applications/KakaoTalk.app"
207
+ else:
208
+ kakao_bin_path = os.path.expanduser(
209
+ "~/.wine/drive_c/Program Files (x86)/Kakao/KakaoTalk/KakaoTalk.exe"
210
+ )
211
+
212
+ if Path(kakao_bin_path).exists():
135
213
  return kakao_bin_path
136
214
 
137
215
  return None
@@ -140,15 +218,6 @@ class GetKakaoDesktopAuth:
140
218
  self,
141
219
  kakao_bin_path: Optional[str] = None,
142
220
  ) -> Tuple[Optional[str], str]:
143
- if platform.system() != "Windows":
144
- return None, MSG_UNSUPPORTED
145
-
146
- if not kakao_bin_path:
147
- kakao_bin_path = self.get_kakao_desktop()
148
-
149
- if not kakao_bin_path:
150
- return None, MSG_NO_BIN
151
-
152
221
  # get_auth_by_dump()
153
222
  # + Fast
154
223
  # - Requires admin
@@ -158,23 +227,38 @@ class GetKakaoDesktopAuth:
158
227
  # - Slow
159
228
  # - Cannot run on macOS
160
229
 
161
- # If admin, prefer get_auth_by_dump() over get_auth_by_pme(), vice versa
162
- methods: List[Callable[[str, bool], Tuple[Optional[str], str]]] = []
163
- relaunch = True
164
- kakao_auth = None
165
- msg = ""
166
-
167
- pme_present = importlib.util.find_spec("PyMemoryEditor") is not None
168
- methods.append(self.get_auth_by_dump)
169
- if pme_present:
170
- methods.append(self.get_auth_by_pme)
171
- if check_admin() is False:
172
- methods.reverse()
173
-
174
- for method in methods:
175
- kakao_auth, msg = method(kakao_bin_path, relaunch)
176
- relaunch = False
177
- if kakao_auth is not None:
178
- break
230
+ if not kakao_bin_path:
231
+ kakao_bin_path = self.get_kakao_desktop()
232
+
233
+ if not kakao_bin_path:
234
+ return None, MSG_NO_BIN
235
+
236
+ if platform.system() != "Darwin":
237
+ # If admin, prefer get_auth_by_dump() over get_auth_by_pme(), vice versa
238
+ methods: List[Callable[[str, bool], Tuple[Optional[str], str]]] = []
239
+ relaunch = True
240
+ kakao_auth = None
241
+ msg = ""
242
+
243
+ pme_present = importlib.util.find_spec("PyMemoryEditor") is not None
244
+ methods.append(self.get_auth_by_dump)
245
+ if pme_present:
246
+ methods.append(self.get_auth_by_pme)
247
+ if check_admin() is False:
248
+ methods.reverse()
249
+
250
+ for method in methods:
251
+ kakao_auth, msg = method(kakao_bin_path, relaunch)
252
+ relaunch = False
253
+ if kakao_auth is not None:
254
+ break
255
+ else:
256
+ csrutil_status = subprocess.run(
257
+ ["csrutil", "status"], capture_output=True, text=True
258
+ ).stdout
259
+
260
+ if "enabled" in csrutil_status:
261
+ return None, MSG_SIP_ENABLED
262
+ kakao_auth, msg = self.get_auth_darwin(kakao_bin_path)
179
263
 
180
264
  return kakao_auth, msg
@@ -388,8 +388,8 @@ class TelethonAPI(TelegramAPI):
388
388
  else:
389
389
  sent_message = cast(
390
390
  Message,
391
- await self.client.send_file("Stickers", msg, force_document=True),
392
- ) # type: ignore
391
+ await self.client.send_file("Stickers", msg, force_document=True), # type: ignore
392
+ )
393
393
 
394
394
  for _ in range(5):
395
395
  # https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this
@@ -8,8 +8,9 @@ import shutil
8
8
  import socket
9
9
  import subprocess
10
10
  import time
11
- from typing import Any, Dict, List, Optional, Union, cast
11
+ from typing import Any, Dict, List, Optional, Tuple, Union, cast
12
12
 
13
+ import browsers # type: ignore
13
14
  import requests
14
15
  import websocket
15
16
  from PIL import Image
@@ -19,6 +20,23 @@ from PIL import Image
19
20
  # https://chromedevtools.github.io/devtools-protocol/
20
21
 
21
22
 
23
+ BROWSER_PREF = [
24
+ "chrome",
25
+ "chrome-canary",
26
+ "chromium",
27
+ "msedge",
28
+ "msedge-beta",
29
+ "msedge-dev",
30
+ "msedge-canary",
31
+ "brave",
32
+ "brave-beta",
33
+ "brave-nightly",
34
+ "opera",
35
+ "opera-beta",
36
+ "opera-developer",
37
+ ]
38
+
39
+
22
40
  def get_free_port() -> int:
23
41
  with socket.socket() as sock:
24
42
  sock.bind(("", 0))
@@ -66,47 +84,19 @@ class CRD:
66
84
 
67
85
  @staticmethod
68
86
  def get_chrome_path() -> Optional[str]:
69
- chrome_bin: Optional[str]
70
- if platform.system() == "Darwin":
71
- chrome_bin = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
72
-
73
- if os.path.isfile(chrome_bin) is False:
74
- return None
75
-
76
- return chrome_bin
77
-
78
- elif platform.system() == "Windows":
79
- chrome_x64 = f"{os.environ.get('PROGRAMW6432') or os.environ.get('PROGRAMFILES')}\\Google\\Chrome\\Application"
80
- chrome_x86 = (
81
- f"{os.environ.get('PROGRAMFILES(X86)')}\\Google\\Chrome\\Application"
82
- )
83
-
84
- chrome_dir = (
85
- chrome_x64
86
- if os.path.isdir(chrome_x64)
87
- else chrome_x86
88
- if os.path.isdir(chrome_x86)
89
- else None
90
- )
91
-
92
- if chrome_dir is None:
93
- return None
94
-
95
- return chrome_dir + "\\chrome.exe"
96
-
97
- else:
98
- for executable in (
99
- "google-chrome",
100
- "google-chrome-stable",
101
- "google-chrome-beta",
102
- "google-chrome-dev",
103
- "chromium-browser",
104
- "chromium",
105
- ):
106
- chrome_bin = shutil.which(executable)
107
- if chrome_bin is not None:
108
- return chrome_bin
87
+ bs: List[Tuple[int, str]] = []
88
+ for b in browsers.browsers():
89
+ browser_type = b["browser_type"]
90
+ path = b["path"]
91
+ try:
92
+ rank = BROWSER_PREF.index(browser_type)
93
+ except ValueError:
94
+ continue
95
+ bs.append((rank, path))
96
+ if len(bs) == 0:
109
97
  return None
98
+ bs = sorted(bs, key=lambda x: x[0])
99
+ return bs[0][1]
110
100
 
111
101
  def connect(self, target_id: int = 0):
112
102
  self.cmd_id = 1
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.12.2"
3
+ __version__ = "2.12.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sticker-convert
3
- Version: 2.12.2
3
+ Version: 2.12.4
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, Viber, Discord, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -365,7 +365,7 @@ Description-Content-Type: text/markdown
365
365
  License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
367
  Requires-Dist: anyio~=4.9.0
368
- Requires-Dist: apngasm_python~=1.3.1
368
+ Requires-Dist: apngasm_python~=1.3.2
369
369
  Requires-Dist: av~=13.1.0
370
370
  Requires-Dist: beautifulsoup4~=4.13.3
371
371
  Requires-Dist: cryptg~=0.5.0.post0
@@ -376,12 +376,13 @@ Requires-Dist: memory-tempfile~=2.2.3
376
376
  Requires-Dist: mergedeep~=1.3.4
377
377
  Requires-Dist: numpy>=1.22.4
378
378
  Requires-Dist: Pillow~=11.1.0
379
- Requires-Dist: pyoxipng~=9.0.0
379
+ Requires-Dist: pybrowsers~=0.7.0
380
+ Requires-Dist: pyoxipng~=9.1.0
380
381
  Requires-Dist: python-telegram-bot~=22.0
381
382
  Requires-Dist: psutil~=7.0.0
382
383
  Requires-Dist: PyMemoryEditor~=1.5.22
383
384
  Requires-Dist: requests~=2.32.3
384
- Requires-Dist: rlottie_python~=1.3.6
385
+ Requires-Dist: rlottie_python~=1.3.7
385
386
  Requires-Dist: signalstickers-client-fork-laggykiller~=3.3.0.post2
386
387
  Requires-Dist: socksio~=1.0.0
387
388
  Requires-Dist: telethon~=1.39.0
@@ -1,6 +1,6 @@
1
1
  aiolimiter~=1.2.1
2
2
  anyio~=4.9.0
3
- apngasm_python~=1.3.1
3
+ apngasm_python~=1.3.2
4
4
  av~=13.1.0
5
5
  beautifulsoup4~=4.13.3
6
6
  cryptg~=0.5.0.post0
@@ -11,12 +11,13 @@ memory-tempfile~=2.2.3
11
11
  mergedeep~=1.3.4
12
12
  numpy>=1.22.4
13
13
  Pillow~=11.1.0
14
- pyoxipng~=9.0.0
14
+ pybrowsers~=0.7.0
15
+ pyoxipng~=9.1.0
15
16
  python-telegram-bot~=22.0
16
17
  psutil~=7.0.0
17
18
  PyMemoryEditor~=1.5.22
18
19
  requests~=2.32.3
19
- rlottie_python~=1.3.6
20
+ rlottie_python~=1.3.7
20
21
  signalstickers-client-fork-laggykiller~=3.3.0.post2
21
22
  socksio~=1.0.0
22
23
  telethon~=1.39.0
@@ -415,6 +415,7 @@ def test_download_kakao_animated_gif_store_link_with_token(tmp_path: LocalPath)
415
415
 
416
416
 
417
417
  @pytest.mark.skipif(not TEST_DOWNLOAD, reason="TEST_DOWNLOAD not set")
418
+ @pytest.mark.skipif(not KAKAO_TOKEN, reason="No credentials")
418
419
  def test_download_kakao_animated_gif_share_link(tmp_path: LocalPath) -> None:
419
420
  _run_sticker_convert(
420
421
  tmp_path=tmp_path,
@@ -430,6 +431,7 @@ def test_download_kakao_animated_gif_share_link(tmp_path: LocalPath) -> None:
430
431
 
431
432
 
432
433
  @pytest.mark.skipif(not TEST_DOWNLOAD, reason="TEST_DOWNLOAD not set")
434
+ @pytest.mark.skipif(not KAKAO_TOKEN, reason="No credentials")
433
435
  def test_download_kakao_mini_share_link(tmp_path: LocalPath) -> None:
434
436
  _run_sticker_convert(
435
437
  tmp_path=tmp_path,
@@ -450,7 +452,7 @@ def test_download_viber_custom_sticker_packs(tmp_path: LocalPath) -> None:
450
452
  tmp_path=tmp_path,
451
453
  source="viber",
452
454
  url="https://stickers.viber.com/pages/custom-sticker-packs/11eefcc8e3c228308e3fafd9b834679a19de752fb5c38390",
453
- expected_file_count=2,
455
+ expected_file_count=3,
454
456
  expected_file_formats=[".png"],
455
457
  with_title=True,
456
458
  with_author=False,
@@ -465,7 +467,7 @@ def test_download_viber_official_sticker_packs(tmp_path: LocalPath) -> None:
465
467
  tmp_path=tmp_path,
466
468
  source="viber",
467
469
  url="https://stickers.viber.com/pages/spring_2024",
468
- expected_file_count=14,
470
+ expected_file_count=15,
469
471
  expected_file_formats=[".png"],
470
472
  with_title=True,
471
473
  with_author=False,
@@ -479,7 +481,7 @@ def test_download_viber_official_sticker_packs_sound(tmp_path: LocalPath) -> Non
479
481
  tmp_path=tmp_path,
480
482
  source="viber",
481
483
  url="https://stickers.viber.com/pages/onenationunderloveUA",
482
- expected_file_count=24,
484
+ expected_file_count=25,
483
485
  expected_file_formats=[".png", ".mp3"],
484
486
  with_title=True,
485
487
  with_author=False,
@@ -493,8 +495,8 @@ def test_download_viber_official_sticker_packs_animated(tmp_path: LocalPath) ->
493
495
  tmp_path=tmp_path,
494
496
  source="viber",
495
497
  url="https://stickers.viber.com/pages/earthday",
496
- expected_file_count=32,
497
- expected_file_formats=[".svg"],
498
+ expected_file_count=33,
499
+ expected_file_formats=[".svg", ".png"],
498
500
  with_title=True,
499
501
  with_author=False,
500
502
  with_emoji=False,