manga-parser
Version:
A parser for manga online sources
267 lines (220 loc) • 6.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
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 ReadMangaToday extends _abstractCatalog2.default {
constructor() {
super();
this.name = 'ReadMangaToday';
this.catalogName = 'readmangatoday';
this.baseUrl = 'http://www.readmanga.today';
this.lang = _abstractCatalog.LANGUAGE_EN;
}
/**
* @param {number} page
* @returns {string}
*/
popularMangaRequest(page) {
return `${this.baseUrl}/hot-manga/${(0, _utils.toString)(page)}`;
}
/**
* @param $
* @returns {Array.<Manga>}
*/
popularMangaList($) {
let mangas = [];
let provider = this;
$('div.hot-manga > div.style-list > div.box').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.hot-manga > ul.pagination > li > a:contains(»)');
let nextPage = null;
if (pagination.length) {
nextPage = pagination.attr('href').match(/hot-manga\/(\d+)/);
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) {
return `${this.baseUrl}/latest-releases/${(0, _utils.toString)(page)}`;
}
/**
* @param $
* @returns {Array.<Manga>}
*/
latestUpdatesList($) {
let mangas = [];
$('div.hot-manga > div.style-grid > div.box').each((i, elem) => {
let manga = this.extractMangaSummary($, elem, Infinity);
mangas.push(manga);
});
return mangas;
}
/**
* @param $
* @returns {{hasNext: boolean, nextUrl: string, nextPage: ?number}}
*/
latestUpdatesPaginator($) {
let pagination = $('div.hot-manga > ul.pagination > li > a:contains(»)');
let nextPage = null;
if (pagination.length) {
nextPage = pagination.attr('href').match(/latest-releases\/(\d+)/);
if (nextPage && nextPage.length) {
nextPage = parseInt(nextPage[1]);
}
}
return {
hasNext: Boolean(pagination.length),
nextUrl: pagination.attr('href'),
nextPage: nextPage
};
}
/**
* @param $
* @param manga
* @returns {Manga}
*/
mangaDetail($, manga) {
let container = $('div.content-list').first();
manga.author = (0, _utils.trimSpaces)(container.find('ul.cast-list li.director > ul a').text());
manga.artist = (0, _utils.trimSpaces)(container.find('ul.cast-list li:not(.director) > ul a').text());
manga.genre = (0, _utils.trimSpaces)(container.find('dl.dl-horizontal > dd').eq(2).text());
manga.description = (0, _utils.trimSpaces)(container.find('li.movie-detail').text());
manga.status = this.parseStatus((0, _utils.trimSpaces)(container.find('dl.dl-horizontal > dd').eq(1).text()));
manga.setThumbnailUrl(container.find('img.img-responsive').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 = [];
$('ul.chp_lst > 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().find('span.val').text());
chapter.publishedAt = (0, _utils.parseDateAgo)((0, _utils.trimSpaces)($(elem).find('span.dte').first().text()));
chapter.generateId();
chapters.push(chapter);
});
return chapters;
}
/**
* @param $
* @returns {Array}
*/
pageList($) {
let pages = [];
let options = $('ul.list-switcher-2 > li > select.jump-menu').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 $('img.img-responsive-2').first().attr('src');
}
/**
* @param query
* @param page
* @returns {{url: string, headers: any, method: string, form: any}}
*/
searchOptions(query, page) {
return {
url: `${this.baseUrl}/service/advanced_search`,
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
method: 'POST',
form: {
type: 'all',
status: 'both',
'manga-name': query
}
};
}
/**
* @param $
* @returns {Array}
*/
search($) {
let mangas = [];
$('div.style-list > div.box').each((i, elem) => {
let manga = this.extractMangaSummary($, elem, Infinity);
mangas.push(manga);
});
return mangas;
}
/**
* @param $
* @returns {{ hasNext: boolean, nextUrl: ?string, nextPage: ?number }}
*/
searchPaginator($) {
return {
hasNext: false,
nextUrl: null,
nextPage: null
};
}
/**
* @param $
* @param elem
* @param catalogId
* @returns {Manga}
*/
extractMangaSummary($, elem, catalogId) {
let manga = new _models.Manga();
let link = $(elem).find('div.title > h2 > a');
manga.setUrl(link.attr('href'));
manga.title = (0, _utils.trimSpaces)(link.attr('title'));
manga.setThumbnailUrl($(elem).find('img').attr('src'));
manga.catalogId = catalogId;
manga.catalog = this.catalogName;
manga.generateId();
return manga;
}
}
exports.default = new ReadMangaToday();