tmal
Version:
tuna's myanimelist parser
150 lines (145 loc) • 3.91 kB
JavaScript
const fetch = require('node-fetch');
const baseUrl = 'https://myanimelist.net/';
const _ = require('lodash');
const moment = require('moment');
const Promise = require('bluebird');
const refetch = (url) => {
return new Promise((resolve,reject)=>{
fetch(url).then(response => {
if(response.status !== 200)
{
if(response.status === 404)
{
reject({type:404,message: `${url} returned 404 status: ${response.status}`})
}
else
{
console.error(`${url} returned non-200 status: ${response.status} going to refetch..`);
resolve(refetch(url));
}
}
else
{
console.log(`${url} fetched successfully..`);
resolve(response.text());
}
}).catch(err => {
reject(err);
});
})
};
module.exports.fetch = function(url) {
const _this = this;
return fetch(url).then(response => {
if(response.status !== 200)
{
console.error(`${url} returned non-200 status: ${response.status} going to refetch..`);
return refetch(url);
}
else
{
console.log(`${url} fetched successfully..`);
return response.text();
}
})
};
module.exports.parseSidebar = ($,term,split) => {
const el = $('span:contains("'+term+':")');
const re = new RegExp(term+':\n', 'g');
if (typeof el !== 'undefined' && el.length > 0) {
if (split) {
return el.parent().text().replace(re, '').trim()
.split(',');
}
return el.parent().text().replace(re, '').trim();
}
return null;
};
module.exports.parseStartDate = (date) => {
if(date.indexOf('to') > -1)
{
const tmp = _.split(date,'to');
try {
return moment(tmp[0].trim(),'MMM D, YYYY').endOf('day').unix();
}catch(err) {
throw err;
}
}
else
{
try {
return moment(date.trim(),'MMM D, YYYY').endOf('day').unix();
}catch(err) {
throw err;
}
}
};
module.exports.getSeason = function(date){
const y = parseInt(moment(date,'X').format('YYYY'));
const m = parseInt(moment(date,'X').format('M'));
let label;
if(m >= 1 && m <= 3)
{
// winter
label = 'Winter '+y;
}
else if( m >= 4 && m <= 5 )
{
// spring
label = 'Spring '+y;
}
else if(m >= 6 && m <= 9)
{
// summer
label = 'Summer '+y;
}
else if( m >= 10 && m <= 12)
{
// fall
label = 'Fall '+y;
}
return label;
};
module.exports.parseEndDate = (date) => {
if(date.indexOf('to') > -1)
{
const tmp = _.split(date,'to');
try {
if(tmp[1].trim().indexOf('?') > -1)
{
return null;
}
else
{
return moment(tmp[1].trim(),'MMM D, YYYY').endOf('day').unix();
}
}catch(err) {
throw err;
}
}
else
{
try {
if(date.trim().indexOf('?') > -1)
{
return null;
}
else
{
return moment(date.trim(),'MMM D, YYYY').endOf('day').unix();
}
}catch(err) {
throw err;
}
}
};
module.exports.getEpisodeAirDate = function($){
const airedMatch = $('table div.fn-grey2').text()
.match(/((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]+, [0-9]{4})\(([A-Z]+)\)/);
if (airedMatch !== null) {
return moment(airedMatch[1],'MMMM D, YYYY').add(1,'days').unix()
}
else
return null;
};
module.exports.baseUrl = baseUrl;