<div align="center">
<a href="https://github.com/sinkaroid/tomoe/wiki"><img width="500" src="https://cdn.discordapp.com/attachments/952117487166705747/1013588505919762443/tomoe_.png" alt="tomoe"></a>
<h3 align="center">An exalted doujinshi downloader with ease.</h3>
<p align="center">
<a href="https://github.com/sinkaroid/tomoe/actions/workflows/bulk_download.yml"><img src="https://github.com/sinkaroid/tomoe/workflows/modular%20bulk%20download/badge.svg"></a>
<a href="https://codeclimate.com/github/sinkaroid/tomoe/maintainability"><img src="https://api.codeclimate.com/v1/badges/a729e38da1fe1ee520b1/maintainability" /></a>
</p>
Tomoe is a CLI tool for downloading doujinshi from various doujinboards. It's also has built-in modular bulk download and auto render into PDF (**Portable Document Format**) for it's utility, hopefully will be reusable.
<a href="#options">🚀 Commands</a> •
<a href="https://github.com/sinkaroid/tomoe/wiki">Documentation</a> •
<a href="https://github.com/sinkaroid/tomoe/issues/new/choose">Report Issues</a>
</div>
- [Tomoe](#)
- [Features](#features)
- [Tomoe availability](#tomoe-vs-the-doujinboards)
- [Site support](#site-support)
- [Installation](#installation)
- [Prerequisites](#prerequisites)
- [Documentation](https://github.com/sinkaroid/tomoe/wiki)
- [Command usage](#command-usage)
- [Quick examples](#quick-example)
- [Options](#options)
- [Bulk download](#bulk-download)
- [Bulk download using nested list](#bulk-download-using-nested-list)
- [Pronunciation](#pronunciation)
- [Acknowledgements](./CLOSING_REMARKS.md)
- [Legal](#legal)
---
## Tomoe vs. the doujinboards
Tomoe consumes [Jandapress](https://github.com/sinkaroid/jandapress) and uses [janda](https://pypi.org/project/janda/) for the doujin Python library.
**Features availability** Speed or performance may not be accurate because internet connection or API response. Some tests have high resolve time and render a bit longer, because some sources do not provide real extension of an images, tomoe should check and guess it's format.
| Site | Status | Bulk download | Average response |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ---------------- |
| `nhentai` | [![Nhentai download](https://github.com/sinkaroid/tomoe/workflows/Nhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/nhentai.yml) | `Yes` | ~0.52 minutes |
| `pururin` | [![Pururin download](https://github.com/sinkaroid/tomoe/workflows/Pururin%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/pururin.yml) | `Yes` | ~0.63 minutes |
| `hentaifox` | [![Hentaifox download](https://github.com/sinkaroid/tomoe/workflows/Hentaifox%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/hentaifox.yml) | `Yes` | ~0.33 minutes |
| `hentai2read` | [![Hentai2read download](https://github.com/sinkaroid/tomoe/workflows/Hentai2read%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/hentai2read.yml) | `Yes` | ~0.10 minutes |
| `simply-hentai` | [![Simply-hentai download](https://github.com/sinkaroid/tomoe/workflows/Simplyhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/simply.yml) | `Yes` | ~0.29 minutes |
| `asmhentai` | [![Asmhentai download](https://github.com/sinkaroid/tomoe/workflows/Asmhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/asmhentai.yml) | `Yes` | ~0.23 minutes |
| `3hentai` | [![3hentai download](https://github.com/sinkaroid/tomoe/workflows/3hentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/3hentai.yml) | `Yes` | ~0.20 minutes |
## Features
- Plenty of sites coverage
- Built-in auto render into PDF
- Modular bulk download
- Minimalist dependencies
- Download with ease, doesn't require you a lot of arguments
<img src="https://cdn.discordapp.com/attachments/997107089921028136/1014351915578040380/tomoe_.png" width="600" alt="tomoe">
## Site support
Currently tomoe supports the following websites:
- [nhentai.net](https://nhentai.net/)
- [pururin.to](https://pururin.to/)
- [hentaifox.com](https://hentaifox.com/)
- [hentai2read.com](https://hentai2read.com/)
- [simply-hentai.com](https://simply-hentai.com/)
- [asmhentai.com](https://asmhentai.com/)
- [3hentai.net](https://3hentai.net/)
## Prerequisites
<table>
<td><b>NOTE:</b> Python 3.7 or above</td>
</table>
## Installation
`pip install tomoe`
- Or manual build by cloning the repository and run `python setup.py install`
## Command usage
> `tomoe --args <id|path>`
## Quick example
> `tomoe --nhentai 177013`
After that, you could see the download results or throw you an error if something went wrong.
## Options
It's fairly simple to use tomoe
| **Argument** | **Description** | **Example** |
| --------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--nhentai`, int | nhentai | [`tomoe --nhentai 255369`](https://nhentai.net/g/255369/) |
| `--pururin`, int | pururin | [`tomoe --pururin 47226`](https://pururin.to/gallery/47226/crot-sampe-lumpuh) |
| `--hentaifox`, int | hentaifox | [`tomoe --hentaifox 59026`](https://hentaifox.com/gallery/59026/) |
| `--hentai2read`, str | hentai2read | [`tomoe --hentai2read chaldea_life/1`](https://hentai2read.com/chaldea_life/) |
| `--simply`, str | simply-hentai | [`tomoe --simply "fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages"`](https://www.simply-hentai.com/fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages) |
| `--asmhentai`, int | asmhentai | [`tomoe --asmhentai 311851`](https://asmhentai.com/g/311851/)
| `--three`, int | 3hentai | [`tomoe --three 608979`](https://asmhentai.com/g/311851/) |
| `--bulk`, str | custom bulk download | [`tomoe --bulk doujin.json`](/doujin.json) |
| `--pdf`, str | render pdf for each title | [`tomoe --nhentai 255369 --pdf`](https://3hentai.net/d/608979) |
## Bulk download
You can pass multiple id to request bulk download
| **Sites** | **Description** | **Example** |
| ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| nhentai | place multiple id | `tomoe --nhentai 255369 417103 417119` |
| pururin | place multiple id | `tomoe --pururin 47226 64351 56175` |
| hentaifox | place multiple id | `tomoe --hentaifox 59026 61805` |
| hentai2read | place multiple path | `tomoe --hentai2read chaldea_life/1 watashitachi_producersan_ni_mechakucha/1` |
| simply | place multiple chapter | `tomoe --simply "fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages" "original-work/kanchou-manga-cffc37a/all-pages"` |
| asmhentai | place multiple id | `tomoe --asmhentai 311851 210135 309068` |
## Bulk download using nested list
> `tomoe --bulk doujin.json`
If you need to download multiple doujins from each different website, you can do a bulk download using an arbitrary method. Meaning that you can mix and wrap the whole book ids into nested array in a JSON file. Read more about [Understanding Nested Arrays.](https://javascript.plainenglish.io/understanding-the-nested-arrays-fbf3ab13c2b4#:~:text=An%20array%20is%20an%20ordered,the%20element%20of%20an%20array)
Create `doujin.json` in the same directory where you want to run tomoe and follow this structure:
**Note** _You should not change the "book" property_
```js
{
"book": [
{
"nhentai": 177013
},
{
"nhentai": 255369
},
{
"pururin": 47226
},
{
"pururin": 64351
},
{
"hentaifox": 59026
},
{
"hentaifox": 61805
},
{
"asmhentai": 311851
},
{
"asmhentai": 210135
},
{
"hentai2read": "chaldea_life/1"
},
{
"simply": "fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages"
}
]
}
```
Then tell tomoe to resolve all the book ids from the JSON file.
`tomoe --bulk doujin.json`
## Pronunciation
[`ja_JP`](https://www.localeplanet.com/java/ja-JP/index.html) • **to-moe** — commonly translated as "comma", is a comma-like swirl symbol used in Japanese mon. It closely resembles the usual form of a magatama.
## Legal
This tool can be freely copied, modified, altered, distributed without any attribution whatsoever. However, if you feel
like this tool deserves an attribution, mention it. It won't hurt anybody.
> Licence: WTF.
Raw data
{
"_id": null,
"home_page": "https://github.com/sinkaroid/tomoe",
"name": "tomoe",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": null,
"author": "sinkaroid",
"author_email": "anakmancasan@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c3/73/401737de3f2ca189087e5d0481c65a44d7321a7bb66fd0d6a58d270efe4b/tomoe-3.0.19.tar.gz",
"platform": null,
"description": "<div align=\"center\">\r\n<a href=\"https://github.com/sinkaroid/tomoe/wiki\"><img width=\"500\" src=\"https://cdn.discordapp.com/attachments/952117487166705747/1013588505919762443/tomoe_.png\" alt=\"tomoe\"></a>\r\n\r\n<h3 align=\"center\">An exalted doujinshi downloader with ease.</h3>\r\n<p align=\"center\">\r\n\t<a href=\"https://github.com/sinkaroid/tomoe/actions/workflows/bulk_download.yml\"><img src=\"https://github.com/sinkaroid/tomoe/workflows/modular%20bulk%20download/badge.svg\"></a>\r\n\t<a href=\"https://codeclimate.com/github/sinkaroid/tomoe/maintainability\"><img src=\"https://api.codeclimate.com/v1/badges/a729e38da1fe1ee520b1/maintainability\" /></a>\r\n</p>\r\n\r\nTomoe is a CLI tool for downloading doujinshi from various doujinboards. It's also has built-in modular bulk download and auto render into PDF (**Portable Document Format**) for it's utility, hopefully will be reusable.\r\n\r\n<a href=\"#options\">\ud83d\ude80 Commands</a> \u2022\r\n<a href=\"https://github.com/sinkaroid/tomoe/wiki\">Documentation</a> \u2022\r\n<a href=\"https://github.com/sinkaroid/tomoe/issues/new/choose\">Report Issues</a>\r\n\r\n</div>\r\n\r\n- [Tomoe](#)\r\n - [Features](#features)\r\n - [Tomoe availability](#tomoe-vs-the-doujinboards)\r\n - [Site support](#site-support)\r\n - [Installation](#installation)\r\n - [Prerequisites](#prerequisites)\r\n - [Documentation](https://github.com/sinkaroid/tomoe/wiki)\r\n - [Command usage](#command-usage)\r\n - [Quick examples](#quick-example)\r\n - [Options](#options)\r\n - [Bulk download](#bulk-download)\r\n - [Bulk download using nested list](#bulk-download-using-nested-list)\r\n - [Pronunciation](#pronunciation)\r\n - [Acknowledgements](./CLOSING_REMARKS.md)\r\n - [Legal](#legal)\r\n\r\n---\r\n\r\n## Tomoe vs. the doujinboards\r\n\r\nTomoe consumes [Jandapress](https://github.com/sinkaroid/jandapress) and uses [janda](https://pypi.org/project/janda/) for the doujin Python library.\r\n\r\n**Features availability** Speed or performance may not be accurate because internet connection or API response. Some tests have high resolve time and render a bit longer, because some sources do not provide real extension of an images, tomoe should check and guess it's format.\r\n\r\n| Site | Status | Bulk download | Average response | \r\n| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ---------------- | \r\n| `nhentai` | [![Nhentai download](https://github.com/sinkaroid/tomoe/workflows/Nhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/nhentai.yml) | `Yes` | ~0.52 minutes | \r\n| `pururin` | [![Pururin download](https://github.com/sinkaroid/tomoe/workflows/Pururin%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/pururin.yml) | `Yes` | ~0.63 minutes |\r\n| `hentaifox` | [![Hentaifox download](https://github.com/sinkaroid/tomoe/workflows/Hentaifox%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/hentaifox.yml) | `Yes` | ~0.33 minutes |\r\n| `hentai2read` | [![Hentai2read download](https://github.com/sinkaroid/tomoe/workflows/Hentai2read%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/hentai2read.yml) | `Yes` | ~0.10 minutes | \r\n| `simply-hentai` | [![Simply-hentai download](https://github.com/sinkaroid/tomoe/workflows/Simplyhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/simply.yml) | `Yes` | ~0.29 minutes |\r\n| `asmhentai` | [![Asmhentai download](https://github.com/sinkaroid/tomoe/workflows/Asmhentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/asmhentai.yml) | `Yes` | ~0.23 minutes |\r\n| `3hentai` | [![3hentai download](https://github.com/sinkaroid/tomoe/workflows/3hentai%20test/badge.svg)](https://github.com/sinkaroid/tomoe/actions/workflows/3hentai.yml) | `Yes` | ~0.20 minutes |\r\n\r\n## Features\r\n\r\n- Plenty of sites coverage\r\n- Built-in auto render into PDF\r\n- Modular bulk download\r\n- Minimalist dependencies\r\n- Download with ease, doesn't require you a lot of arguments\r\n\r\n<img src=\"https://cdn.discordapp.com/attachments/997107089921028136/1014351915578040380/tomoe_.png\" width=\"600\" alt=\"tomoe\">\r\n\r\n## Site support\r\n\r\nCurrently tomoe supports the following websites:\r\n\r\n- [nhentai.net](https://nhentai.net/)\r\n- [pururin.to](https://pururin.to/)\r\n- [hentaifox.com](https://hentaifox.com/)\r\n- [hentai2read.com](https://hentai2read.com/)\r\n- [simply-hentai.com](https://simply-hentai.com/)\r\n- [asmhentai.com](https://asmhentai.com/)\r\n- [3hentai.net](https://3hentai.net/)\r\n\r\n## Prerequisites\r\n\r\n<table>\r\n\t<td><b>NOTE:</b> Python 3.7 or above</td>\r\n</table>\r\n\r\n## Installation\r\n\r\n`pip install tomoe`\r\n\r\n- Or manual build by cloning the repository and run `python setup.py install`\r\n\r\n## Command usage\r\n\r\n> `tomoe --args <id|path>`\r\n\r\n## Quick example\r\n\r\n> `tomoe --nhentai 177013`\r\n\r\nAfter that, you could see the download results or throw you an error if something went wrong.\r\n\r\n## Options\r\n\r\nIt's fairly simple to use tomoe\r\n\r\n| **Argument** | **Description** | **Example** |\r\n| --------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\r\n| `--nhentai`, int | nhentai | [`tomoe --nhentai 255369`](https://nhentai.net/g/255369/) |\r\n| `--pururin`, int | pururin | [`tomoe --pururin 47226`](https://pururin.to/gallery/47226/crot-sampe-lumpuh) |\r\n| `--hentaifox`, int | hentaifox | [`tomoe --hentaifox 59026`](https://hentaifox.com/gallery/59026/) |\r\n| `--hentai2read`, str | hentai2read | [`tomoe --hentai2read chaldea_life/1`](https://hentai2read.com/chaldea_life/) |\r\n| `--simply`, str | simply-hentai | [`tomoe --simply \"fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages\"`](https://www.simply-hentai.com/fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages) |\r\n| `--asmhentai`, int | asmhentai | [`tomoe --asmhentai 311851`](https://asmhentai.com/g/311851/) \r\n| `--three`, int | 3hentai | [`tomoe --three 608979`](https://asmhentai.com/g/311851/) |\r\n| `--bulk`, str | custom bulk download | [`tomoe --bulk doujin.json`](/doujin.json) |\r\n| `--pdf`, str | render pdf for each title | [`tomoe --nhentai 255369 --pdf`](https://3hentai.net/d/608979) |\r\n\r\n## Bulk download\r\n\r\nYou can pass multiple id to request bulk download\r\n\r\n| **Sites** | **Description** | **Example** |\r\n| ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |\r\n| nhentai | place multiple id | `tomoe --nhentai 255369 417103 417119` |\r\n| pururin | place multiple id | `tomoe --pururin 47226 64351 56175` |\r\n| hentaifox | place multiple id | `tomoe --hentaifox 59026 61805` |\r\n| hentai2read | place multiple path | `tomoe --hentai2read chaldea_life/1 watashitachi_producersan_ni_mechakucha/1` |\r\n| simply | place multiple chapter | `tomoe --simply \"fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages\" \"original-work/kanchou-manga-cffc37a/all-pages\"` |\r\n| asmhentai | place multiple id | `tomoe --asmhentai 311851 210135 309068` |\r\n\r\n## Bulk download using nested list\r\n\r\n> `tomoe --bulk doujin.json`\r\n\r\nIf you need to download multiple doujins from each different website, you can do a bulk download using an arbitrary method. Meaning that you can mix and wrap the whole book ids into nested array in a JSON file. Read more about [Understanding Nested Arrays.](https://javascript.plainenglish.io/understanding-the-nested-arrays-fbf3ab13c2b4#:~:text=An%20array%20is%20an%20ordered,the%20element%20of%20an%20array)\r\n\r\nCreate `doujin.json` in the same directory where you want to run tomoe and follow this structure: \r\n**Note** _You should not change the \"book\" property_\r\n\r\n```js\r\n{\r\n \"book\": [\r\n {\r\n \"nhentai\": 177013\r\n },\r\n {\r\n \"nhentai\": 255369\r\n },\r\n {\r\n \"pururin\": 47226\r\n },\r\n {\r\n \"pururin\": 64351\r\n },\r\n {\r\n \"hentaifox\": 59026\r\n },\r\n {\r\n \"hentaifox\": 61805\r\n },\r\n {\r\n \"asmhentai\": 311851\r\n },\r\n {\r\n \"asmhentai\": 210135\r\n },\r\n {\r\n \"hentai2read\": \"chaldea_life/1\"\r\n },\r\n {\r\n \"simply\": \"fate-grand-order/fgo-no-ashibon-fgo-foot-book/all-pages\"\r\n }\r\n ]\r\n}\r\n```\r\n\r\nThen tell tomoe to resolve all the book ids from the JSON file.\r\n`tomoe --bulk doujin.json`\r\n\r\n## Pronunciation\r\n\r\n[`ja_JP`](https://www.localeplanet.com/java/ja-JP/index.html) \u2022 **to-moe** \u2014 commonly translated as \"comma\", is a comma-like swirl symbol used in Japanese mon. It closely resembles the usual form of a magatama.\r\n\r\n## Legal\r\n\r\nThis tool can be freely copied, modified, altered, distributed without any attribution whatsoever. However, if you feel\r\nlike this tool deserves an attribution, mention it. It won't hurt anybody.\r\n\r\n> Licence: WTF.\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A doujinshi downloader with ease",
"version": "3.0.19",
"project_urls": {
"Discord": "https://discord.gg/8wj4vM5hHM",
"Documentation": "https://github.com/sinkaroid/tomoe/wiki",
"Funding": "https://github.com/sponsors/sinkaroid",
"Homepage": "https://github.com/sinkaroid/tomoe",
"Issue tracker": "https://github.com/sinkaroid/tomoe/issues/new/choose"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c373401737de3f2ca189087e5d0481c65a44d7321a7bb66fd0d6a58d270efe4b",
"md5": "56761a94d4698ade4ff8efe6aa3dcde3",
"sha256": "03cbc619a6400dfe7b8e14b8edccf99cc3c6fa4ab8eb762a78f75aab745e9c22"
},
"downloads": -1,
"filename": "tomoe-3.0.19.tar.gz",
"has_sig": false,
"md5_digest": "56761a94d4698ade4ff8efe6aa3dcde3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14757,
"upload_time": "2024-05-10T16:39:57",
"upload_time_iso_8601": "2024-05-10T16:39:57.800807Z",
"url": "https://files.pythonhosted.org/packages/c3/73/401737de3f2ca189087e5d0481c65a44d7321a7bb66fd0d6a58d270efe4b/tomoe-3.0.19.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-10 16:39:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sinkaroid",
"github_project": "tomoe",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "janda",
"specs": [
[
">=",
"3.1.3"
]
]
},
{
"name": "inputimeout",
"specs": [
[
">=",
"1.0.4"
]
]
},
{
"name": "xhtml2pdf",
"specs": [
[
">=",
"0.2.7"
]
]
}
],
"lcname": "tomoe"
}