hanime-crave
Version:
hanime.tv scraper
94 lines (80 loc) • 3.39 kB
JavaScript
const HentaiEpisode = require('../structures/episode.js');
const necessary = [
'start',
'end'
];
function getYearOffset(yr = 0) {
let now = new Date();
return now.getFullYear() + yr
}
function arrayEqual(a1, a2) {
return a1.filter(f => !a2.includes(f))
}
function getDefaults() {
return {
order: {by: 'released_at', type: 'DESC'},
start: `${getYearOffset()}-01-01`,
end: `${getYearOffset(1)}-01-01`
}
}
module.exports = (args = getDefaults()) => {
return new Promise((res, rej) => {
let defaults = getDefaults();
if(typeof args !== 'object') { // 2018 / 2019
if(!isNaN(args)) {
defaults.start = `${args}-01-01`;
defaults.end = `${args + 1}-01-01`
} else if(typeof args === 'string') { // 2018-02-08 || DESC / ASC || released_at
if(/\d{4}\-\d{2}\-\d{2}/.test(args)) {
defaults.start = args;
defaults.end = `${+args.split('-')[0] + 1}-01-01`
} else if(['DESC', 'ASC'].includes(args))
defaults.order.type = args.toUpperCase()
else defaults.order.by = args.toLowerCase()
} else defaults;
args = defaults
} else {
if(Object.keys(args).length < 1) { // {}
args = defaults
} else {
let diff = arrayEqual(Object.keys(defaults), Object.keys(args));
if(diff.length > 0)
for(let i = 0; i < diff.length; i++)
args[diff[i]] = defaults[diff[i]];
diff = arrayEqual(['by', 'type'], Object.keys(args.order));
if(diff.length > 0)
for(let i = 0; i < diff.length; i++)
args.order[diff[i]] = defaults.order[diff[i]];
}
};
if(typeof args !== 'object' || (args || []).length >= 0) return rej(new Error("Wrong arguments format."));
fetch(`https://hr.hanime.tv/api/v8/hentai_videos?source=browse-seasons&__order=${args.order.by},${args.order.type}&${args.order.by}__gte=${args.start}&${args.order.by}__lt=${args.end}`)
.then(resp => resp.json())
.then(json => {
let episodes = [];
for(let i = 0; i < json.data.length; i++)
episodes[i] = new HentaiEpisode(json.data[i].name,
json.data[i].slug,
json.data[i].created_at,
new Date(json.data[i].created_at).getTime(),
json.data[i].released_at,
new Date(json.data[i].released_at).getTime(),
json.data[i].views,
json.data[i].interests,
json.data[i].poster_url,
json.data[i].cover_url,
json.data[i].brand,
json.data[i].is_censored,
json.data[i].likes,
json.data[i].dislikes,
json.data[i].downloads,
"");
res({
info: {total: json.meta.total, count: json.meta.count},
episodes: episodes,
query: args
})
})
.catch(err => rej(err))
})
}