@yeci226/nhentai-ts
Version:
A scraper for NHentai with types
101 lines (99 loc) • 3.54 kB
text/typescript
import { CheerioAPI } from 'cheerio'
import { baseURLS, clean, getExtension, Pages, imageSites } from '../lib'
import { TURL, IDoujinInfo } from '../Types'
export const parseDoujinInfo = async (
$: CheerioAPI,
site: keyof typeof baseURLS,
api_pages?: { t: string }[]
): Promise<IDoujinInfo> => {
const pages: string[] = []
const dataSrc =
$('.thumb-container').first().find('a > img').attr('data-src') || ''
const gallery_id = dataSrc.includes('/galleries/')
? dataSrc.split('/galleries/')[1]?.split('/')[0] || ''
: ''
if (site === 'net' && api_pages)
api_pages.forEach((page, i) =>
pages.push(
`https://i.nhentai.net/galleries/${gallery_id}/${
i + 1
}.${getExtension(page.t)}`
)
)
else
for (const el of $('.thumb-container')) {
const url = ($(el).find('a > img').attr('data-src') || '').replace(
/t(?=\.)/,
''
)
if (url) {
const page = url.replace(imageSites[site], 'i.nhentai.net')
pages.push(page)
}
}
const cover =
$('#cover').find('a > img').attr('data-src') ||
$('#cover').find('a > img').attr('src')
const href = $('#cover').find('a').attr('href') || ''
const id = href.includes('g/')
? href.split('g/')[1]?.split('/')[0] || ''
: ''
const titles = {
english: $('#info').find('h1').text().trim(),
original: $('#info').find('h2').text().trim()
}
const baseURL = baseURLS[site]
const parodies: string[] = []
const characters: string[] = []
const tags: string[] = []
const artists: string[] = []
const groups: string[] = []
const languages: string[] = []
const categories: string[] = []
$('.tag-container.field-name').each((i, el) => {
const type = $(el).text().trim().toLowerCase()
const contents: string[] = []
const push = (field: string[]): void =>
contents
.filter((content) => content !== '')
.forEach((content) => field.push(content))
$(el)
.find('.tags')
.find('a')
.each((i, el) => {
contents.push($(el).text().trim().split('\n')[0])
})
type.startsWith('parodies')
? push(parodies)
: type.startsWith('characters')
? push(characters)
: type.startsWith('tags')
? push(tags)
: type.startsWith('artists')
? push(artists)
: type.startsWith('groups')
? push(groups)
: type.startsWith('languages')
? push(languages)
: push(categories)
})
const url = `${baseURL}/g/${id}` as TURL
const images = new Pages(pages, titles.english)
return {
id,
title: titles.english,
originalTitle: titles.original,
parodies: clean(parodies),
characters: clean(characters),
tags: clean(tags),
artists: clean(artists),
groups: clean(groups),
languages: clean(languages),
categories: clean(categories),
cover: !pages.some((url) => url.includes('cdn.dogehls.xyz'))
? cover.replace('cdn.dogehls.xyz', 't3.nhentai.net')
: null,
images,
url
}
}