perdoo


Nameperdoo JSON
Version 0.5.0 PyPI version JSON
download
home_pageNone
SummaryUnify and organize your comic collection.
upload_time2025-02-01 02:15:33
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords comic comics metadata tagger tagging
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Perdoo

[![PyPI - Python](https://img.shields.io/pypi/pyversions/Perdoo.svg?logo=PyPI&label=Python&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)
[![PyPI - Status](https://img.shields.io/pypi/status/Perdoo.svg?logo=PyPI&label=Status&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)
[![PyPI - Version](https://img.shields.io/pypi/v/Perdoo.svg?logo=PyPI&label=Version&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)
[![PyPI - License](https://img.shields.io/pypi/l/Perdoo.svg?logo=PyPI&label=License&style=flat-square)](https://opensource.org/licenses/MIT)

[![Pre-Commit](https://img.shields.io/badge/pre--commit-enabled-informational?logo=pre-commit&style=flat-square)](https://github.com/pre-commit/pre-commit)
[![Ruff](https://img.shields.io/badge/ruff-enabled-informational?logo=ruff&style=flat-square)](https://github.com/astral-sh/ruff)

[![Github - Contributors](https://img.shields.io/github/contributors/Buried-In-Code/Perdoo.svg?logo=Github&label=Contributors&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/graphs/contributors)
[![Github Action - Testing](https://img.shields.io/github/actions/workflow/status/Buried-In-Code/Perdoo/testing.yaml?branch=main&logo=Github&label=Testing&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/actions/workflows/testing.yaml)
[![Github Action - Publishing](https://img.shields.io/github/actions/workflow/status/Buried-In-Code/Perdoo/publishing.yaml?branch=main&logo=Github&label=Publishing&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/actions/workflows/publishing.yaml)


Perdoo is designed to assist in sorting and organizing your comic collection by utilizing metadata files stored within comic archives.\
Perdoo standardizes all your digital comics into a unified format (cb7, cbt, or cbz).\
It adds and/or updates metadata files using supported services.\
Unlike other tagging tools, Perdoo employs a manual approach when metadata files are absent, prompting users to enter the necessary Publisher/Series/Issue details for search purposes.

## Installation

### Pipx

1. Ensure you have [Pipx](https://pipx.pypa.io/stable/) installed: `pipx --version`
2. Install the project: `pipx install perdoo`

## Usage

<details><summary>Perdoo Commands</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo --help`](docs/img/perdoo-commands.svg)

</details>
<details><summary>Perdoo import</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo import --help`](docs/img/perdoo-import.svg)

</details>

### Perdoo archive Commands

<details><summary>Perdoo archive view</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo archive view --help`](docs/img/perdoo-archive-view.svg)

</details>

### Perdoo settings Commands

<details><summary>Perdoo settings view</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo settings view --help`](docs/img/perdoo-settings-view.svg)

</details>
<details><summary>Perdoo settings locate</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo settings locate --help`](docs/img/perdoo-settings-locate.svg)

</details>
<details><summary>Perdoo settings update</summary>

  <!-- RICH-CODEX hide_command: true -->
  ![`uv run Perdoo settings update --help`](docs/img/perdoo-settings-update.svg)

</details>

## Supported Formats

### Input Extensions

- .cbr
- .cbt
- .cbz
- .cb7 _(Requires installing `cb7` dependencies: `pipx install perdoo[cb7]`)_

### Output Extensions

- .cbt
- .cbz _(Default)_
- .cb7 _(Requires installing `cb7` dependencies: `pipx install perdoo[cb7]`)_

### Metadata Files

- [MetronInfo.xml](https://github.com/Metron-Project/metroninfo)
- Perdoo supports a slightly modified [ComicInfo.xml](https://github.com/anansi-project/comicinfo) to ignore field ordering.

## Services

- [Comicvine](https://comicvine.gamespot.com) using the [Simyan](https://github.com/Metron-Project/Simyan) library.
- [Marvel](https://www.marvel.com/comics) using the [Esak](https://github.com/Metron-Project/Esak) library.
- [Metron](https://metron.cloud) using the [Mokkari](https://github.com/Metron-Project/Mokkari) library.

## File Renaming and Organization

File naming and organization uses a pattern-based approach, it tries to name based on the MetronInfo data with a fallback to ComicInfo.
Naming is done based on the Comic Format, set the value to `""` and it will fallback to the default setting.

- **_Default_**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_#{number:3}`
- **Annual**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_Annual_#{number:2}`
- **Digital Chapter**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_Chapter_#{number:3}`
- **Graphic Novel**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_GN_#{number:2}`
- **Hardcover**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_HC_#{number:2}`
- **Limited Series**: `""` _Falls back to Default_
- **Omnibus**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_OB_#{number:2}`
- **One-Shot**: `""` _Falls back to Default_
- **Single Issue**: `""` _Falls back to Default_
- **Trade Paperback**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_TPB_#{number:2}`

### Options

- **Padding**: Int and Int-like fields, such as `{number}`, can include optional zero-padding by specifying the length (e.g. `{number:3}` will pad 0's to be atleast 3 digits long, `12` => `012`).
- **Sanitization**: All metadata values are sanitized to remove characters outside the set `0-9a-zA-Z&!-`. Custom characters can still be added directly to patterns.

| Pattern Key          | Description                                            |
| -------------------- | ------------------------------------------------------ |
| `{cover-date}`       | The issue cover date in `yyyy-mm-dd` format.           |
| `{cover-day}`        | The day from the issue cover date.                     |
| `{cover-month}`      | The month from the issue cover date.                   |
| `{cover-year}`       | The year from the issue cover date.                    |
| `{format}`           | The full format name of the series.                    |
| `{id}`               | The primary id of the issue.                           |
| `{imprint}`          | The publisher's imprint.                               |
| `{isbn}`             | The issue's ISBN.                                      |
| `{issue-count}`      | The total number of issues in the series.              |
| `{lang}`             | The issue's language.                                  |
| `{number}`           | The issue number.                                      |
| `{publisher-id}`     | The publisher's unique id.                             |
| `{publisher-name}`   | The full name of the publisher.                        |
| `{series-id}`        | The series' unique id.                                 |
| `{series-name}`      | The full name of the series.                           |
| `{series-sort-name}` | Sort-friendly name (omits leading "The", "A", etc...). |
| `{series-year}`      | The year the series started.                           |
| `{store-date}`       | The store date of the issue in `yyyy-mm-dd` format.    |
| `{store-day}`        | The day from the issue store date.                     |
| `{store-month}`      | The month from the issue store date.                   |
| `{store-year}`       | The year from the issue store date.                    |
| `{title}`            | The issue title.                                       |
| `{upc}`              | The issue's UPC.                                       |
| `{volume}`           | The volume of the series.                              |

## Socials

[![Social - Fosstodon](https://img.shields.io/badge/%40BuriedInCode-teal?label=Fosstodon&logo=mastodon&style=for-the-badge)](https://fosstodon.org/@BuriedInCode)\
[![Social - Matrix](https://img.shields.io/matrix/The-Dev-Environment:matrix.org?label=The-Dev-Environment&logo=matrix&style=for-the-badge)](https://matrix.to/#/#The-Dev-Environment:matrix.org)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "perdoo",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "comic, comics, metadata, tagger, tagging",
    "author": null,
    "author_email": "BuriedInCode <BuriedInCode@tuta.io>",
    "download_url": "https://files.pythonhosted.org/packages/ca/60/a0f01f3c2e8572f91aafc44d37c579a6ff08164f1c11ec10c1fec88aa49c/perdoo-0.5.0.tar.gz",
    "platform": null,
    "description": "# Perdoo\n\n[![PyPI - Python](https://img.shields.io/pypi/pyversions/Perdoo.svg?logo=PyPI&label=Python&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)\n[![PyPI - Status](https://img.shields.io/pypi/status/Perdoo.svg?logo=PyPI&label=Status&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)\n[![PyPI - Version](https://img.shields.io/pypi/v/Perdoo.svg?logo=PyPI&label=Version&style=flat-square)](https://pypi.python.org/pypi/Perdoo/)\n[![PyPI - License](https://img.shields.io/pypi/l/Perdoo.svg?logo=PyPI&label=License&style=flat-square)](https://opensource.org/licenses/MIT)\n\n[![Pre-Commit](https://img.shields.io/badge/pre--commit-enabled-informational?logo=pre-commit&style=flat-square)](https://github.com/pre-commit/pre-commit)\n[![Ruff](https://img.shields.io/badge/ruff-enabled-informational?logo=ruff&style=flat-square)](https://github.com/astral-sh/ruff)\n\n[![Github - Contributors](https://img.shields.io/github/contributors/Buried-In-Code/Perdoo.svg?logo=Github&label=Contributors&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/graphs/contributors)\n[![Github Action - Testing](https://img.shields.io/github/actions/workflow/status/Buried-In-Code/Perdoo/testing.yaml?branch=main&logo=Github&label=Testing&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/actions/workflows/testing.yaml)\n[![Github Action - Publishing](https://img.shields.io/github/actions/workflow/status/Buried-In-Code/Perdoo/publishing.yaml?branch=main&logo=Github&label=Publishing&style=flat-square)](https://github.com/Buried-In-Code/Perdoo/actions/workflows/publishing.yaml)\n\n\nPerdoo is designed to assist in sorting and organizing your comic collection by utilizing metadata files stored within comic archives.\\\nPerdoo standardizes all your digital comics into a unified format (cb7, cbt, or cbz).\\\nIt adds and/or updates metadata files using supported services.\\\nUnlike other tagging tools, Perdoo employs a manual approach when metadata files are absent, prompting users to enter the necessary Publisher/Series/Issue details for search purposes.\n\n## Installation\n\n### Pipx\n\n1. Ensure you have [Pipx](https://pipx.pypa.io/stable/) installed: `pipx --version`\n2. Install the project: `pipx install perdoo`\n\n## Usage\n\n<details><summary>Perdoo Commands</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo --help`](docs/img/perdoo-commands.svg)\n\n</details>\n<details><summary>Perdoo import</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo import --help`](docs/img/perdoo-import.svg)\n\n</details>\n\n### Perdoo archive Commands\n\n<details><summary>Perdoo archive view</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo archive view --help`](docs/img/perdoo-archive-view.svg)\n\n</details>\n\n### Perdoo settings Commands\n\n<details><summary>Perdoo settings view</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo settings view --help`](docs/img/perdoo-settings-view.svg)\n\n</details>\n<details><summary>Perdoo settings locate</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo settings locate --help`](docs/img/perdoo-settings-locate.svg)\n\n</details>\n<details><summary>Perdoo settings update</summary>\n\n  <!-- RICH-CODEX hide_command: true -->\n  ![`uv run Perdoo settings update --help`](docs/img/perdoo-settings-update.svg)\n\n</details>\n\n## Supported Formats\n\n### Input Extensions\n\n- .cbr\n- .cbt\n- .cbz\n- .cb7 _(Requires installing `cb7` dependencies: `pipx install perdoo[cb7]`)_\n\n### Output Extensions\n\n- .cbt\n- .cbz _(Default)_\n- .cb7 _(Requires installing `cb7` dependencies: `pipx install perdoo[cb7]`)_\n\n### Metadata Files\n\n- [MetronInfo.xml](https://github.com/Metron-Project/metroninfo)\n- Perdoo supports a slightly modified [ComicInfo.xml](https://github.com/anansi-project/comicinfo) to ignore field ordering.\n\n## Services\n\n- [Comicvine](https://comicvine.gamespot.com) using the [Simyan](https://github.com/Metron-Project/Simyan) library.\n- [Marvel](https://www.marvel.com/comics) using the [Esak](https://github.com/Metron-Project/Esak) library.\n- [Metron](https://metron.cloud) using the [Mokkari](https://github.com/Metron-Project/Mokkari) library.\n\n## File Renaming and Organization\n\nFile naming and organization uses a pattern-based approach, it tries to name based on the MetronInfo data with a fallback to ComicInfo.\nNaming is done based on the Comic Format, set the value to `\"\"` and it will fallback to the default setting.\n\n- **_Default_**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_#{number:3}`\n- **Annual**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_Annual_#{number:2}`\n- **Digital Chapter**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_Chapter_#{number:3}`\n- **Graphic Novel**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_GN_#{number:2}`\n- **Hardcover**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_HC_#{number:2}`\n- **Limited Series**: `\"\"` _Falls back to Default_\n- **Omnibus**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_OB_#{number:2}`\n- **One-Shot**: `\"\"` _Falls back to Default_\n- **Single Issue**: `\"\"` _Falls back to Default_\n- **Trade Paperback**: `{publisher-name}/{series-name}-v{volume}/{series-name}-v{volume}_TPB_#{number:2}`\n\n### Options\n\n- **Padding**: Int and Int-like fields, such as `{number}`, can include optional zero-padding by specifying the length (e.g. `{number:3}` will pad 0's to be atleast 3 digits long, `12` => `012`).\n- **Sanitization**: All metadata values are sanitized to remove characters outside the set `0-9a-zA-Z&!-`. Custom characters can still be added directly to patterns.\n\n| Pattern Key          | Description                                            |\n| -------------------- | ------------------------------------------------------ |\n| `{cover-date}`       | The issue cover date in `yyyy-mm-dd` format.           |\n| `{cover-day}`        | The day from the issue cover date.                     |\n| `{cover-month}`      | The month from the issue cover date.                   |\n| `{cover-year}`       | The year from the issue cover date.                    |\n| `{format}`           | The full format name of the series.                    |\n| `{id}`               | The primary id of the issue.                           |\n| `{imprint}`          | The publisher's imprint.                               |\n| `{isbn}`             | The issue's ISBN.                                      |\n| `{issue-count}`      | The total number of issues in the series.              |\n| `{lang}`             | The issue's language.                                  |\n| `{number}`           | The issue number.                                      |\n| `{publisher-id}`     | The publisher's unique id.                             |\n| `{publisher-name}`   | The full name of the publisher.                        |\n| `{series-id}`        | The series' unique id.                                 |\n| `{series-name}`      | The full name of the series.                           |\n| `{series-sort-name}` | Sort-friendly name (omits leading \"The\", \"A\", etc...). |\n| `{series-year}`      | The year the series started.                           |\n| `{store-date}`       | The store date of the issue in `yyyy-mm-dd` format.    |\n| `{store-day}`        | The day from the issue store date.                     |\n| `{store-month}`      | The month from the issue store date.                   |\n| `{store-year}`       | The year from the issue store date.                    |\n| `{title}`            | The issue title.                                       |\n| `{upc}`              | The issue's UPC.                                       |\n| `{volume}`           | The volume of the series.                              |\n\n## Socials\n\n[![Social - Fosstodon](https://img.shields.io/badge/%40BuriedInCode-teal?label=Fosstodon&logo=mastodon&style=for-the-badge)](https://fosstodon.org/@BuriedInCode)\\\n[![Social - Matrix](https://img.shields.io/matrix/The-Dev-Environment:matrix.org?label=The-Dev-Environment&logo=matrix&style=for-the-badge)](https://matrix.to/#/#The-Dev-Environment:matrix.org)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Unify and organize your comic collection.",
    "version": "0.5.0",
    "project_urls": {
        "Homepage": "https://pypi.org/project/Perdoo",
        "Issues": "https://github.com/Buried-In-Code/Perdoo/issues",
        "Source": "https://github.com/Buried-In-Code/Perdoo"
    },
    "split_keywords": [
        "comic",
        " comics",
        " metadata",
        " tagger",
        " tagging"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8d4f9280626ebe6adf5799410fe475225ce58a1d3a179c8fe133f4895d7ba065",
                "md5": "3c7714a892ce36505001c1c6764e608b",
                "sha256": "f6c93af95aaf14513a7f049ac940539b70b3b6bf9cff10257f3ef9b0aca787dc"
            },
            "downloads": -1,
            "filename": "perdoo-0.5.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3c7714a892ce36505001c1c6764e608b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 39155,
            "upload_time": "2025-02-01T02:15:31",
            "upload_time_iso_8601": "2025-02-01T02:15:31.266114Z",
            "url": "https://files.pythonhosted.org/packages/8d/4f/9280626ebe6adf5799410fe475225ce58a1d3a179c8fe133f4895d7ba065/perdoo-0.5.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ca60a0f01f3c2e8572f91aafc44d37c579a6ff08164f1c11ec10c1fec88aa49c",
                "md5": "a9f70ed98a214ce953f756b2efd68742",
                "sha256": "ad958748d098152474e1bee7f3b1c2a512e5c25bdfaf127edca0107e14623c6b"
            },
            "downloads": -1,
            "filename": "perdoo-0.5.0.tar.gz",
            "has_sig": false,
            "md5_digest": "a9f70ed98a214ce953f756b2efd68742",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 34429,
            "upload_time": "2025-02-01T02:15:33",
            "upload_time_iso_8601": "2025-02-01T02:15:33.435445Z",
            "url": "https://files.pythonhosted.org/packages/ca/60/a0f01f3c2e8572f91aafc44d37c579a6ff08164f1c11ec10c1fec88aa49c/perdoo-0.5.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-01 02:15:33",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Buried-In-Code",
    "github_project": "Perdoo",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "perdoo"
}
        
Elapsed time: 0.65758s