UNPKG

manga-parser

Version:
295 lines (240 loc) 7.12 kB
'use strict'; 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();