sticker-convert 2.11.0__py3-none-any.whl → 2.11.1__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 +7 -7
 - sticker_convert/converter.py +5 -6
 - sticker_convert/downloaders/download_base.py +2 -2
 - sticker_convert/job.py +2 -2
 - sticker_convert/uploaders/compress_wastickers.py +76 -56
 - sticker_convert/uploaders/upload_viber.py +18 -19
 - sticker_convert/utils/auth/telegram_api.py +4 -2
 - sticker_convert/utils/files/metadata_handler.py +3 -3
 - sticker_convert/version.py +1 -1
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/METADATA +5 -5
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/RECORD +15 -15
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/WHEEL +1 -1
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/LICENSE +0 -0
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/entry_points.txt +0 -0
 - {sticker_convert-2.11.0.dist-info → sticker_convert-2.11.1.dist-info}/top_level.txt +0 -0
 
    
        sticker_convert/cli.py
    CHANGED
    
    | 
         @@ -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 
     | 
| 
      
 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 
     | 
| 
      
 80 
     | 
    
         
            +
                            f"--download-{k.replace('_', '-')}",
         
     | 
| 
       81 
81 
     | 
    
         
             
                            dest=f"download_{k}",
         
     | 
| 
       82 
     | 
    
         
            -
                            help=f 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
| 
      
 184 
     | 
    
         
            +
                            f"--{k.replace('_', '-')}",
         
     | 
| 
       185 
185 
     | 
    
         
             
                            **keyword_args,
         
     | 
| 
       186 
186 
     | 
    
         
             
                            dest=k,
         
     | 
| 
       187 
187 
     | 
    
         
             
                            help=v,
         
     | 
    
        sticker_convert/converter.py
    CHANGED
    
    | 
         @@ -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:
         
     | 
    
        sticker_convert/job.py
    CHANGED
    
    | 
         @@ -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 
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
    
         
            -
                         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                                 
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                                 
     | 
| 
       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 
     | 
    
         
            -
                         
     | 
| 
      
 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 
     | 
    
         
            -
                                 
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       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' 
     | 
| 
      
 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' 
     | 
| 
      
 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' 
     | 
| 
      
 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 = []
         
     | 
    
        sticker_convert/version.py
    CHANGED
    
    
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            Metadata-Version: 2. 
     | 
| 
      
 1 
     | 
    
         
            +
            Metadata-Version: 2.2
         
     | 
| 
       2 
2 
     | 
    
         
             
            Name: sticker-convert
         
     | 
| 
       3 
     | 
    
         
            -
            Version: 2.11. 
     | 
| 
      
 3 
     | 
    
         
            +
            Version: 2.11.1
         
     | 
| 
       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,7 +364,7 @@ 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. 
     | 
| 
      
 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 
370 
     | 
    
         
             
            Requires-Dist: beautifulsoup4~=4.12.3
         
     | 
| 
         @@ -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~= 
     | 
| 
      
 379 
     | 
    
         
            +
            Requires-Dist: Pillow~=11.1.0
         
     | 
| 
       380 
380 
     | 
    
         
             
            Requires-Dist: pyoxipng~=9.0.0
         
     | 
| 
       381 
     | 
    
         
            -
            Requires-Dist: python-telegram-bot~=21. 
     | 
| 
      
 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
         
     | 
| 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
         
     | 
| 
       2 
2 
     | 
    
         
             
            sticker_convert/__main__.py,sha256=elDCMvU27letiYs8jPUpxaCq5puURnvcDuqGsAAb6_w,592
         
     | 
| 
       3 
     | 
    
         
            -
            sticker_convert/cli.py,sha256= 
     | 
| 
       4 
     | 
    
         
            -
            sticker_convert/converter.py,sha256= 
     | 
| 
      
 3 
     | 
    
         
            +
            sticker_convert/cli.py,sha256=MWzq9QJJ7HYBD73DmSgRIPo-u58mTGEIoUUpJKNjI0Q,22358
         
     | 
| 
      
 4 
     | 
    
         
            +
            sticker_convert/converter.py,sha256=Y2Ypvy1GjGAteLDLEXcbRXP6Z0sgdIjJk3ZssYwa1jw,36291
         
     | 
| 
       5 
5 
     | 
    
         
             
            sticker_convert/definitions.py,sha256=ZhP2ALCEud-w9ZZD4c3TDG9eHGPZyaAL7zPUsJAbjtE,2073
         
     | 
| 
       6 
6 
     | 
    
         
             
            sticker_convert/gui.py,sha256=7nQ9yxxuTU6EiFicErXA-igVAz3-0qmevvLVHsweJF0,33656
         
     | 
