sticker-convert 2.8.4__tar.gz → 2.8.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. {sticker_convert-2.8.4/src/sticker_convert.egg-info → sticker_convert-2.8.6}/PKG-INFO +24 -26
  2. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/README.md +21 -23
  3. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/pyproject.toml +1 -1
  4. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/requirements.txt +1 -1
  5. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/cli.py +1 -0
  6. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/download_base.py +47 -10
  7. sticker_convert-2.8.6/src/sticker_convert/downloaders/download_viber.py +95 -0
  8. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/job.py +4 -0
  9. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/compression.json +47 -0
  10. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/input.json +10 -0
  11. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/url_detect.py +3 -0
  12. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/version.py +1 -1
  13. {sticker_convert-2.8.4 → sticker_convert-2.8.6/src/sticker_convert.egg-info}/PKG-INFO +24 -26
  14. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert.egg-info/SOURCES.txt +1 -0
  15. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert.egg-info/requires.txt +1 -1
  16. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/tests/test_download.py +42 -0
  17. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/LICENSE +0 -0
  18. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/MANIFEST.in +0 -0
  19. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/setup.cfg +0 -0
  20. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/__init__.py +0 -0
  21. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/__main__.py +0 -0
  22. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/converter.py +0 -0
  23. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/definitions.py +0 -0
  24. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/__init__.py +0 -0
  25. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/download_kakao.py +0 -0
  26. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/download_line.py +0 -0
  27. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/download_signal.py +0 -0
  28. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/downloaders/download_telegram.py +0 -0
  29. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui.py +0 -0
  30. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/__init__.py +0 -0
  31. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/__init__.py +0 -0
  32. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/comp_frame.py +0 -0
  33. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/config_frame.py +0 -0
  34. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/control_frame.py +0 -0
  35. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/cred_frame.py +0 -0
  36. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/input_frame.py +0 -0
  37. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/output_frame.py +0 -0
  38. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/progress_frame.py +0 -0
  39. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/frames/right_clicker.py +0 -0
  40. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/gui_utils.py +0 -0
  41. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/__init__.py +0 -0
  42. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/advanced_compression_window.py +0 -0
  43. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/base_window.py +0 -0
  44. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/kakao_get_auth_window.py +0 -0
  45. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/line_get_auth_window.py +0 -0
  46. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/gui_components/windows/signal_get_auth_window.py +0 -0
  47. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/.github/FUNDING.yml +0 -0
  48. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/.gitignore +0 -0
  49. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/README.md +0 -0
  50. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers/Info.plist +0 -0
  51. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Info.plist +0 -0
  52. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Contents.json +0 -0
  53. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Contents.json +0 -0
  54. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Contents.json +0 -0
  55. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 1.sticker/Sticker 1.png +0 -0
  56. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Contents.json +0 -0
  57. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 2.sticker/Sticker 2.png +0 -0
  58. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Contents.json +0 -0
  59. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/Sticker Pack.stickerpack/Sticker 3.sticker/Sticker 3.png +0 -0
  60. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/App-Store-1024x1024pt.png +0 -0
  61. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Contents.json +0 -0
  62. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-App-Store-1024x768pt.png +0 -0
  63. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-67x50pt@2x.png +0 -0
  64. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPad-Pro-74x55pt@2x.png +0 -0
  65. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@2x.png +0 -0
  66. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages-iPhone-60x45pt@3x.png +0 -0
  67. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@2x.png +0 -0
  68. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages27x20pt@3x.png +0 -0
  69. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@2x.png +0 -0
  70. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/Messages32x24pt@3x.png +0 -0
  71. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPad-Settings-29pt@2x.png +0 -0
  72. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-Settings-29pt@3x.png +0 -0
  73. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers StickerPackExtension/Stickers.xcstickers/iMessage App Icon.stickersiconset/iPhone-settings-29pt@2x.png +0 -0
  74. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.pbxproj +0 -0
  75. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  76. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  77. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  78. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
  79. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/job_option.py +0 -0
  80. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/NotoColorEmoji.ttf +0 -0
  81. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/appicon.icns +0 -0
  82. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/appicon.ico +0 -0
  83. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/appicon.png +0 -0
  84. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/emoji.json +0 -0
  85. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/help.json +0 -0
  86. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/resources/output.json +0 -0
  87. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/__init__.py +0 -0
  88. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/compress_wastickers.py +0 -0
  89. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/upload_base.py +0 -0
  90. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/upload_signal.py +0 -0
  91. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/upload_telegram.py +0 -0
  92. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/uploaders/xcode_imessage.py +0 -0
  93. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/auth/get_kakao_auth.py +0 -0
  94. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/auth/get_line_auth.py +0 -0
  95. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/auth/get_signal_auth.py +0 -0
  96. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/callback.py +0 -0
  97. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/cache_store.py +0 -0
  98. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/json_manager.py +0 -0
  99. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/json_resources_loader.py +0 -0
  100. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/metadata_handler.py +0 -0
  101. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/run_bin.py +0 -0
  102. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/files/sanitize_filename.py +0 -0
  103. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/media/apple_png_normalize.py +0 -0
  104. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/media/codec_info.py +0 -0
  105. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/media/decrypt_kakao.py +0 -0
  106. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert/utils/media/format_verify.py +0 -0
  107. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert.egg-info/dependency_links.txt +0 -0
  108. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert.egg-info/entry_points.txt +0 -0
  109. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/src/sticker_convert.egg-info/top_level.txt +0 -0
  110. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/tests/test_compression.py +0 -0
  111. {sticker_convert-2.8.4 → sticker_convert-2.8.6}/tests/test_export.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.8.4
3
+ Version: 2.8.6
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -349,7 +349,7 @@ Project-URL: Source, https://github.com/laggykiller/sticker-convert
349
349
  Project-URL: Documentation, https://github.com/laggykiller/sticker-convert
350
350
  Project-URL: Tracker, https://github.com/laggykiller/sticker-convert/issues
351
351
  Project-URL: Repository, https://github.com/laggykiller/sticker-convert
352
- Keywords: telegram,line,tgs,whatsapp,kakao,signal,imessage,wastickers
352
+ Keywords: telegram,line,tgs,whatsapp,kakao,signal,imessage,wastickers,viber
353
353
  Classifier: Development Status :: 5 - Production/Stable
354
354
  Classifier: Intended Audience :: End Users/Desktop
355
355
  Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
@@ -369,7 +369,7 @@ Requires-Dist: anyio~=4.3.0
369
369
  Requires-Dist: apngasm_python~=1.2.3
370
370
  Requires-Dist: av~=12.0.0
371
371
  Requires-Dist: beautifulsoup4~=4.12.3
372
- Requires-Dist: rookiepy~=0.3.7
372
+ Requires-Dist: rookiepy~=0.4.0
373
373
  Requires-Dist: imagequant~=1.1.1
374
374
  Requires-Dist: memory-tempfile~=2.2.3
375
375
  Requires-Dist: mergedeep~=1.3.4
@@ -391,7 +391,7 @@ Requires-Dist: webp~=0.3.0
391
391
 
392
392
  - A python script for creating, downloading, converting+compressing and uploading stickers from multiple instant messaging applications.
393
393
  - With GUI and CLI that runs on Windows, MacOS and Linux
394
- - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), iMessage (Create Xcode sticker pack project)
394
+ - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), Viber (Download only), iMessage (Create Xcode sticker pack project)
395
395
  - Supports static and animated stickers, with transparency support
396
396
 
397
397
  ## Downloads
@@ -429,6 +429,7 @@ Requires-Dist: webp~=0.3.0
429
429
  | [WhatsApp](docs/guide_whatsapp.md) | ⭕ (By Android or WhatsApp Web) | ⭕ (Create `.wastickers`, import by Sticker Maker) |
430
430
  | [Line](docs/guide_line.md) | ✅ | 🚫 (Need to submit for manual approval) |
431
431
  | [Kakao](docs/guide_kakao.md) | ✅ (Need 'share link' for animated) | 🚫 (Need to submit for manual approval) |
432
+ | [Viber](docs/guide_viber.md) | ✅ | 🚫 (Manually upload through Viber app) |
432
433
  | [iMessage](docs/guide_imessage.md) | 🚫 | ⭕ (Create Xcode stickerpack project for sideload) |
433
434
 
434
435
  ✅ = Supported ⭕ = Partially supported 🚫 = Not supported
@@ -455,6 +456,9 @@ Requires-Dist: webp~=0.3.0
455
456
  - Kakao
456
457
  - Download: Supported (e.g. `https://e.kakao.com/t/xxxxx` OR `kakaotalk://store/emoticon/4404400` OR `https://emoticon.kakao.com/items/xxxxx` OR `4404400`). It is rather complicated, learn more from [docs/guide_kakao.md](docs/guide_kakao.md)
457
458
  - Upload: Not supported. You need to manually submit sticker pack for approval before you can use in app.
459
+ - Viber
460
+ - Download: Supported (e.g. `https://stickers.viber.com/pages/example` OR `https://stickers.viber.com/pages/custom-sticker-packs/example`)
461
+ - Upload: The program can convert images to png with 490x490 for uploading to viber manually. It should be noted that Viber is able to resize images for you, so it may not be necessary to use sticker-convert for creating Viber sticker pack.
458
462
  - iMessage
459
463
  - Download: Not supported.
460
464
  - Upload: The program can create Xcode project for iMessage sticker pack, which could then be compiled and sideloaded using Xcode.
@@ -476,27 +480,17 @@ To run in CLI mode, pass on any arguments
476
480
 
