sticker-convert 2.7.10__py3-none-any.whl → 2.7.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sticker_convert/cli.py CHANGED
@@ -9,6 +9,8 @@ from multiprocessing import cpu_count
9
9
  from pathlib import Path
10
10
  from typing import Any, Dict
11
11
 
12
+ from mergedeep import merge # type: ignore
13
+
12
14
  from sticker_convert.definitions import CONFIG_DIR, DEFAULT_DIR
13
15
  from sticker_convert.job import Job
14
16
  from sticker_convert.job_option import CompOption, CredOption, InputOption, OutputOption
@@ -50,6 +52,12 @@ class CLI:
50
52
  action="store_true",
51
53
  help=self.help["global"]["no_confirm"],
52
54
  )
55
+ parser.add_argument(
56
+ "--custom-presets",
57
+ dest="custom_presets",
58
+ default=None,
59
+ help=self.help["global"]["custom_presets"],
60
+ )
53
61
 
54
62
  parser_input = parser.add_argument_group("Input options")
55
63
  for k, v_str in self.help["input"].items():
@@ -162,6 +170,16 @@ class CLI:
162
170
 
163
171
  args = parser.parse_args()
164
172
 
173
+ if args.custom_presets:
174
+ try:
175
+ custom_presets = JsonManager.load_json(Path(args.custom_presets))
176
+ self.compression_presets: Dict[Any, Any] = merge( # type: ignore
177
+ self.compression_presets, # type: ignore
178
+ custom_presets,
179
+ )
180
+ except RuntimeError:
181
+ print(f"Error: Cannot load custom presets from {args.custom_presets}")
182
+
165
183
  self.cb.no_confirm = args.no_confirm
166
184
 
167
185
  self.opt_input = self.get_opt_input(args)
@@ -714,20 +714,24 @@ class StickerConvert:
714
714
  else:
715
715
  extra_kwargs["optimize"] = True
716
716
 
717
- # Only enable transparency if all pixels have alpha channel
718
- # with value of 0 or 255
719
- alpha_channel_values = np.unique(np.array(self.frames_raw)[:, :, :, 3])
720
- illegals = np.setxor1d(
721
- alpha_channel_values, [0, 255]
722
- ) # Find all values not 0 or 255
723
- if illegals.size == 0:
717
+ # GIF can only have one alpha color
718
+ # Change lowest alpha to alpha=0
719
+ # Only keep alpha=0 and alpha=255, nothing in between
720
+ frames_processed = np.array(self.frames_processed)
721
+ alpha = frames_processed[:, :, :, 3]
722
+ alpha_min = np.min(alpha) # type: ignore
723
+ if alpha_min < 255:
724
+ alpha[alpha > alpha_min] = 255
725
+ alpha[alpha == alpha_min] = 0
726
+
727
+ if 0 in alpha:
724
728
  extra_kwargs["transparency"] = 0
725
729
  extra_kwargs["disposal"] = 2
726
- im_out = [self.quantize(Image.fromarray(i)) for i in self.frames_processed]
730
+ im_out = [self.quantize(Image.fromarray(i)) for i in frames_processed]
727
731
  else:
728
732
  im_out = [
729
733
  self.quantize(Image.fromarray(i).convert("RGB")).convert("RGB")
730
- for i in self.frames_processed
734
+ for i in frames_processed
731
735
  ]
732
736
 
733
737
  if self.fps:
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "global": {
3
- "no_confirm": "Do not ask any questions."
3
+ "no_confirm": "Do not ask any questions.",
4
+ "custom_presets": "Specify a json file containing custom compression presets.\nSee compression.json for format.\nNote that if present, 'custom_preset.json' from config directory would be auto loaded."
4
5
  },
5
6
  "input": {
6
7
  "input_dir": "Specify input directory."
@@ -46,7 +47,7 @@
46
47
  "vid_format": "Set file format if input is animated.",
47
48
  "img_format": "Set file format if input is static.",
48
49
  "fake_vid": "Convert (faking) image to video.\nUseful if:\n(1) Size limit for video is larger than image;\n(2) Mix image and video into same pack.",
49
- "scale_filter": "Set scale filter. Default as bicubic. Valid options are:\n- nearest = Use nearest neighbour (Suitable for pixel art)\n-box = Similar to nearest, but better downscaling\n- bilinear = Linear interpolation\n- hamming = Similar to bilinear, but better downscaling\n- bicubic = Cubic spline interpolation\n- lanczos = A high-quality downsampling filter",
50
+ "scale_filter": "Set scale filter. Default as bicubic. Valid options are:\n- nearest = Use nearest neighbour (Suitable for pixel art)\n- box = Similar to nearest, but better downscaling\n- bilinear = Linear interpolation\n- hamming = Similar to bilinear, but better downscaling\n- bicubic = Cubic spline interpolation\n- lanczos = A high-quality downsampling filter",
50
51
  "quantize_method": "Set method for quantizing image. Default as imagequant. Valid options are:\n- imagequant = Best quality but slow\n- fastoctree = Fast but image looks chunky\n- none = No image quantizing, large image size as result",
51
52
  "cache_dir": "Set custom cache directory.\nUseful for debugging, or speed up conversion if cache_dir is on RAM disk.",
52
53
  "default_emoji": "Set the default emoji for uploading Signal and Telegram sticker packs."
@@ -22,6 +22,12 @@ class GetLineAuth:
22
22
  rookiepy.vivaldi, # type: ignore
23
23
  ]
