sticker-convert 2.11.0__tar.gz → 2.11.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. {sticker_convert-2.11.0/src/sticker_convert.egg-info → sticker_convert-2.11.2}/PKG-INFO +10 -7
  2. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/README.md +4 -1
  3. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/requirements.txt +4 -4
  4. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/cli.py +7 -7
  5. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/converter.py +5 -6
  6. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_base.py +2 -2
  7. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_signal.py +1 -1
  8. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/job.py +2 -2
  9. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/compress_wastickers.py +76 -56
  10. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/upload_viber.py +18 -19
  11. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/telegram_api.py +4 -2
  12. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/metadata_handler.py +3 -3
  13. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/version.py +1 -1
  14. {sticker_convert-2.11.0 → sticker_convert-2.11.2/src/sticker_convert.egg-info}/PKG-INFO +10 -7
  15. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert.egg-info/requires.txt +4 -4
  16. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/LICENSE +0 -0
  17. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/MANIFEST.in +0 -0
  18. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/pyproject.toml +0 -0
  19. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/setup.cfg +0 -0
  20. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/__init__.py +0 -0
  21. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/__main__.py +0 -0
  22. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/definitions.py +0 -0
  23. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/__init__.py +0 -0
  24. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_discord.py +0 -0
  25. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_kakao.py +0 -0
  26. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_line.py +0 -0
  27. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_telegram.py +0 -0
  28. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/downloaders/download_viber.py +0 -0
  29. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui.py +0 -0
  30. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/__init__.py +0 -0
  31. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/__init__.py +0 -0
  32. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/comp_frame.py +0 -0
  33. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/config_frame.py +0 -0
  34. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/control_frame.py +0 -0
  35. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/cred_frame.py +0 -0
  36. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/input_frame.py +0 -0
  37. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/output_frame.py +0 -0
  38. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/progress_frame.py +0 -0
  39. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/frames/right_clicker.py +0 -0
  40. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/gui_utils.py +0 -0
  41. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/__init__.py +0 -0
  42. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/advanced_compression_window.py +0 -0
  43. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/base_window.py +0 -0
  44. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/discord_get_auth_window.py +0 -0
  45. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/kakao_get_auth_window.py +0 -0
  46. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/line_get_auth_window.py +0 -0
  47. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/signal_get_auth_window.py +0 -0
  48. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/gui_components/windows/viber_get_auth_window.py +0 -0
  49. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +0 -0
  50. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  51. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/README.md +0 -0
  52. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers/Info.plist +0 -0
  53. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +0 -0
  54. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +0 -0
  55. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +0 -0
  56. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +0 -0
  57. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  58. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +0 -0
  59. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  60. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +0 -0
  61. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  62. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  63. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +0 -0
  64. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  65. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  66. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  67. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  68. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  69. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  70. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  71. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  72. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  73. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  74. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  75. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  76. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +0 -0
  77. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  78. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  79. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  80. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  81. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/job_option.py +0 -0
  82. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  83. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/appicon.icns +0 -0
  84. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/appicon.ico +0 -0
  85. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/appicon.png +0 -0
  86. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/compression.json +0 -0
  87. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/emoji.json +0 -0
  88. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/help.json +0 -0
  89. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/input.json +0 -0
  90. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/memdump_linux.sh +0 -0
  91. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/memdump_windows.ps1 +0 -0
  92. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/resources/output.json +0 -0
  93. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/__init__.py +0 -0
  94. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/upload_base.py +0 -0
  95. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/upload_signal.py +0 -0
  96. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/upload_telegram.py +0 -0
  97. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/uploaders/xcode_imessage.py +0 -0
  98. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_discord_auth.py +0 -0
  99. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_kakao_auth.py +0 -0
  100. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_kakao_desktop_auth.py +0 -0
  101. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_line_auth.py +0 -0
  102. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_signal_auth.py +0 -0
  103. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/get_viber_auth.py +0 -0
  104. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/auth/telethon_setup.py +0 -0
  105. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/callback.py +0 -0
  106. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/chrome_remotedebug.py +0 -0
  107. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/emoji.py +0 -0
  108. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/cache_store.py +0 -0
  109. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/json_manager.py +0 -0
  110. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/json_resources_loader.py +0 -0
  111. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/run_bin.py +0 -0
  112. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/files/sanitize_filename.py +0 -0
  113. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/media/apple_png_normalize.py +0 -0
  114. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/media/codec_info.py +0 -0
  115. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/media/decrypt_kakao.py +0 -0
  116. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/media/format_verify.py +0 -0
  117. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/process.py +0 -0
  118. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert/utils/url_detect.py +0 -0
  119. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert.egg-info/SOURCES.txt +0 -0
  120. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert.egg-info/dependency_links.txt +0 -0
  121. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert.egg-info/entry_points.txt +0 -0
  122. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/src/sticker_convert.egg-info/top_level.txt +0 -0
  123. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/tests/test_compression.py +0 -0
  124. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/tests/test_download.py +0 -0
  125. {sticker_convert-2.11.0 → sticker_convert-2.11.2}/tests/test_export.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sticker-convert
3
- Version: 2.11.0
3
+ Version: 2.11.2
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>
@@ -364,10 +364,10 @@ Requires-Python: >=3.9
364
364
  Description-Content-Type: text/markdown
365
365
  License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
- Requires-Dist: anyio~=4.7.0
367
+ Requires-Dist: anyio~=4.8.0
368
368
  Requires-Dist: apngasm_python~=1.3.1
369
369
  Requires-Dist: av~=13.1.0
370
- Requires-Dist: beautifulsoup4~=4.12.3
370
+ Requires-Dist: beautifulsoup4~=4.13.3
371
371
  Requires-Dist: cryptg~=0.5.0.post0
372
372
  Requires-Dist: rookiepy~=0.5.6
373
373
  Requires-Dist: httpx~=0.28.1
@@ -376,9 +376,9 @@ Requires-Dist: memory-tempfile~=2.2.3
376
376
  Requires-Dist: mergedeep~=1.3.4
377
377
  Requires-Dist: mini-racer~=0.12.4
378
378
  Requires-Dist: numpy>=1.22.4
379
- Requires-Dist: Pillow~=10.4.0
379
+ Requires-Dist: Pillow~=11.1.0
380
380
  Requires-Dist: pyoxipng~=9.0.0
381
- Requires-Dist: python-telegram-bot~=21.9
381
+ Requires-Dist: python-telegram-bot~=21.10
382
382
  Requires-Dist: psutil~=6.1.1
383
383
  Requires-Dist: PyMemoryEditor~=1.5.22
384
384
  Requires-Dist: requests~=2.32.3