| 
       7 
     | 
    
         
            -
            sticker_convert/job.py,sha256= 
     | 
| 
      
 7 
     | 
    
         
            +
            sticker_convert/job.py,sha256=9J2a-yEqdISHUmPI1gw5CAdwmlJ9cIecJfzVU40A9VU,27617
         
     | 
| 
       8 
8 
     | 
    
         
             
            sticker_convert/job_option.py,sha256=NysZtKVVG7EzRkLnVaeYJY0uNlYKFmjoststB1cvVrY,8020
         
     | 
| 
       9 
     | 
    
         
            -
            sticker_convert/version.py,sha256= 
     | 
| 
      
 9 
     | 
    
         
            +
            sticker_convert/version.py,sha256=B1A0zdNjEP5npHwLfEerwv890gLeBzul8X8eOXThNYg,47
         
     | 
| 
       10 
10 
     | 
    
         
             
            sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       11 
     | 
    
         
            -
            sticker_convert/downloaders/download_base.py,sha256= 
     | 
| 
      
 11 
     | 
    
         
            +
            sticker_convert/downloaders/download_base.py,sha256=MI5pCT_tkfoaFlrD1oNynDj1Rv1CK0APuNVElTEAEis,5110
         
     | 
| 
       12 
12 
     | 
    
         
             
            sticker_convert/downloaders/download_discord.py,sha256=6AFpLAYL2hRvVcsqUtzDUC31U66U02ZcnKXDnZRi2jk,3496
         
     | 
| 
       13 
13 
     | 
    
         
             
            sticker_convert/downloaders/download_kakao.py,sha256=qc2Ldv_zrM6H_o0dVI8Qp8xuakTNuEYPwqFfC7l_ehc,12530
         
     | 
| 
       14 
14 
     | 
    
         
             
            sticker_convert/downloaders/download_line.py,sha256=c-hTzEarGQP0b-pnPl29NuSKcaZWUeRo_94YpJzz72M,17911
         
     | 
| 
         @@ -78,11 +78,11 @@ sticker_convert/resources/memdump_linux.sh,sha256=YbdX5C5RyCnoeDUE6JgTo8nQXKhrUw 
     | 
|
| 
       78 
78 
     | 
    
         
             
            sticker_convert/resources/memdump_windows.ps1,sha256=CfyNSSEW3HJOkTu-mKrP3qh5aprN-1VCBfj-R1fELA0,302
         
     | 
| 
       79 
79 
     | 
    
         
             
            sticker_convert/resources/output.json,sha256=SC_3vtEBJ79R7q0vy_p33eLsGFEyBsSOai0Hy7mLqG8,2208
         
     | 
| 
       80 
80 
     | 
    
         
             
            sticker_convert/uploaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       81 
     | 
    
         
            -
            sticker_convert/uploaders/compress_wastickers.py,sha256= 
     | 
| 
      
 81 
     | 
    
         
            +
            sticker_convert/uploaders/compress_wastickers.py,sha256=Rgl3WzIDJn7oa00nNqeBFDqIHP-cWvgQqET2-kDbf9c,7417
         
     | 
| 
       82 
82 
     | 
    
         
             
            sticker_convert/uploaders/upload_base.py,sha256=uQupPn6r4zrlAzpKzzX7CgvZb69ATyrwPKahWOQj0ds,1203
         
     | 
| 
       83 
83 
     | 
    
         
             
            sticker_convert/uploaders/upload_signal.py,sha256=Qhay8HS3b9J7DGETcLtNg9kV16BGoSgYC5cX5wJd0ew,6674
         
     | 
| 
       84 
84 
     | 
    
         
             
            sticker_convert/uploaders/upload_telegram.py,sha256=WlUyLJlW83XZz6RhA76jHMXA6TNUIEVbPwhi14RTnds,12482
         
     | 
| 
       85 
     | 
    
         
            -
            sticker_convert/uploaders/upload_viber.py,sha256= 
     | 
| 
      
 85 
     | 
    
         
            +
            sticker_convert/uploaders/upload_viber.py,sha256=kRvZZCv5WcalOJvz9Mdl2yqi3L5n4joovA39WMWn4qs,6420
         
     | 
| 
       86 
86 
     | 
    
         
             
            sticker_convert/uploaders/xcode_imessage.py,sha256=iTTT8gDYOTNkKqXeSWUBuWfxu7xeE418t2Z1YQFR5L0,11365
         
     | 
| 
       87 
87 
     | 
    
         
             
            sticker_convert/utils/callback.py,sha256=spYUGlklOs1yPZAxoqwOWgR1sdimpfM8a27if3TaVYk,6155
         
     | 
