https://github.com/zekfad/nhentai-api
Node.JS client for nhentai.net undocumented API.
https://github.com/zekfad/nhentai-api
api api-client doujin javascript js nhentai nhentai-api node-module nodejs
Last synced: 11 months ago
JSON representation
Node.JS client for nhentai.net undocumented API.
- Host: GitHub
- URL: https://github.com/zekfad/nhentai-api
- Owner: Zekfad
- License: isc
- Created: 2019-10-08T18:09:23.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-05-06T23:32:57.000Z (almost 3 years ago)
- Last Synced: 2025-03-31T20:38:04.797Z (12 months ago)
- Topics: api, api-client, doujin, javascript, js, nhentai, nhentai-api, node-module, nodejs
- Language: JavaScript
- Homepage: https://zekfad.github.io/nhentai-api/
- Size: 1.11 MB
- Stars: 44
- Watchers: 2
- Forks: 6
- Open Issues: 13
-
Metadata Files:
- Readme: ReadMe.md
- License: LICENSE
Awesome Lists containing this project
README
# Node.JS client for nhentai.net undocumented APIs.
[](https://www.npmjs.com/package/nhentai-api)[](https://travis-ci.org/github/Zekfad/nhentai-api)[](https://ci.appveyor.com/project/Zekfad/nhentai-api)[](https://codecov.io/gh/Zekfad/nhentai-api)
Node.JS module for handling nhentai.net API.
## Features
* Objective-oriented API abstraction.
* Bidirectional inspecting (get image from book/get book from image).
* Easy proxy support by using custom Agent (like [this one](https://www.npmjs.com/package/https-proxy-agent)).
* Return URLs for binary data (images).
## Install
Install via yarn:
```
yarn add nhentai-api
```
Install via npm:
```
npm i nhentai-api
```
## Docs
[Read the docs on GitHub pages.](https://zekfad.github.io/nhentai-api/)
## Example
### Import
#### CommonJS
```js
const { API, TagTypes, } = require('nhentai-api');
```
#### ES6
```js
import { API, TagTypes, } from 'nhentai-api';
```
### Use
#### Initialize API client
```js
const api = new API();
```
#### Get the book
```js
api.getBook(177013).then(book => {
api.getImageURL(book.cover); // https://t.nhentai.net/galleries/987560/cover.jpg
api.getImageURL(book.pages[1]); // https://i.nhentai.net/galleries/987560/2.jpg
});
```
#### Get random book
```js
await api.getRandomBook(); // Book instance
````
#### Search for the books
```js
api.search('test').then(async search => {
console.log(search); /*
Search {
api: API { hosts: [Object], ssl: true, agent: [Agent] },
query: 'test',
page: 1,
perPage: 25,
books: [
[Book], [Book], [Book], [Book],
[Book], [Book], [Book], [Book],
[Book], [Book], [Book], [Book],
[Book], [Book], [Book], [Book],
[Book], [Book], [Book], [Book],
[Book], [Book], [Book], [Book],
[Book]
],
pages: 67
} */
search = await search.getNextPage(); // Same as api.search('text', 2);
console.log(search); /*
Search {
// Same as above
page: 2,
// Same as above
books: [
// Books from 2nd page of search
],
// Same as above
} */
});
```
In case you need to change API implementation (e.g. change proxy) you can pass `api` to
```js
search.getNextPage(api);
```
You can also use async generator:
```js
// Get first 2 pages
for await (const search of api.searchGenerator('test')) {
console.log(search);
if (search.page >= 2)
break;
}
```
#### Working with tags
`book.tags` has type of `TagsArray`, it is just an `Array` with helper methods.
```js
const tag = book.tags[0]; // Tag
```
##### Get tag id
```js
tag.id;
```
##### Get tag name (without count)
```js
tag.name;
// or
tag.toString();
```
##### Get tag name (with count)
```js
tag.toString(true);
```
##### Get tag type (as string)
```js
tag.type.type;
// or
tag.type.toString();
```
##### Pre-filtered tags
```js
book.pureTags; // pure tags (with type 'tag')
book.categories; // category tags
book.artists; // artist tags
book.parodies; // parody tags
book.characters; // character tags
book.groups; // group tags
book.languages; // language tags
```
##### Filter tags
Get artists:
```js
book.artists;
// or
book.getTagsWith({
type: TagTypes.Artist, // you may also use Tag.types.Artist or Tag.types.get('artist')
}); // TagsArray (subclass of Array)
// or
book.getTagsWith({ type: 'artist', }); // TagsArray (subclass of Array)
```
Get tag with name `english`:
```js
book.getTagsWith({ name: 'english', }); // TagsArray (subclass of Array)
```
Get categories
```js
book.categories;
// or
book.getTagsWith({ type: TagTypes.Category, }); // Recommended
// or
book.getTagsWith({ type: Tag.types.Category, });
// or
book.getTagsWith({ type: Tag.types.get('category'), });
// or
book.getTagsWith({ type: 'category', });
```
##### Get tags comma separated
Without counts:
```js
book.tags.toNames().join(', ');
// or
book.tags.join(', ');
```
With counts:
```js
book.tags.toNames(true).join(', ');
// or
book.tags.map(tag => tag.toString(true)).join(', ')
```
Get all artists:
```js
// With counts
book.artists.toNames(true).join(', ');
// or
book.getTagsWith({ type: TagTypes.Artist, }).toNames(true).join(', ');
// Without counts
book.artists.join(', ');
// or
book.artists.toNames().join(', ');
// or
book.getTagsWith({ type: TagTypes.Artist, }).join(', ');
```