477
481
  ```
478
482
  usage: sticker-convert.py [-h] [--version] [--no-confirm] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
479
- [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO]
480
- [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
481
- [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
482
- [--no-compress]
483
- [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}]
484
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
485
- [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN]
486
- [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX]
487
- [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
488
- [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX]
489
- [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX]
490
- [--padding-percent PADDING_PERCENT] [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX]
491
- [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT]
492
- [--fake-vid] [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
493
- [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
494
- [--signal-password SIGNAL_PASSWORD] [--signal-get-auth] [--signal-data-dir SIGNAL_DATA_DIR]
495
- [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID]
496
- [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth] [--kakao-username KAKAO_USERNAME]
497
- [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE]
498
- [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth] [--line-cookies LINE_COOKIES]
499
- [--save-cred SAVE_CRED]
483
+ [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO | --download-viber DOWNLOAD_VIBER]
484
+ [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE] [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
485
+ [--no-compress] [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}] [--steps STEPS]
486
+ [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX]
487
+ [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
488
+ [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
489
+ [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid] [--scale-filter SCALE_FILTER]
490
+ [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
491
+ [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
492
+ [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
493
+ [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
500
494
 
501
495
  CLI for stickers-convert
502
496
 
@@ -530,6 +524,10 @@ Input options:
530
524
  Download kakao stickers from a URL / ID as input
531
525
  (Example: https://e.kakao.com/t/xxxxx OR kakaotalk://store/emoticon/4404400
532
526
  OR https://emoticon.kakao.com/items/xxxxx OR 4404400)
527
+ --download-viber DOWNLOAD_VIBER
528
+ Download viber stickers from a URL as input
529
+ (Example: https://stickers.viber.com/pages/example
530
+ OR https://stickers.viber.com/pages/custom-sticker-packs/example)
533
531
 
534
532
  Output options:
535
533
  --output-dir OUTPUT_DIR
@@ -545,7 +543,7 @@ Output options:
545
543
 
546
544
  Compression options:
547
545
  --no-compress Do not compress files. Useful for only downloading stickers.
548
- --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}
546
+ --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}
549
547
  Apply preset for compression.
550
548
  --steps STEPS Set number of divisions between min and max settings.
551
549
  Steps higher = Slower but yields file more closer to the specified file size limit.
@@ -4,7 +4,7 @@
4
4
 
5
5
  - A python script for creating, downloading, converting+compressing and uploading stickers from multiple instant messaging applications.
6
6
  - With GUI and CLI that runs on Windows, MacOS and Linux
7
- - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), iMessage (Create Xcode sticker pack project)
7
+ - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), Viber (Download only), iMessage (Create Xcode sticker pack project)
8
8
  - Supports static and animated stickers, with transparency support
9
9
 
10
10
  ## Downloads
@@ -42,6 +42,7 @@
42
42
  | [WhatsApp](docs/guide_whatsapp.md) | ⭕ (By Android or WhatsApp Web) | ⭕ (Create `.wastickers`, import by Sticker Maker) |
43
43
  | [Line](docs/guide_line.md) | ✅ | 🚫 (Need to submit for manual approval) |
44
44
  | [Kakao](docs/guide_kakao.md) | ✅ (Need 'share link' for animated) | 🚫 (Need to submit for manual approval) |
45
+ | [Viber](docs/guide_viber.md) | ✅ | 🚫 (Manually upload through Viber app) |
45
46
  | [iMessage](docs/guide_imessage.md) | 🚫 | ⭕ (Create Xcode stickerpack project for sideload) |
46
47
 
47
48
  ✅ = Supported ⭕ = Partially supported 🚫 = Not supported
@@ -68,6 +69,9 @@
68
69
  - Kakao
69
70
  - Download: Supported (e.g. `https://e.kakao.com/t/xxxxx` OR `kakaotalk://store/emoticon/4404400` OR `https://emoticon.kakao.com/items/xxxxx` OR `4404400`). It is rather complicated, learn more from [docs/guide_kakao.md](docs/guide_kakao.md)
70
71
  - Upload: Not supported. You need to manually submit sticker pack for approval before you can use in app.
72
+ - Viber
73
+ - Download: Supported (e.g. `https://stickers.viber.com/pages/example` OR `https://stickers.viber.com/pages/custom-sticker-packs/example`)
74
+ - Upload: The program can convert images to png with 490x490 for uploading to viber manually. It should be noted that Viber is able to resize images for you, so it may not be necessary to use sticker-convert for creating Viber sticker pack.
71
75
  - iMessage
72
76
  - Download: Not supported.
73
77
  - Upload: The program can create Xcode project for iMessage sticker pack, which could then be compiled and sideloaded using Xcode.
@@ -89,27 +93,17 @@ To run in CLI mode, pass on any arguments
89
93
 