@@ -402,7 +402,10 @@ Requires-Dist: websocket_client~=1.8.0
402
402
  - [Pre-compiled releases](https://github.com/laggykiller/sticker-convert/releases) for Windows, MacOS and Linux (As AppImage).
403
403
  - Windows: Unzip the downloaded file and run `sticker-convert.exe`
404
404
  - MacOS: Unzip the downloaded file, hold control and open `hold_control_and_click_open_me.command` for the first time, then `sticker-convert.app` in the future
405
- - Linux: `chmod +x` the downloaded AppImage and run it
405
+ - Linux:
406
+ - AppImage: `chmod +x` the downloaded AppImage and run it
407
+ - Zip: unzip and run `sticker-convert.bin`
408
+ - [AUR package](https://aur.archlinux.org/packages/sticker-convert): `makepkg -si`
406
409
  - [pip package](https://pypi.org/project/sticker-convert/): `pip install sticker-convert`. Launch with `sticker-convert` or `python -m sticker_convert`
407
410
  - [Docker image](https://hub.docker.com/r/laggykiller/sticker-convert) for running on Linux.
408
411
  - [Try in Google Colab without downloading](https://colab.research.google.com/github/laggykiller/sticker-convert/blob/master/sticker_convert_colab.ipynb) (Requires Google account), which runs the code on Google server and get the result from Google Drive. However, it maybe slower than running on your computer. (~15 seconds per file if not converting to .apng, ~1 minute per file if you convert to .apng)
@@ -11,7 +11,10 @@
11
11
  - [Pre-compiled releases](https://github.com/laggykiller/sticker-convert/releases) for Windows, MacOS and Linux (As AppImage).
12
12
  - Windows: Unzip the downloaded file and run `sticker-convert.exe`
13
13
  - MacOS: Unzip the downloaded file, hold control and open `hold_control_and_click_open_me.command` for the first time, then `sticker-convert.app` in the future
14
- - Linux: `chmod +x` the downloaded AppImage and run it
14
+ - Linux:
15
+ - AppImage: `chmod +x` the downloaded AppImage and run it
16
+ - Zip: unzip and run `sticker-convert.bin`
17
+ - [AUR package](https://aur.archlinux.org/packages/sticker-convert): `makepkg -si`
15
18
  - [pip package](https://pypi.org/project/sticker-convert/): `pip install sticker-convert`. Launch with `sticker-convert` or `python -m sticker_convert`
16
19
  - [Docker image](https://hub.docker.com/r/laggykiller/sticker-convert) for running on Linux.
17
20
  - [Try in Google Colab without downloading](https://colab.research.google.com/github/laggykiller/sticker-convert/blob/master/sticker_convert_colab.ipynb) (Requires Google account), which runs the code on Google server and get the result from Google Drive. However, it maybe slower than running on your computer. (~15 seconds per file if not converting to .apng, ~1 minute per file if you convert to .apng)
@@ -1,8 +1,8 @@
1
1
  aiolimiter~=1.2.1
2
- anyio~=4.7.0
2
+ anyio~=4.8.0
3
3
  apngasm_python~=1.3.1
4
4
  av~=13.1.0
5
- beautifulsoup4~=4.12.3
5
+ beautifulsoup4~=4.13.3
6
6
  cryptg~=0.5.0.post0
7
7
  rookiepy~=0.5.6
8
8
  httpx~=0.28.1
@@ -11,9 +11,9 @@ memory-tempfile~=2.2.3
11
11
  mergedeep~=1.3.4
12
12
  mini-racer~=0.12.4
13
13
  numpy>=1.22.4
14
- Pillow~=10.4.0
14
+ Pillow~=11.1.0
15
15
  pyoxipng~=9.0.0
16
- python-telegram-bot~=21.9
16
+ python-telegram-bot~=21.10
17
17
  psutil~=6.1.1
18
18
  PyMemoryEditor~=1.5.22
19
19
  requests~=2.32.3
@@ -71,26 +71,26 @@ class CLI:
71
71
 
72
72
  parser_input = parser.add_argument_group("Input options")
73
73
  for k, v_str in self.help["input"].items():
74
- parser_input.add_argument(f'--{k.replace("_", "-")}', dest=k, help=v_str)
74
+ parser_input.add_argument(f"--{k.replace('_', '-')}", dest=k, help=v_str)
75
75
  parser_input_src = parser_input.add_mutually_exclusive_group()
76
76
  for k, v_dict in self.input_presets.items():
77
77
  if k == "local":
78
78
  continue
79
79
  parser_input_src.add_argument(
80
- f'--download-{k.replace("_", "-")}',
80
+ f"--download-{k.replace('_', '-')}",
81
81
  dest=f"download_{k}",
82
- help=f'{v_dict["help"]}\n({v_dict["example"]})',
82
+ help=f"{v_dict['help']}\n({v_dict['example']})",
83
83
  )
84
84
 
85
85
  parser_output = parser.add_argument_group("Output options")
86
86
  for k, v_str in self.help["output"].items():
87
- parser_output.add_argument(f'--{k.replace("_", "-")}', dest=k, help=v_str)
87
+ parser_output.add_argument(f"--{k.replace('_', '-')}", dest=k, help=v_str)
88
88
  parser_output_dst = parser_output.add_mutually_exclusive_group()
89
89
  for k, v_dict in self.output_presets.items():
90
90
  if k == "local":
91
91
  continue
92
92
  parser_output_dst.add_argument(
93
- f'--export-{k.replace("_", "-")}',
93
+ f"--export-{k.replace('_', '-')}",
94
94
  dest=f"export_{k}",
95
95
  action="store_true",
96
96
  help=v_dict["help"],
@@ -154,7 +154,7 @@ class CLI:
154
154
  else:
155
155
  continue
156
156
  parser_comp.add_argument(
157
- f'--{k.replace("_", "-")}',
157
+ f"--{k.replace('_', '-')}",
158
158
  **keyword_args,
159
159
  dest=k,
160
160
  help=v,
@@ -181,7 +181,7 @@ class CLI:
181
181
  if k in flags_cred_bool:
182
182
  keyword_args = {"action": "store_true"}
183
183
  parser_cred.add_argument(
184
- f'--{k.replace("_", "-")}',
184
+ f"--{k.replace('_', '-')}",
185
185
  **keyword_args,
186
186
  dest=k,
187
187
  help=v,
@@ -24,8 +24,7 @@ if TYPE_CHECKING:
24
24
  MSG_START_COMP = "[I] Start compressing {} -> {}"
25
25
  MSG_SKIP_COMP = "[S] Compatible file found, skip compress and just copy {} -> {}"
26
26
  MSG_COMP = (
27
- "[C] Compressing {} -> {} res={}x{}, "
28
- "quality={}, fps={}, color={} (step {}-{}-{})"
27
+ "[C] Compressing {} -> {} res={}x{}, quality={}, fps={}, color={} (step {}-{}-{})"
29
28
  )
30
29
  MSG_REDO_COMP = "[{}] Compressed {} -> {} but size {} {} limit {}, recompressing"
31
30
  MSG_DONE_COMP = "[S] Successful compression {} -> {} size {} (step {})"
@@ -909,10 +908,10 @@ class StickerConvert:
909
908
  def _quantize_by_imagequant(self, image: Image.Image) -> Image.Image:
910
909
  import imagequant # type: ignore
911
910
 
912
- assert self.quality
913
- assert self.opt_comp.quality_min
914
- assert self.opt_comp.quality_max
915
- assert self.color
911
+ assert isinstance(self.quality, int)
912
+ assert isinstance(self.opt_comp.quality_min, int)
913
+ assert isinstance(self.opt_comp.quality_max, int)
914
+ assert isinstance(self.color, int)
916
915
 
917
916
  dither = 1 - (self.quality - self.opt_comp.quality_min) / (
918
917
  self.opt_comp.quality_max - self.opt_comp.quality_min
@@ -104,7 +104,7 @@ class DownloadBase:
104
104
  self.cb.put(f"Downloaded {url}")
105
105
  else:
106
106
  self.cb.put(
107
- f"Error {response.status_code}: {url} (tried {retry+1}/{retries} times)"
107
+ f"Error {response.status_code}: {url} (tried {retry + 1}/{retries} times)"
108
108
  )
109
109
 
110
110
  if results is not None:
@@ -153,7 +153,7 @@ class DownloadBase:
153
153
  break
154
154
  except requests.exceptions.RequestException as e:
155
155
  self.cb.put(
156
- f"Cannot download {url} (tried {retry+1}/{retries} times): {e}"
156
+ f"Cannot download {url} (tried {retry + 1}/{retries} times): {e}"
157
157
  )
158
158
 
159
159
  if not result:
@@ -63,7 +63,7 @@ class DownloadSignal(DownloadBase):
63
63
  )
64
64
 
65
65
  def download_stickers_signal(self) -> Tuple[int, int]:
66
- if "signal.art" not in self.url or not self.url.startswith(
66
+ if "signal.art" not in self.url and not self.url.startswith(
67
67
  "sgnl://addstickers/"
68
68
  ):
69
69
  self.cb.put("Download failed: Unrecognized URL format")
@@ -346,7 +346,7 @@ class Job:
346
346
  if not MetadataHandler.check_metadata_provided(
347
347
  self.opt_input.dir, input_option, metadata
348
348
  ):
349
- error_msg += f'[X] {output_presets[output_option]["full_name"]} requires {metadata}\n'
349
+ error_msg += f"[X] {output_presets[output_option]['full_name']} requires {metadata}\n"
350
350
  if self.opt_input.option == "local":
351
351
  error_msg += f" {metadata} was not supplied and {metadata}.txt is absent\n"
352
352
  else:
@@ -356,7 +356,7 @@ class Job:
356
356
  )
357
357
  error_msg += f" Create {metadata}.txt with the {metadata} name\n"
358
358
  else:
359
- info_msg += f'[!] {output_presets[output_option]["full_name"]} requires {metadata}\n'
359
+ info_msg += f"[!] {output_presets[output_option]['full_name']} requires {metadata}\n"
360
360
  if self.opt_input.option == "local":
361
361
  info_msg += f" {metadata} was not supplied but {metadata}.txt is present\n"
362
362
  info_msg += f" Using {metadata} name in {metadata}.txt\n"
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env python3
2
2
  import copy
3
- import shutil
4
3
  import zipfile
5
4
  from pathlib import Path
6
5
  from typing import Any, List, Tuple
@@ -9,7 +8,6 @@ from sticker_convert.converter import StickerConvert
9
8
  from sticker_convert.job_option import CompOption, CredOption, OutputOption
10
9
  from sticker_convert.uploaders.upload_base import UploadBase
11
10
  from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
12
- from sticker_convert.utils.files.cache_store import CacheStore
13
11
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
14
12
  from sticker_convert.utils.files.sanitize_filename import sanitize_filename
15
13
  from sticker_convert.utils.media.codec_info import CodecInfo
@@ -70,8 +68,65 @@ class CompressWastickers(UploadBase):
70
68
  stickers_total = 0
71
69
  for pack_title, stickers in packs.items():
72
70
  stickers_total += len(stickers)
73
- # Originally the Sticker Maker application name the files with int(time.time())
74
- with CacheStore.get_cache_store(path=self.opt_comp.cache_dir) as tempdir:
71
+ out_f = Path(
72
+ self.opt_output.dir, sanitize_filename(pack_title + ".wastickers")
73
+ ).as_posix()
74
+
75
+ MetadataHandler.set_metadata(
76
+ self.opt_output.dir, author=author, title=title, newline=True
77
+ )
78
+ with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
79
+ cover_opt_comp_merged = copy.deepcopy(self.opt_comp)
80
+ cover_opt_comp_merged.merge(self.spec_cover)
81
+
82
+ cover_path_old = MetadataHandler.get_cover(self.opt_output.dir)
83
+ cover_path_new = Path("bytes.png")
84
+ if cover_path_old is None:
85
+ # First image in the directory, extracting first frame
86
+ first_image = [
87
+ i
88
+ for i in sorted(self.opt_output.dir.iterdir())
89
+ if Path(self.opt_output.dir, i.name).is_file()
90
+ and i.suffix not in (".txt", ".m4a", ".wastickers")
91
+ ][0]
92
+ self.cb.put(f"Creating cover using {first_image.name}")
93
+ success, _, cover_data, _ = StickerConvert.convert(
94
+ Path(self.opt_output.dir, first_image),
95
+ cover_path_new,
96
+ cover_opt_comp_merged,
97
+ self.cb,
98
+ self.cb_return,
99
+ )
100
+ if not success:
101
+ self.cb.put(
102
+ f"Warning: Cannot compress cover {first_image.name}, unable to create .wastickers"
103
+ )
104
+ continue
105
+ else:
106
+ if not FormatVerify.check_file(
107
+ cover_path_old, spec=self.spec_cover
108
+ ):
109
+ success, _, cover_data, _ = StickerConvert.convert(
110
+ cover_path_old,
111
+ cover_path_new,
112
+ cover_opt_comp_merged,
113
+ self.cb,
114
+ self.cb_return,
115
+ )
116
+ if not success:
117
+ self.cb.put(
118
+ f"Warning: Cannot compress cover {cover_path_old.name}, unable to create .wastickers"
119
+ )
120
+ continue
121
+ else:
122
+ with open(cover_path_old, "rb") as f:
123
+ cover_data = f.read()
124
+
125
+ assert isinstance(cover_data, bytes)
126
+ zipf.writestr("tray.png", cover_data)
127
+ zipf.write(Path(self.opt_output.dir, "author.txt"), "author.txt")
128
+ zipf.write(Path(self.opt_output.dir, "title.txt"), "title.txt")
129
+
75
130
  for num, src in enumerate(stickers):
76
131
  self.cb.put(f"Verifying {src} for compressing into .wastickers")
77
132
 
@@ -79,72 +134,37 @@ class CompressWastickers(UploadBase):
79
134
  ext = ".webp"
80
135
  else:
81
136
  ext = ".png"
137
+ dst = f"bytes{ext}"
82
138
 
83
- dst = Path(tempdir, f"sticker_{num+1}{ext}")
84
-
85
- if FormatVerify.check_file(
86
- src, spec=self.webp_spec
87
- ) or FormatVerify.check_file(src, spec=self.png_spec):
88
- shutil.copy(src, dst)
89
- else:
90
- StickerConvert.convert(
139
+ if not (
140
+ FormatVerify.check_file(src, spec=self.webp_spec)
141
+ or FormatVerify.check_file(src, spec=self.png_spec)
142
+ ):
143
+ success, _, image_data, _ = StickerConvert.convert(
91
144
  Path(src),
92
145
  Path(dst),
93
146
  self.opt_comp_merged,
94
147
  self.cb,
95
148
  self.cb_return,
96
149
  )
150
+ assert isinstance(image_data, bytes)
151
+ if not success:
152
+ self.cb.put(
153
+ f"Warning: Cannot compress file {Path(src).name}, skip this file..."
154
+ )
155
+ continue
156
+ else:
157
+ with open(src, "rb") as f:
158
+ image_data = f.read()
97
159
 
98
- out_f = Path(
99
- self.opt_output.dir, sanitize_filename(pack_title + ".wastickers")
100
- ).as_posix()
101
-
102
- self.add_metadata(Path(tempdir), pack_title, author)
103
- with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
104
- for file in Path(tempdir).iterdir():
105
- file_path = Path(tempdir, file.name)
106
- zipf.write(file_path, arcname=file_path.name)
160
+ # Originally the Sticker Maker application name the files with int(time.time())
161
+ zipf.writestr(f"sticker_{num + 1}{ext}", image_data)
107
162
 
108
163
  self.cb.put((out_f))
109
164
  urls.append(out_f)
110
165
 
111
166
  return stickers_total, stickers_total, urls
112
167
 
113
- def add_metadata(self, pack_dir: Path, title: str, author: str) -> None:
114
- opt_comp_merged = copy.deepcopy(self.opt_comp)
115
- opt_comp_merged.merge(self.spec_cover)
116
-
117
- cover_path_old = MetadataHandler.get_cover(self.opt_output.dir)
118
- cover_path_new = Path(pack_dir, "tray.png")
119
- if cover_path_old:
120
- if FormatVerify.check_file(cover_path_old, spec=self.spec_cover):
121
- shutil.copy(cover_path_old, cover_path_new)
122
- else:
123
- StickerConvert.convert(
124
- cover_path_old,
125
- cover_path_new,
126
- opt_comp_merged,
127
- self.cb,
128
- self.cb_return,
129
- )
130
- else:
131
- # First image in the directory, extracting first frame
132
- first_image = [
133
- i
134
- for i in sorted(self.opt_output.dir.iterdir())
135
- if Path(self.opt_output.dir, i.name).is_file()
136
- and i.suffix not in (".txt", ".m4a", ".wastickers")
137
- ][0]
138
- StickerConvert.convert(
139
- Path(self.opt_output.dir, first_image),
140
- cover_path_new,
141
- opt_comp_merged,
142
- self.cb,
143
- self.cb_return,
144
- )
145
-
146
- MetadataHandler.set_metadata(pack_dir, author=author, title=title, newline=True)
147
-
148
168
  @staticmethod
149
169
  def start(
150
170
  opt_output: OutputOption,
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  import copy
3
3
  import json
4
- import shutil
5
4
  import zipfile
6
5
  from pathlib import Path
7
6
  from typing import Any, Dict, List, Tuple
@@ -12,7 +11,6 @@ from sticker_convert.converter import StickerConvert
12
11
  from sticker_convert.job_option import CompOption, CredOption, OutputOption
13
12
  from sticker_convert.uploaders.upload_base import UploadBase
14
13
  from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
15
- from sticker_convert.utils.files.cache_store import CacheStore
16
14
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
17
15
  from sticker_convert.utils.files.sanitize_filename import sanitize_filename
18
16
  from sticker_convert.utils.media.format_verify import FormatVerify
@@ -96,31 +94,32 @@ class UploadViber(UploadBase):
96
94
  stickers_ok = 0
97
95
  for pack_title, stickers in packs.items():
98
96
  stickers_total += len(stickers)
99
- with CacheStore.get_cache_store(path=self.opt_comp.cache_dir) as tempdir:
97
+ out_f = Path(
98
+ self.opt_output.dir, sanitize_filename(pack_title + ".zip")
99
+ ).as_posix()
100
+ with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
100
101
  for num, src in enumerate(stickers):
101
102
  self.cb.put(f"Verifying {src} for uploading to Viber")
102
103
 
103
- dst = Path(tempdir, f"{str(num).zfill(2)}.png")
104
-
105
- if FormatVerify.check_file(src, spec=self.png_spec):
106
- shutil.copy(src, dst)
107
- else:
108
- StickerConvert.convert(
109
- Path(src),
110
- Path(dst),
104
+ if not FormatVerify.check_file(src, spec=self.png_spec):
105
+ success, _, image_data, _ = StickerConvert.convert(
106
+ src,
107
+ Path("bytes.png"),
111
108
  self.opt_comp_merged,
112
109
  self.cb,
113
110
  self.cb_return,
114
111
  )
112
+ assert isinstance(image_data, bytes)
113
+ if not success:
114
+ self.cb.put(
115
+ f"Warning: Cannot compress file {src.name}, skip this file..."
116
+ )
117
+ continue
118
+ else:
119
+ with open(src, "rb") as f:
120
+ image_data = f.read()
115
121
 
116
- out_f = Path(
117
- self.opt_output.dir, sanitize_filename(pack_title + ".zip")
118
- ).as_posix()
119
-
120
- with zipfile.ZipFile(out_f, "w", zipfile.ZIP_DEFLATED) as zipf:
121
- for file in Path(tempdir).iterdir():
122
- file_path = Path(tempdir, file.name)
123
- zipf.write(file_path, arcname=file_path.name)
122
+ zipf.writestr(f"{str(num).zfill(2)}.png", image_data)
124
123
 
125
124
  upload_data = copy.deepcopy(upload_data_base)
126
125
  upload_data["title"] = pack_title
@@ -76,7 +76,7 @@ class BotAPI(TelegramAPI):
76
76
  self.application = ( # type: ignore
77
77
  ApplicationBuilder()
78
78
  .token(opt_cred.telegram_token)
79
- .rate_limiter(AIORateLimiter(max_retries=3))
79
+ .rate_limiter(AIORateLimiter(overall_max_rate=4, max_retries=3))
80
80
  .connect_timeout(self.timeout)
81
81
  .pool_timeout(self.timeout)
82
82
  .read_timeout(self.timeout)
@@ -389,13 +389,15 @@ class TelethonAPI(TelegramAPI):
389
389
  sent_message = cast(Message, await self.client.send_file("Stickers", msg)) # type: ignore
390
390
 
391
391
  for _ in range(5):
392
+ # https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this
393
+ # In a single chat, avoid sending more than one message per second.
394
+ time.sleep(1)
392
395
  last_message = cast(
393
396
  List[Message],
394
397
  await self.client.get_messages("Stickers", 1), # type: ignore
395
398
  )[0]
396
399
  if sent_message.id != last_message.id:
397
400
  return last_message.message
398
- time.sleep(1)
399
401
 
400
402
  return "timeout"
401
403
 
@@ -264,7 +264,7 @@ class MetadataHandler:
264
264
  if len(anim_stickers) == file_per_anim_pack or (
265
265
  finished_all and len(anim_stickers) > 0
266
266
  ):
267
- suffix = f'{"-anim" if image_present else ""}{"-" + str(anim_pack_count) if anim_pack_count > 0 else ""}'
267
+ suffix = f"{'-anim' if image_present else ''}{'-' + str(anim_pack_count) if anim_pack_count > 0 else ''}"
268
268
  title_current = str(title) + suffix
269
269
  packs[title_current] = anim_stickers.copy()
270
270
  anim_stickers = []
@@ -272,7 +272,7 @@ class MetadataHandler:
272
272
  if len(image_stickers) == file_per_image_pack or (
273
273
  finished_all and len(image_stickers) > 0
274
274
  ):
275
- suffix = f'{"-image" if anim_present else ""}{"-" + str(image_pack_count) if image_pack_count > 0 else ""}'
275
+ suffix = f"{'-image' if anim_present else ''}{'-' + str(image_pack_count) if image_pack_count > 0 else ''}"
276
276
  title_current = str(title) + suffix
277
277
  packs[title_current] = image_stickers.copy()
278
278
  image_stickers = []
@@ -292,7 +292,7 @@ class MetadataHandler:
292
292
  if len(stickers) == file_per_pack or (
293
293
  finished_all and len(stickers) > 0
294
294
  ):
295
- suffix = f'{"-" + str(pack_count) if pack_count > 0 else ""}'
295
+ suffix = f"{'-' + str(pack_count) if pack_count > 0 else ''}"
296
296
  title_current = str(title) + suffix
297
297
  packs[title_current] = stickers.copy()
298
298
  stickers = []
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.11.0"
3
+ __version__ = "2.11.2"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sticker-convert
3
- Version: 2.11.0
3
+ Version: 2.11.2
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>
@@ -364,10 +364,10 @@ Requires-Python: >=3.9
364
364
  Description-Content-Type: text/markdown
365
365
  License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
- Requires-Dist: anyio~=4.7.0
367
+ Requires-Dist: anyio~=4.8.0
368
368
  Requires-Dist: apngasm_python~=1.3.1
369
369
  Requires-Dist: av~=13.1.0
370
- Requires-Dist: beautifulsoup4~=4.12.3
370
+ Requires-Dist: beautifulsoup4~=4.13.3
371
371
  Requires-Dist: cryptg~=0.5.0.post0
372
372
  Requires-Dist: rookiepy~=0.5.6
373
373
  Requires-Dist: httpx~=0.28.1
@@ -376,9 +376,9 @@ Requires-Dist: memory-tempfile~=2.2.3
376
376
  Requires-Dist: mergedeep~=1.3.4
377
377
  Requires-Dist: mini-racer~=0.12.4
378
378
  Requires-Dist: numpy>=1.22.4
379
- Requires-Dist: Pillow~=10.4.0
379
+ Requires-Dist: Pillow~=11.1.0
380
380
  Requires-Dist: pyoxipng~=9.0.0
381
- Requires-Dist: python-telegram-bot~=21.9
381
+ Requires-Dist: python-telegram-bot~=21.10
382
382
  Requires-Dist: psutil~=6.1.1
383
383
  Requires-Dist: PyMemoryEditor~=1.5.22
384
384
  Requires-Dist: requests~=2.32.3
@@ -402,7 +402,10 @@ Requires-Dist: websocket_client~=1.8.0
402
402
  - [Pre-compiled releases](https://github.com/laggykiller/sticker-convert/releases) for Windows, MacOS and Linux (As AppImage).
403
403
  - Windows: Unzip the downloaded file and run `sticker-convert.exe`
404
404
  - MacOS: Unzip the downloaded file, hold control and open `hold_control_and_click_open_me.command` for the first time, then `sticker-convert.app` in the future
405
- - Linux: `chmod +x` the downloaded AppImage and run it
405
+ - Linux:
406
+ - AppImage: `chmod +x` the downloaded AppImage and run it
407
+ - Zip: unzip and run `sticker-convert.bin`
408
+ - [AUR package](https://aur.archlinux.org/packages/sticker-convert): `makepkg -si`
406
409
  - [pip package](https://pypi.org/project/sticker-convert/): `pip install sticker-convert`. Launch with `sticker-convert` or `python -m sticker_convert`
407
410
  - [Docker image](https://hub.docker.com/r/laggykiller/sticker-convert) for running on Linux.
408
411
  - [Try in Google Colab without downloading](https://colab.research.google.com/github/laggykiller/sticker-convert/blob/master/sticker_convert_colab.ipynb) (Requires Google account), which runs the code on Google server and get the result from Google Drive. However, it maybe slower than running on your computer. (~15 seconds per file if not converting to .apng, ~1 minute per file if you convert to .apng)
@@ -1,8 +1,8 @@
1
1
  aiolimiter~=1.2.1
2
- anyio~=4.7.0
2
+ anyio~=4.8.0
3
3
  apngasm_python~=1.3.1
4
4
  av~=13.1.0
5
- beautifulsoup4~=4.12.3
5
+ beautifulsoup4~=4.13.3
6
6
  cryptg~=0.5.0.post0
7
7
  rookiepy~=0.5.6
8
8
  httpx~=0.28.1
@@ -11,9 +11,9 @@ memory-tempfile~=2.2.3
11
11
  mergedeep~=1.3.4
12
12
  mini-racer~=0.12.4
13
13
  numpy>=1.22.4
14
- Pillow~=10.4.0
14
+ Pillow~=11.1.0
15
15
  pyoxipng~=9.0.0
16
- python-telegram-bot~=21.9
16
+ python-telegram-bot~=21.10
17
17
  psutil~=6.1.1
18
18
  PyMemoryEditor~=1.5.22
19
19
  requests~=2.32.3