| 
       88 
88 
     | 
    
         
             
            sticker_convert/utils/chrome_remotedebug.py,sha256=tLc1C1u7U3kJvAi1WFK5_3gKcdfg4x6SAkTIX2g87VE,4765
         
     | 
| 
         @@ -95,21 +95,21 @@ sticker_convert/utils/auth/get_kakao_desktop_auth.py,sha256=VbEec-yujlLJOBeM55Rm 
     | 
|
| 
       95 
95 
     | 
    
         
             
            sticker_convert/utils/auth/get_line_auth.py,sha256=8l8ha2vQmk3rHGvDE7PkcxQXbH3oe62LKbI3qVUtvqc,2196
         
     | 
| 
       96 
96 
     | 
    
         
             
            sticker_convert/utils/auth/get_signal_auth.py,sha256=9L9kqpfJ4j9B10nJ8iLFKolPd6r_8TsGUDxCpTLR43o,4306
         
     | 
| 
       97 
97 
     | 
    
         
             
            sticker_convert/utils/auth/get_viber_auth.py,sha256=mUTrcxq5bTrzSXEVaeTPqVQIdZdwvIhrbMgBUb7dU30,8173
         
     | 
| 
       98 
     | 
    
         
            -
            sticker_convert/utils/auth/telegram_api.py,sha256= 
     | 
| 
      
 98 
     | 
    
         
            +
            sticker_convert/utils/auth/telegram_api.py,sha256=WQi3dat8IZy13nXfyDS25XTS3HKp5BhVzgHimgbPnmw,24169
         
     | 
| 
       99 
99 
     | 
    
         
             
            sticker_convert/utils/auth/telethon_setup.py,sha256=3hH0KglsotFBxT3gwFjHiDuREyahFIlmx-ZL1_-zM2A,2714
         
     | 
| 
       100 
100 
     | 
    
         
             
            sticker_convert/utils/files/cache_store.py,sha256=etfe614OAhAyrnM5fGeESKq6R88YLNqkqkxSzEmZ0V0,1047
         
     | 
| 
       101 
101 
     | 
    
         
             
            sticker_convert/utils/files/json_manager.py,sha256=Vr6pZJdLMkrJJWN99210aduVHb0ILyf0SSTaw4TZqgc,541
         
     | 
| 
       102 
102 
     | 
    
         
             
            sticker_convert/utils/files/json_resources_loader.py,sha256=flZFixUXRTrOAhvRQpuSQgmJ69yXL94sxukcowLT1JQ,1049
         
     | 
| 
       103 
     | 
    
         
            -
            sticker_convert/utils/files/metadata_handler.py,sha256= 
     | 
| 
      
 103 
     | 
    
         
            +
            sticker_convert/utils/files/metadata_handler.py,sha256=UNCfsbAmN-s4LhMUGlAj-CVCsoDCv4BaP5yQG7R81Jk,10108
         
     | 
| 
       104 
104 
     | 
    
         
             
            sticker_convert/utils/files/run_bin.py,sha256=C_KKGtMUTajJnKo4Ia9e6WuWCXSQRdGsVPG-r5GXT_I,1784
         
     | 
| 
       105 
105 
     | 
    
         
             
            sticker_convert/utils/files/sanitize_filename.py,sha256=HBklPGsHRJjFQUIC5rYTQsUrsuTtezZXIEA8CPhLP8A,2156
         
     | 
| 
       106 
106 
     | 
    
         
             
            sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE4l0MygBA1jB-PFiYLEkzk,3657
         
     | 
| 
       107 
107 
     | 
    
         
             
            sticker_convert/utils/media/codec_info.py,sha256=XoEWBfPWTzr4zSVQIU1XF1yh5viHxH5FytNEpdZR38c,14874
         
     | 
| 
       108 
108 
     | 
    
         
             
            sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
         
     | 
| 
       109 
109 
     | 
    
         
             
            sticker_convert/utils/media/format_verify.py,sha256=oM32P186tWe9YxvBQRPr8D3FEmBN3b2rEe_2S_MwxyQ,6236
         
     | 
| 
       110 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
       111 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
       112 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
       113 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
       114 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
       115 
     | 
    
         
            -
            sticker_convert-2.11. 
     | 
| 
      
 110 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
         
     | 
| 
      
 111 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/METADATA,sha256=KIoxhhqLPn8bsyfpwTptU5l0hxAKsEQYMjUIBvpHZhY,53575
         
     | 
| 
      
 112 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
         
     | 
| 
      
 113 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
         
     | 
| 
      
 114 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
         
     | 
| 
      
 115 
     | 
    
         
            +
            sticker_convert-2.11.1.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     |