90
94
  ```
91
95
  usage: sticker-convert.py [-h] [--version] [--no-confirm] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
92
- [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO]
93
- [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
94
- [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
95
- [--no-compress]
96
- [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}]
97
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
98
- [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN]
99
- [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX]
100
- [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
101
- [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX]
102
- [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX]
103
- [--padding-percent PADDING_PERCENT] [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX]
104
- [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT]
105
- [--fake-vid] [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
106
- [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
107
- [--signal-password SIGNAL_PASSWORD] [--signal-get-auth] [--signal-data-dir SIGNAL_DATA_DIR]
108
- [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID]
109
- [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth] [--kakao-username KAKAO_USERNAME]
110
- [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE]
111
- [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth] [--line-cookies LINE_COOKIES]
112
- [--save-cred SAVE_CRED]
96
+ [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO | --download-viber DOWNLOAD_VIBER]
97
+ [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE] [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
98
+ [--no-compress] [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}] [--steps STEPS]
99
+ [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX]
100
+ [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
101
+ [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
102
+ [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid] [--scale-filter SCALE_FILTER]
103
+ [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
104
+ [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
105
+ [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
106
+ [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
113
107
 
114
108
  CLI for stickers-convert
115
109
 
@@ -143,6 +137,10 @@ Input options:
143
137
  Download kakao stickers from a URL / ID as input
144
138
  (Example: https://e.kakao.com/t/xxxxx OR kakaotalk://store/emoticon/4404400
145
139
  OR https://emoticon.kakao.com/items/xxxxx OR 4404400)
140
+ --download-viber DOWNLOAD_VIBER
141
+ Download viber stickers from a URL as input
142
+ (Example: https://stickers.viber.com/pages/example
143
+ OR https://stickers.viber.com/pages/custom-sticker-packs/example)
146
144
 
147
145
  Output options:
148
146
  --output-dir OUTPUT_DIR
@@ -158,7 +156,7 @@ Output options:
158
156
 
159
157
  Compression options:
160
158
  --no-compress Do not compress files. Useful for only downloading stickers.
161
- --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}
159
+ --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}
162
160
  Apply preset for compression.
163
161
  --steps STEPS Set number of divisions between min and max settings.
164
162
  Steps higher = Slower but yields file more closer to the specified file size limit.
@@ -4,7 +4,7 @@ description = "Convert (animated) stickers to/from WhatsApp, Telegram, Signal, L
4
4
  readme = "README.md"
5
5
  requires-python = ">=3.8"
6
6
  license = {file = "LICENSE"}
7
- keywords = ["telegram", "line", "tgs", "whatsapp", "kakao", "signal", "imessage", "wastickers"]
7
+ keywords = ["telegram", "line", "tgs", "whatsapp", "kakao", "signal", "imessage", "wastickers", "viber"]
8
8
  authors = [
9
9
  {name = "laggykiller", email = "chaudominic2@gmail.com" } # Optional
10
10
  ]
@@ -3,7 +3,7 @@ anyio~=4.3.0
3
3
  apngasm_python~=1.2.3
4
4
  av~=12.0.0
5
5
  beautifulsoup4~=4.12.3
6
- rookiepy~=0.3.7
6
+ rookiepy~=0.4.0
7
7
  imagequant~=1.1.1
8
8
  memory-tempfile~=2.2.3
9
9
  mergedeep~=1.3.4
@@ -211,6 +211,7 @@ class CLI:
211
211
  "line": args.download_line,
212
212
  "telegram": args.download_telegram,
213
213
  "kakao": args.download_kakao,
214
+ "viber": args.download_viber,
214
215
  }
215
216
 
216
217
  download_option = "local"
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
  from pathlib import Path
5
5
  from typing import Any, List, Optional, Tuple
6
6
 
7
+ import anyio
7
8
  import requests
8
9
 
9
10
  from sticker_convert.job_option import CredOption
@@ -27,16 +28,50 @@ class DownloadBase:
27
28
 
28
29
  def download_multiple_files(
29
30
  self, targets: List[Tuple[str, Path]], retries: int = 3, **kwargs: Any
31
+ ) -> None:
32
+ anyio.run(self.download_multiple_files_async, targets, retries, **kwargs)
33
+
34
+ async def download_multiple_files_async(
35
+ self, targets: List[Tuple[str, Path]], retries: int = 3, **kwargs: Any
30
36
  ) -> None:
31
37
  # targets format: [(url1, dest2), (url2, dest2), ...]
32
38
  self.cb.put(
33
39
  ("bar", None, {"set_progress_mode": "determinate", "steps": len(targets)})
34
40
  )
35
41
 
36
- for url, dest in targets:
37
- self.download_file(url, dest, retries, show_progress=False, **kwargs)
42
+ async with anyio.create_task_group() as tg:
43
+ for url, dest in targets:
44
+ tg.start_soon(self.download_file_async, url, dest, retries, **kwargs)
45
+
46
+ async def download_file_async(
47
+ self,
48
+ url: str,
49
+ dest: Path,
50
+ retries: int = 3,
51
+ **kwargs: Any,
52
+ ) -> None:
53
+ for retry in range(retries):
54
+ try:
55
+ response = requests.get(url, allow_redirects=True, **kwargs)
56
+
57
+ if not response.ok:
58
+ self.cb.put("update_bar")
59
+ raise requests.exceptions.RequestException(
60
+ f"Error {response.status_code}"
61
+ )
62
+
63
+ self.cb.put(f"Downloading {url}")
64
+ with open(dest, "wb+") as f:
65
+ f.write(response.content)
66
+ self.cb.put(f"Downloaded {url}")
67
+ break
68
+
69
+ except requests.exceptions.RequestException as e:
70
+ self.cb.put(
71
+ f"Cannot download {url} (tried {retry+1}/{retries} times): {e}"
72
+ )
38
73
 
39
- self.cb.put("update_bar")
74
+ self.cb.put("update_bar")
40
75
 
41
76
  def download_file(
42
77
  self,
@@ -51,10 +86,12 @@ class DownloadBase:
51
86
 
52
87
  for retry in range(retries):
53
88
  try:
54
- response = requests.get(url, stream=True, **kwargs)
89
+ response = requests.get(
90
+ url, stream=True, allow_redirects=True, **kwargs
91
+ )
55
92
  total_length = int(response.headers.get("content-length")) # type: ignore
56
93
 
57
- if response.status_code != 200:
94
+ if not response.ok:
58
95
  return b""
59
96
  self.cb.put(f"Downloading {url}")
60
97
 
@@ -75,16 +112,16 @@ class DownloadBase:
75
112
  self.cb.put("update_bar")
76
113
 
77
114
  break
78
- except requests.exceptions.RequestException:
79
- msg = f"Cannot download {url} (tried {retry+1}/{retries} times)"
80
- self.cb.put(msg)
115
+ except requests.exceptions.RequestException as e:
116
+ self.cb.put(
117
+ f"Cannot download {url} (tried {retry+1}/{retries} times): {e}"
118
+ )
81
119
 
82
120
  if not result:
83
121
  return b""
84
122
  if dest:
85
123
  with open(dest, "wb+") as f:
86
124
  f.write(result)
87
- msg = f"Downloaded {url}"
88
- self.cb.put(msg)
125
+ self.cb.put(f"Downloaded {url}")
89
126
  return b""
90
127
  return result
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env python3
2
+ import json
3
+ import zipfile
4
+ from io import BytesIO
5
+ from pathlib import Path
6
+ from typing import Optional, Tuple, cast
7
+ from urllib.parse import urlparse
8
+
9
+ import requests
10
+ from bs4 import BeautifulSoup
11
+
12
+ from sticker_convert.downloaders.download_base import DownloadBase
13
+ from sticker_convert.job_option import CredOption
14
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
15
+ from sticker_convert.utils.files.metadata_handler import MetadataHandler
16
+
17
+
18
+ class DownloadViber(DownloadBase):
19
+ # def __init__(self, *args: Any, **kwargs: Any) -> None:
20
+ # super().__init__(*args, **kwargs)
21
+
22
+ def get_pack_info(self, url: str) -> Optional[Tuple[str, str]]:
23
+ r = requests.get(url, allow_redirects=True)
24
+ soup = BeautifulSoup(r.text, "html.parser")
25
+
26
+ is_custom = urlparse(url).path.startswith("/pages/custom-sticker-packs/")
27
+ if is_custom:
28
+ tag_text_search = "window.CUSTOM_STICKER_PACK"
29
+ else:
30
+ tag_text_search = "window.PRODUCT"
31
+
32
+ script_tag = soup.find(
33
+ lambda tag: tag.name == "script" and tag.text.startswith(tag_text_search)
34
+ )
35
+ if script_tag is None:
36
+ return None
37
+
38
+ pack_json = script_tag.text.replace(f"{tag_text_search} = ", "", 1)[:-1]
39
+ pack_dict = json.loads(pack_json)
40
+
41
+ title = pack_dict["title"]
42
+ first_sticker_url = cast(str, pack_dict["stickerFirstItemUrl"])
43
+ zip_url = "/".join(first_sticker_url.split("/")[:-1]) + ".zip"
44
+
45
+ return title, zip_url
46
+
47
+ def decompress(self, zip_file: bytes) -> None:
48
+ with zipfile.ZipFile(BytesIO(zip_file)) as zf:
49
+ self.cb.put("Unzipping...")
50
+
51
+ zf_files = zf.namelist()
52
+ self.cb.put(
53
+ (
54
+ "bar",
55
+ None,
56
+ {"set_progress_mode": "determinate", "steps": len(zf_files)},
57
+ )
58
+ )
59
+
60
+ for sticker in zf_files:
61
+ num = sticker.split(".")[0][-2:].zfill(3)
62
+ data = zf.read(sticker)
63
+ ext = Path(sticker).suffix
64
+ self.cb.put(f"Read {sticker}")
65
+
66
+ out_path = Path(self.out_dir, num + ext)
67
+ with open(out_path, "wb") as f:
68
+ f.write(data)
69
+
70
+ self.cb.put("update_bar")
71
+
72
+ def download_stickers_viber(self) -> bool:
73
+ pack_info = self.get_pack_info(self.url)
74
+ if pack_info is None:
75
+ self.cb.put("Download failed: Cannot get pack info")
76
+ return False
77
+ title, zip_url = pack_info
78
+
79
+ zip_file = self.download_file(zip_url)
80
+ self.decompress(zip_file)
81
+
82
+ MetadataHandler.set_metadata(self.out_dir, title=title)
83
+
84
+ return True
85
+
86
+ @staticmethod
87
+ def start(
88
+ url: str,
89
+ out_dir: Path,
90
+ opt_cred: Optional[CredOption],
91
+ cb: CallbackProtocol,
92
+ cb_return: CallbackReturn,
93
+ ) -> bool:
94
+ downloader = DownloadViber(url, out_dir, opt_cred, cb, cb_return)
95
+ return downloader.download_stickers_viber()
@@ -16,6 +16,7 @@ from sticker_convert.downloaders.download_kakao import DownloadKakao
16
16
  from sticker_convert.downloaders.download_line import DownloadLine
17
17
  from sticker_convert.downloaders.download_signal import DownloadSignal
18
18
  from sticker_convert.downloaders.download_telegram import DownloadTelegram
19
+ from sticker_convert.downloaders.download_viber import DownloadViber
19
20
  from sticker_convert.job_option import CompOption, CredOption, InputOption, OutputOption
20
21
  from sticker_convert.uploaders.compress_wastickers import CompressWastickers
21
22
  from sticker_convert.uploaders.upload_signal import UploadSignal
@@ -527,6 +528,9 @@ class Job:
527
528
  if self.opt_input.option == "kakao":
528
529
  downloaders.append(DownloadKakao.start)
529
530
 
531
+ if self.opt_input.option == "viber":
532
+ downloaders.append(DownloadViber.start)
533
+
530
534
  if len(downloaders) > 0:
531
535
  self.executor.cb("Downloading...")
532
536
  else:
@@ -328,6 +328,53 @@
328
328
  "quantize_method": "imagequant",
329
329
  "default_emoji": "😀"
330
330
  },
331
+ "viber": {
332
+ "size_max": {
333
+ "img": 0,
334
+ "vid": 0
335
+ },
336
+ "format": {
337
+ "img": ".png",
338
+ "vid": ".png"
339
+ },
340
+ "fps": {
341
+ "min": 1,
342
+ "max": 1,
343
+ "power": 1
344
+ },
345
+ "res": {
346
+ "w": {
347
+ "min": 490,
348
+ "max": 490
349
+ },
350
+ "h": {
351
+ "min": 490,
352
+ "max": 490
353
+ },
354
+ "power": 1
355
+ },
356
+ "quality": {
357
+ "min": 95,
358
+ "max": 95,
359
+ "power": 1
360
+ },
361
+ "color": {
362
+ "min": 257,
363
+ "max": 257,
364
+ "power": 1
365
+ },
366
+ "duration": {
367
+ "min": 0,
368
+ "max": 0
369
+ },
370
+ "padding_percent": 0,
371
+ "bg_color": "",
372
+ "steps": 1,
373
+ "fake_vid": false,
374
+ "scale_filter": "bicubic",
375
+ "quantize_method": "imagequant",
376
+ "default_emoji": "😀"
377
+ },
331
378
  "imessage_small": {
332
379
  "size_max": {
333
380
  "img": 500000,
@@ -49,6 +49,16 @@
49
49
  "author": true
50
50
  }
51
51
  },
52
+ "viber": {
53
+ "full_name": "Download from Viber",
54
+ "help": "Download viber stickers from a URL as input",
55
+ "example": "Example: https://stickers.viber.com/pages/example\nOR https://stickers.viber.com/pages/custom-sticker-packs/example",
56
+ "address_lbls": "URL address / ID",
57
+ "metadata_provides": {
58
+ "title": true,
59
+ "author": false
60
+ }
61
+ },
52
62
  "local": {
53
63
  "full_name": "From local directory",
54
64
  "help": "Load files from local directory on computer",
@@ -27,4 +27,7 @@ class UrlDetect:
27
27
  ):
28
28
  return "kakao"
29
29
 
30
+ if domain == "stickers.viber.com":
31
+ return "viber"
32
+
30
33
  return None
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.8.4"
3
+ __version__ = "2.8.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.8.4
3
+ Version: 2.8.6
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -349,7 +349,7 @@ Project-URL: Source, https://github.com/laggykiller/sticker-convert
349
349
  Project-URL: Documentation, https://github.com/laggykiller/sticker-convert
350
350
  Project-URL: Tracker, https://github.com/laggykiller/sticker-convert/issues
351
351
  Project-URL: Repository, https://github.com/laggykiller/sticker-convert
352
- Keywords: telegram,line,tgs,whatsapp,kakao,signal,imessage,wastickers
352
+ Keywords: telegram,line,tgs,whatsapp,kakao,signal,imessage,wastickers,viber
353
353
  Classifier: Development Status :: 5 - Production/Stable
354
354
  Classifier: Intended Audience :: End Users/Desktop
355
355
  Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
@@ -369,7 +369,7 @@ Requires-Dist: anyio~=4.3.0
369
369
  Requires-Dist: apngasm_python~=1.2.3
370
370
  Requires-Dist: av~=12.0.0
371
371
  Requires-Dist: beautifulsoup4~=4.12.3
372
- Requires-Dist: rookiepy~=0.3.7
372
+ Requires-Dist: rookiepy~=0.4.0
373
373
  Requires-Dist: imagequant~=1.1.1
374
374
  Requires-Dist: memory-tempfile~=2.2.3
375
375
  Requires-Dist: mergedeep~=1.3.4
@@ -391,7 +391,7 @@ Requires-Dist: webp~=0.3.0
391
391
 
392
392
  - A python script for creating, downloading, converting+compressing and uploading stickers from multiple instant messaging applications.
393
393
  - With GUI and CLI that runs on Windows, MacOS and Linux
394
- - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), iMessage (Create Xcode sticker pack project)
394
+ - Currently supports Signal, Telegram, WhatsApp (Create .wastickers), Line (Download only), Kakao (Download only), Viber (Download only), iMessage (Create Xcode sticker pack project)
395
395
  - Supports static and animated stickers, with transparency support
396
396
 
397
397
  ## Downloads
@@ -429,6 +429,7 @@ Requires-Dist: webp~=0.3.0
429
429
  | [WhatsApp](docs/guide_whatsapp.md) | ⭕ (By Android or WhatsApp Web) | ⭕ (Create `.wastickers`, import by Sticker Maker) |
430
430
  | [Line](docs/guide_line.md) | ✅ | 🚫 (Need to submit for manual approval) |
431
431
  | [Kakao](docs/guide_kakao.md) | ✅ (Need 'share link' for animated) | 🚫 (Need to submit for manual approval) |
432
+ | [Viber](docs/guide_viber.md) | ✅ | 🚫 (Manually upload through Viber app) |
432
433
  | [iMessage](docs/guide_imessage.md) | 🚫 | ⭕ (Create Xcode stickerpack project for sideload) |
433
434
 
434
435
  ✅ = Supported ⭕ = Partially supported 🚫 = Not supported
@@ -455,6 +456,9 @@ Requires-Dist: webp~=0.3.0
455
456
  - Kakao
456
457
  - Download: Supported (e.g. `https://e.kakao.com/t/xxxxx` OR `kakaotalk://store/emoticon/4404400` OR `https://emoticon.kakao.com/items/xxxxx` OR `4404400`). It is rather complicated, learn more from [docs/guide_kakao.md](docs/guide_kakao.md)
