From 6523b1957537728f60d3838462fe776e0d6001c4 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 15 Aug 2023 10:24:38 +0000 Subject: [PATCH] FIX FirstKiss : domain change and new template --- src/web/mjs/connectors/FirstKiss.mjs | 82 ++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/src/web/mjs/connectors/FirstKiss.mjs b/src/web/mjs/connectors/FirstKiss.mjs index ee9ef2ac5c..858d4ae0c2 100644 --- a/src/web/mjs/connectors/FirstKiss.mjs +++ b/src/web/mjs/connectors/FirstKiss.mjs @@ -1,14 +1,88 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; -export default class FirstKiss extends WordPressMadara { +export default class FirstKiss extends Connector { constructor() { super(); super.id = 'firstkiss'; - super.label = '1st Kiss Manga'; + super.label = 'LikeManga.io'; this.tags = ['webtoon', 'english']; - this.url = 'https://1stkissmanga.me'; + this.url = 'https://likemanga.io'; this.requestOptions.headers.set('x-referer', this.url); this.requestOptions.headers.set('x-origin', this.url); } + + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'h1#title-detail-manga'); + return new Manga(this, uri.pathname, data[0].content.trim()); + } + + async _getMangas() { + let mangaList = []; + const uri = new URL(this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'ul.pagination li:last-of-type a'); + const pageCount = parseInt(data[0].search.match(/(\d+)$/)[1]); + for(let page = 1; page <= pageCount; page++) { + const mangas = await this._getMangasFromPage(page); + mangaList.push(...mangas); + } + return mangaList; + } + + async _getMangasFromPage(page) { + const uri = new URL(`?act=home&pageNum=${page}`, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.card-body p.card-text a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + + async _getChapters(manga) { + const chapterList = []; + for (let page = 1, run = true; run; page++) { + const chapters = await this._getChaptersFromPage(manga, page); + chapters.length > 0 ? chapterList.push(...chapters) : run = false; + } + return chapterList; + } + + async _getChaptersFromPage(manga, page) { + const mangaid = manga.id.match(/-(\d+)\/$/)[1]; + const uri = new URL( `?act=ajax&code=load_list_chapter&manga_id=${mangaid}&page_num=${page}`, this.url); + const request = new Request(uri, this.requestOptions); + const response = await this.fetchJSON(request); + let data = this.createDOM(response.list_chap); + data = [...data.querySelectorAll( 'li.wp-manga-chapter a' )]; + return data.map(element => { + return { + id: new URL(element.href, request.url).pathname, + title: element.text.trim(), + }; + }); + } + + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.reading-detail div.page-chapter source'); + return data.map(image => this.createConnectorURI(this.getAbsolutePath(image, request.url))); + } + + async _handleConnectorURI(payload) { + const request = new Request(payload, this.requestOptions); + request.headers.set('x-referer', this.url); + const response = await fetch(request); + let data = await response.blob(); + data = await this._blobToBuffer(data); + this._applyRealMime(data); + return data; + } + }