psd-export


Namepsd-export JSON
Version 1.0.28 PyPI version JSON
download
home_page
SummaryFast exporting of PSDs with [tagged] layers for variants.
upload_time2024-01-26 04:36:13
maintainer
docs_urlNone
authorcromachina
requires_python>=3.11.2
licenseMIT License Copyright (c) 2022 cromachina Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords exporter psd art
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # psd-export

- Fast multi-threaded exporting of PSDs with `[tagged]` layers for variants.
- Special named layers can be used to apply filters like mosaic or gaussian blur, or whatever else you can hook in.
- This tool is primarily meant to be compatible with PSDs exported from `PaintTool SAIv2` and `Clip Studio Paint`.

---
### Why
For my art workflow, I typically make a bunch variation layers and also need to apply mosaics to all of them. As a manual process, exporting every variant can take several minutes, with lots of clicking everywhere to turn layers on and off (potentially missing layers by accident) and then adding mosaics can be another 10 or 20 minutes of extra work. If I find I need to change something in my pictures and export again, I have to repeat this whole ordeal. This script puts this export process on the order of seconds, saving me a lot of time and pain.

---
### Installation
- Install python: https://www.python.org/downloads/
- Run `pip install psd-export` to install the script.
- Run `psd-export` to export any PSD files in the current directory.
- Run `psd-export --help` for more command line arguments.

---
### Building from source
- Install a C compiler (like MSVC, GCC, Clang)
- Install extra dependencies: `pip install setuptools wheel cython numpy`
- Install this repository locally: `pip install -e .`
- If you modify a Cython file (.pyx), then rebuild it with: `python setup.py build_ext --inplace`

---
### Setting up the PSD

#### Automatic Exporting

##### Primary tags
- Add tags surrounded by `[]` to the names of layers that you want as part of an exported picture.
  - A layer name can contain anything else outside of tags: `scene [1]`, which will be ignored.
- Because whitespace is used to delimit arguments to filters, a tag's name will not include anything after a space, for example:
  - `[blur 50]` the tag name will be `blur`, and `50` is an argument to `blur`.
- Each set of primary tagged layers will be turned on and off and then exported in turn.
  - That means multiple layers can have the same tag, so you can toggle layers in your foreground and background together, for example:
    - A layer named `foreground [1]` and a separate layer named `background [1]`
- A layer can have multiple tags in the name: `scene [1][2]`
  - This will export with this layer visible for both tags.
- A primary tag is not necessary. If no primary tag is provided, then the whole picture is exported as is.

##### Secondary tags
- Tags with an `@` in the name will be treated as secondary tags.
- Text before the `@` is the tag name, and text after the `@` is the exclusion group.
  - The exclusion group can be empty.
  - Valid secondary tag names: `[jp@]`, `[jp@text]`
- These tags will be exported in combination with primary tags, for example:
  - If you have layers tagged `[1]`, `[thing@]` `[jp@text]`, and `[en@text]`, then what will be exported is `1`, `1-thing`, `1-thing-jp`, `1-thing-en`, `1-jp`, `1-en`
  - Because `[jp@text]` and `[en@text]` share the same exclusion group `text`, they will never be enabled together.
  - If there was a second primary tag `[2]` for example, the whole set of combinations would be exported again but with `2` instead of `1`

#### Image filters
- Tags with special names will be treated as filters on the colors below them.
- Filters can double as export tags too.
- If you want a filter to not be treated as an export tag, you can preceed it with `#` to set the ignore flag, for example `[#censor]`
- Filters can have arguments as well to control their behavior, separated by spaces, for example `[#censor 50]`
- If you want the filter to apply to layers outside of the group it is in, then the group blend mode should be set to `pass-through`, otherwise it may blend with transparent black pixels if the filter is over a transparent part of a group. The blur and motion blur filters apply to alpha as well, so they should behave as expected in isolated groups.
- If multiple filters are enabled in one layer, they will be applied from left to right on top of each result, example:
  - `[#censor][#blur]` will apply a mosaic, and then a blur on top of that mosaic.
- Blend modes and clipping layers applied directly to filter layers are ignored.

##### Available default filters:
- `[censor mosaic_factor apply_to_alpha]`
  - If the `mosaic_factor` argument is omitted, then it is defaulted to 100, which means 1/100th the smallest dimension, (or 4 pixels, whichever is larger) in order to be Pixiv compliant.
  - `apply_to_alpha` defaults to False. Any value is treated as True.
  - Typically you will want this filter to be a secondary tag, for example: `[censor@]`, so you can have censored and uncensored outputs.
