manga-parser
Version:
A parser for manga online sources
295 lines (240 loc) • 7.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _utils = require('../utils');
var _abstractCatalog = require('../abstract-catalog');
var _abstractCatalog2 = _interopRequireDefault(_abstractCatalog);
var _models = require('../models');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class Mangahere extends _abstractCatalog2.default {
constructor() {
super();
this.name = 'Mangahere';
this.catalogName = 'mangahere';
this.baseUrl = 'http://www.mangahere.co';
this.lang = _abstractCatalog.LANGUAGE_EN;
}
/**
* @param {number} page
* @returns {string}
*/
popularMangaRequest(page) {
let pageStr = page ? `${(0, _utils.toString)(page)}.htm` : '';
return `${this.baseUrl}/directory/${pageStr}?views.za`;
}
/**
* @param $
* @returns {Array.<Manga>}
*/
popularMangaList($) {
let mangas = [];
let provider = this;
$('div.directory_list > ul > li').each((i, elem) => {
let manga = this.extractMangaSummary($, elem, provider.getNextIndex());
mangas.push(manga);
});
return mangas;
}
/**
* @param $
* @returns {{hasNext: boolean, nextUrl: string, nextPage: ?number}}
*/
popularMangaPaginator($) {
let pagination = $('div.next-page > a.next');
let nextPage = null;
if (pagination.length) {
nextPage = pagination.attr('href').match(/(\d+).htm/);
if (nextPage && nextPage.length) {
nextPage = parseInt(nextPage[1]);
}
}
return {
hasNext: Boolean(pagination.length),
nextUrl: pagination.attr('href'),
nextPage: nextPage
};
}
/**
* @param {number} page
* @returns {string}
*/
latestUpdatesRequest(page) {
let pageStr = page ? `${(0, _utils.toString)(page)}.htm` : '';
return `${this.baseUrl}/directory/${pageStr}?last_chapter_time.za`;
}
/**
* @param $
* @returns {Array.<Manga>}
*/
latestUpdatesList($) {
let mangas = [];
$('div.directory_list > ul > li').each((i, elem) => {
let manga = this.extractMangaSummary($, elem, Infinity);
mangas.push(manga);
});
return mangas;
}
/**
* @param $
* @returns {{hasNext: boolean, nextUrl: string, nextPage: ?number}}
*/
latestUpdatesPaginator($) {
return this.popularMangaPaginator($);
}
/**
* @param $
* @param manga
* @returns {Manga}
*/
mangaDetail($, manga) {
let container = $('.manga_detail_top').first();
let infos = container.find('.detail_topText').first();
manga.author = (0, _utils.trimSpaces)(infos.find('a[href^="http://www.mangahere.co/author/"]').first().text());
manga.artist = (0, _utils.trimSpaces)(infos.find('a[href^="http://www.mangahere.co/artist/"]').first().text());
manga.genre = (0, _utils.trimSpaces)(infos.find('li').eq(3).contents()[1].data);
manga.description = (0, _utils.trimSpaces)(infos.find('#show').contents()[0].data);
manga.status = this.parseStatus((0, _utils.trimSpaces)(infos.find('li').eq(6).text()));
manga.setThumbnailUrl(container.find('img.img').first().attr('src'));
manga.detailsFetched = true;
return manga;
}
/**
* @private
* @param {string} status
* @returns {string}
*/
parseStatus(status) {
if (status.indexOf('Ongoing') > -1) {
return _models.STATUS_ONGOING;
} else if (status.indexOf('Completed') > -1) {
return _models.STATUS_COMPLETED;
}
return _models.STATUS_UNKNOWN;
}
/**
* @param $
* @returns {Array}
*/
chapterList($) {
let chapters = [];
$('.detail_list > ul:not([class]) > li').each((i, elem) => {
let chapter = new _models.Chapter();
chapter.setUrl($(elem).find('a').first().attr('href'));
chapter.title = (0, _utils.trimSpaces)($(elem).find('a').first().text());
chapter.publishedAt = (0, _utils.resetDateTime)(this.parseChapterDate((0, _utils.trimSpaces)($(elem).find('span.right').first().text())));
chapter.generateId();
chapters.push(chapter);
});
return chapters;
}
/**
* @private
* @param date
* @returns {Date}
*/
parseChapterDate(date) {
if (date.indexOf('Today') > -1) {
return new Date();
} else if (date.indexOf('Yesterday') > -1) {
return (0, _moment2.default)().subtract(1, 'days').toDate();
}
let momentDate = (0, _moment2.default)(date, 'MMM D, YYYY');
if (momentDate.isValid()) {
return momentDate.toDate();
}
return new Date(1970, 0, 1);
}
/**
* @param $
* @returns {Array}
*/
pageList($) {
let licensed = $('.mangaread_error > .mt10').first();
if (licensed.length) {
throw new Error(licensed.text());
}
let pages = [];
let options = $('select.wid60').first().find('option');
options.each((i, elem) => {
let page = $(elem).attr('value');
pages.push((0, _utils.sanitizeUrlProtocol)(page));
});
return pages;
}
/**
* @param $
* @returns {string}
*/
imageUrl($) {
return $('#image').first().attr('src');
}
/**
* @param query
* @param page
* @returns {string}
*/
searchOptions(query, page) {
return `${this.baseUrl}/search.php?name_method=cw&author_method=cw&artist_method=cw&advopts=1&name=${query}&page=${(0, _utils.toString)(page)}`;
}
/**
* @param $
* @returns {Array}
*/
search($) {
let mangas = [];
$('div.result_search > dl:has(dt)').each((i, elem) => {
let manga = this.extractMangaSummary($, elem, Infinity);
mangas.push(manga);
});
return mangas;
}
/**
* @param $
* @returns {{ hasNext: boolean, nextUrl: ?string, nextPage: ?number }}
*/
searchPaginator($) {
let pagination = $('div.next-page > a.next');
let nextPage = null;
let nextUrl = null;
if (pagination.length) {
nextUrl = pagination.attr('href');
nextPage = pagination.attr('href').match(/page=(\d+)/);
if (nextPage && nextPage.length) {
nextPage = parseInt(nextPage[1]);
}
}
return {
hasNext: Boolean(pagination.length),
nextUrl: nextUrl,
nextPage: nextPage
};
}
/**
* @param $
* @param elem
* @param catalogId
* @returns {Manga}
*/
extractMangaSummary($, elem, catalogId) {
let manga = new _models.Manga();
// for popular and latest mangas
let link = $(elem).find('div.title > a');
if (!link.length && $(elem).find('a.manga_info').length) {
// for search
link = $(elem).find('a.manga_info');
}
manga.setUrl(link.attr('href'));
manga.title = (0, _utils.trimSpaces)(link.attr('title') ? link.attr('title') : link.attr('rel') ? link.attr('rel') : link.text());
if ($(elem).find('img').length) {
manga.setThumbnailUrl($(elem).find('img').first().attr('src'));
}
manga.catalogId = catalogId;
manga.catalog = this.catalogName;
manga.generateId();
return manga;
}
}
exports.default = new Mangahere();