457
458
  - Upload: Not supported. You need to manually submit sticker pack for approval before you can use in app.
459
+ - Viber
460
+ - Download: Supported (e.g. `https://stickers.viber.com/pages/example` OR `https://stickers.viber.com/pages/custom-sticker-packs/example`)
461
+ - Upload: The program can convert images to png with 490x490 for uploading to viber manually. It should be noted that Viber is able to resize images for you, so it may not be necessary to use sticker-convert for creating Viber sticker pack.
458
462
  - iMessage
459
463
  - Download: Not supported.
460
464
  - Upload: The program can create Xcode project for iMessage sticker pack, which could then be compiled and sideloaded using Xcode.
@@ -476,27 +480,17 @@ To run in CLI mode, pass on any arguments
476
480
 
477
481
  ```
478
482
  usage: sticker-convert.py [-h] [--version] [--no-confirm] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
479
- [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO]
480
- [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
481
- [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
482
- [--no-compress]
483
- [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}]
484
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
485
- [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN]
486
- [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX]
487
- [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
488
- [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX]
489
- [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX]
490
- [--padding-percent PADDING_PERCENT] [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX]
491
- [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT]
492
- [--fake-vid] [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
493
- [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
494
- [--signal-password SIGNAL_PASSWORD] [--signal-get-auth] [--signal-data-dir SIGNAL_DATA_DIR]
495
- [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID]
496
- [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth] [--kakao-username KAKAO_USERNAME]
497
- [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE]
498
- [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth] [--line-cookies LINE_COOKIES]
499
- [--save-cred SAVE_CRED]
483
+ [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO | --download-viber DOWNLOAD_VIBER]
484
+ [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE] [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
485
+ [--no-compress] [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}] [--steps STEPS]
486
+ [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX]
487
+ [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
488
+ [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER] [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
489
+ [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT] [--img-format IMG_FORMAT] [--fake-vid] [--scale-filter SCALE_FILTER]
490
+ [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR] [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
491
+ [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
492
+ [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
493
+ [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
500
494
 
501
495
  CLI for stickers-convert
502
496
 
@@ -530,6 +524,10 @@ Input options:
530
524
  Download kakao stickers from a URL / ID as input
531
525
  (Example: https://e.kakao.com/t/xxxxx OR kakaotalk://store/emoticon/4404400
532
526
  OR https://emoticon.kakao.com/items/xxxxx OR 4404400)
527
+ --download-viber DOWNLOAD_VIBER
528
+ Download viber stickers from a URL as input
529
+ (Example: https://stickers.viber.com/pages/example
530
+ OR https://stickers.viber.com/pages/custom-sticker-packs/example)
533
531
 
534
532
  Output options:
535
533
  --output-dir OUTPUT_DIR
@@ -545,7 +543,7 @@ Output options:
545
543
 
546
544
  Compression options:
547
545
  --no-compress Do not compress files. Useful for only downloading stickers.
548
- --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}
546
+ --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,viber,imessage_small,imessage_medium,imessage_large,custom}
549
547
  Apply preset for compression.
550
548
  --steps STEPS Set number of divisions between min and max settings.
551
549
  Steps higher = Slower but yields file more closer to the specified file size limit.
@@ -24,6 +24,7 @@ src/sticker_convert/downloaders/download_kakao.py
24
24
  src/sticker_convert/downloaders/download_line.py
25
25
  src/sticker_convert/downloaders/download_signal.py
26
26
  src/sticker_convert/downloaders/download_telegram.py
27
+ src/sticker_convert/downloaders/download_viber.py
27
28
  src/sticker_convert/gui_components/__init__.py
28
29
  src/sticker_convert/gui_components/gui_utils.py
29
30
  src/sticker_convert/gui_components/frames/__init__.py
@@ -3,7 +3,7 @@ anyio~=4.3.0
3
3
  apngasm_python~=1.2.3
4
4
  av~=12.0.0
5
5
  beautifulsoup4~=4.12.3
6
- rookiepy~=0.3.7
6
+ rookiepy~=0.4.0
7
7
  imagequant~=1.1.1
8
8
  memory-tempfile~=2.2.3
9
9
  mergedeep~=1.3.4
@@ -412,3 +412,45 @@ def test_download_kakao_animated_gif_share_link(tmp_path: LocalPath) -> None:
412
412
  with_author=True,
413
413
  with_emoji=False,
414
414
  )
415
+
416
+
417
+ @pytest.mark.skipif(not TEST_DOWNLOAD, reason="TEST_DOWNLOAD not set")
418
+ def test_download_viber_custom_sticker_packs(tmp_path: LocalPath) -> None:
419
+ _run_sticker_convert(
420
+ tmp_path=tmp_path,
421
+ source="viber",
422
+ url="https://stickers.viber.com/pages/custom-sticker-packs/11eefcc8e3c228308e3fafd9b834679a19de752fb5c38390",
423
+ expected_file_count=2,
424
+ expected_file_formats=[".png"],
425
+ with_title=True,
426
+ with_author=False,
427
+ with_emoji=False,
428
+ )
429
+
430
+
431
+ @pytest.mark.skipif(not TEST_DOWNLOAD, reason="TEST_DOWNLOAD not set")
432
+ def test_download_viber_official_sticker_packs(tmp_path: LocalPath) -> None:
433
+ _run_sticker_convert(
434
+ tmp_path=tmp_path,
435
+ source="viber",
436
+ url="https://stickers.viber.com/pages/spring_2024",
437
+ expected_file_count=14,
438
+ expected_file_formats=[".png"],
439
+ with_title=True,
440
+ with_author=False,
441
+ with_emoji=False,
442
+ )
443
+
444
+
445
+ @pytest.mark.skipif(not TEST_DOWNLOAD, reason="TEST_DOWNLOAD not set")
446
+ def test_download_viber_official_sound_sticker_packs(tmp_path: LocalPath) -> None:
447
+ _run_sticker_convert(
448
+ tmp_path=tmp_path,
449
+ source="viber",
450
+ url="https://stickers.viber.com/pages/spring_2024",
451
+ expected_file_count=24,
452
+ expected_file_formats=[".png", ".mp3"],
453
+ with_title=True,
454
+ with_author=False,
455
+ with_emoji=False,
456
+ )
File without changes