- `[blur size]`
  - The `size` argument defaults to 50 if omitted.
  - This filter is best used to create a non-destructive blur, such as for a background layer. You can fill an entire layer and set it to `[#blur 8]` for example.
- `[motion-blur angle size]`
  - `angle` is in degrees, starting from horizontal to the right; Default 0.
  - `size` defaults to 50.
  - Best used for non-destructive blur: `[#motion-blur 45 20]`

##### Adding a new filter:
In your own script:
```py
# my-export.py
from psd_export import (export, filters, util, blendfuncs)
import numpy as np

my_arg1_default = 1.0

# Register the filter with this decorator:
@filters.filter('my-filter')
# Only positional arguments work right now. The result of this function replaces the destination color and alpha.
def some_filter(color_dst, color_src, alpha_dst, alpha_src, arg1=None, arg2=100, *_):
    # Cast arguments to your desired types, as they will come in as strings.
    if arg1 is None:
        arg1 = my_arg1_default
    arg1 = float(arg1)
    # Manipulate color and alpha numpy arrays, in-place if you want.
    color = np.subtract(arg1, color, out=color)
    color = blendfuncs.lerp(color_dst, color, alpha_src)
    # Always return the same shaped arrays as a tuple:
    return color, alpha

if __name__ == '__main__':
    # Add your own command line arguments if needed.
    export.arg_parser.add_argument('--my-arg1', default=my_arg1_default, type=float,
        help='Set the arg1 default parameter.')
    args = export.arg_parser.parse_args()
    my_arg1_default = args.my_arg1

    export.main()
```

Apply it to a layer in your PSD, for example:
`[my-filter 20.4]` or `[#my-filter]`, etc.

---
### Examples
In the layers below, there are 2 primary tags and 3 secondary tags (with two unique exclusion groups):

Primary tags: `1`, `2`

Secondary tags: `jp`, `en`, `censor`

Exclusion groups: `text`, `<empty>`

Groups with primary tags will be exported again even if the secondary tag does not exist under that group! This keeps the exported folders uniformly sized for publishing, so different folders may appear to have duplicate outputs.

Example layer configuration in SAI:

![image](https://user-images.githubusercontent.com/82557197/232172462-a52cf239-0adc-4ad0-9601-8d6d79fd158d.png)

Example output from script, showing every valid combination:

![image](https://user-images.githubusercontent.com/82557197/232172483-20d1089f-6ccf-46f4-96ed-4651d9e7b1e7.png)

Folder after exporting everything:

![image](https://user-images.githubusercontent.com/82557197/232172514-39985f21-b5ac-4f63-9be6-483355dada4b.png)

Example of a layer with the tag `[censor@]` (the layer does not need to be set to visible before exporting):

![image](https://user-images.githubusercontent.com/82557197/232172599-7146521c-f539-4753-81ec-f21d4eb98aa9.png)

After exporting:

![image](https://user-images.githubusercontent.com/82557197/232172637-4b4e397c-53cb-4449-8525-bca0603d9ec1.png)

---
### Blendmode status:
| Blendmode | Status |
| - | - |
| Normal | Pass |
| Multiply | Pass |
| Screen | Pass |
| Overlay | Pass |
| Linear Burn (Shade) | Pass |
| Linear Dodge (Shine) | Pass |
| Linear Light (Shade/Shine) | Pass |
| Color Burn (Burn) | Pass |
| Color Dodge (Dodge) | Pass |
| Vivid Light (Burn/Dodge) | Pass |
| Soft Light | Pass |
| Hard Light | Pass |
| Pin Light | Pass |
| Hard Mix | Small precision error for near-black colors, can look slightly different from SAI |
| Darken | Pass |
| Lighten | Pass |
| Darken Color | Pass |
| Lighten Color | Pass |
| Difference | Pass |
| Exclude | Pass |
| Subtract | Pass |
| Divide | Pass |
| Hue | Pass |
| Saturation | Pass |
| Color | Pass |
| Luminosity | Pass |
| [TS] Linear Burn (Shade) | Pass |
| [TS] Linear Dodge (Shine) | Pass |
| [TS] Linear Light (Shade/Shine) | Pass |
| [TS] Color Burn (Burn) | Small precision error for near-black colors, can look slightly different from SAI |
| [TS] Color Dodge (Dodge) | Pass |
| [TS] Vivid Light (Burn/Dodge) | Pass |
| [TS] Hard Mix | Small precision error for near-black colors, can look slightly different from SAI |
| [TS] Difference | Pass |

### Missing PSD features:
- Other things that are not implemented (also not implemented in `psd-tools`):
  - Adjustment layers (gradient map, color balance, etc.)
  - Layer effects (shadow, glow, overlay, strokes, etc.)
  - Font rendering
  - Probably some other things I'm unaware of.

---
### TODO:
- Fix blend modes that don't quite work properly. This is low priority because I hardly use these modes myself or merge the results when painting.
- Binary package export

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "psd-export",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.11.2",
    "maintainer_email": "",
    "keywords": "exporter,psd,art",
    "author": "cromachina",
    "author_email": "",
    "download_url": "https://files.pythonhosted.org/packages/37/f2/8dd2ddd183ffacf973cc2888104b1587739b921c6bfbc92107c0dea5f20c/psd-export-1.0.28.tar.gz",
    "platform": null,
    "description": "# psd-export\n\n- Fast multi-threaded exporting of PSDs with `[tagged]` layers for variants.\n- Special named layers can be used to apply filters like mosaic or gaussian blur, or whatever else you can hook in.\n- This tool is primarily meant to be compatible with PSDs exported from `PaintTool SAIv2` and `Clip Studio Paint`.\n\n---\n### Why\nFor my art workflow, I typically make a bunch variation layers and also need to apply mosaics to all of them. As a manual process, exporting every variant can take several minutes, with lots of clicking everywhere to turn layers on and off (potentially missing layers by accident) and then adding mosaics can be another 10 or 20 minutes of extra work. If I find I need to change something in my pictures and export again, I have to repeat this whole ordeal. This script puts this export process on the order of seconds, saving me a lot of time and pain.\n\n---\n### Installation\n- Install python: https://www.python.org/downloads/\n- Run `pip install psd-export` to install the script.\n- Run `psd-export` to export any PSD files in the current directory.\n- Run `psd-export --help` for more command line arguments.\n\n---\n### Building from source\n- Install a C compiler (like MSVC, GCC, Clang)\n- Install extra dependencies: `pip install setuptools wheel cython numpy`\n- Install this repository locally: `pip install -e .`\n- If you modify a Cython file (.pyx), then rebuild it with: `python setup.py build_ext --inplace`\n\n---\n### Setting up the PSD\n\n#### Automatic Exporting\n\n##### Primary tags\n- Add tags surrounded by `[]` to the names of layers that you want as part of an exported picture.\n  - A layer name can contain anything else outside of tags: `scene [1]`, which will be ignored.\n- Because whitespace is used to delimit arguments to filters, a tag's name will not include anything after a space, for example:\n  - `[blur 50]` the tag name will be `blur`, and `50` is an argument to `blur`.\n- Each set of primary tagged layers will be turned on and off and then exported in turn.\n  - That means multiple layers can have the same tag, so you can toggle layers in your foreground and background together, for example:\n    - A layer named `foreground [1]` and a separate layer named `background [1]`\n- A layer can have multiple tags in the name: `scene [1][2]`\n  - This will export with this layer visible for both tags.\n- A primary tag is not necessary. If no primary tag is provided, then the whole picture is exported as is.\n\n##### Secondary tags\n- Tags with an `@` in the name will be treated as secondary tags.\n- Text before the `@` is the tag name, and text after the `@` is the exclusion group.\n  - The exclusion group can be empty.\n  - Valid secondary tag names: `[jp@]`, `[jp@text]`\n- These tags will be exported in combination with primary tags, for example:\n  - If you have layers tagged `[1]`, `[thing@]` `[jp@text]`, and `[en@text]`, then what will be exported is `1`, `1-thing`, `1-thing-jp`, `1-thing-en`, `1-jp`, `1-en`\n  - Because `[jp@text]` and `[en@text]` share the same exclusion group `text`, they will never be enabled together.\n  - If there was a second primary tag `[2]` for example, the whole set of combinations would be exported again but with `2` instead of `1`\n\n#### Image filters\n- Tags with special names will be treated as filters on the colors below them.\n- Filters can double as export tags too.\n- If you want a filter to not be treated as an export tag, you can preceed it with `#` to set the ignore flag, for example `[#censor]`\n- Filters can have arguments as well to control their behavior, separated by spaces, for example `[#censor 50]`\n- If you want the filter to apply to layers outside of the group it is in, then the group blend mode should be set to `pass-through`, otherwise it may blend with transparent black pixels if the filter is over a transparent part of a group. The blur and motion blur filters apply to alpha as well, so they should behave as expected in isolated groups.\n- If multiple filters are enabled in one layer, they will be applied from left to right on top of each result, example:\n  - `[#censor][#blur]` will apply a mosaic, and then a blur on top of that mosaic.\n- Blend modes and clipping layers applied directly to filter layers are ignored.\n\n##### Available default filters:\n- `[censor mosaic_factor apply_to_alpha]`\n  - If the `mosaic_factor` argument is omitted, then it is defaulted to 100, which means 1/100th the smallest dimension, (or 4 pixels, whichever is larger) in order to be Pixiv compliant.\n  - `apply_to_alpha` defaults to False. Any value is treated as True.\n  - Typically you will want this filter to be a secondary tag, for example: `[censor@]`, so you can have censored and uncensored outputs.\n- `[blur size]`\n  - The `size` argument defaults to 50 if omitted.\n  - This filter is best used to create a non-destructive blur, such as for a background layer. You can fill an entire layer and set it to `[#blur 8]` for example.\n- `[motion-blur angle size]`\n  - `angle` is in degrees, starting from horizontal to the right; Default 0.\n  - `size` defaults to 50.\n  - Best used for non-destructive blur: `[#motion-blur 45 20]`\n\n##### Adding a new filter:\nIn your own script:\n```py\n# my-export.py\nfrom psd_export import (export, filters, util, blendfuncs)\nimport numpy as np\n\nmy_arg1_default = 1.0\n\n# Register the filter with this decorator:\n@filters.filter('my-filter')\n# Only positional arguments work right now. The result of this function replaces the destination color and alpha.\ndef some_filter(color_dst, color_src, alpha_dst, alpha_src, arg1=None, arg2=100, *_):\n    # Cast arguments to your desired types, as they will come in as strings.\n    if arg1 is None:\n        arg1 = my_arg1_default\n    arg1 = float(arg1)\n    # Manipulate color and alpha numpy arrays, in-place if you want.\n    color = np.subtract(arg1, color, out=color)\n    color = blendfuncs.lerp(color_dst, color, alpha_src)\n    # Always return the same shaped arrays as a tuple:\n    return color, alpha\n\nif __name__ == '__main__':\n    # Add your own command line arguments if needed.\n    export.arg_parser.add_argument('--my-arg1', default=my_arg1_default, type=float,\n        help='Set the arg1 default parameter.')\n    args = export.arg_parser.parse_args()\n    my_arg1_default = args.my_arg1\n\n    export.main()\n```\n\nApply it to a layer in your PSD, for example:\n`[my-filter 20.4]` or `[#my-filter]`, etc.\n\n---\n### Examples\nIn the layers below, there are 2 primary tags and 3 secondary tags (with two unique exclusion groups):\n\nPrimary tags: `1`, `2`\n\nSecondary tags: `jp`, `en`, `censor`\n\nExclusion groups: `text`, `<empty>`\n\nGroups with primary tags will be exported again even if the secondary tag does not exist under that group! This keeps the exported folders uniformly sized for publishing, so different folders may appear to have duplicate outputs.\n\nExample layer configuration in SAI:\n\n![image](https://user-images.githubusercontent.com/82557197/232172462-a52cf239-0adc-4ad0-9601-8d6d79fd158d.png)\n\nExample output from script, showing every valid combination:\n\n![image](https://user-images.githubusercontent.com/82557197/232172483-20d1089f-6ccf-46f4-96ed-4651d9e7b1e7.png)\n\nFolder after exporting everything:\n\n![image](https://user-images.githubusercontent.com/82557197/232172514-39985f21-b5ac-4f63-9be6-483355dada4b.png)\n\nExample of a layer with the tag `[censor@]` (the layer does not need to be set to visible before exporting):\n\n![image](https://user-images.githubusercontent.com/82557197/232172599-7146521c-f539-4753-81ec-f21d4eb98aa9.png)\n\nAfter exporting:\n\n![image](https://user-images.githubusercontent.com/82557197/232172637-4b4e397c-53cb-4449-8525-bca0603d9ec1.png)\n\n---\n### Blendmode status:\n| Blendmode | Status |\n| - | - |\n| Normal | Pass |\n| Multiply | Pass |\n| Screen | Pass |\n| Overlay | Pass |\n| Linear Burn (Shade) | Pass |\n| Linear Dodge (Shine) | Pass |\n| Linear Light (Shade/Shine) | Pass |\n| Color Burn (Burn) | Pass |\n| Color Dodge (Dodge) | Pass |\n| Vivid Light (Burn/Dodge) | Pass |\n| Soft Light | Pass |\n| Hard Light | Pass |\n| Pin Light | Pass |\n| Hard Mix | Small precision error for near-black colors, can look slightly different from SAI |\n| Darken | Pass |\n| Lighten | Pass |\n| Darken Color | Pass |\n| Lighten Color | Pass |\n| Difference | Pass |\n| Exclude | Pass |\n| Subtract | Pass |\n| Divide | Pass |\n| Hue | Pass |\n| Saturation | Pass |\n| Color | Pass |\n| Luminosity | Pass |\n| [TS] Linear Burn (Shade) | Pass |\n| [TS] Linear Dodge (Shine) | Pass |\n| [TS] Linear Light (Shade/Shine) | Pass |\n| [TS] Color Burn (Burn) | Small precision error for near-black colors, can look slightly different from SAI |\n| [TS] Color Dodge (Dodge) | Pass |\n| [TS] Vivid Light (Burn/Dodge) | Pass |\n| [TS] Hard Mix | Small precision error for near-black colors, can look slightly different from SAI |\n| [TS] Difference | Pass |\n\n### Missing PSD features:\n- Other things that are not implemented (also not implemented in `psd-tools`):\n  - Adjustment layers (gradient map, color balance, etc.)\n  - Layer effects (shadow, glow, overlay, strokes, etc.)\n  - Font rendering\n  - Probably some other things I'm unaware of.\n\n---\n### TODO:\n- Fix blend modes that don't quite work properly. This is low priority because I hardly use these modes myself or merge the results when painting.\n- Binary package export\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2022 cromachina  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "Fast exporting of PSDs with [tagged] layers for variants.",
    "version": "1.0.28",
    "project_urls": {
        "Homepage": "https://github.com/cromachina/psd-export"
    },
    "split_keywords": [
        "exporter",
        "psd",
        "art"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2022dca35b47dea2cce6a4a11406988e0c075118032f46945c2b90f6a1171e4e",
                "md5": "cd463d01a59eace3a7fca319eee177c8",
                "sha256": "015b15b27a82d8a870c72d52a38531790da30710726fd239bb3730b29d3ace43"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cd463d01a59eace3a7fca319eee177c8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 404085,
            "upload_time": "2024-01-26T04:35:40",
            "upload_time_iso_8601": "2024-01-26T04:35:40.965996Z",
            "url": "https://files.pythonhosted.org/packages/20/22/dca35b47dea2cce6a4a11406988e0c075118032f46945c2b90f6a1171e4e/psd_export-1.0.28-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9c39c094f60b2cea65c46fd67ef2f14dd9b7f8682db1dbe4dce38260dfb7be54",
                "md5": "800b37c5729af8cce56f2ad264654e88",
                "sha256": "4242e27dcced868b51d0b620d3a0975291d2155d3a0194aacb1d26fe783e6d4c"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "800b37c5729af8cce56f2ad264654e88",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 389562,
            "upload_time": "2024-01-26T04:35:43",
            "upload_time_iso_8601": "2024-01-26T04:35:43.113719Z",
            "url": "https://files.pythonhosted.org/packages/9c/39/c094f60b2cea65c46fd67ef2f14dd9b7f8682db1dbe4dce38260dfb7be54/psd_export-1.0.28-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "26f05e4971c0783782d435bb56b8295af87cad607597241b081492386e667bb7",
                "md5": "f0bce7f4bd32e04f7745b3f13767c3ba",
                "sha256": "0b1a14c6b41008d4d83dccbf4ee5d3c273ae0d27a23d1b3e3b32cc2db228d51f"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f0bce7f4bd32e04f7745b3f13767c3ba",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1079243,
            "upload_time": "2024-01-26T04:35:44",
            "upload_time_iso_8601": "2024-01-26T04:35:44.601730Z",
            "url": "https://files.pythonhosted.org/packages/26/f0/5e4971c0783782d435bb56b8295af87cad607597241b081492386e667bb7/psd_export-1.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d3cded8b3f0467b104246e9c1df6e5328834f06cd664c8ebbae7656f7f010300",
                "md5": "5ba14192ab9e02273b06479e8e639a63",
                "sha256": "fd412d0950c0bae5aa281be4259130e4aa21399cb5d5d178f43165c79fc7557d"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5ba14192ab9e02273b06479e8e639a63",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1093269,
            "upload_time": "2024-01-26T04:35:46",
            "upload_time_iso_8601": "2024-01-26T04:35:46.670333Z",
            "url": "https://files.pythonhosted.org/packages/d3/cd/ed8b3f0467b104246e9c1df6e5328834f06cd664c8ebbae7656f7f010300/psd_export-1.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c035b61be29586f21c88bc19731906c71a957c32e6a857f9b0cb3c0e653ec556",
                "md5": "e603bc4e3afc7b5e6c04acc81e4797cd",
                "sha256": "384e12912db6aeee73416f8c10596c7a8464efbe88bc8f11d12973c4a9f089e9"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "e603bc4e3afc7b5e6c04acc81e4797cd",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1050865,
            "upload_time": "2024-01-26T04:35:48",
            "upload_time_iso_8601": "2024-01-26T04:35:48.127465Z",
            "url": "https://files.pythonhosted.org/packages/c0/35/b61be29586f21c88bc19731906c71a957c32e6a857f9b0cb3c0e653ec556/psd_export-1.0.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "64007669462cc0b15bb624cf0d458f60b4415bb9d852252495caee625474fa59",
                "md5": "a6e0ac48dab5bf8a1314c185578d0b63",
                "sha256": "76ccc887aaa603049000c16df14177cf633dc88ccb31279d33b5601e04bce90a"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-musllinux_1_1_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a6e0ac48dab5bf8a1314c185578d0b63",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1087195,
            "upload_time": "2024-01-26T04:35:49",
            "upload_time_iso_8601": "2024-01-26T04:35:49.812793Z",
            "url": "https://files.pythonhosted.org/packages/64/00/7669462cc0b15bb624cf0d458f60b4415bb9d852252495caee625474fa59/psd_export-1.0.28-cp311-cp311-musllinux_1_1_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "64f890d35898c74cdb8e15eee4ba1c6b56379229091ea706520b59b0b3d75c93",
                "md5": "02e7cdbe589ae7158ad6e8a797548648",
                "sha256": "2cec8a066053339ea8627703329adc04116c1d91f087811a55f1cd4366e73339"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "02e7cdbe589ae7158ad6e8a797548648",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1043774,
            "upload_time": "2024-01-26T04:35:51",
            "upload_time_iso_8601": "2024-01-26T04:35:51.512966Z",
            "url": "https://files.pythonhosted.org/packages/64/f8/90d35898c74cdb8e15eee4ba1c6b56379229091ea706520b59b0b3d75c93/psd_export-1.0.28-cp311-cp311-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3ddce18fe5d295b3b6d081c419aad2281d32c4138d5c6ad5398494e766c0ba43",
                "md5": "46c56ea8615bce0d62ce5f41ade30454",
                "sha256": "dcf0ea38108ac0da1d0ab5964fbbfc192b9239985d9ca886ad0c1d25319fe690"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "46c56ea8615bce0d62ce5f41ade30454",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 1098786,
            "upload_time": "2024-01-26T04:35:53",
            "upload_time_iso_8601": "2024-01-26T04:35:53.432302Z",
            "url": "https://files.pythonhosted.org/packages/3d/dc/e18fe5d295b3b6d081c419aad2281d32c4138d5c6ad5398494e766c0ba43/psd_export-1.0.28-cp311-cp311-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "119ae96382aa72160301fd49421f7d67286f0ca867552b4fc7d0f31c22a21fb3",
                "md5": "a7a96d2c782a5f5499a54c7c1fe73df7",
                "sha256": "0ceee7bd288643b40ce7f4f34045d555ee50be52bdea61476a3368da5761c25d"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "a7a96d2c782a5f5499a54c7c1fe73df7",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 365724,
            "upload_time": "2024-01-26T04:35:54",
            "upload_time_iso_8601": "2024-01-26T04:35:54.784243Z",
            "url": "https://files.pythonhosted.org/packages/11/9a/e96382aa72160301fd49421f7d67286f0ca867552b4fc7d0f31c22a21fb3/psd_export-1.0.28-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "333f4ac4bf6b4396803f220ebbb015cdd08176735bf4b32a3475cec3aaca3f27",
                "md5": "45390f0ddbc9999ac6fa21d35b8290f8",
                "sha256": "2bd3031ab552b31ce1cb3c2ee29f6f02e7cd5edaaca8a3d8bde645278510797d"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "45390f0ddbc9999ac6fa21d35b8290f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.11.2",
            "size": 383396,
            "upload_time": "2024-01-26T04:35:56",
            "upload_time_iso_8601": "2024-01-26T04:35:56.332519Z",
            "url": "https://files.pythonhosted.org/packages/33/3f/4ac4bf6b4396803f220ebbb015cdd08176735bf4b32a3475cec3aaca3f27/psd_export-1.0.28-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9ed7c79ffd2290bebbee607ca0910179eff3f012bdd2b3500d829218ed8b6087",
                "md5": "d7fb71c1c9e47a6c2232b6a5f4e9de39",
                "sha256": "d58b85af689d59ccd8e960e2df1bd29e630a94eed279921635dbc40e385925a4"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d7fb71c1c9e47a6c2232b6a5f4e9de39",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 397624,
            "upload_time": "2024-01-26T04:35:57",
            "upload_time_iso_8601": "2024-01-26T04:35:57.731466Z",
            "url": "https://files.pythonhosted.org/packages/9e/d7/c79ffd2290bebbee607ca0910179eff3f012bdd2b3500d829218ed8b6087/psd_export-1.0.28-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "39ca50f88b9dfe7b74b8600cef724d5f49ea23e60fd34f427b446cdf6bc271da",
                "md5": "de920c17aa498e964e3d8657a42e2484",
                "sha256": "e5a01da67651a61154e05d0cdce0320fb56dd5734cec1102d6a38b03865e01d5"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "de920c17aa498e964e3d8657a42e2484",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 386748,
            "upload_time": "2024-01-26T04:35:59",
            "upload_time_iso_8601": "2024-01-26T04:35:59.189123Z",
            "url": "https://files.pythonhosted.org/packages/39/ca/50f88b9dfe7b74b8600cef724d5f49ea23e60fd34f427b446cdf6bc271da/psd_export-1.0.28-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9232b3e188c951afb09c0f8d5e26fbb5500cffcd8e91bc52d3f19867c03935c2",
                "md5": "74c0865ce8de9c93a7227998755ce7d2",
                "sha256": "eb70aa7a375335e43b720a106960f08c65059f38909d0555c5e5095f1b2dfb69"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "74c0865ce8de9c93a7227998755ce7d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1064984,
            "upload_time": "2024-01-26T04:36:01",
            "upload_time_iso_8601": "2024-01-26T04:36:01.079468Z",
            "url": "https://files.pythonhosted.org/packages/92/32/b3e188c951afb09c0f8d5e26fbb5500cffcd8e91bc52d3f19867c03935c2/psd_export-1.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bb23d89b25d8dbfaf35d48556b807323774becb0eecd72eac5c89a017762491e",
                "md5": "a0b4d81dc7a4571c003ac205d0a7778a",
                "sha256": "baf967c5b22dda17ca6c23a90084bb000cc84b06c8af477af1c78888e3367ab7"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a0b4d81dc7a4571c003ac205d0a7778a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1085583,
            "upload_time": "2024-01-26T04:36:02",
            "upload_time_iso_8601": "2024-01-26T04:36:02.605695Z",
            "url": "https://files.pythonhosted.org/packages/bb/23/d89b25d8dbfaf35d48556b807323774becb0eecd72eac5c89a017762491e/psd_export-1.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7c70f4ae5025baa2d19e70c0ab2ac9d146ce19195c513cfee2c01b9e63aa6a76",
                "md5": "ab4a544bc58c30a71a6f69a17ca0fe68",
                "sha256": "208503d05e7d170fadf1507e400ff533e9e210e44dc14b1981e7d92fe87e82b7"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "ab4a544bc58c30a71a6f69a17ca0fe68",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1042178,
            "upload_time": "2024-01-26T04:36:04",
            "upload_time_iso_8601": "2024-01-26T04:36:04.031659Z",
            "url": "https://files.pythonhosted.org/packages/7c/70/f4ae5025baa2d19e70c0ab2ac9d146ce19195c513cfee2c01b9e63aa6a76/psd_export-1.0.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ecdbef5c05e07ca26bd55a7177cedd78065ed01d0d04f6b8b828088d9000cf87",
                "md5": "690e5ba124625d63c29ef43ab52a8d84",
                "sha256": "b4ca09476060df6736d5d96e876350f073c836d1727aebaa196d5246f1f29667"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-musllinux_1_1_aarch64.whl",
            "has_sig": false,
            "md5_digest": "690e5ba124625d63c29ef43ab52a8d84",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1078051,
            "upload_time": "2024-01-26T04:36:05",
            "upload_time_iso_8601": "2024-01-26T04:36:05.873589Z",
            "url": "https://files.pythonhosted.org/packages/ec/db/ef5c05e07ca26bd55a7177cedd78065ed01d0d04f6b8b828088d9000cf87/psd_export-1.0.28-cp312-cp312-musllinux_1_1_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3efab0903def2c4f8294de65766a0eabe1d75e706b4ed3c11afe930d2ecd0872",
                "md5": "9b5bf6f944d969c01e12f06a150bdd73",
                "sha256": "85c8a55a3e0906ba324ebce1f6049d7d26bdcca075f8d67f44f44fd177e70d05"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-musllinux_1_1_i686.whl",
            "has_sig": false,
            "md5_digest": "9b5bf6f944d969c01e12f06a150bdd73",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1034085,
            "upload_time": "2024-01-26T04:36:07",
            "upload_time_iso_8601": "2024-01-26T04:36:07.453557Z",
            "url": "https://files.pythonhosted.org/packages/3e/fa/b0903def2c4f8294de65766a0eabe1d75e706b4ed3c11afe930d2ecd0872/psd_export-1.0.28-cp312-cp312-musllinux_1_1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "59785c7838e61776e0690baa6f6705df366e81855f3ae6f2e7aac9f6d2132ba9",
                "md5": "069c821a4c29c0ed16ba8dfa27e5577b",
                "sha256": "49dc281217acab02cefe35fc25d0c7cbafde2b63737873730aed898e4a3404de"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "069c821a4c29c0ed16ba8dfa27e5577b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 1093744,
            "upload_time": "2024-01-26T04:36:08",
            "upload_time_iso_8601": "2024-01-26T04:36:08.986655Z",
            "url": "https://files.pythonhosted.org/packages/59/78/5c7838e61776e0690baa6f6705df366e81855f3ae6f2e7aac9f6d2132ba9/psd_export-1.0.28-cp312-cp312-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "226fc78402e603da68cdfe1cbe45fb6445108d18ab0bb6aca1a1f425beb0f162",
                "md5": "a53af7e367074ba420abf47b40508307",
                "sha256": "8ffee1fdfc49eb3a206b15d1e58ddd2ecdc1fbf6b505abf370f29ddf5e3f5fc0"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-win32.whl",
            "has_sig": false,
            "md5_digest": "a53af7e367074ba420abf47b40508307",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 361945,
            "upload_time": "2024-01-26T04:36:10",
            "upload_time_iso_8601": "2024-01-26T04:36:10.905757Z",
            "url": "https://files.pythonhosted.org/packages/22/6f/c78402e603da68cdfe1cbe45fb6445108d18ab0bb6aca1a1f425beb0f162/psd_export-1.0.28-cp312-cp312-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d3be6fa331ad5a5b34a0bebfb373f4df0fd0f3aa61aaa0e6c2bc4b613c854547",
                "md5": "73cb5bed714abf5d908319c2c9b03a7d",
                "sha256": "732c4f72717d2a9733e5c52d680407c6b158dcf98ec56b7398a2e6de55cdc5cb"
            },
            "downloads": -1,
            "filename": "psd_export-1.0.28-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "73cb5bed714abf5d908319c2c9b03a7d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.11.2",
            "size": 380585,
            "upload_time": "2024-01-26T04:36:12",
            "upload_time_iso_8601": "2024-01-26T04:36:12.287072Z",
            "url": "https://files.pythonhosted.org/packages/d3/be/6fa331ad5a5b34a0bebfb373f4df0fd0f3aa61aaa0e6c2bc4b613c854547/psd_export-1.0.28-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "37f28dd2ddd183ffacf973cc2888104b1587739b921c6bfbc92107c0dea5f20c",
                "md5": "3cf397ac3e2092a5c84af0e5e32c0f7f",
                "sha256": "abe64e16e94bc15ec3a44ef6028b528ca388532fbf32b3bbd5259e316a057d65"
            },
            "downloads": -1,
            "filename": "psd-export-1.0.28.tar.gz",
            "has_sig": false,
            "md5_digest": "3cf397ac3e2092a5c84af0e5e32c0f7f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11.2",
            "size": 258230,
            "upload_time": "2024-01-26T04:36:13",
            "upload_time_iso_8601": "2024-01-26T04:36:13.447446Z",
            "url": "https://files.pythonhosted.org/packages/37/f2/8dd2ddd183ffacf973cc2888104b1587739b921c6bfbc92107c0dea5f20c/psd-export-1.0.28.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-26 04:36:13",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cromachina",
    "github_project": "psd-export",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "psd-export"
}
        
Elapsed time: 0.25260s