24
24
 
25
+ # https://github.com/thewh1teagle/rookie/pull/24
26
+ if "libre_wolf" in rookiepy.__all__:
27
+ browsers.extend(rookiepy.libre_wolf) # type: ignore
28
+ else:
29
+ browsers.extend(rookiepy.librewolf) # type: ignore
30
+
25
31
  if platform.system() == "Windows":
26
32
  browsers.extend(
27
33
  [
@@ -1,12 +1,27 @@
1
- from typing import Dict
1
+ from typing import Any, Dict
2
2
 
3
- from sticker_convert.definitions import ROOT_DIR
3
+ from mergedeep import merge # type: ignore
4
+
5
+ from sticker_convert.definitions import CONFIG_DIR, ROOT_DIR
4
6
  from sticker_convert.utils.files.json_manager import JsonManager
5
7
 
8
+
9
+ def _load_compression() -> Dict[Any, Any]:
10
+ compression_json = JsonManager.load_json(ROOT_DIR / "resources/compression.json")
11
+ custom_preset_json_path = CONFIG_DIR / "custom_preset.json"
12
+ if custom_preset_json_path.exists():
13
+ custom_preset_json = JsonManager.load_json(custom_preset_json_path)
14
+ compression_json: Dict[Any, Any] = merge( # type: ignore
15
+ compression_json, # type: ignore
16
+ custom_preset_json,
17
+ )
18
+ return compression_json
19
+
20
+
6
21
  HELP_JSON: Dict[str, Dict[str, str]] = JsonManager.load_json(
7
22
  ROOT_DIR / "resources/help.json"
8
23
  )
9
24
  INPUT_JSON = JsonManager.load_json(ROOT_DIR / "resources/input.json")
10
- COMPRESSION_JSON = JsonManager.load_json(ROOT_DIR / "resources/compression.json")
25
+ COMPRESSION_JSON = _load_compression()
11
26
  OUTPUT_JSON = JsonManager.load_json(ROOT_DIR / "resources/output.json")
12
27
  EMOJI_JSON = JsonManager.load_json(ROOT_DIR / "resources/emoji.json")
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.7.10"
3
+ __version__ = "2.7.12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sticker-convert
3
- Version: 2.7.10
3
+ Version: 2.7.12
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>
@@ -475,7 +475,7 @@ Requires-Dist: webp ~=0.3.0
475
475
  To run in CLI mode, pass on any arguments
476
476
 
477
477
  ```
478
- usage: sticker-convert.py [-h] [--version] [--no-confirm] [--input-dir INPUT_DIR]
478
+ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
479
479
  [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO]
480
480
  [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
481
481
  [--export-signal | --export-telegram | --export-telegram-emoji | --export-whatsapp | --export-imessage]
@@ -483,7 +483,7 @@ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--input-dir INPUT_DIR
483
483
  [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}]
484
484
  [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
485
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] [--res-power RES_POWER]
486
+ [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER]
487
487
  [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
488
488
  [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER]
489
489
  [--duration-min DURATION_MIN] [--duration-max DURATION_MAX] [--bg-color BG_COLOR]
@@ -494,15 +494,19 @@ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--input-dir INPUT_DIR
494
494
  [--signal-data-dir SIGNAL_DATA_DIR] [--telegram-token TELEGRAM_TOKEN]
495
495
  [--telegram-userid TELEGRAM_USERID] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
496
496
  [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD]
497
- [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
497
+ [--kakao-country-code KAKAO_COUNTRY_CODE] [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
498
498
  [--line-cookies LINE_COOKIES] [--save-cred SAVE_CRED]
499
499
 
500
500
  CLI for stickers-convert
501
501
 
502
- options:
502
+ optional arguments:
503
503
  -h, --help show this help message and exit
504
504
  --version show program's version number and exit
505
505
  --no-confirm Do not ask any questions.
506
+ --custom-presets CUSTOM_PRESETS
507
+ Specify a json file containing custom compression presets.
508
+ See compression.json for format.
509
+ Note that if present, 'custom_preset.json' from config directory would be auto loaded.
506
510
 
507
511
  Input options:
508
512
  --input-dir INPUT_DIR
@@ -540,7 +544,7 @@ Output options:
540
544
 
541
545
  Compression options:
542
546
  --no-compress Do not compress files. Useful for only downloading stickers.
543
- --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}
547
+ --preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,imessage_small,imessage_medium,imessage_large,custom}
544
548
  Apply preset for compression.
545
549
  --steps STEPS Set number of divisions between min and max settings.
546
550
  Steps higher = Slower but yields file more closer to the specified file size limit.
@@ -600,7 +604,7 @@ Compression options:
600
604
  --scale-filter SCALE_FILTER
601
605
  Set scale filter. Default as bicubic. Valid options are:
602
606
  - nearest = Use nearest neighbour (Suitable for pixel art)
603
- -box = Similar to nearest, but better downscaling
607
+ - box = Similar to nearest, but better downscaling
604
608
  - bilinear = Linear interpolation
605
609
  - hamming = Similar to bilinear, but better downscaling
606
610
  - bicubic = Cubic spline interpolation
@@ -628,10 +632,10 @@ Credentials options:
628
632
  --telegram-token TELEGRAM_TOKEN
629
633
  Set Telegram token. Required for uploading and downloading Telegram stickers.
630
634
  --telegram-userid TELEGRAM_USERID
631
- Set telegram user_id (From real account, not bot account). Required for uploading Telegram stickers.
635
+ Set telegram user_id (From real account, not bot account). Required for uploading Telegram stickers.
632
636
  --kakao-auth-token KAKAO_AUTH_TOKEN
633
- Set Kakao auth_token. Required for downloading animated stickers from https://e.kakao.com/t/xxxxx
634
- --kakao-get-auth Generate Kakao auth_token. Kakao username, password, country code and phone number are also required.
637
+ Set Kakao auth_token. Required for downloading animated stickers from https://e.kakao.com/t/xxxxx
638
+ --kakao-get-auth Generate Kakao auth_token. Kakao username, password, country code and phone number are also required.
635
639
  --kakao-username KAKAO_USERNAME
636
640
  Set Kakao username, which is email or phone number used for signing up Kakao account
637
641
  Example: +447700900142
@@ -1,12 +1,12 @@
1
1
  sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
2
2
  sticker_convert/__main__.py,sha256=6RJauR-SCSSTT3TU7FFB6B6PVwsCxO2xZXtmZ3jc2Is,463
3
- sticker_convert/cli.py,sha256=Ex5Nculo1cbkfhLPibnYR6-SM431ODGPb324Bos0z6k,17702
4
- sticker_convert/converter.py,sha256=RjsKMhxq10SJKd9dRpin_wqp07OUj4EXQCV6-ASCIPU,32805
3
+ sticker_convert/cli.py,sha256=kyfhvMoHq42uLZsYYLrr6b30xsNE93GVZlbGYPFjC2I,18385
4
+ sticker_convert/converter.py,sha256=-BxUT-VCw-VbfbG7ZZxNTI4FIJcU3Pq2rzw0VuitiVI,32904
5
5
  sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
6
6
  sticker_convert/gui.py,sha256=TqdgFbHBRYgcXWWrsfxLUJ8Zu9WeE11vYyZMX6nalik,30599
7
7
  sticker_convert/job.py,sha256=J4e7dZ48t5EhM3fG-xF1BEQ10WYljx3wWamKXAJjCa8,26000
8
8
  sticker_convert/job_option.py,sha256=1YVhyTfu2cWz3qpAKbdIM11jbL0CJz0ksOYAeg8v6dc,7649
9
- sticker_convert/version.py,sha256=eWoky_Xc6Fg1odZm_L5C8BA63Wxj-o-_bVEz5-u16VQ,47
9
+ sticker_convert/version.py,sha256=itLv7GvtbPZ961xSemMjepArEGEJR3yg6PpGH0MuovQ,47
10
10
  sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  sticker_convert/downloaders/download_base.py,sha256=5R7c8kwahAflOOYrtSQPnBVQ4T-DsprPUMP7G9wcJX4,2824
12
12
  sticker_convert/downloaders/download_kakao.py,sha256=RYrebTxEjKjXAr9xw18r0dMW0dFjSqZxzi8dpaq56TY,8581
@@ -68,7 +68,7 @@ sticker_convert/resources/appicon.ico,sha256=-ldugcl2Yq2pBRTktnhGKWInpKyWzRjCiPv
68
68
  sticker_convert/resources/appicon.png,sha256=6XBEQz7PnerqS43aRkwpWolFG4WvKMuQ-st1ly-_JPg,5265
69
69
  sticker_convert/resources/compression.json,sha256=vwn6wLsfsPnNnpjhJHRvzozBI4F_kkb9-eBR8IlyYLo,10833
70
70
  sticker_convert/resources/emoji.json,sha256=sXSuKusyG1L2Stuf9BL5ZqfzOIOdeAeE3RXcrXAsLdY,413367
71
- sticker_convert/resources/help.json,sha256=dYLh751rhhriSwc2p_xKVdWPCgUZTPyNJ1QFZdUjA2M,6259
71
+ sticker_convert/resources/help.json,sha256=TUZi_70uVmgImApBUtKieDGEMtu8syVjE0ah8sKEcbk,6470
72
72
  sticker_convert/resources/input.json,sha256=sRz8qWaLh2KTjjlPIxz2UfynVn2Bn0olywbb8-qT_Hc,2251
73
73
  sticker_convert/resources/output.json,sha256=QYP2gqDvEaAm5I9bH4NReaB1XMLboevv69u-V8YdZUs,1373
74
74
  sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -80,11 +80,11 @@ sticker_convert/uploaders/xcode_imessage.py,sha256=mwnUTNclq4SFGX8JgFoM-bsvAtsYt
80
80
  sticker_convert/utils/callback.py,sha256=JnwrgaSNdl-74Nd-fz6EH-r6ePLLb-4a5C1P0OAPjNQ,5279
81
81
  sticker_convert/utils/url_detect.py,sha256=Cw3SzHj0xQTgCY8KvXbgFGRn_VhDJuZvH0mWsiQOg5s,769
82
82
  sticker_convert/utils/auth/get_kakao_auth.py,sha256=ipAZ1DUd5CMTpUoxRXHVOFC3DKIpxwxpTYAfrOJ6UZ8,9829
83
- sticker_convert/utils/auth/get_line_auth.py,sha256=WzO5aGL1-_KHTcBA6ymOZLD3vLp35MUj0pG7w08K5Wo,2436
83
+ sticker_convert/utils/auth/get_line_auth.py,sha256=CAg5oAyqnzyAr1sP0iaecJPpmreeERiZnVxIX9X_Ib0,2682
84
84
  sticker_convert/utils/auth/get_signal_auth.py,sha256=6Sx-lMuyBHeX1RpjAWI8u03qnRu9fmO4p89pd7fowOE,4925
85
85
  sticker_convert/utils/files/cache_store.py,sha256=etfe614OAhAyrnM5fGeESKq6R88YLNqkqkxSzEmZ0V0,1047
86
86
  sticker_convert/utils/files/json_manager.py,sha256=Vr6pZJdLMkrJJWN99210aduVHb0ILyf0SSTaw4TZqgc,541
87
- sticker_convert/utils/files/json_resources_loader.py,sha256=H3uMn-77wtALwiGAPhA31OIohcZtWvvzXO7rFmM8EMg,535
87
+ sticker_convert/utils/files/json_resources_loader.py,sha256=flZFixUXRTrOAhvRQpuSQgmJ69yXL94sxukcowLT1JQ,1049
88
88
  sticker_convert/utils/files/metadata_handler.py,sha256=TJpQ-7KdnqQh09hwR6xB_scRLhbJ6D3zgORy3dkf858,9933
89
89
  sticker_convert/utils/files/run_bin.py,sha256=QalA9je6liHxiOtxsjsFsIkc2t59quhcJCVpP1X3p50,1743
90
90
  sticker_convert/utils/files/sanitize_filename.py,sha256=HBklPGsHRJjFQUIC5rYTQsUrsuTtezZXIEA8CPhLP8A,2156
@@ -92,9 +92,9 @@ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE
92
92
  sticker_convert/utils/media/codec_info.py,sha256=JHHlfCLSpepYFv6TSL1XqwUJoVOpOPFxurRtduplPGY,12856
93
93
  sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
94
94
  sticker_convert/utils/media/format_verify.py,sha256=Xf94jyqk_6M9IlFGMy0wYIgQKn_yg00nD4XW0CgAbew,5732
95
- sticker_convert-2.7.10.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
96
- sticker_convert-2.7.10.dist-info/METADATA,sha256=2TNBaAF4qvthg7_9hijcjjFX2yKe1Vth2aoH3c_nFiM,48837
97
- sticker_convert-2.7.10.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
98
- sticker_convert-2.7.10.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
99
- sticker_convert-2.7.10.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
100
- sticker_convert-2.7.10.dist-info/RECORD,,
95
+ sticker_convert-2.7.12.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
96
+ sticker_convert-2.7.12.dist-info/METADATA,sha256=tJ1IQvfsDyRiDDQSkHech1YhfhlB9U9HPeUEk5a15eY,49133
97
+ sticker_convert-2.7.12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
98
+ sticker_convert-2.7.12.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
99
+ sticker_convert-2.7.12.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
100
+ sticker_convert-2.7.12.dist-info/RECORD,,