hanime-crave
Version:
hanime.tv scraper
108 lines (94 loc) • 3.37 kB
JavaScript
const HentaiEpisode = require('../structures/episode.js');
const tags = require('../structures/tags.json');
const search = require('./search.js');
const defaults = {
text: "",
brands: [],
blacklist: [],
tags: [],
tags_mode: "AND",
page: 0,
order: 'desc'
};
function addMissingArgs(args) {
let keys = Object.keys(defaults);
let newArgs = args;
for(let i = 0; i < keys.length; i++)
if(!newArgs.hasOwnProperty(keys[i]))
newArgs[keys[i]] = defaults[keys[i]];
return newArgs
}
function buildBody(data) {
return {
search_text: data.text,
tags: data.tags,
trags_mode: data.tags_mode,
brands: data.brands,
blacklist: data.blacklist,
order_by: "created_at_unix",
ordering: data.order,
page: data.page
}
}
module.exports = (args = defaults) => {
return new Promise((res, rej) => {
if(typeof args !== 'object') {
if(!isNaN(args))
args = addMissingArgs({page: args});
if(typeof args === 'string') {
if(args.toUpperCase() === 'AND'
|| args.toUpperCase() === 'OR') {
args = addMissingArgs({tags_mode: args})
} else if(args.toLowerCase() === 'desc'
|| args.toLowerCase() === 'asc') {
args = addMissingArgs({order: args})
} else args = addMissingArgs({text: args})
}
} else if(!isNaN(args.length)) { // is array
if(tags.includes(args[0])) args = addMissingArgs({tags: args})
else args = addMissingArgs({brands: args})
} else args = addMissingArgs(args);
if(typeof args !== 'object' || (args || []).length >= 0) return rej(new Error("Wrong arguments format."));
fetch(
"https://search.htv-services.com",
{
method: 'post',
body: JSON.stringify(buildBody(args)),
headers: {
'Content-Type': 'application/json'
}
}
)
.then(resp => resp.json())
.then(data => {
let episodes = [];
let json = JSON.parse(data.hits);
for(let i = 0; i < json.length; i++)
episodes[i] = new HentaiEpisode(json[i].name,
json[i].slug,
json[i].created_at,
json[i].created_at_unix,
json[i].released_at,
json[i].released_at_unix,
json[i].views,
json[i].interests,
json[i].poster_url,
json[i].cover_url,
json[i].brand,
json[i].is_censored,
json[i].likes,
json[i].dislikes,
json[i].downloads,
json[i].is_banned_in);
res({
episodes: episodes,
query: {page: data.page, maxPages: data.nbPages, totalHits: data.nbHits, hitsPerPage: data.hitsPerPage, tags: args.tags},
next: function() {
args.page += 1;
return search(args)
}
})
})
.catch(err => rej(err))
})
}