Nyora — Python
Read like the world can wait.
The official Python SDK for Nyora — a thin cloud client that scripts your
library, browses ~960 manga sources, and fetches chapters and pages straight
from Python. pip install, create a client, and you're scripting manga in 60
seconds.
What it is
nyora is a thin cloud client for the Nyora manga engine. It talks to the
public Nyora cloud helper at https://api.hasanraza.tech — the
kotatsu-parsers JVM engine with ~960 sources — over a small typed REST API.
There is nothing to compile and no parser engine, JVM, Node.js, or bundle on your
machine: a bare Nyora() points at the cloud by default, so you get the full
catalog the moment you install.
This one install gives you three surfaces:
- a Python library you
import nyorato script from your own code, - the
nyora-clicommand (one-shot subcommands + JSON output), - a terminal reader (TUI), plus Nyora Cloud Sync for a signed-in library.
pip install nyora
📖 Full documentation: nyora.pages.dev/docs/python
Quickstart
from nyora import Nyora
with Nyora() as client: # defaults to the Nyora cloud
source = client.sources.find("mangadex") # resolve by id or fuzzy name
page = client.manga.popular(source.id) # SearchPage of entries
entry = page.entries[0]
details = client.manga.details(source.id, entry.url)
pages = client.manga.pages(source.id, details.chapters[0].url)
for p in pages:
print(p.url) # page image URLs
The client exposes two typed namespaces:
client.sources—list()the loaded sources,catalog()the full ~960-source catalog, orfind(query)by id or fuzzy name.client.manga—popular(...),latest(...),search(...),details(...), andpages(...).
List and search sources
from nyora import Nyora
with Nyora() as client:
for src in client.sources.catalog()[:10]:
print(src.id, src.name, src.lang)
src = client.sources.find("asura")
results = client.manga.search(src.id, "Solo Leveling")
print(results.entries[0].title)
Browse popular / latest
with Nyora() as client:
src = client.sources.find("mangadex").id
popular = client.manga.popular(src, page=1)
latest = client.manga.latest(src, page=1)
for entry in popular.entries[:5]:
print(entry.title, "—", entry.url)
Details and pages
with Nyora() as client:
src = client.sources.find("mangadex").id
entry = client.manga.popular(src).entries[0]
details = client.manga.details(src, entry.url) # metadata + full chapter list
print(details.manga.title, "-", len(details.chapters), "chapters")
pages = client.manga.pages(src, details.chapters[0].url) # branch=... optional
print([p.url for p in pages])
Async fan-out
AsyncNyora mirrors the read API for concurrent requests across many sources:
import asyncio
from nyora import AsyncNyora
async def main():
async with AsyncNyora() as client:
payload = await client.get("/sources")
print(len(payload.get("sources", [])), "sources")
asyncio.run(main())
Point the client somewhere else with
Nyora(base_url=...)or theNYORA_BASE_URLenvironment variable — otherwise it useshttps://api.hasanraza.tech.
Cloud Sync
NyoraSync is Nyora's account + library sync. It signs in against the sync
server https://stream.hasanraza.tech (OAuth2 password grant + rotating JWT),
then does last-write-wins upsert/select over your per-user tables
(nyora_manga, nyora_favourite, nyora_history, nyora_bookmark, …). One
account is shared across the iOS app, the TUI, and the SDKs — favourite a manga
anywhere and it shows up everywhere.
from nyora.sync import NyoraSync
sync = NyoraSync() # -> https://stream.hasanraza.tech
sync.register("me@example.com", "hunter2") # or sync.sign_in(...) if you have an account
sync.sign_in("me@example.com", "hunter2")
# Push favourites (last-write-wins upsert)
sync.upsert("nyora_favourite", [
{"manga_id": "abc123", "source": "mangadex", "title": "Solo Leveling"},
])
# Pull them back (optionally only rows changed after an ISO timestamp)
rows = sync.select("nyora_favourite")
print(rows)
sync.sign_out()
- Methods:
register,sign_in,sign_out,upsert(table, rows),select(table, since=None), plus theis_signed_inproperty. - Tokens persist to
~/.config/nyora/sync.json(respectsXDG_CONFIG_HOME), so a session survives restarts.sign_out()deletes them. - Access tokens auto-refresh on a
401using the stored refresh token.
Command line (nyora-cli)
Installing the package adds the nyora-cli command (aliased as nyora).
Running bare
nyora-clilaunches the terminal reader (TUI). Pass a subcommand for a one-shot command instead.
nyora-cli # no subcommand -> launches the TUI
nyora-cli --help # list all commands and options
nyora-cli sources --search asura
nyora-cli search -s asura "Solo Leveling"
| Command | Description |
|---|---|
sources [--search Q] |
List the source catalog, or fuzzy-filter by name |
search -s SRC [-p PAGE] QUERY |
Search a source |
popular -s SRC [-p PAGE] |
Browse a source's popular titles |
latest -s SRC [-p PAGE] |
Browse a source's latest updates |
details -s SRC URL |
Fetch manga details and the full chapter list |
pages -s SRC CHAPTER_URL [--branch B] |
Resolve page image URLs |
download -s SRC CHAPTER_URL [-o OUT] |
Download one chapter as a .cbz archive |
batch -s SRC MANGA_URL [-o DIR] |
Download every chapter, one .cbz each, into DIR |
version |
Print the package version |
-s/--source accepts a source id or a fuzzy name. Add the global
--json flag to any subcommand to emit raw JSON for piping into jq:
nyora-cli --json popular -s mangadex -p 1 | jq '.entries[].title'
Terminal reader (TUI)
Run bare nyora-cli (or nyora-tui) to open the terminal reader: pick a source,
browse popular/latest/search, open a title, and page through a chapter — without
leaving the shell. It is non-TTY safe (prints a notice and exits cleanly when not
interactive).
The TUI is also the front-end for Cloud Sync:
- Type
syncat the source filter to open the account menu (sign in / register / sign out). - Type
libto browse your synced library. - When signed in, a manga's details show a "Favourite to library?" prompt — favourites sync to your cloud account.
nyora-cli # launches the TUI
nyora-tui # also launches the TUI
Installation
pip install nyora
Requires Python 3.10+ and a network connection (all catalog/parsing work
happens on the Nyora cloud helper). Prefer isolation? Use a virtualenv or
pipx install nyora.
| Install | Command | Adds |
|---|---|---|
| Default | pip install nyora |
Library + nyora-cli + TUI + Cloud Sync |
| Docs | pip install "nyora[docs]" |
Sphinx + Furo to build the docs |
| Dev | pip install "nyora[dev]" |
Build, test, lint, publish tooling |
Also from Nyora
Nyora is a complete manga ecosystem — native apps for Android/iOS/macOS/Windows/
Linux/Web, a JavaScript SDK (npm install nyora-sdk), and drop-in extensions:
nyora-mihon brings the whole
catalog to stock Mihon and nyora-aidoku
brings it to stock Aidoku on iOS — no app modification required.
Privacy & license
No ads, no tracking, no telemetry. nyora is fully auditable, Apache-2.0
open-source code. Developed and maintained by Md Hasan Raza —
GitHub.
Nyora is not affiliated with any of the manga sources it can access.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nyora-2.0.1.tar.gz.
File metadata
- Download URL: nyora-2.0.1.tar.gz
- Upload date:
- Size: 280.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b708a6213264d8cbac0d0eab51ce29e8e0c5dd80dd1db6dcde23730fb45db88
|
|
| MD5 |
8773f9a65e06d8d2d884ca4d38989fa9
|
|
| BLAKE2b-256 |
7f141483a73d193b3c16ecd6e9e0abbc5b81e874acea9f8c1f3152ce6cd79e40
|
Provenance
The following attestation bundles were made for nyora-2.0.1.tar.gz:
Publisher:
publish.yml on Hasan72341/nyora-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nyora-2.0.1.tar.gz -
Subject digest:
0b708a6213264d8cbac0d0eab51ce29e8e0c5dd80dd1db6dcde23730fb45db88 - Sigstore transparency entry: 2133555021
- Sigstore integration time:
-
Permalink:
Hasan72341/nyora-python@acd5d764319f3b5edc8d7d813ce554c325604115 -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/Hasan72341
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@acd5d764319f3b5edc8d7d813ce554c325604115 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nyora-2.0.1-py3-none-any.whl.
File metadata
- Download URL: nyora-2.0.1-py3-none-any.whl
- Upload date:
- Size: 161.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf7d70512aec3aa12ad8849a3b08a88dd3412429a7144b80f3fd5bd90b8167d2
|
|
| MD5 |
04399a168beadb5830e5b0fcf9f49450
|
|
| BLAKE2b-256 |
a87e90692e230aaeb14fb2936431c0302ee7330c262683add997fd2a3a73b5de
|
Provenance
The following attestation bundles were made for nyora-2.0.1-py3-none-any.whl:
Publisher:
publish.yml on Hasan72341/nyora-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nyora-2.0.1-py3-none-any.whl -
Subject digest:
cf7d70512aec3aa12ad8849a3b08a88dd3412429a7144b80f3fd5bd90b8167d2 - Sigstore transparency entry: 2133555069
- Sigstore integration time:
-
Permalink:
Hasan72341/nyora-python@acd5d764319f3b5edc8d7d813ce554c325604115 -
Branch / Tag:
refs/tags/v2.0.1 - Owner: https://github.com/Hasan72341
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@acd5d764319f3b5edc8d7d813ce554c325604115 -
Trigger Event:
push
-
Statement type: