From c1a715e5aa32e34c4fc1004b3cdfff9de7ef25e9 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Sun, 4 Dec 2022 17:31:58 +0000 Subject: [PATCH 01/48] Add projectsuki icon --- src/web/img/connectors/projectsuki | Bin 0 -> 1098 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/projectsuki diff --git a/src/web/img/connectors/projectsuki b/src/web/img/connectors/projectsuki new file mode 100644 index 0000000000000000000000000000000000000000..72bb76c50880a876e4d2da448aa3586170ea826a GIT binary patch literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL literal 0 HcmV?d00001 From f4bf3771074c9346375bb2bfd2a846d66327c9bd Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Sun, 4 Dec 2022 17:33:03 +0000 Subject: [PATCH 02/48] Add ProjectSuki Fixes https://github.com/manga-download/hakuneko/issues/3294 --- src/web/mjs/connectors/ProjectSuki.mjs | 93 ++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/web/mjs/connectors/ProjectSuki.mjs diff --git a/src/web/mjs/connectors/ProjectSuki.mjs b/src/web/mjs/connectors/ProjectSuki.mjs new file mode 100644 index 0000000000..92d228fac3 --- /dev/null +++ b/src/web/mjs/connectors/ProjectSuki.mjs @@ -0,0 +1,93 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; + +export default class ProjectSuki extends Connector { + + constructor() { + super(); + super.id = 'projectsuki'; + super.label = 'ProjectSuki'; + this.tags = [ 'manga', 'webtoon', 'english' ]; + this.url = 'https://projectsuki.com'; + } + + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const id = uri.pathname + uri.search; + const title = (await this.fetchDOM(request, 'h2[itemprop="title"'))[0].textContent.trim(); + return new Manga(this, id, title); + } + + async _getMangas() { + let mangaList = []; + for (let page = 0, run = true; run; page++) { + const mangas = await this._getMangasFromPage(page); + mangas.length > 0 ? mangaList.push(...mangas) : run = false; + } + return mangaList; + } + + async _getMangasFromPage(page) { + const uri = new URL('/browse/' + page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'a.inherit-color.p-1[aria-label]'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.getAttribute('aria-label').trim() + }; + }); + } + + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'td.col-5.col-sm-4.col-md-4.text-truncate > a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.textContent.trim(), + }; + }); + } + + async _getPages(chapter) + { + const script = ` + new Promise((resolve, reject) => { + const xrequesto = function (element, url, data, method) + { + let xhr = new XMLHttpRequest(); + xhr.onload = function () { + if (xhr.status >= 200 && xhr.status < 300) + { + datar = JSON.parse(xhr.response); + element.insertAdjacentHTML('beforeend', datar['src']); + let images = [...document.querySelectorAll( 'img.img-fluid.center-block' )]; + resolve(images.map(image => image.src)); + } + else + { + throw Error('Cant get images :/ !'); + } + } + xhr.open(method, url); + xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); + xhr.send(data); + } + const xelement = document.querySelector('.strip-reader'); + const xbookid = window.location.href.split('/') [4]; + let xchapterid = window.location.href.split('/') [5]; + xrequesto(xelement, '/callpage', JSON.stringify({ + bookid: xbookid, + chapterid: xchapterid, + first: true + }) + , 'POST'); + }); + `; + const uri = new URL(chapter.id, this.url); + let request = new Request(uri, this.requestOptions); + return await Engine.Request.fetchUI(request, script); + } +} \ No newline at end of file From a2b74e26cb1c0bd05e1281803fd533cd7767129f Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Sun, 4 Dec 2022 19:52:25 +0000 Subject: [PATCH 03/48] Add niceoppai Icon --- src/web/img/connectors/niceoppai | Bin 0 -> 14195 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/niceoppai diff --git a/src/web/img/connectors/niceoppai b/src/web/img/connectors/niceoppai new file mode 100644 index 0000000000000000000000000000000000000000..10a29b83683d9a113bcf3992ca031f1911b36bd8 GIT binary patch literal 14195 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 Date: Sun, 4 Dec 2022 19:54:15 +0000 Subject: [PATCH 04/48] Add NiceOppai Fixes https://github.com/manga-download/hakuneko/issues/3280 --- src/web/mjs/connectors/NiceOppai.mjs | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/web/mjs/connectors/NiceOppai.mjs diff --git a/src/web/mjs/connectors/NiceOppai.mjs b/src/web/mjs/connectors/NiceOppai.mjs new file mode 100644 index 0000000000..1c1bfbbbce --- /dev/null +++ b/src/web/mjs/connectors/NiceOppai.mjs @@ -0,0 +1,35 @@ +import WordPressLightPro from './templates/WordPressLightPro.mjs'; + +export default class NiceOppai extends WordPressLightPro { + + constructor() { + super(); + super.id = 'niceoppai'; + super.label ='NiceOppai'; + this.tags = ['manga', 'thai']; + this.url = 'https://www.niceoppai.net'; + this.path = '/manga_list/all/any/name-az/'; + this.queryMangas = 'div.mng_lst div.nde div.det a'; + this.queryChapters = 'div.mng_det ul.lst li a.lst'; + this.queryPages = 'div#image-container source'; + } + + async _getChaptersFromPage(manga, page){ + const request = new Request (new URL(this.url + manga.id+ 'chapter-list/' + page), this.requestOptions); + const data = await this.fetchDOM(request, this.queryChapters); + return data.map(element => { + return { + id: this.getRelativeLink( element ), + title: element.innerText.replace( manga.title, '' ).trim(), + language: this.language + }; + }); + } + + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryPages); + return data.map(image => this.getAbsolutePath(image, request.url)); + } +} \ No newline at end of file From 45432bb88ad7a4ffe539adff847601d0ab2be9e6 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Sun, 4 Dec 2022 19:57:26 +0000 Subject: [PATCH 05/48] Update WordPressLightPro to use new coding style * Needed by NiceOppai' (in this form) and ReadHentaiManga (which is dead anyway) --- .../templates/WordPressLightPro.mjs | 146 ++++++------------ 1 file changed, 46 insertions(+), 100 deletions(-) diff --git a/src/web/mjs/connectors/templates/WordPressLightPro.mjs b/src/web/mjs/connectors/templates/WordPressLightPro.mjs index 3620de8aef..8669507f75 100644 --- a/src/web/mjs/connectors/templates/WordPressLightPro.mjs +++ b/src/web/mjs/connectors/templates/WordPressLightPro.mjs @@ -19,115 +19,61 @@ export default class WordPressLightPro extends Connector { this.language = ''; } - /** - * - */ - _getMangaListFromPages( mangaPageLinks, index ) { - index = index || 0; - return this.fetchDOM( mangaPageLinks[ index ], this.queryMangas, 5 ) - .then( data => { - let mangaList = data.map( element => { - return { - id: this.getRelativeLink( element ), - title: element.title.trim() || element.text.trim() - }; - } ); - if( index < mangaPageLinks.length - 1 ) { - return this._getMangaListFromPages( mangaPageLinks, index + 1 ) - .then( mangas => mangaList.concat( mangas ) ); - } else { - return Promise.resolve( mangaList ); - } - } ); + async _getMangas() { + const request = new Request (new URL(this.url + this.path), this.requestOptions); + const dom = await this.fetchDOM(request, 'body' ); + let pageCount = parseInt( dom[0].querySelector(this.queryMangasPageCount).href.match( /(\d+)\/$/ )[1] ); + let pagesList = []; + for (let i = 1; i <= pageCount; i++){ + pagesList.push(...await this._getMangasFromPage(i)); + } + return pagesList; } - /** - * - */ - _getMangaList( callback ) { - this.fetchDOM( this.url + this.path, this.queryMangasPageCount ) - .then( data => { - let pageCount = parseInt( data[0].href.match( /(\d+)\/$/ )[1] ); - let pageLinks = [... new Array( pageCount ).keys()].map( page => this.url + this.path + ( page + 1 ) + '/' ); - return this._getMangaListFromPages( pageLinks ); - } ) - .then( data => { - callback( null, data ); - } ) - .catch( error => { - console.error( error, this ); - callback( error, undefined ); - } ); + async _getMangasFromPage(page) { + const request = new Request (new URL(this.url + this.path + page), this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangas); + return data.map(element => { + return { + id: this.getRelativeLink(element, this.url), + title: element.title.trim() || element.text.trim() + }; + }); } - /** - * - */ - _getChapterListFromPages( manga, chapterPageLinks, index ) { - index = index || 0; - return this.fetchDOM( chapterPageLinks[ index ], this.queryChapters, 5 ) - .then( data => { - let chapterList = data.map( element => { - let anchor = element.nodeName.toLowerCase() === 'a' ? element : element.closest( 'a' ); - return { - id: this.getRelativeLink( anchor ), - title: element.innerText.replace( manga.title, '' ).trim(), - language: this.language - }; - } ); - if( index < chapterPageLinks.length - 1 ) { - return this._getChapterListFromPages( manga, chapterPageLinks, index + 1 ) - .then( chapters => chapterList.concat( chapters ) ); - } else { - return Promise.resolve( chapterList ); - } - } ); - } + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + let data = await this.fetchDOM(request, this.queryChaptersPageCount); + const pageCount = data.length === 0 ? 1 : parseInt( data[0].href.match( /(\d+)\/$/ )[1] ); + let pagesList = []; + for (let i = 1; i <= pageCount; i++){ + pagesList.push(...await this._getChaptersFromPage(manga, i)); + } + return pagesList; + } - /** - * - */ - _getChapterList( manga, callback ) { - this.fetchDOM( this.url + manga.id, this.queryChaptersPageCount ) - .then( data => { - let pageCount = data.length === 0 ? 1 : parseInt( data[0].href.match( /(\d+)\/$/ )[1] ); - let pageLinks = [... new Array( pageCount ).keys()].map( page => this.url + manga.id + 'chapters-list/' + ( page + 1 ) + '/' ); - pageLinks[0] = this.url + manga.id; - return this._getChapterListFromPages( manga, pageLinks ); - } ) - .then( data => { - callback( null, data ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); + async _getChaptersFromPage(manga, page){ + const request = new Request (new URL(this.url + manga.id+ 'chapter-list/' + page), this.requestOptions); + const data = await this.fetchDOM(request, this.queryChapters); + return data.map(element => { + return { + id: this.getRelativeLink( element ), + title: element.innerText.replace( manga.title, '' ).trim(), + language: this.language + }; + }); } - /** - * - */ - _getPageList( manga, chapter, callback ) { - this.fetchDOM( this.url + chapter.id, this.queryPageLinks ) - .then( data => { - let pageList = data.map( element => this.createConnectorURI( this.url + chapter.id + element.value + '/' ) ); - callback( null, pageList ); - } ) - .catch( error => { - console.error( error, chapter ); - callback( error, undefined ); - } ); + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryPageLinks ); + return data.map(element => this.createConnectorURI(this.url + chapter.id + element.value + '/')); } - /** - * - */ - _handleConnectorURI( payload ) { + async _handleConnectorURI( payload ) { let request = new Request( payload, this.requestOptions ); - /* - * TODO: only perform requests when from download manager - * or when from browser for preview and selected chapter matches - */ return this.fetchDOM( request, this.queryPages ) .then( data => { let span = document.createElement( 'span' ); @@ -137,4 +83,4 @@ export default class WordPressLightPro extends Connector { .then( response => response.blob() ) .then( data => this._blobToBuffer( data ) ); } -} \ No newline at end of file +} From 913162821afae140c7aacde3b2f49c4392acb03a Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Mon, 5 Dec 2022 15:29:59 +0000 Subject: [PATCH 06/48] Add Mangatigre icon --- src/web/img/connectors/mangatigre | Bin 0 -> 1098 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/mangatigre diff --git a/src/web/img/connectors/mangatigre b/src/web/img/connectors/mangatigre new file mode 100644 index 0000000000000000000000000000000000000000..72bb76c50880a876e4d2da448aa3586170ea826a GIT binary patch literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL literal 0 HcmV?d00001 From d20ca17708ff09b6b9fabb2ca4b8907fd3fef138 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Mon, 5 Dec 2022 15:31:12 +0000 Subject: [PATCH 07/48] Add MangaTigre Fixes https://github.com/manga-download/hakuneko/issues/3681 --- src/web/mjs/connectors/MangaTigre.mjs | 106 ++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/web/mjs/connectors/MangaTigre.mjs diff --git a/src/web/mjs/connectors/MangaTigre.mjs b/src/web/mjs/connectors/MangaTigre.mjs new file mode 100644 index 0000000000..0d7f41c79b --- /dev/null +++ b/src/web/mjs/connectors/MangaTigre.mjs @@ -0,0 +1,106 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; + +export default class MangaTigre extends Connector { + constructor() { + super(); + super.id = 'mangatigre'; + super.label = 'MangaTigre'; + this.tags = [ 'manga', 'webtoon', 'spanish' ]; + this.url = 'https://www.mangatigre.net'; + this.token = undefined; + this.requestOptions.headers.set('x-origin', this.url); + this.booktype = { + 1: "manga", + 2: "manhwa", + 3: "manhua", + }; + } + + async _getMangas() { + const uri = new URL('/mangas', this.url); + await this.getToken(uri); + let mangaList = []; + for (let page = 1, run = true; run; page++) { + const mangas = await this._getMangasFromPage(page); + mangas.length > 0 ? mangaList.push(...mangas) : run = false; + } + return mangaList; + } + + async _getMangasFromPage(page) { + const uri = new URL('/mangas', this.url); + const request = new Request(uri, { + method: 'POST', + body: JSON.stringify({_token : this.token, page : page}), + headers: { + 'content-type': 'application/json', + 'x-referer': uri.href + } + }); + const response = await fetch(request); + const data = await response.json(); + return data.data.map(element => { + let btype = this.booktype[element.type]; + return { + id: '/'+btype+'/'+element.slug, + title: element.name.trim() + }; + }); + } + + async _getChapters(manga) { + const slug = manga.id.split('/')[2]; + const uri = new URL(manga.id, this.url); + await this.getToken(uri); + const request = new Request(uri, { + method: 'POST', + body: JSON.stringify({_token : this.token}), + headers: { + 'content-type': 'application/json', + 'x-referer': uri.href + } + }); + const data = await this.fetchDOM(request, 'a'); + return data.map(element => { + return { + id: element.pathname, + title: element.text.trim() + }; + }); + } + + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const script = ` + new Promise(resolve => { + resolve({ + chap : window.chapter, cdn : window.cdn + }); + }); + `; + const request = new Request(uri); + const response = await Engine.Request.fetchUI(request, script); + const chap = JSON.parse(response.chap); + const CDN = response.cdn; + let keyz = Object.keys(chap.images).sort(); + let pagelist = []; + for (let i = 0; i < keyz.length; i++ ){ + let key = keyz[i]; + let image = chap.images[key]; + let link = '//'.concat(CDN, '/chapters/').concat(chap.manga.slug, '/').concat(chap.number, '/').concat(image.name, '.').concat(image.format); + pagelist.push(this.getAbsolutePath(link, request.url)); + } + return pagelist; + } + async getToken(url){ + try{ + let request = new Request(url, this.requestOptions); + let data = await this.fetchDOM(request, 'button[data-token]',3); + this.token = data[0].getAttribute('data-token'); + } + catch(e) + { + } + } +} \ No newline at end of file From 35a2ea247c2c4ece533bc154ede989782e234add Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 11:53:01 +0000 Subject: [PATCH 08/48] Add ManhwaManga Fixes https://github.com/manga-download/hakuneko/issues/3611 --- src/web/mjs/connectors/ManhwaManga.mjs | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/web/mjs/connectors/ManhwaManga.mjs diff --git a/src/web/mjs/connectors/ManhwaManga.mjs b/src/web/mjs/connectors/ManhwaManga.mjs new file mode 100644 index 0000000000..9f11dca42c --- /dev/null +++ b/src/web/mjs/connectors/ManhwaManga.mjs @@ -0,0 +1,62 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; +export default class ManhwaManga extends Connector { + constructor() { + super(); + super.id = 'manhwamanga'; + super.label = 'ManhwaManga'; + this.tags = [ 'manga', 'webtoon', 'english', 'hentai' ]; + this.url = 'https://manhwamanga.net'; + this.path = '/latest-updates'; + this.queryMangas = 'a.item-cover'; + this.queryMangasPagesCount = 'ul.pagination li:last-of-type a'; + this.queryChapters = 'div.episode-list div.main a'; + this.queryPages = 'div#viewer source[data-src]'; + this.queryMangaTitleURI = 'h1.item-title span'; + } + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangaTitleURI); + return new Manga(this, uri.pathname, data[0].textContent.trim()); + } + async _getMangas() { + let mangaList = []; + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangasPagesCount); + const pageCount = parseInt(data[0].getAttribute('data-page')); + 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(this.path + '/page/'+ page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangas); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.title.trim() + }; + }); + } + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryChapters); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.querySelector('b').textContent.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, this.queryPages); + return data.map(image => this.getAbsolutePath(image.getAttribute('data-src'), request.url)); + } +} \ No newline at end of file From b5e3b1f09cb19b988aee051e2919edb839e0e8ff Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 11:53:31 +0000 Subject: [PATCH 09/48] add ManhwaManga icon --- src/web/img/connectors/manhwamanga | Bin 0 -> 7284 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/manhwamanga diff --git a/src/web/img/connectors/manhwamanga b/src/web/img/connectors/manhwamanga new file mode 100644 index 0000000000000000000000000000000000000000..2c1e65b51c421e2a09a1549283a66a6ebc3be5b9 GIT binary patch literal 7284 zcmV-)9E;saq{tZf1>ti55d9bvrKu-6YTUSoDS#U+VD7LtX~F}g;Yqo?nq zs_XjdyE60LAJyH{)7^9QsL?^p6B85N)m2%UPrmuy`O$0N|Ics%r-yj9C-7W{I=_$6 z=3lw@3IlfYAD`dYF+lr<8`_-BKo9S|hIU7>EsmVUl*;(D$rG5`QJmRxHB(hR(l@q={F zM@!fJY_NlKCy0QAo&)lp_;3Yn3O=2*PbFr@4 zhjA0~6LRQZ@li|v8H_7aAreeD}_|gFqPnRNQSV>9}fsJOeTOxxE z*fBvC6tKC+9el^&tAC~OR3<5wl9;i! zvi(8ZfhVm&8H*|>kq|FTYS*R95eWr5XA9pcjGdpzuYv&q2nru+&P;{Eff4|NfVPok zsTFbEsJt*%(eatIGG?f(p!r-*Ff){3#o)&p&B<e075U+hdt|AJCz-BR@sr@hE?w!od1t| zrYu7cKEChRZ0i2FoA(`?&b8eU8I2VwJ);?5kV|?wn>*C#cD3h#0K-VEaEKMHhl<97 zO(C`&NnY}j%g#y=gB<25RakL?B@>Jw36)PwF6)}fKO(D_*+$L!E3W6U)esTMwr~=X z&e=366If8^;Z=5ednk!pM%`Lo`RLwBFaR=^9L2*b`|3*75u93tEDJ;a8Ai4Y;ficI ztKVNwleA~lBP(3O)j`*ST2?B8C33YLD5|*6C$r5#J12s$7R}$|4gT04{8Hh-kK9l>}e$YcBBtoFue@~W(HOchg-;xvASWdts~!_ArFp3_%bCX6*Bm2g1VP*bfwE&CKx}Rduo5s+bWdPL{Ie`|H|jk|Y_Sl~?%j zr}iKD&C%Ic6`Oao%1xsjfi#1z-aZ@@Mb;FOe{xP7`f)o-a0^cPCLefV|JiK2}qvoNe+K2x~7XtNBYz^7yy8B(FUm^CLuv6dMjzyc2Nq4BATn;AoL z?TlI`Df#UKi$83a7{rRBsZME+m#pcOQ|R%OJJp(fxTyglNHVvrx;6;^>Y^tHyv%4i zkc+R+cm7X(z>|i+WHhjS9&`t`Qh=MnxglBlRPzS~iY*8P!O$!|UA|_~%YAm?&bN0S zuh^~tr$Y3SL``x7)_t5ZNN;fOSU_u9d9)cCUVl{(w~c(qz~ax9o5nzHSh^sF#Y+pV z%ls&|M1ph}yYn5Er`iSvxxy^OPdwU*z(Rl+35#(j{gZu12i#0+>M6!s`|G~2mH|oW zQpV}_hHPiC7&E=9HRC`V5P^l}hupyr_22Y~;?*zA7WZ>26C#3}u=I_&J(&2izyEjJ z4}GToz0WOu=YuOh5o>#78G+>dQ!CvtRcqlD0kIVqd-1!6=3zJMOaiPWPuZ6jTZt7C zoPdrTNknQPSM34-Qj{%c%Ma98Yav!gX2u7{rViv{V@MGT0F3MM?Y(Z2S|WnZjN$DG z+My>c@TBVJbSie`qRD?Tf6+HedkoQp2@ko|AMscn{`F>INQB=C_I)#$__O7I*v}0E zl3+HRLio_kBouX4OnW*K;$+%U5GO|d%D`gp6v!{1gNaCheZ>=o9womtY~ba}O*a0avV*m>4Y4KGyC|cP(2mthE44W=K%a z&rGZsak5_@o(Hhe<>+a&%Yw+RfF(p?f_jpS7AV{7H|)5op%qQ4f?yVs`)q1Jy}+Wx z*@rv#U(3s(%I!0qtId+=Wx6bV#Xazs{Z~YgIb%{O$PwjccXA;S@)V`5ncg|L=sR{> z@v(p-S!?mlM%k`uR3gfQ6#oo z-m~*ymEpny0KGq(i{x@!OY&0 zG&l6MjDbA$uQ_RaVOvHjiRHR284_ai{_g@o47hA3gTi0ruI$OE1Q%^q$#m+-YM9JF z88&CbL<+T*+}St>0>@UqqST)7;*F-(FiFW>E&ucM-oL326qF{WowDN+FKg$0$1ncG z#IaXa8k;y`pqF`Lkj`{}H?9{0acVVhce*Bf8;0+wlY-b_;QbnLzN$fcjJ5A-Qbd_FlQ3;1MXD}HP8;=fxQlmaKS z{)DzsT`LGo0%>Avbt|{zymvu@dSKA{cUyw%P;RRI#ABh!GNFVxeUa5L6@lgDk_BoSSYRIn=T`6KAYL^nx#6*l{=Q{VEkS#HVLRf8+Qi3z<`rPm7(^DFF)b zr2T`Ly_fW5u1# zGAx?f`9Y)nt506`M{|1wu}A#$+3CRo0+7P~-t68x>t$CmEM`*Ip*5RG(3!Sd0(#ob z7Q9~iu940CxSr`u3OdK`g`SJN*GVI$natCSf;9HLl+KwUfRxDrzplK}GV0ED>7?x^ zu*TR`{c2yJvy)NvuIV5GQbA+gxcx{y%Gf_sDP@~^GjKTd1mFte0lOtQo6yro41A$J zAc^zBZuB-ZLC$w*Pq0ylcI}8+Mj$wz>>h5hC(oz1BOrE(naTci*y*7+ud>nwc}iWg zmzi5^n|vp+8*)s$Ll7~H6oqy&KO55)U+WxUpTWjGv)wibfh;lY<ZwjGvFd4;hMz4EkP(@sh&EJ#c1eN+r3p_hXd%y4F+T^v3?WeK*g`wuwNP;v2x5j( zF!NC-GV*!ecTEB&wJS}#?!N8Df(RnB&U}ZT=j@<&%D}Bgwq61{*EJFI>c1@-h6pe` z*G11IeSU*M0!b}icd5@tP;bG6M9D;{L@6yK_41jkT?%ZZP_RK~s=I`cf;CfWuWYXfX34zh`}0ArK-RdzFpNgQ8d{0lR(L-v-Q#T77(;>> zyoI1%1x67O(&a2|rD-$GR?@c4z)V1@;;!g;zKsWS)^WWNk0ha;owxh*T!esbY1Rzd zBth%FZ!1}MvfEwin$+|}DI)5fN75`gJsv^ST2hdE!i&fA?bLOsdrsXb&wcb-J{l=! z47HIUhE+5e#&bvG+HAzekRozdm9kp>C;))SkzfS|;!d1Co(M;rXHVR76MV7~sn%a2 zm&|f@{K00p*86sbKG4_t`u(+3Yv~Z3o|^3jJLh+v5d?HuWJd7X+5|y?H?qb+W`zb^;y|1>BJQaJ z0~jU)SirF8Z782S22jKS*=<%pU}k0}kYa{Zz;d#Df87|pH7WayAz^w^(7nv>_9+tx z3!tKOpVYpv>pk`cRM%=M@$L<Rq4{fa;gFN{ORb27IGGq*9hE_hFV+S>GCOgGMJu61<7jueVI1e# zVTXFj0AXKWsY5_#+f+)|U+Ad}20Y?l9bWj-N_8^z+*2pczz4^sUo%j*h6MN8HA&lT z@{@x2%|lB+3X5N?SNl#=8c=ScSEf5s@Q(YAcL}|;bk~aSHu^5lg;Jd{q$8k56XB^= zu&kY}ReS(hZ!H9fRSms$%$}x;wU|p?MW-&GA&7c4eibZ5+)Y_Ln^xKap0J-@8u@Wp z+~Xw#7$!xWoodr0aZZ>(*a4NzXYN-UmCy=zi`)y~4`(MH=oZG@Bp_=6Mcg}jwALJ= znKYwm)Lre;ePJQkQqDG5wH0b6mXX2fnqZ$X^oaODr>NVdGrY~NwM$qaC+t>s7*ND* zBma77XkC@{XkP8JS^K$HR&~kdPPK+a(4c*R5rSi;UjC2q+;D;m!kl>`tDQjrfYX&d z7?8yM>XhdHO`oN;|1EEGkDUyM)qLI&l(O<*&!r*znSsIXI2rsj>LP{_C{zNpnIu>Y zS4GjIvv>6qEWuiaWwMqnvt{lz8$4I&-5n4!Tqhj}$XF(*MmaY+(rp}#*gI{u-4c*- zAb`LzLdD9-8BJDe!!|b78kPh>r)y7mK7jxOr{ZUh>eXCTVvs*jtVUFukEBajyCb@) z*Z^aZGggikCq`9R$ptVs#|z)_Mq5((MyHEOl9+Tpwws9aeYNk(Qtr}XSn^uZ{l)H)i;kSQF|956#p6LS zs{}#StB$z+B~|puB%CC@TdU8@gU6P=f>%0t(vm6=gkca$SC{;;99E*B9!)3i6)L7a zRSR-sRa)%JtIRmsuyXQj{%2#P+)S?S|)0**Kc&rk#`p z)3X=Zoeu~wC`=T{r}e&adC5yITQ`6*FTDX@4hQ~t;EV@6oa2fYI?Bs_2O(f zTuN>WtG`@by1qVp_mg<5oN2qcfXyqw9Ga?~5goK8Gm9&;_AP|sQw2e$j{&-5>-5t53UA|%9iGPRt?`W3x4$R0X0>h9J~w{X@XGDY;`=A}cN*DyyxG`SZwilv+BqEbq3Y*G0yl6) znCaL6&?G?54UwW%>kJk}U+&xM)0O>-El$mi?%+x$0}k1}6b>PIS+P-(sUvV(qdcVI zAGAiU%Y~2VQec<<&Ef+eJ3jJ`JrBQfXrROD_QH5;zqdR#o}2C@(_tkF6N9D|Qua3B z85Ju6m|z)X8I}TKcQo%0`u>2M`7$*WlAE(e3;1hye9!g17yt=w!I{q&-&vX;Bzx;% zJC+ksAtOL(7AOlndTRCdUlprgZW4WA1O`$rm*i##Nk+7t5pmNYxDo z`|=)f%GQ7~1A+yKpH5Pnu$pky09n?Sgyy_MUf#>^D~|5XiHrN%m3$^e)g~hpzqxbl z4U0!RzCWo7E-Zs~&_Kl?59V%X@R8wurENuKZ)^PICU@oIvwP;PcR1E_nM2lAbw%G0Kb~`DvwGLS; zge3?;tCtP1+UGumsQr5$g&g|RNM*t!5qYZPt{!YHkvTuzi2*bwB5f_ zd${f2R?ojOZ*Ck|_#Q^`(Aa5*8H4&b)0T`7$2j-B{g?ehc{*BZ^x5QJjx4?YsjH60 z-a)VH3oZ)tf9w4(%7+JY(V}&a+uRrC3WF+p@qBweb8a0z^p+ewP#!6dnZpx(_oY>; z#ml4?oA7F(V@#AV!3wrklEf)tRnKCqJ<8yulGGr!>@Wjlg|LCEEKTH1GMHy6_ZIAI zsZfOJxawtk;gax3qahDAmLCt@=@1WhbBD7%8K~@-BH0?}#af5Zj$81|nmNkD{7?;j zZ(#VPg{7)BkU3^QA6K^Ej&4YnaU z3hWT4Box64IpJhZNzMfMytPGXheoKHCN;-z`d$K2PHS&idT37?G2xyi6^P`^E7i~0 zQHS`+G`Pm^USA3y=?4G((qrE&?)|F2r^Hz=v2gx(H7roz48VPUq|xN2jc#Je9KO7jeM$NA6HY&MnF8f()i*;RSlJ#ZH%< z5gElo3R=837`nMVU72j87LSgO|8I5K#oYPLnFrtd*u;y=;w_chCl(L>w*yC8Z8vZ2 zuMaFtzA=HmhUvKqt4N)g^v(f0XwHdjfT>zS-!1Q@Ivf>T3G6!NriA!)eZS>AP{|*K9K1 zq5ty4_(w09{bTo@|98y!%8LKD2cKBV-2XZ=wpYe)I&gTQuXN(Ej&+j{k3arL$49RW z>LZf>wpOWS@}Sdw|J4tDZnE!F^A{gf;k)wPLSAPqmf3Fz=j-i?W_gj9+*oLRc5&!f z=1(Qg3oA+HdyAP0ErpizChL`qc7dQC7|=wLxx^`eDdhete=vpog-fSj5ZB5p?LT%- z_?f;PrO42JFP_z2Rhxe`Joka=eal+iRBYeXF8ahjS8P4n@>)<8H!b`2jz;NXG5@Lh zzWrV@6!2fy2ELz^11??>FOfKaq-xrmZr=7R-FHc48+Y0kc)lG??UA&60 zTDx>%eQOB#t{VPYVSFqf^;3FfXXW=s7B0`yNIP%IEgZ}zSLEY`)KL;;sc&nPLn|KW z=2POaC_El}6{%ZBzJKj0dxHp$tceM)3MvcjcK`ku|=(mUF{?qK<4D_XXrJl*d9d|^euO4g- z=J0`QSC&cx-|!~#_LN(PyGGDPrh4kFz@`Y@g=}%|iDK!_;;6LtVA{N;fBvW(`kF0% zXn4vnbrU?$3f?iiIOb&UJAM&Xre>qukgs1;Y#fb!DY#|iRN~HLjw85kl(A5j7c%E{ zeU1COIRGA^q1DaB_K(_yjuj7ue#5Gn%$qUZWaPf($iu{ZysMT|^@?))Unev5L=8Fm zWBX^?rJ`4o-*pat(y3@6mf-c-RGgaB+JU2Z9!xPv01BM5T7xo(DV6`8Kl+4Qe$4Gh zCBLuCj~562X|;K4zEDbDaJ$ta;Hm%4P&%mUt4M% z8XWHqmG%yZ?^pNVH#%`|VdVSX=(NaL5L*;kZ_U&0>Q#g@;$(=&48Ra|Nv4n>RFM{J zWxDqZ-x z9Ixm6-UF{9h@3HQW*+qW18Y(t1hW7;Yz@ePRjZvT=h~m~Y!b8)>!K~zE+jIM?fJ*6 zH%uYHAt?)TVI#;qYX%}xd1$egq!3^WVnVL>^d4Sy!`E%oPDA6}SJLN)^?4hdQiXC( zZBpvzwD;yBGF~+WddmZ^c>PB9)33NZR|q;CHf{KJb;X}SJtUm{%q O0000 Date: Tue, 6 Dec 2022 13:26:26 +0000 Subject: [PATCH 10/48] Add TruyenVN Fixes https://github.com/manga-download/hakuneko/issues/3567 --- src/web/mjs/connectors/TruyenVN.mjs | 71 +++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/web/mjs/connectors/TruyenVN.mjs diff --git a/src/web/mjs/connectors/TruyenVN.mjs b/src/web/mjs/connectors/TruyenVN.mjs new file mode 100644 index 0000000000..68dff64af8 --- /dev/null +++ b/src/web/mjs/connectors/TruyenVN.mjs @@ -0,0 +1,71 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; +export default class TruyenVN extends Connector { + constructor() { + super(); + super.id = 'truyenvn'; + super.label = 'TruyenVN'; + this.tags = [ 'manga', 'webtoon', 'vietnamese', 'hentai' ]; + this.url = 'https://truyenvnpro.com'; + this.path = '/danh-sach-truyen'; + this.queryMangas = 'div.form-row div.entry > a'; + this.queryMangasPagesCount = 'div.z-pagination a:nth-last-child(2)'; + this.queryChapters = 'section#chapterList a'; + this.queryPages = 'div.content-text source[loading="lazy"]'; + this.queryMangaTitleURI = 'div.row h1.name'; + } + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangaTitleURI); + return new Manga(this, uri.pathname, data[0].textContent.trim()); + } + async _getMangas() { + let mangaList = []; + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangasPagesCount); + const pageCount = parseInt(data[0].text); + 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(this.path + '/page/'+ page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangas); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.title.trim() + }; + }); + } + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryChapters); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.querySelector('span').textContent.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, this.queryPages); + return data.map(image => this.createConnectorURI(this.getAbsolutePath(image.src, request.url))); + } + async _handleConnectorURI(payload) { + let request = new Request(payload, this.requestOptions); + request.headers.set('x-referer', this.url); + let response = await fetch(request); + let data = await response.blob(); + data = await this._blobToBuffer(data); + this._applyRealMime(data); + return data; + } +} \ No newline at end of file From c3e93ea856f061643403da7a3a0e440b16f73a1b Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 13:27:07 +0000 Subject: [PATCH 11/48] add truyenvn icon --- src/web/img/connectors/truyenvn | Bin 0 -> 7269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/truyenvn diff --git a/src/web/img/connectors/truyenvn b/src/web/img/connectors/truyenvn new file mode 100644 index 0000000000000000000000000000000000000000..5c2505defb9accb5de759e79bf2daba320f6c6b1 GIT binary patch literal 7269 zcmV-r9Gc^aP)is6h;5E=?}-KoyHB2v_OCK1-lJmy9I0~McV`cg8WF)x=jVA29h`kQaFAmv+&xK#D?eB!h197*{n@Y7hBF}&`fPZyUlfNmUk!WbFQaJ{wDd@!rP3$S(}@v zHBX3oOLh%xvWPa{TYm26bqcdBd7F53a%`2#?W(K4&XRpzTfVLE2!OsYZG~J5U2k9g zmJY)H5dJF>)ZS{;76Wc{B7h+M+!h$?^0fucvfK6D)@HzCtAU+u{&1)0dX22M7&QwL z+X}BOu3b}^K~3Rr1!BYJrgUY{P>y?BEpNwoVH4v9CkH`&i?ZHxpZrPOEC_8gp6{9r z+AX}PzKln5%RTp|1Z!=v7XApv@m6K5qhRwS)q1y>ep{*`XHu$=7*X;?*|Y0T#sHl# zmoSUcv&o%NxV#W_kt2daRwZTCO~ST9Tj~H37)=z9r*@`#j3KNQ<~oMGE-7t$#@a*` zIY?+Uk;YS7O;eS+HJFE|zx3cwfy$CrhE>|5O1sF%Z^jRChJcmxY}XTw&22C5-x_5 ztaD5ht2{b$`SrxZzmbNRJV`ESuJ57}T(Gm)d_=JFsXj*xU<}}m(b#@5j&=FUS{xtw z=+Stv5$8tW3AHe1`0KxPd-#C|mU#c&3wIcU4?)-uVi9DgB6nK|E{}Zy=~`LR0l*YO z3~&T$fI0I97J~lTrOD{@so^lP8e3uQ?gPF4)%7?&^3kIjY{Vo%ub(UC9V*5nh=Ftz zl#Pu5RGEDwos{v4r7LYq!9C8ha33L2*veeUZ*n1+#^5@MxRNpzC=7{z^bg+FS?-wy zyKe8Zk^Ui|WrAH$fnRG?*F}k{DYNEH0So~~k}RZ%24lMxUy1wirTGpn9=T`N3V;<5 zr(kiaGsnRvKXPC?p2|kC^jm-MI{WK!<|KTTg*14FQl$yZgpgcNDXLScQ5mHX!qcin zGG-|z9hxdiSx(k2Yo;6l2w>2c#odf_S+O0Le7YOg$uoh`)u;;_-VCdEngEYNjOC>E zET?EKOeFEljY!%eAoIvs$B>CWNV#?ehLa$`MJt@OBl|jl^8k*6*wZCXed3pIzseBn z(O9ED{^ly4J+Wauc``{t0LH1k;F1Y6A=DJWmXw$S^O!k67K^r~^ot)$m^>Gg#)l&A z0`V$^OU$b%lLZh220a)YhQ%GJ+Xx)fl*TT_dbHsRl;7rDQ^zA)rt9~Fn;vG-Fo)K25;Nj#ic7#L~$-t?L=(Ti2?mo`H*EArJEK+ z)K+*p1PB;d+ymeT0ADUu0`I$!^sfQ20AisjcHD}$S@Qrbxd#9)SE1Jw%76E{RH25iNaf<=NkA3|1*H2xI_{7mZ zyB%^g7Q&)8&e~O~#(!SrwXbHhn{YiTgjFDEGpi757IceGX6Ip>ylT_{MTCHMLkJBS z1NI?Y8K0S~Mb83I93>7pth0(7PF96z8!ydel^(QY&OjHze379h;1p(`btA4yZM;T# zXDGAwIYEdaphW=(1A`yOR9AoUJxj->gF5;87{B+`H*8p6Oae7&t57q8s5vaiW;=5K zr7+ZA6LCD&bbz1~y5Ll5ow;v;|e*3~B;Uzz^iSKnw3!Wq*$2Z-*Z!TO~2;2xL^=jcmb$}IT0GoUGvLC5S;ZG|hoFQ}>$t>8{RN1?gge!%@ z7Fp_~srT&H{!N+vaXBz}n4uZ==FGql8>V>;m)Y~YrSyJ$tq{h!ZSQk6XwO6@Q+{2Olb^23t|juI*C%@>dT?Z^BAVhbXiJcCgarzP3J6X$CQx41Fy_n z)pcX85Kvs+u7tZl?3qpxS}TTtAz_iN5g@mb&9=)-W*eJ!LzZCkT_nX4UJb-I!hloe zs|S^Y1Z*MhiCIv{VwKN!2BRV`QM;J}m;i_+SQ3GNT>=8LjC%#kxx9r|`RonhbzF5PBvcX@Ialh`t7g*;3>p5xtJ-%yqd>!h1pNK?*MYdJ>DO z!5hq0HwkbZ(n}yN%3^(OJ)X!RG^ZycLbL#^peqty>V#bF5Bz1TD%A~*wz1gA6DESr zf_RC-X$H6oat;;;3G9co55PeI`vA;uzb*n$2qKh{S$uf-XTSe(KS?JbR|b*&>@OZ( z`s6>o}M5Yt6&K)_O z#sI7Ytc{ZG0M+$#O+%eabmO2LK=K9mEIty@P~tH{Ux&fB#}j*UG*K|$HFG5HHU=LE zjCs@o?*laN@?~`iuq+~lZ2XnnV#*W&EzbuC`y27tZ$P@ytjSa(kQ1nVk!yw^EF`;0 zV}u+HhVf)$Y{>~UDbL0K`#@NoP+u{k7jb8GY`tbMfUre|R##7#z2QxNk=` zVzO!UH$mLC&3Y2A9BX;cVz}@5|M9LXVL8sG9jVwVfJ6~=J(C$|<1R6pSp53$oWgKo*MItN>^}L(!+W2JH{x53 z!2v+Gq2PYono;HvN*o23mO>M%k?l7za-z2y1{=0Sx@foYF{A zwHDU$(&%VG#NC_2X}JT4)YC9MVI(m@q*VZ18wMr8N(Bcm0EnsGOC5E>+A(9jpR%%j zo-Zd=^eZVNUDjZ^-&n(w$IUA2&ysmN1$&fbZ14HfnELcGFbsZ$KdEoee~C3KXdb3s{X)0 z(WwJLS)tp6p{|+M0(P1rz>SgBCw}h0{3rg&p+nQv>4Raw_XxTppO3a7owU9pZw%pS zkms)qqRAwZsdRu7Kej@7sk%;6GkHS+Fb1z*jxw22_*)$lISegVS<&^@M`@$PG(;D& z^WD(w`s7Cr&X1>YXJcgbGY{`M4B-6+_yB+hAnva#qFoPe$BzRG`@H~oeYGD?r*$L1 zby%-U!6==bICovF#?06S#sHYa_}~MJ+SM~yA6cXmpE}p#$NwfBI}B$0Xqh%Ob0t;K zOqZg}3nko4s~_ui&BiBx`S2|uIw1FJXzz*Fq9exeK7jj?EKDk^3o5R7`f>nZvdSF+ z8c8^149{S}4DPz47ca~il{>(}P@7~oDFjVeCNDkxWst1Fdlf6$h{#}AI*@3g`Ch0X zsB{=nujn=)<__W29p*;;>SS>WnLi=`bO`JRcprr2$;z}(U{2tDfx%x33~v&!8&J>p zD_MCp^<_LmOJF466p802Q(gJh|M<%2%%v$Ok*#!qCt_kJZT4Ni6;UEzz0wT(0ke~@ z#%nC8EAlXbWdZkw0VgCn1P=+?r|n&2aY9-VeM#Sg@b$Hgc>LR6zG&Ua>2e1+SXgMA zDW^z37zpKUaknj*rKJx;3kMxk`dt;hty#z-xU$O&$cF@x1b-hs`>`zHWluv3-C}@S zvIIyB%y(O<-^qe+p*$cxx0~|>#(}gZ@H~ib^QQ2L?wr9rhkLp*h-6rNRY5_MH3&Lo z)Wyek65JNS^+C6;i=9Z$BREn0LDgH-78X>Tqn$PriFOJJIJxK*c>yB1_oB0^Bl0`Kn;uaq~Ko1u!4zsTcaDzfpjp zbtuT)2dKM&SYD1W*-!wGO<_xIsYP-1JgR}0jj_6XEId!p9dUucGZLR**E~HP#}_{T zzs{kbUp67oa!u8(iY5wf2{JQ~Q_^UXE=3pH(F8STt)duZXBlHH=^9zHmJNvH2+*?< zzE0w)wSIK`+@(oB2uMRH2=dLS>SQM!$a5W|#J(*2!x@c>Y$845z(CUC8LZh5vP+7w1Ld~btgwY=iUGXn0CaI1ta zI^@l}lQYnD_lN5`ps+ewR=oePZeg}=HMB*QLSgl_KxMa6meHc7OMK}qij=gi6FrEm~MdKGCw z%`i0WOb6GT1(%_vtGrF6dF-ec(@R!2A={LfSsPif##~I*$&vAx`U?Y0tZ-h!^8lX$ z_)P*&QCM|XRP)@Gy|kJ(D@A{HH=ws8vhNF^L;v9y4&j3jEEy?z#|4ny6ZYhGQ)G=M zae9EI)b%wGt=LS}D54DjW(k@Mv~6xgBHcJD$>hGN@Qt-R0WqP=5KaMjLEsRONb?Y( z9~1mznZ+$1Q>w#1kwiL!*4o z?Ct$}u!yM*W(RQ{G9t6rwq!`D-TQ18ykvu*DPt{)^9s#)GBIc(kV6yl5(D!zh&S@{ z)H(U(m6czrFMzNF;(&3SppnocFRA>&{F&*4!}y5!YB)f6l|Z*@L-lC45- zCu=r8&9_^c)XNjTnQCm{xcmz)?U$x0N&l46XZa1Q;0Xo36)y zPb<@VE}Yz$`=ci>D@0LlAc+ex6aShcAXK}cuECCcl#oi^>aVv*S=*de{05g3wiQx* zK&+1~VhNpq##)?*<;w)l1KbB_H%jlRDi_p*SC|O96bAeNp|iK{>0CJTr3WVl4Nz3x zb*s!uN)i{KDNFZkbBySHsJ;2V9T=*d=Z(&?xtE?*mZCiQZDMbjMxwQVEEp_>t5^(A zNqPmuB>pCE7pv#oN&?F8Udfo1MBx3*>r`9A9 znL;ZASjS6F-Lx5F+e<^*-jHtG{Whi5BnV7}9W3|b5Lvcu=y>j#6?X3m6c}P*-slg% zatVL-_{v4ID|o@i_B6nCAO*e|5-hnJXJ)C+vN=KWJg~%VBJTt6*A?lYL1{6}U5cCQ z&A$u_{dq|hGUgW635m=77$5uW z3H-&eejg!Tu)=9k8|9m%uFT?_q%iqPGrh=FvTrz z?A*knBJNC3b8{H#T9p*p35nnN@GeCcO z5zrYBX9X@$#ifZtd0^%B?jm9XtV1|&fnxx_+XzGFyMeO#+m>J`iVzeIhPE1U+g;?g z8#ET#E1Ie=m~DokWnNL?t{LvZguws&Z)c*>(5}(oH9_B`G;ki*^&h-4Q^8#rOzKN) z<%)6`tUG?S&PdE((@R!py^zHRWlG|6kC{7hR5_yRyvp0L=o z>%Z}rtNP-V2!H3H9%hAB@)QDH`@$PDewK zA^?4_uv*c5riY%K&mTg`TS(eea1A6R4IHO+n5JOULK6rh2(jHyWej3}2PH0X**pKAW^<3HAAbB~-27omJ=LLLkG__yt^};{=+J((~;FHy?YnV|Jr{!8GPmoXB7m*${?y;4NW|D&qP@6tZ>af zX#%dv+QZhWLvmg~7gnJUEz_gi5r7Gx5ri>2yh8Fhfv;g9=!azN9ZB4g4q$*00$eb{ zcL>gd*cF86f-sr(z333Q9T1zo2ng7KaE{bbECuIQE{r!O6PxM73A!<|`1}9vIQA|D z(R=P)u>bPI2cMb?8O4!aGvI!ROCUOcVoC#vXBpt-pcniQ!ijhoU;54e{M!1TK5=>K zN+yeY!T@p$dFHt_`|Yo+m=G%o_Y70_M~U4k(z&N1K{8yoTE7k@Zh-M_DMh2-#8e)o)B8^$DoIL;dw zcnvIT)b8FD=<0fmPkrnVKmCh`dn=bGOPzqbAaskKmH;)j7VC@i!P=jGYjyN<|Ndo# zArV_)ZD^~=HLs`XZxOWeNSMW55T`exGI3%nSOJ~tb*Svc*wiQ&XDisg)) z?!Wrk5i<)Q0L*pBUe{EP;5X#eXdqiz=tKk* zSz&#Y>7bTc1!fvcooHSuZGtAVdXwcTOz?J^YF<=wO*E^VZd%i_#z;S1Q`wtYOcuRL z^Qa=~Y@o(BV(u*MXa{Vm;u&h*tV1{ZOL~3~^gF9=a`~g8A6W#ipk2sWI<@Zkjp7D@dLwbvC}$bMZC1c`-O2S-(sta;PV(CFIDR8TTBn+-$XGW7odk6H=}K?X7400000NkvXXu0mjfUvkM> literal 0 HcmV?d00001 From 9388eb3570c5b9311af97e4f8806d3b231db3b97 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 15:10:33 +0000 Subject: [PATCH 12/48] Add ManhuaDB Fixes https://github.com/manga-download/hakuneko/issues/3477 --- src/web/mjs/connectors/ManhuaDB.mjs | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/web/mjs/connectors/ManhuaDB.mjs diff --git a/src/web/mjs/connectors/ManhuaDB.mjs b/src/web/mjs/connectors/ManhuaDB.mjs new file mode 100644 index 0000000000..b27f7dd144 --- /dev/null +++ b/src/web/mjs/connectors/ManhuaDB.mjs @@ -0,0 +1,73 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; +export default class ManhuaDB extends Connector { + constructor() { + super(); + super.id = 'manhuadb'; + super.label = 'ManhuaDB'; + this.tags = [ 'manga', 'webtoon', 'chinese' ]; + this.url = 'https://www.manhuadb.com'; + this.path = '/manhua/list.html'; + this.queryMangas = 'div.media.comic-book-unit div.media-body h2 > a'; + this.queryMangasPagesArray = 'select#page-selector option'; + this.queryChapters = 'ol.links-of-books li a'; + this.queryPages = 'div.content-text source[loading="lazy"]'; + this.queryMangaTitleURI = 'div.comic-main-section div.comic-info h1.comic-title'; + } + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangaTitleURI); + return new Manga(this, uri.pathname, data[0].textContent.trim()); + } + async _getMangas() { + let mangaList = []; + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + const pagesArray = await this.fetchDOM(request, this.queryMangasPagesArray); + for(let i = 0; i < pagesArray.length; i++) { + const page = new URL(pagesArray[i].value, this.url); + const mangas = await this._getMangasFromPage(page); + mangaList.push(...mangas); + } + return mangaList; + } + async _getMangasFromPage(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryMangas); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, this.queryChapters); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.title.trim() + }; + }) + .reverse(); + } + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const script = ` + new Promise(resolve => { + resolve({ + img_pre : window.img_pre, img_data_arr : window.img_data_arr , img_host : window.img_host + }); + }); + `; + const request = new Request(uri); + const response = await Engine.Request.fetchUI(request, script); + let pagelist = []; + response.img_data_arr.forEach(image =>{ + pagelist.push(response.img_host+response.img_pre +image.img); + }); + return pagelist; + } +} From 2e48ad53f8ce6b315a95f301e90e563f290573f0 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 16:15:47 +0100 Subject: [PATCH 13/48] add ManhuaDB icon --- src/web/img/connectors/manhuadb | Bin 0 -> 1098 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/manhuadb diff --git a/src/web/img/connectors/manhuadb b/src/web/img/connectors/manhuadb new file mode 100644 index 0000000000000000000000000000000000000000..72bb76c50880a876e4d2da448aa3586170ea826a GIT binary patch literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL literal 0 HcmV?d00001 From a67ed74cbefa1571b0129528f8409cf6ea756eef Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 16:17:00 +0100 Subject: [PATCH 14/48] Add ManhuaDB Fixes https://github.com/manga-download/hakuneko/issues/3477 --- src/web/mjs/connectors/ManhuaDB.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/mjs/connectors/ManhuaDB.mjs b/src/web/mjs/connectors/ManhuaDB.mjs index b27f7dd144..9d14241c36 100644 --- a/src/web/mjs/connectors/ManhuaDB.mjs +++ b/src/web/mjs/connectors/ManhuaDB.mjs @@ -70,4 +70,4 @@ export default class ManhuaDB extends Connector { }); return pagelist; } -} +} \ No newline at end of file From af59019605b327829ca7f7e239c21d3f547e8b33 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 16:18:02 +0100 Subject: [PATCH 15/48] Add Manhuadb icon From 65d6b077aebc8c8dff11b5001fbbd7fa944784c2 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 6 Dec 2022 16:18:03 +0100 Subject: [PATCH 16/48] Add ManhuaDB Fixes https://github.com/manga-download/hakuneko/issues/3477 From a7e527c51a249606f99bed47db80fb6085c777a4 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Wed, 7 Dec 2022 13:45:44 +0000 Subject: [PATCH 17/48] Add MangaScanWS Fixes https://github.com/manga-download/hakuneko/issues/4740 --- src/web/mjs/connectors/MangaScanWS.mjs | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/web/mjs/connectors/MangaScanWS.mjs diff --git a/src/web/mjs/connectors/MangaScanWS.mjs b/src/web/mjs/connectors/MangaScanWS.mjs new file mode 100644 index 0000000000..87ade841ba --- /dev/null +++ b/src/web/mjs/connectors/MangaScanWS.mjs @@ -0,0 +1,36 @@ +import MangaReaderCMS from './templates/MangaReaderCMS.mjs'; + +export default class MangaScanWS extends MangaReaderCMS { + + constructor() { + super(); + super.id = 'mangascanws'; + super.label = 'MangaScanWS'; + this.tags = [ 'manga', 'webtoon', 'french' ]; + this.url = 'https://mangascan.ws'; + } + + async _getPages(chapter) { + let request = new Request(new URL(chapter.id, this.url), this.requestOptions); + let data = await this.fetchDOM(request, this.queryPages); + return data.map(element => { + try { + const src = element.dataset['src'].split('://').pop(); + return this.createConnectorURI(decodeURIComponent(atob(src || undefined))); + } catch(error) { + let src = (element.dataset['src'] || element.src).trim(); + return this.createConnectorURI(new URL(src, request.url).href); + } + }); + } + + async _handleConnectorURI(payload) { + let request = new Request(payload, this.requestOptions); + request.headers.set('x-referer', this.url); + let response = await fetch(request); + let data = await response.blob(); + data = await this._blobToBuffer(data); + this._applyRealMime(data); + return data; + } +} \ No newline at end of file From 40d5157d62aa142c353297e3305efc73af8e8e23 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Wed, 7 Dec 2022 13:46:31 +0000 Subject: [PATCH 18/48] Add MangaScanWS icon --- src/web/img/connectors/mangascanws | Bin 0 -> 8633 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/mangascanws diff --git a/src/web/img/connectors/mangascanws b/src/web/img/connectors/mangascanws new file mode 100644 index 0000000000000000000000000000000000000000..4d9b144f02c86757672707d5fd1988f4d49d6904 GIT binary patch literal 8633 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 LNkvXXu0mjf&!fw^ literal 0 HcmV?d00001 From e5eb42c4e6acde2599aefa0be9eb2129b5a3a236 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Thu, 8 Dec 2022 16:28:28 +0000 Subject: [PATCH 19/48] Add NovelMania * Fixes https://github.com/manga-download/hakuneko/issues/3709 * Chapters may have mixed content : text and pictures. This connector renders both, but pictures comes after the text. --- src/web/mjs/connectors/NovelMania.mjs | 96 +++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/web/mjs/connectors/NovelMania.mjs diff --git a/src/web/mjs/connectors/NovelMania.mjs b/src/web/mjs/connectors/NovelMania.mjs new file mode 100644 index 0000000000..6a7f5f6252 --- /dev/null +++ b/src/web/mjs/connectors/NovelMania.mjs @@ -0,0 +1,96 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; +export default class NovelMania extends Connector { + constructor() { + super(); + super.id = 'novelmania'; + super.label = 'NovelMania'; + this.tags = [ 'novel', 'portuguese' ]; + this.url = 'https://novelmania.com.br'; + this.novelFormat = 'image/png'; + this.novelWidth = '56em'; + // parseInt(1200 / window.devicePixelRatio) + 'px'; + this.novelPadding = '1.5em'; + } + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'meta[property="og:title"]'); + return new Manga(this, uri.pathname, data[0].content.trim()); + } + async _getMangas() { + let mangaList = []; + const uri = new URL('/novels', this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'ul.pagination li:nth-last-of-type(2) a'); + const pageCount = parseInt(data[0].text); + 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('/novels/?page=' + page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.row.mb-2 a.novel.novel-title'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.querySelector('h5').textContent.trim() + }; + }); + } + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'ol.list-inline li a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.querySelector('span').textContent.trim()+ ':'+element.querySelector('strong').textContent.trim() + }; + }) + .reverse(); + } + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + let darkmode = Engine.Settings.NovelColorProfile(); + let script = ` + new Promise((resolve, reject) => { + document.body.style.width = '${this.novelWidth}'; + let container = document.querySelector('div.container'); + container.style.maxWidth = '${this.novelWidth}'; + container.style.padding = '0'; + container.style.margin = '0'; + let novel = document.querySelector('div#chapter-content'); + novel.style.padding = '${this.novelPadding}'; + [...novel.querySelectorAll(":not(:empty)")].forEach(ele => { + ele.style.backgroundColor = '${darkmode.background}' + ele.style.color = '${darkmode.text}' + }) + novel.style.backgroundColor = '${darkmode.background}'; + novel.style.color = '${darkmode.text}'; + let script = document.createElement('script'); + script.onerror = error => reject(error); + script.onload = async function() { + try { + let canvas = await html2canvas(novel); + let textimg = canvas.toDataURL('${this.novelFormat}'); + const picnodes = document.querySelectorAll('div#chapter-content img'); + let final = []; + final.push(textimg); + picnodes.forEach(element => final.push(element.src)); + resolve( final); + } catch (error){ + reject(error) + } + } + script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; + document.body.appendChild(script); + }); + `; + const response = await Engine.Request.fetchUI(request, script, 30000, true); + return response; + } +} \ No newline at end of file From dd4bbaa4875cb0ee7688ec8c4e9f914e4cb4a137 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Thu, 8 Dec 2022 16:29:10 +0000 Subject: [PATCH 20/48] add novelmania icon --- src/web/img/connectors/novelmania | Bin 0 -> 9315 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/web/img/connectors/novelmania diff --git a/src/web/img/connectors/novelmania b/src/web/img/connectors/novelmania new file mode 100644 index 0000000000000000000000000000000000000000..cf01e20504ff1c5539a35afa04162cae80162263 GIT binary patch literal 9315 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 R`X~SZ002ovPDHLkV1k Date: Sun, 18 Dec 2022 10:58:45 +0000 Subject: [PATCH 21/48] Code refactor on MangaScanWS --- src/web/mjs/connectors/MangaScanWS.mjs | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/web/mjs/connectors/MangaScanWS.mjs b/src/web/mjs/connectors/MangaScanWS.mjs index 87ade841ba..4cf5077986 100644 --- a/src/web/mjs/connectors/MangaScanWS.mjs +++ b/src/web/mjs/connectors/MangaScanWS.mjs @@ -9,21 +9,10 @@ export default class MangaScanWS extends MangaReaderCMS { this.tags = [ 'manga', 'webtoon', 'french' ]; this.url = 'https://mangascan.ws'; } - async _getPages(chapter) { - let request = new Request(new URL(chapter.id, this.url), this.requestOptions); - let data = await this.fetchDOM(request, this.queryPages); - return data.map(element => { - try { - const src = element.dataset['src'].split('://').pop(); - return this.createConnectorURI(decodeURIComponent(atob(src || undefined))); - } catch(error) { - let src = (element.dataset['src'] || element.src).trim(); - return this.createConnectorURI(new URL(src, request.url).href); - } - }); + const data = await super._getPages(chapter); + return data.map(element => this.createConnectorURI(element)); } - async _handleConnectorURI(payload) { let request = new Request(payload, this.requestOptions); request.headers.set('x-referer', this.url); @@ -32,5 +21,5 @@ export default class MangaScanWS extends MangaReaderCMS { data = await this._blobToBuffer(data); this._applyRealMime(data); return data; - } -} \ No newline at end of file + } +} From 1c7fd424e68c1ce7b115acba3799970cd85e9d35 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 27 Dec 2022 20:47:21 +0000 Subject: [PATCH 22/48] Add files via upload --- src/web/mjs/connectors/MangaHereToday.mjs | 5 +-- src/web/mjs/connectors/Pururin.mjs | 55 +++++++++-------------- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/src/web/mjs/connectors/MangaHereToday.mjs b/src/web/mjs/connectors/MangaHereToday.mjs index dc21643163..00b8ead503 100644 --- a/src/web/mjs/connectors/MangaHereToday.mjs +++ b/src/web/mjs/connectors/MangaHereToday.mjs @@ -20,8 +20,7 @@ export default class MangaHereToday extends AnyACG { let data = await this.fetchDOM(request, this.queryMangaTitle); let id = uri.pathname + uri.search; //HACK We need to remove trailing "Manga" from the title - let r = new RegExp(' Manga$'); - let title = data[0].querySelector(this.queryMangaTitleText).textContent.replace(r, '').trim(); + let title = data[0].querySelector(this.queryMangaTitleText).textContent.replace(/\s+Manga$/i, '').trim(); return new Manga(this, id, title); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Pururin.mjs b/src/web/mjs/connectors/Pururin.mjs index 95edab27c1..a7efcb887b 100644 --- a/src/web/mjs/connectors/Pururin.mjs +++ b/src/web/mjs/connectors/Pururin.mjs @@ -7,7 +7,7 @@ export default class Pururin extends Connector { super.label = 'Pururin'; this.tags = ['manga', 'hentai', 'english']; this.url = 'https://pururin.to'; - this.CDN = "https://cdn.pururin.to/assets/images/data/{1}/{2}.{3}"; + this.CDN = "https://cdn.pururin.to/assets/images/data/"; this.path = "/browse/title"; this.api = "/api/contribute/gallery/info"; this.queryMangasPageCount = 'ul.pagination.flex-wrap li:nth-last-of-type(2) a'; @@ -40,46 +40,35 @@ export default class Pururin extends Connector { }); } async _getChapters(manga) { - let mid = this.getRootRelativeOrAbsoluteLink(manga.id, this.url); - const chapters = [{ id: mid, title: 'Chapter' }]; - return chapters; + return [{ id: manga.id, title: 'Chapter' }]; } async _getPages(chapter) { - let pictures = []; - const myRegexp = new RegExp(/gallery\/([0-9]+)/g); - let match = myRegexp.exec(chapter.id); - let mangaID = match[1]; - let params = '{"id":'+mangaID+',"type":2}'; + let mangaID = chapter.id.match(/\/gallery\/([0-9]+)/)[1]; const uri = new URL(this.api, this.url); - const request = new Request(uri, { - method: 'POST', - body: params, - headers: { - 'x-origin': this.url, - 'x-referer': this.url, - 'Content-Type': 'application/json;charset=UTF-8', - 'X-Requested-With': 'XMLHttpRequest', - } - }); + const request = this.getApiRequest(uri, mangaID); const data = await this.fetchJSON(request); let pagesMax = data.gallery.total_pages; let extension = data.gallery.image_extension; //https://cdn.pururin.to/assets/images/data//.image_extension - for (var i = 1; i <= pagesMax; i++) { - let imageuri = this.CDN.replace('{1}', mangaID).replace('{2}', i).replace('{3}', extension); - pictures.push(imageuri); - } - return pictures; + return new Array(pagesMax).fill().map((_, index) => new URL(`${this.CDN}/${mangaID}/${index + 1}.${extension}`).href); } async _getMangaFromURI(uri) { - const myRegexp = new RegExp(/gallery\/([0-9]+)/g); - let match = myRegexp.exec(uri.href); - let mangaID = match[1]; - let params = '{"id":'+mangaID+',"type":2}'; + let mangaID = uri.href.match(/\/gallery\/([0-9]+)/)[1]; const req = new URL(this.api, this.url); - const request = new Request(req, { + const request = this.getApiRequest(req, mangaID); + const data = await this.fetchJSON(request); + const title = data.gallery.title; + const id = this.getRootRelativeOrAbsoluteLink(uri, this.url); + return new Manga(this, id, title); + } + getApiRequest(url, id) { + let params = { + id: id, + type:2 + }; + return new Request(url, { method: 'POST', - body: params, + body: JSON.stringify(params), headers: { 'x-origin': this.url, 'x-referer': this.url, @@ -87,9 +76,5 @@ export default class Pururin extends Connector { 'X-Requested-With': 'XMLHttpRequest', } }); - const data = await this.fetchJSON(request); - const title = data.gallery.title; - const id = this.getRootRelativeOrAbsoluteLink(uri, this.url); - return new Manga(this, id, title); } -} \ No newline at end of file +} From 91a9f876872ebe49c7a655f421c45779295e6afa Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Sat, 31 Dec 2022 12:28:02 +0000 Subject: [PATCH 23/48] Fix lint --- src/web/mjs/connectors/MangaTigre.mjs | 10 ++++------ src/web/mjs/connectors/ManhuaDB.mjs | 5 ++--- src/web/mjs/connectors/NiceOppai.mjs | 12 ++++++------ src/web/mjs/connectors/NovelMania.mjs | 10 ++++++++-- src/web/mjs/connectors/ProjectSuki.mjs | 3 +-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/web/mjs/connectors/MangaTigre.mjs b/src/web/mjs/connectors/MangaTigre.mjs index 0d7f41c79b..cbb243959e 100644 --- a/src/web/mjs/connectors/MangaTigre.mjs +++ b/src/web/mjs/connectors/MangaTigre.mjs @@ -85,7 +85,7 @@ export default class MangaTigre extends Connector { const CDN = response.cdn; let keyz = Object.keys(chap.images).sort(); let pagelist = []; - for (let i = 0; i < keyz.length; i++ ){ + for (let i = 0; i < keyz.length; i++ ) { let key = keyz[i]; let image = chap.images[key]; let link = '//'.concat(CDN, '/chapters/').concat(chap.manga.slug, '/').concat(chap.number, '/').concat(image.name, '.').concat(image.format); @@ -93,14 +93,12 @@ export default class MangaTigre extends Connector { } return pagelist; } - async getToken(url){ + async getToken(url) { try{ let request = new Request(url, this.requestOptions); - let data = await this.fetchDOM(request, 'button[data-token]',3); + let data = await this.fetchDOM(request, 'button[data-token]', 3); this.token = data[0].getAttribute('data-token'); - } - catch(e) - { + } catch(e) { } } } \ No newline at end of file diff --git a/src/web/mjs/connectors/ManhuaDB.mjs b/src/web/mjs/connectors/ManhuaDB.mjs index 9d14241c36..84fb57b780 100644 --- a/src/web/mjs/connectors/ManhuaDB.mjs +++ b/src/web/mjs/connectors/ManhuaDB.mjs @@ -50,8 +50,7 @@ export default class ManhuaDB extends Connector { id: this.getRootRelativeOrAbsoluteLink(element, this.url), title: element.title.trim() }; - }) - .reverse(); + }).reverse(); } async _getPages(chapter) { const uri = new URL(chapter.id, this.url); @@ -63,7 +62,7 @@ export default class ManhuaDB extends Connector { }); `; const request = new Request(uri); - const response = await Engine.Request.fetchUI(request, script); + const response = await Engine.Request.fetchUI(request, script); let pagelist = []; response.img_data_arr.forEach(image =>{ pagelist.push(response.img_host+response.img_pre +image.img); diff --git a/src/web/mjs/connectors/NiceOppai.mjs b/src/web/mjs/connectors/NiceOppai.mjs index 1c1bfbbbce..43a7b78953 100644 --- a/src/web/mjs/connectors/NiceOppai.mjs +++ b/src/web/mjs/connectors/NiceOppai.mjs @@ -14,22 +14,22 @@ export default class NiceOppai extends WordPressLightPro { this.queryPages = 'div#image-container source'; } - async _getChaptersFromPage(manga, page){ + async _getChaptersFromPage(manga, page) { const request = new Request (new URL(this.url + manga.id+ 'chapter-list/' + page), this.requestOptions); const data = await this.fetchDOM(request, this.queryChapters); return data.map(element => { return { - id: this.getRelativeLink( element ), - title: element.innerText.replace( manga.title, '' ).trim(), - language: this.language + id: this.getRelativeLink( element ), + title: element.innerText.replace( manga.title, '' ).trim(), + language: this.language }; - }); + }); } async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, this.queryPages); + const data = await this.fetchDOM(request, this.queryPages); return data.map(image => this.getAbsolutePath(image, request.url)); } } \ No newline at end of file diff --git a/src/web/mjs/connectors/NovelMania.mjs b/src/web/mjs/connectors/NovelMania.mjs index 6a7f5f6252..4d20e9e317 100644 --- a/src/web/mjs/connectors/NovelMania.mjs +++ b/src/web/mjs/connectors/NovelMania.mjs @@ -1,6 +1,8 @@ import Connector from '../engine/Connector.mjs'; import Manga from '../engine/Manga.mjs'; + export default class NovelMania extends Connector { + constructor() { super(); super.id = 'novelmania'; @@ -12,11 +14,13 @@ export default class NovelMania extends Connector { // parseInt(1200 / window.devicePixelRatio) + 'px'; this.novelPadding = '1.5em'; } + async _getMangaFromURI(uri) { const request = new Request(uri, this.requestOptions); const data = await this.fetchDOM(request, 'meta[property="og:title"]'); return new Manga(this, uri.pathname, data[0].content.trim()); } + async _getMangas() { let mangaList = []; const uri = new URL('/novels', this.url); @@ -29,6 +33,7 @@ export default class NovelMania extends Connector { } return mangaList; } + async _getMangasFromPage(page) { const uri = new URL('/novels/?page=' + page, this.url); const request = new Request(uri, this.requestOptions); @@ -40,6 +45,7 @@ export default class NovelMania extends Connector { }; }); } + async _getChapters(manga) { const uri = new URL(manga.id, this.url); const request = new Request(uri, this.requestOptions); @@ -49,9 +55,9 @@ export default class NovelMania extends Connector { id: this.getRootRelativeOrAbsoluteLink(element, this.url), title: element.querySelector('span').textContent.trim()+ ':'+element.querySelector('strong').textContent.trim() }; - }) - .reverse(); + }).reverse(); } + async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); diff --git a/src/web/mjs/connectors/ProjectSuki.mjs b/src/web/mjs/connectors/ProjectSuki.mjs index 92d228fac3..c892598123 100644 --- a/src/web/mjs/connectors/ProjectSuki.mjs +++ b/src/web/mjs/connectors/ProjectSuki.mjs @@ -51,8 +51,7 @@ export default class ProjectSuki extends Connector { }); } - async _getPages(chapter) - { + async _getPages(chapter) { const script = ` new Promise((resolve, reject) => { const xrequesto = function (element, url, data, method) From 8a204b2452c32df6b291834307ea3428ae2d2d6f Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:54:48 +0000 Subject: [PATCH 24/48] Delete BeautyManga.mjs --- src/web/mjs/connectors/BeautyManga.mjs | 53 -------------------------- 1 file changed, 53 deletions(-) delete mode 100644 src/web/mjs/connectors/BeautyManga.mjs diff --git a/src/web/mjs/connectors/BeautyManga.mjs b/src/web/mjs/connectors/BeautyManga.mjs deleted file mode 100644 index 1f1c97ba55..0000000000 --- a/src/web/mjs/connectors/BeautyManga.mjs +++ /dev/null @@ -1,53 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class BeautyManga extends WordPressMadara { - constructor() { - super(); - super.id = 'beautymanga'; - super.label = 'BeautyManga'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://mangadex.today'; - this.path = '/popular-manga'; - this.queryMangas = 'div.item-thumb.hover-details.c-image-hover a'; - this.queryMangasPageCount = 'ul.pagination li:nth-last-of-type(2) a'; - this.pathMangas = '?page=%PAGE%'; - this.queryPages = 'p#arraydata'; - this.mangaTitleFilter = ''; - } - async _getMangasFromPage(page) { - let uri = new URL(this.path + this.pathMangas.replace('%PAGE%', page), this.url); - uri.pathname = uri.pathname.replace(/\/+/g, '/'); - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryMangas); - return data.map(element => { - return { - id: new URL(element.href, request.url).pathname, - title: element.title.replace(this.mangaTitleFilter, '').trim() - }; - }); - } - async _getChaptersAjaxOld(mangaID) { - const uri = new URL('/ajax-list-chapter?mangaID='+mangaID, this.url); - const request = new Request(uri, { - method: 'GET' - }); - const data = await this.fetchDOM(request, this.queryChapters); - if (data.length) { - return data; - } else { - throw new Error('No chapters found (new ajax endpoint)!'); - } - } - async _getPages(chapter) { - let uri = new URL(chapter.id, this.url); - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryPages); - let el = data[0].innerText.split(','); - return el.map(element => { - const uri = new URL(this.getAbsolutePath(element, request.url)); - return this.createConnectorURI({ - url: uri.href, - referer: uri.origin - }); - }); - } -} \ No newline at end of file From fab665752bf8a36bff0cd2fdf1221496232bd0fa Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:56:14 +0000 Subject: [PATCH 25/48] Delete MadaraDex.mjs --- src/web/mjs/connectors/MadaraDex.mjs | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 src/web/mjs/connectors/MadaraDex.mjs diff --git a/src/web/mjs/connectors/MadaraDex.mjs b/src/web/mjs/connectors/MadaraDex.mjs deleted file mode 100644 index 883cec9819..0000000000 --- a/src/web/mjs/connectors/MadaraDex.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class MadaraDex extends WordPressMadara { - constructor() { - super(); - super.id = 'madaradex'; - super.label = 'MadaraDex'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://madaradex.org'; - } - async _handleConnectorURI(payload) { - this.requestOptions.headers.set('x-referer', this.url); - let request = new Request(payload.url, this.requestOptions); - let response = await fetch(request); - let data = await response.blob(); - data = await this._blobToBuffer(data); - this._applyRealMime(data); - return data; - } -} \ No newline at end of file From 2150d3d7aeccac76b690695dc983e45fbc519612 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:56:29 +0000 Subject: [PATCH 26/48] Delete manga1st --- src/web/img/connectors/manga1st | Bin 7985 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/manga1st diff --git a/src/web/img/connectors/manga1st b/src/web/img/connectors/manga1st deleted file mode 100644 index cc00792b67fe69603efec8f3f4b0f2575c19b634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7985 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 tL9$O9@Ff5Lo8 Date: Tue, 3 Jan 2023 19:56:47 +0000 Subject: [PATCH 27/48] Delete Manga1st.mjs --- src/web/mjs/connectors/Manga1st.mjs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/web/mjs/connectors/Manga1st.mjs diff --git a/src/web/mjs/connectors/Manga1st.mjs b/src/web/mjs/connectors/Manga1st.mjs deleted file mode 100644 index 32e1691846..0000000000 --- a/src/web/mjs/connectors/Manga1st.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class Manga1st extends WordPressMadara { - constructor() { - super(); - super.id = 'manga1st'; - super.label = 'Manga1st'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://manga1st.com'; - } -} \ No newline at end of file From 1d54c34511807d3d737e2fde54e48aa2ee6aa936 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:57:16 +0000 Subject: [PATCH 28/48] Delete MangaHereToday.mjs --- src/web/mjs/connectors/MangaHereToday.mjs | 26 ----------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/web/mjs/connectors/MangaHereToday.mjs diff --git a/src/web/mjs/connectors/MangaHereToday.mjs b/src/web/mjs/connectors/MangaHereToday.mjs deleted file mode 100644 index 00b8ead503..0000000000 --- a/src/web/mjs/connectors/MangaHereToday.mjs +++ /dev/null @@ -1,26 +0,0 @@ -import AnyACG from './templates/AnyACG.mjs'; -import Manga from '../engine/Manga.mjs'; - -export default class MangaHereToday extends AnyACG { - constructor() { - super(); - super.id = 'mangaheretoday'; - super.label = 'MangaHereToday'; - this.tags = [ 'manga', 'english' ]; - this.url = 'http://mangahere.today'; - this.queryMangas = 'div.row div.media-body'; - this.queryMangaLink = 'a'; - this.queryChapters = 'div.total-chapter:nth-of-type(4) h4 a'; - this.queryPages = 'div.chapter-content-inner p#arraydata'; - this.queryMangaTitle = 'div.media-body'; - this.queryMangaTitleText = 'h1.title-manga'; - } - async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryMangaTitle); - let id = uri.pathname + uri.search; - //HACK We need to remove trailing "Manga" from the title - let title = data[0].querySelector(this.queryMangaTitleText).textContent.replace(/\s+Manga$/i, '').trim(); - return new Manga(this, id, title); - } -} From 934b0c15a4832ed05879bf9a471a42913a397a83 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:58:00 +0000 Subject: [PATCH 29/48] Delete MangaFull.mjs --- src/web/mjs/connectors/MangaFull.mjs | 99 ---------------------------- 1 file changed, 99 deletions(-) delete mode 100644 src/web/mjs/connectors/MangaFull.mjs diff --git a/src/web/mjs/connectors/MangaFull.mjs b/src/web/mjs/connectors/MangaFull.mjs deleted file mode 100644 index 73e3dcac81..0000000000 --- a/src/web/mjs/connectors/MangaFull.mjs +++ /dev/null @@ -1,99 +0,0 @@ -import Connector from '../engine/Connector.mjs'; - -/** - * - */ -export default class MangaFull extends Connector { - - /** - * - */ - constructor() { - super(); - super.id = 'mangafull'; - super.label = 'MangaFull'; - this.tags = [ 'manga', 'english' ]; - this.url = 'https://mangafull.org'; - } - - /** - * - */ - _getMangaListFromPages( mangaPageLinks, index ) { - index = index || 0; - let request = new Request( mangaPageLinks[ index ], this.requestOptions ); - return this.fetchDOM( request, 'div.cate-manga div.media div.media-body > a:first-of-type', 5 ) - .then( data => { - let mangaList = data.map( element => { - return { - id: this.getRootRelativeOrAbsoluteLink( element, request.url ), - title: element.title.trim().replace( /\s*manga$/i, '' ) - }; - } ); - if( index < mangaPageLinks.length - 1 ) { - return this._getMangaListFromPages( mangaPageLinks, index + 1 ) - .then( mangas => mangaList.concat( mangas ) ); - } else { - return Promise.resolve( mangaList ); - } - } ); - } - - /** - * - */ - _getMangaList( callback ) { - let request = new Request( this.url + '/popular-manga?page=', this.requestOptions ); - this.fetchDOM( request, 'div.pagelistcate div.pagelist div.pagination ul.pagination li:nth-last-of-type(2) a' ) - .then( data => { - let pageCount = parseInt( data[0].text.trim() ); - let pageLinks = [... new Array( pageCount ).keys()].map( page => request.url + ( page + 1 ) ); - return this._getMangaListFromPages( pageLinks ); - } ) - .then( data => { - callback( null, data ); - } ) - .catch( error => { - console.error( error, this ); - callback( error, undefined ); - } ); - } - - /** - * - */ - _getChapterList( manga, callback ) { - let request = new Request( this.url + manga.id, this.requestOptions ); - this.fetchDOM( request, 'div.total-chapter section#examples div.chapter-list ul li.row h4' ) - .then( data => { - let chapterList = data.map( element => { - return { - id: this.getRootRelativeOrAbsoluteLink( element.querySelector( 'a' ), request.url ) + '/0', - title: element.innerText.replace( manga.title, '' ).trim(), - language: '' - }; - } ); - callback( null, chapterList ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); - } - - /** - * - */ - _getPageList( manga, chapter, callback ) { - let request = new Request( this.url + chapter.id, this.requestOptions ); - this.fetchDOM( request, 'div.row div.each-page source.img' ) - .then( data => { - let pageList = data.map( element => this.getAbsolutePath( element, request.url ) ); - callback( null, pageList ); - } ) - .catch( error => { - console.error( error, chapter ); - callback( error, undefined ); - } ); - } -} \ No newline at end of file From 3ca5222e1c20cc0f55d4fd900e9119a04564c797 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:58:39 +0000 Subject: [PATCH 30/48] Delete ManhwaFull.mjs --- src/web/mjs/connectors/ManhwaFull.mjs | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/web/mjs/connectors/ManhwaFull.mjs diff --git a/src/web/mjs/connectors/ManhwaFull.mjs b/src/web/mjs/connectors/ManhwaFull.mjs deleted file mode 100644 index e817f79dfc..0000000000 --- a/src/web/mjs/connectors/ManhwaFull.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; - -export default class ManhwaFull extends WordPressMadara { - - constructor() { - super(); - super.id = 'manhwafull'; - super.label = 'ManhwaFull'; - this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://manhwafull.com'; - } -} \ No newline at end of file From 2650d31fda543b2c28c8a8b2814e15f7b1c46e27 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:59:11 +0000 Subject: [PATCH 31/48] Delete MangaFoxFull.mjs --- src/web/mjs/connectors/MangaFoxFull.mjs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/web/mjs/connectors/MangaFoxFull.mjs diff --git a/src/web/mjs/connectors/MangaFoxFull.mjs b/src/web/mjs/connectors/MangaFoxFull.mjs deleted file mode 100644 index 11300b96c4..0000000000 --- a/src/web/mjs/connectors/MangaFoxFull.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class MangaFoxFull extends WordPressMadara { - constructor() { - super(); - super.id = 'mangafoxfull'; - super.label = 'MangaFoxFull'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://mangafoxfull.com'; - this.requestOptions.headers.set('x-referer', this.url); - } -} \ No newline at end of file From 8989a3f073b18cac70364224c535d55b1cb84707 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 19:59:18 +0000 Subject: [PATCH 32/48] Delete mangafoxfull --- src/web/img/connectors/mangafoxfull | Bin 13890 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/mangafoxfull diff --git a/src/web/img/connectors/mangafoxfull b/src/web/img/connectors/mangafoxfull deleted file mode 100644 index 01c4c2b091a41d8011db1bd0b7314f97cf40196a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13890 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 QkpKVy07*qoM6N<$f Date: Tue, 3 Jan 2023 20:00:08 +0000 Subject: [PATCH 33/48] Delete ManhuaDragon.mjs --- src/web/mjs/connectors/ManhuaDragon.mjs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/web/mjs/connectors/ManhuaDragon.mjs diff --git a/src/web/mjs/connectors/ManhuaDragon.mjs b/src/web/mjs/connectors/ManhuaDragon.mjs deleted file mode 100644 index 71f9b9ed2d..0000000000 --- a/src/web/mjs/connectors/ManhuaDragon.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class ManhuaDragon extends WordPressMadara { - constructor() { - super(); - super.id = 'manhuadragon'; - super.label = 'ManhuaDragon'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://manhuadragon.com'; - } -} \ No newline at end of file From afc22aa7cd7a4101657e52130f5a40210828b5b2 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:00:15 +0000 Subject: [PATCH 34/48] Delete manhuadragon --- src/web/img/connectors/manhuadragon | Bin 9064 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/manhuadragon diff --git a/src/web/img/connectors/manhuadragon b/src/web/img/connectors/manhuadragon deleted file mode 100644 index c94e64b0db909a128eca405b9ef486e68bf7b61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9064 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 From 22eeb0018fa27559743b4306abffa976f10efd0f Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:01:05 +0000 Subject: [PATCH 35/48] Delete beautymanga --- src/web/img/connectors/beautymanga | Bin 1098 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/beautymanga diff --git a/src/web/img/connectors/beautymanga b/src/web/img/connectors/beautymanga deleted file mode 100644 index 72bb76c50880a876e4d2da448aa3586170ea826a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL From 0f612c96d8c76bb0c1b641b2911c640774c18674 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:01:17 +0000 Subject: [PATCH 36/48] Delete madaradex --- src/web/img/connectors/madaradex | Bin 1098 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/madaradex diff --git a/src/web/img/connectors/madaradex b/src/web/img/connectors/madaradex deleted file mode 100644 index 72bb76c50880a876e4d2da448aa3586170ea826a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL From eff3e37a223c9be1d37a2ad1da590543b66225c3 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:01:38 +0000 Subject: [PATCH 37/48] Delete mangachill --- src/web/img/connectors/mangachill | Bin 1098 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/mangachill diff --git a/src/web/img/connectors/mangachill b/src/web/img/connectors/mangachill deleted file mode 100644 index 72bb76c50880a876e4d2da448aa3586170ea826a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL From d499de37dda9be5b48fb6a2c0652c6e7b997c37c Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:01:54 +0000 Subject: [PATCH 38/48] Delete mangaheretoday --- src/web/img/connectors/mangaheretoday | Bin 1098 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/mangaheretoday diff --git a/src/web/img/connectors/mangaheretoday b/src/web/img/connectors/mangaheretoday deleted file mode 100644 index 72bb76c50880a876e4d2da448aa3586170ea826a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL From f8b62d7b6fd2d7c534a3577a33c4e09459567eaa Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:03:08 +0000 Subject: [PATCH 39/48] Delete painfulnightz --- src/web/img/connectors/painfulnightz | Bin 7497 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/painfulnightz diff --git a/src/web/img/connectors/painfulnightz b/src/web/img/connectors/painfulnightz deleted file mode 100644 index 2152798026b242a0e671a3d553ce801234a86714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7497 zcmV-P9k$|$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf9NtMpK~#8N?VSmf zUPYD1Z$d~f*^^E>3t7lU7Q!Y=SON*F2*@%D1MZ{a;4*HrIHRM-T@QNDSxtjk|4F3#`wL&Yc9co25)Y-eitYwE;^Ln#``_1|xhyjz$2A*Ix>}<1RE=}5h zjo>vT0La+*Aiv+h^haS{GkIupPci){D24HdsB?h)<3DRQ{1UVM8>zRKaxCd92a}%! zQ$I3c{+1^hHP0c)r_44ZOpToSv1a41H=FW)v$|orahIa&1+epvW~+V(qhR_W7}&EW z(eziO>4&HQd1AbdA>GmhgZJrblFIjGs&;_`v}^ zk6E8FW|QAzHtFrinEQ4Cx<&wE)*ejE(yy6qpGW7h)zb7p${{g29L3!5i}U@_UBfS~ zdk}M^5#WTPvICeZw0*>dX#aI)Ltf`Dx7{nup1;ZL<=>gj`7!w?CHY4XM^*r`(}!S; z?0By}iTQZ++{Bg_V{m~0L@K|c0??_?OY{BF35C%i6LwS`CTxz`aqs0g%U#x0IC27L zT7>LjX-LnJxM>cASY*Hr_EUW-LdSR(|+J<>8nz+UGd|_@m3uE9cjW@DE_h zY8V;QKFGZC;iUWs@^)e`Cos&VLCTaOyns@GM2_z~^3wT~+gnOyycCQWf*nUroaND~a54GBv6uy$>IL zG;Lu%a^Y@L1f|LZ?$KMca(dtE&F;T4$v#Zzd;x6vHSXo7ytbpIS@iG>$nqh}@U+|) zxP!DC4V{4RKIC+gcs6;^BwrMirNu?+DOoRMe{#nHuv2=ujA;r09rPiE%`WRryq$*I_K+zs)~#oW}A(? zCW(v#+BAhkB&=hoC&sPjuc zLMsZWBAZ_lo&kXmYNPK&vtbt^j26|ShVRZ;s|HgGg>VHG_PUA zWjvoC6xE+hfYz5$w10csdMQdUxfEi#g(jp}wf)T=|2&g3KcQ6?p>niO0PDVk$0K*M z3Z(t^Cn2pRg{H+m0qTixr+*1;-sLkQ=$_dJCo)S~=9uzPv#I>fM}Su^GaG(hMhN1d zMh3?$EqQQ7QF&Z76^2eIsK)_$j8X8!znMM%?WCweR4;&C^DsRtxNns!h6O~wdT=BJ z6BIBEugJv{eiXR6bhHJ{))I0SasYNb=Mz9el28I<()7UItufJ90WE2w5H33^D^e{1 zwAB%?J^4kH6U*?>JAHn6R4;(_-}NqMd*M|nXq2< zCxD%g(E;sFsMO`G0BTFN{g8jg8_;l0!ngv!xRx#c+`~PzM=-TR@l5d1g@)73E_xWj z)RWLC;yT@MivxxsKxcLkfF4B-@ehNBo<&|JZm0wiuX9I0 zT;2=MaMMyeBm%ZFs9XShUqbtddczixYLO*6PAdl3{Gd;J^ckP5MyB2nJ(Ri9PKFpG zE=ZWKc%*5S&-ADxP}3fvS$CSv_*b8)8wYNsL=-~Vt|%%mQZ+?EIf*((=0orC>Eftd z0GqL~Jz$iWpAD=^23nwC;>&^pc`}>l!o-Yen1W5${NS$Tk4%cz>SJgMR`TM)CVD1p>#g_QEFhopr&*LDO6qre2wUfN`leq_sw z*3YDC7zKa$giqw7G68J+6>WFc#GCDehdh~$co1?mV~oBbaVaIlR?4!=4nqH_i5b!_ z#-J0;b}vUZ(KYg-vO=i@F}V01fNz@dXiN zh7==Y1)w-UUR&R2;@-cNKY?*YxRz!|)1&_2flIYq}vN#$xFM$3WlovqrbKIvhM*u`i zleaM}r{MJ{h-zVYYDH9C@lba57N4FZe~@0Xxa6R_a@2Her$H?kIYW_0a5B4 z?zbB)Uyb{g^R(%NFC}JX=bwB=gyV@BB!n1Rni!XPbolrOaA&ndp*|JqSDGD_=W2Ml z@(9x5MYksB5lRc78IMEKE7y1>fmjNNR-1acV%s0kUd)FcD-M`pHXU1ks`iXR?H=66 z`8lhKGw(=*l*OdK^CuDXqK1njJmdjweVSf}cqU7?Pp8>M%8SUYB9DwgW8}p?7{CYiUH6tX(kkbgJ+WDH11SjDaMTvg6B43^- zpfW6QuJ2AQr$=)hC@p|}OKCWsusQ>wE!ve!xFY8Ph9=2#9!$25FTcfSb^@|)YBh*i zkTN^sdN~%Us-~W;(Q^w>S^$axoc5LzZw1H_twXPVX!vc|#vB(-_dP+osWF4QU-Fq9 zgq9%6nag5`S&%jnwH24=f(p{*l@BCIkMaU=Ew_{C7+Io2T8|kw{L1XPkNS)V4QDYw z;Nvg-me1%Qb}dduS3WmOqg=JJ%}_zN-Gdt)p|k)F1p#y>e0y=Tz3|ny{4RNDlEv(Y z&9*;NbSqAhzh#(R_{XZ)w7jy0!Y1=vg4}?__nf5DmK_j)V<(CJ|n`2 zH<+#a1w>~a-dBr`MD#JeDYGN4mt_$ZRJ}!S2QeEj|Fz34qYhl*?h)Nc$a5>pA-%+( z@ZzJA0)+I{|pl2Nfb46L{m#I)t9uX2yaJjU^pLRC3KTn^$ z8IlIJ>@pjClG(VcNlOU2HwxEpEcK!lfRsLel1-<`rX#3GeCWwG0JN6w zBv+#0s^QxTuPWt1y9y2m`i}P6-2ww9n@xNxk?CGEQXW>I3zjr9*GLd?x8w7a^r#PI zSww|{-kLnc2p>4n<(3ve?~(k`zK7^W^3<-6VdbTylpEnIVrOvu9qWM?<0@a@;m4CuWs!rEr1$^ zNwthneQmCtM0Be+X2Q~Mpj8iJCVvLk@{62DLP&2TO(9>8615H#zqHX&xc#DNzqEV} z!QZkU5t-iI_L)J<*npg@0+cEj57fWYKgDR{*m$bT7Rs0)zq}imm_iLoltmz0w;PvI zb~V`lz+knd_q_V)CA%V{OIcbn-b4^~KU%xteskXs>L_G(M7O-5-@nW3i4Vg8trM5y zZU!mIIke~DAorYn4W32GFPEUsyFgXmn{^(yUc@j!inK6TEFmB#k75^`K|DI2*H`D z30(` zk{^(o9hj`mQU~xdv;#uJKgbzR1j>;omyKGlfq+AF^ntX>d(F;46{~9M?g0zh$LFw@) zriqyaH-`z^wND7!sl7s*n8eoK={4R%OqM4hTYD-V#xxi<^ir7Z_j)SunH2VFdW?Bn zk}o(RN$6s}ptSFi4*DqHGyiDz0uy;PXkz5LKrC=4%Qc@)v*U8kooA<0&fTalflw^H zJQF$}{b%^W`BX-5gwg^Sgm!DwYtU#x9cYQRsEhG!9(0I6?mYd!lCu6YFgO2THsRx# z8?-@ftonW;q<}R)OtjN+Sj_iBS5Uo_1b?EB^)0{E?4fAiXF0fj=$FGhjmlzh^BxiU z>0hGnjAs4hM#n-(>5HJ zwI8=dTFlh`pYeBp7dKOP=!wJvg$h%e zdNE|=N06i#fJXPl3yJM?xT_d0TVAU#m{2aJh@shlX5)PXS$fP#xkiQ}?OiXL?Og{Y zeiZ5Y8Unz2JTLc!6*{kS+0u9<22``cx%SuGGYYswzRb#$_nKYtd$Z&Jo^Ilmwc#fB zl{PnTG`r3(C!dR1?MIvx`q+jv36{gTH=|@|e;wzOucKe^DMESmsYNrwI!Oy5`mh^d zMi_qKr$an4L=EW|(eCEu5Q6sT>xk=aqYXMC!Me++CqF!Fl+yDDX}cEQgrRy(34!RX zn0S(xkaU0DPkV|gf!-Z(bAZ2>yez#tpnFdA`%h0HK&(;l7%Q2F-n^XiJ!ti&S7^}p zD#T^r*^ol>*=YY#$Ri&l>c-<6LQIoEc>xIhXK@1gc{T3|mIfLhQew@58xINrG5of-TiVtn2sr$9C?MH>9=i-$l(_Bu%Uv#WkKu z5^lPhSps_rg2D*WYUCxqL7P{SAWu$5}`5yjCempX-fyhZY7u)uKhYRx{gU!rX!dg{Y31*vlBBSp-E8M zX!YVpvDq-xxulUcJ8->B*!cIMCHTl|enO;*t$djnLEF}Y#tXXkT!Osu2w&Q(vh0@j zJTxOzH}a@ok2lu9gs7!&1!K>C1#j-jWDbxCQa@too}(`C36I5$=8eo_VGSu(DA6_I z1e_Qm?|a`wtb>WG$!r?)s7wHwOb48koNt3E^8I@-p~-ZpL$%SKOyzAOTGb?c8p0ZS z1)0>*h#1J|IT@F=-*JiUO#vA}>+AGV1$AXx)j1vY96%GO1S(JI;WxVnG@aJ;) zw1T#FAiQ&kr;4C50SKe8VRA{u@b%cj@emLXC=e5;{X5K$MoNQT72+D#OV9AfA$Toz)0s6@LU1x$dSi0rrni@1YTvG~eL$2Vj*GSm#2qzpv zlkTVys8NO>2H~}gJdb&a(WKK5pK6%S=9N?T{++v^35a@Z&LSM8xd8cF)K*>(>@_tbUCPA05t?#TGQ!)nOO5RGH7BlLJ`Ab z^nocdN7CvMFfR*fk+f3G*91F*wgQ6$CkzBAZ4{#wKouw)2~Cdo&rH0RatN-a+}87O z1oYK(7hz{XyY91<8g0;^2sn!g*K(~qFrSu?w0Yr*d(G~-2qlE(6Yv}>K=lF;WQv@p zz>OB^6ES|ZFF*wCekSQev6nlX4HrkLD@Hu(?Xj5cw3H4`LfhO&J3KU+f;$=@S28s( zrQoHfjRw!+K&->I7klkioRuS>eysNIF~rbgOg&@?^N@rz2U|b)Mza@~BQC;Ysu1lH zfG{3g?=*zqYB>>Pz{~i@&*LfRl~T^K6-3ekQ6$P1c^q}73)OggLmY~Q>h@qmKni?Qo+zPG8h zei1KkM5adzeKQf%Aeh`JZwscn5hP8do<78M>UVHS-;#_NK?2YuTrps@Oy4P=GrJNY zT(y9payGPJ@7=^odvY1wt_+O=?%xEnxBk&xonjqvj^+UE^_QzXT!AOooqZF1$bT8H z7}_rYK};LszY4O2kXzpkoycftyc*&ZovIVuLa#ZkV4hfm!1U$x1!(zhG*FD(_yAhW zoHFx&nKzh62HBzBh#HUm zC$x$V$%M#D+R4Pc@Z%7VZIw%@k#T(SFx^GK8YTLSnZA;uhd*Nc9yBp{OyR#HsT8Fa z?&SSw+sdS1!)ae`@N`Cu`XEK>Ly$T6czk?>^5}=SM)Me>aM-I`O{ziX2tYUv4I29~ zTEuS3=Dz^ZdJH*3PreY07%6*yEOo}b+w3$nN71P?ycqPNo`f}*VCYG-Z0IaHPe;Qp zX+4_MJHiz~<`9j}zTz4~BScFPOZ1{(@Y49LfY#lsh;NviMlt%{%$y)$=-I&K#37B$ zTkS;W2|yUid@${MFb&sm&*Eemx)wWoIxe4L2f37+AXv){%kgmb!AQLwQw-bv8;ug2 zUisHHl~Gy~!t{t)gR0Q}@VHag7K7G(#1f4(nMc8yNlet(%Q0UBSm#Htn#vREAP&!e z;1DKBw?LPJ=9Omaf5s85YT1^&u&oa?#b`qNA4Q<#7$aK$PVTjg>^j!92ypBXE{p_O1g4#HeUj|8BJR-;kN4Q}NX zMG?cbq}b-*oNSdX*8UNVB$xaoru@20Ag(Vz1cI&DQ;w8A|wEP4eNp`cFFBr zWcJ7n$+gbQp&iW!tv(QwV2)#Ml9x1sIp+xB&qDx$-j30CBJ}WOr}p`ykrN61E5%ku z(t|h!`h?joMwDF434hIxxImNo7)+V-td1=Hd<4)@$P4=;KD_27c~4W`=O^Z_#b1s9 z1Wnx84|;Sl{;~w{8pM$|dfg~Mw*a~r-2&)hbPJ%1(Jg>3Mz;XE7~KNsQkeZez!`XI TQatck00000NkvXXu0mjfPET`r From 19dc093020374292e6dd6a6ded724abc36db2b80 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:03:17 +0000 Subject: [PATCH 40/48] Delete webcomicme --- src/web/img/connectors/webcomicme | Bin 1098 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/web/img/connectors/webcomicme diff --git a/src/web/img/connectors/webcomicme b/src/web/img/connectors/webcomicme deleted file mode 100644 index 72bb76c50880a876e4d2da448aa3586170ea826a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmV-Q1hxB#P)6WV~5P&ZND&mTYtcCCYlo!Qx?8Nj;r{|oRbB7;U zpz5R{tF{}dmQ@s?UCI8e4M^LMs^2qAKnZ&tP1;UWY}=;c zsIt$1x*Bp1Ewjb2>C;x>Hu${rHNs{$vEVapqJG}0?fU@$SSX}MqCK8BLz)0&44(FV zIg@_VkDpLXF@iZjK0E;wT6{^fIanm)8gXl!365~AfpZ8hZ^A00n?_<+y~#WPrp$&h z6A(`$>d|5K1yaFgC@yw6gbCZ#Qsh19R$xdy0eJL1YPoHp>c3X0QE-Ep)IAuJ^~;no2N3Y(zM3mZcEz3g9^wQ+~9)+Q$6Z z;!WqwfFQSaSWV^h3NYZRxi`*StqUovrQG@U)KF|k)X1Pp1l*~*<)9OJ^R0>{!bZadOZ36?U+=*zx9lm5;1B5H-uVi`J&$79wcq2UT( z68s}wAU;^EuAoMd`_YZNP%8Y7jb&ddPRZOyTUUiEr|-d&r05l3*_YaL`ZHYkb;jpb zXZQ0YuPw;$!fw$t0;41EI|%Bv1?KGFJuKTWNB6BkkmUm)QZ!uwe38!h=!k}udUwOL zt|O6$VLC2=9l4FG=5&qs9;iD{G#BaMm>N~Db{jaywz z&bp?zJh_g>vK7`acK!_{ziHx^%hXe(fv!;oD>DUfDl$@%-`C_g@~r0r*TTrbcTN Q&;S4c07*qoM6N<$g1%!J6#xJL From 03a0f7add63636d54a32d1824ce2da3e1339f5c4 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:03:32 +0000 Subject: [PATCH 41/48] Delete MangaChill.mjs --- src/web/mjs/connectors/MangaChill.mjs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/web/mjs/connectors/MangaChill.mjs diff --git a/src/web/mjs/connectors/MangaChill.mjs b/src/web/mjs/connectors/MangaChill.mjs deleted file mode 100644 index 047fcd73ab..0000000000 --- a/src/web/mjs/connectors/MangaChill.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class MangaChill extends WordPressMadara { - constructor() { - super(); - super.id = 'mangachill'; - super.label = 'MangaChill'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://mangachill.io'; - } -} \ No newline at end of file From 6313b2f6b3c8e8f6b73b452935b02af390a05393 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:05:37 +0000 Subject: [PATCH 42/48] Create MangaFull.mjs --- src/web/mjs/connectors/MangaFull.mjs | 99 ++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/web/mjs/connectors/MangaFull.mjs diff --git a/src/web/mjs/connectors/MangaFull.mjs b/src/web/mjs/connectors/MangaFull.mjs new file mode 100644 index 0000000000..d860d4d1d9 --- /dev/null +++ b/src/web/mjs/connectors/MangaFull.mjs @@ -0,0 +1,99 @@ +import Connector from '../engine/Connector.mjs'; + +/** + * + */ +export default class MangaFull extends Connector { + + /** + * + */ + constructor() { + super(); + super.id = 'mangafull'; + super.label = 'MangaFull'; + this.tags = [ 'manga', 'english' ]; + this.url = 'https://mangafull.org'; + } + + /** + * + */ + _getMangaListFromPages( mangaPageLinks, index ) { + index = index || 0; + let request = new Request( mangaPageLinks[ index ], this.requestOptions ); + return this.fetchDOM( request, 'div.cate-manga div.media div.media-body > a:first-of-type', 5 ) + .then( data => { + let mangaList = data.map( element => { + return { + id: this.getRootRelativeOrAbsoluteLink( element, request.url ), + title: element.title.trim().replace( /\s*manga$/i, '' ) + }; + } ); + if( index < mangaPageLinks.length - 1 ) { + return this._getMangaListFromPages( mangaPageLinks, index + 1 ) + .then( mangas => mangaList.concat( mangas ) ); + } else { + return Promise.resolve( mangaList ); + } + } ); + } + + /** + * + */ + _getMangaList( callback ) { + let request = new Request( this.url + '/popular-manga?page=', this.requestOptions ); + this.fetchDOM( request, 'div.pagelistcate div.pagelist div.pagination ul.pagination li:nth-last-of-type(2) a' ) + .then( data => { + let pageCount = parseInt( data[0].text.trim() ); + let pageLinks = [... new Array( pageCount ).keys()].map( page => request.url + ( page + 1 ) ); + return this._getMangaListFromPages( pageLinks ); + } ) + .then( data => { + callback( null, data ); + } ) + .catch( error => { + console.error( error, this ); + callback( error, undefined ); + } ); + } + + /** + * + */ + _getChapterList( manga, callback ) { + let request = new Request( this.url + manga.id, this.requestOptions ); + this.fetchDOM( request, 'div.total-chapter section#examples div.chapter-list ul li.row h4' ) + .then( data => { + let chapterList = data.map( element => { + return { + id: this.getRootRelativeOrAbsoluteLink( element.querySelector( 'a' ), request.url ) + '/0', + title: element.innerText.replace( manga.title, '' ).trim(), + language: '' + }; + } ); + callback( null, chapterList ); + } ) + .catch( error => { + console.error( error, manga ); + callback( error, undefined ); + } ); + } + + /** + * + */ + _getPageList( manga, chapter, callback ) { + let request = new Request( this.url + chapter.id, this.requestOptions ); + this.fetchDOM( request, 'div.row div.each-page source.img' ) + .then( data => { + let pageList = data.map( element => this.getAbsolutePath( element, request.url ) ); + callback( null, pageList ); + } ) + .catch( error => { + console.error( error, chapter ); + callback( error, undefined ); + } ); + } +} From a9f5c917dad7601a5b127dcb3ca2ffe8bc2ea5d6 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:07:32 +0000 Subject: [PATCH 43/48] Delete PainfulNightz.mjs --- src/web/mjs/connectors/PainfulNightz.mjs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/web/mjs/connectors/PainfulNightz.mjs diff --git a/src/web/mjs/connectors/PainfulNightz.mjs b/src/web/mjs/connectors/PainfulNightz.mjs deleted file mode 100644 index f3143a40ef..0000000000 --- a/src/web/mjs/connectors/PainfulNightz.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class PainfulNightz extends WordPressMadara { - constructor() { - super(); - super.id = 'painfulnightz'; - super.label = 'PainfulNightz'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://painfulnightz.com'; - } -} \ No newline at end of file From 62a3edafedb495c27f5b0f00e6ceeb88ff24376a Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:07:51 +0000 Subject: [PATCH 44/48] Add files via upload --- src/web/mjs/connectors/ManhwaFull.mjs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/web/mjs/connectors/ManhwaFull.mjs diff --git a/src/web/mjs/connectors/ManhwaFull.mjs b/src/web/mjs/connectors/ManhwaFull.mjs new file mode 100644 index 0000000000..e817f79dfc --- /dev/null +++ b/src/web/mjs/connectors/ManhwaFull.mjs @@ -0,0 +1,12 @@ +import WordPressMadara from './templates/WordPressMadara.mjs'; + +export default class ManhwaFull extends WordPressMadara { + + constructor() { + super(); + super.id = 'manhwafull'; + super.label = 'ManhwaFull'; + this.tags = [ 'webtoon', 'english' ]; + this.url = 'https://manhwafull.com'; + } +} \ No newline at end of file From 01a03be79928b057b5ae23730d5bdd484bb1307d Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:10:09 +0000 Subject: [PATCH 45/48] Delete Webcomicme.mjs --- src/web/mjs/connectors/Webcomicme.mjs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/web/mjs/connectors/Webcomicme.mjs diff --git a/src/web/mjs/connectors/Webcomicme.mjs b/src/web/mjs/connectors/Webcomicme.mjs deleted file mode 100644 index f814388b28..0000000000 --- a/src/web/mjs/connectors/Webcomicme.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class WebComicMe extends WordPressMadara { - constructor() { - super(); - super.id = 'webcomicme'; - super.label = 'WebComic (Webcomic.me)'; - this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://webcomic.me'; - } -} From 4601a26fa0c1f6fa3a58441a31e553fe1c6afa4a Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:10:24 +0000 Subject: [PATCH 46/48] Delete Pururin.mjs --- src/web/mjs/connectors/Pururin.mjs | 80 ------------------------------ 1 file changed, 80 deletions(-) delete mode 100644 src/web/mjs/connectors/Pururin.mjs diff --git a/src/web/mjs/connectors/Pururin.mjs b/src/web/mjs/connectors/Pururin.mjs deleted file mode 100644 index a7efcb887b..0000000000 --- a/src/web/mjs/connectors/Pururin.mjs +++ /dev/null @@ -1,80 +0,0 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; -export default class Pururin extends Connector { - constructor() { - super(); - super.id = 'pururin'; - super.label = 'Pururin'; - this.tags = ['manga', 'hentai', 'english']; - this.url = 'https://pururin.to'; - this.CDN = "https://cdn.pururin.to/assets/images/data/"; - this.path = "/browse/title"; - this.api = "/api/contribute/gallery/info"; - this.queryMangasPageCount = 'ul.pagination.flex-wrap li:nth-last-of-type(2) a'; - this.queryMangas = 'a.card.card-gallery'; - this.queryChapters ='div.gallery-action a'; - this.requestOptions.headers.set('x-referer', this.url); - this.requestOptions.headers.set('x-origin', this.url); - } - async _getMangas() { - let mangaList = []; - const uri = new URL(this.path, this.url); - const request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryMangasPageCount); - let pageCount = parseInt(data[0].text); - for(let page = 1; page <= pageCount; page++) { - let mangas = await this._getMangasFromPage(page); - mangaList.push(...mangas); - } - return mangaList; - } - async _getMangasFromPage(page) { - let uri = new URL(this.path + '?page='+page, this.url); - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, this.queryMangas); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, request.url), - title: element.querySelector('source.card-img-top').getAttribute('alt').trim() - }; - }); - } - async _getChapters(manga) { - return [{ id: manga.id, title: 'Chapter' }]; - } - async _getPages(chapter) { - let mangaID = chapter.id.match(/\/gallery\/([0-9]+)/)[1]; - const uri = new URL(this.api, this.url); - const request = this.getApiRequest(uri, mangaID); - const data = await this.fetchJSON(request); - let pagesMax = data.gallery.total_pages; - let extension = data.gallery.image_extension; - //https://cdn.pururin.to/assets/images/data//.image_extension - return new Array(pagesMax).fill().map((_, index) => new URL(`${this.CDN}/${mangaID}/${index + 1}.${extension}`).href); - } - async _getMangaFromURI(uri) { - let mangaID = uri.href.match(/\/gallery\/([0-9]+)/)[1]; - const req = new URL(this.api, this.url); - const request = this.getApiRequest(req, mangaID); - const data = await this.fetchJSON(request); - const title = data.gallery.title; - const id = this.getRootRelativeOrAbsoluteLink(uri, this.url); - return new Manga(this, id, title); - } - getApiRequest(url, id) { - let params = { - id: id, - type:2 - }; - return new Request(url, { - method: 'POST', - body: JSON.stringify(params), - headers: { - 'x-origin': this.url, - 'x-referer': this.url, - 'Content-Type': 'application/json;charset=UTF-8', - 'X-Requested-With': 'XMLHttpRequest', - } - }); - } -} From 539b0e33dd2fe0aab30232d950365c125868fc3d Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:12:40 +0000 Subject: [PATCH 47/48] Update MangaFull.mjs From e8658a0f615d49be30391c40453a56887238a409 Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Tue, 3 Jan 2023 20:15:23 +0000 Subject: [PATCH 48/48] Create Pururin.mjs --- src/web/mjs/connectors/Pururin.mjs | 80 ++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/web/mjs/connectors/Pururin.mjs diff --git a/src/web/mjs/connectors/Pururin.mjs b/src/web/mjs/connectors/Pururin.mjs new file mode 100644 index 0000000000..a7efcb887b --- /dev/null +++ b/src/web/mjs/connectors/Pururin.mjs @@ -0,0 +1,80 @@ +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; +export default class Pururin extends Connector { + constructor() { + super(); + super.id = 'pururin'; + super.label = 'Pururin'; + this.tags = ['manga', 'hentai', 'english']; + this.url = 'https://pururin.to'; + this.CDN = "https://cdn.pururin.to/assets/images/data/"; + this.path = "/browse/title"; + this.api = "/api/contribute/gallery/info"; + this.queryMangasPageCount = 'ul.pagination.flex-wrap li:nth-last-of-type(2) a'; + this.queryMangas = 'a.card.card-gallery'; + this.queryChapters ='div.gallery-action a'; + this.requestOptions.headers.set('x-referer', this.url); + this.requestOptions.headers.set('x-origin', this.url); + } + async _getMangas() { + let mangaList = []; + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + let data = await this.fetchDOM(request, this.queryMangasPageCount); + let pageCount = parseInt(data[0].text); + for(let page = 1; page <= pageCount; page++) { + let mangas = await this._getMangasFromPage(page); + mangaList.push(...mangas); + } + return mangaList; + } + async _getMangasFromPage(page) { + let uri = new URL(this.path + '?page='+page, this.url); + let request = new Request(uri, this.requestOptions); + let data = await this.fetchDOM(request, this.queryMangas); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, request.url), + title: element.querySelector('source.card-img-top').getAttribute('alt').trim() + }; + }); + } + async _getChapters(manga) { + return [{ id: manga.id, title: 'Chapter' }]; + } + async _getPages(chapter) { + let mangaID = chapter.id.match(/\/gallery\/([0-9]+)/)[1]; + const uri = new URL(this.api, this.url); + const request = this.getApiRequest(uri, mangaID); + const data = await this.fetchJSON(request); + let pagesMax = data.gallery.total_pages; + let extension = data.gallery.image_extension; + //https://cdn.pururin.to/assets/images/data//.image_extension + return new Array(pagesMax).fill().map((_, index) => new URL(`${this.CDN}/${mangaID}/${index + 1}.${extension}`).href); + } + async _getMangaFromURI(uri) { + let mangaID = uri.href.match(/\/gallery\/([0-9]+)/)[1]; + const req = new URL(this.api, this.url); + const request = this.getApiRequest(req, mangaID); + const data = await this.fetchJSON(request); + const title = data.gallery.title; + const id = this.getRootRelativeOrAbsoluteLink(uri, this.url); + return new Manga(this, id, title); + } + getApiRequest(url, id) { + let params = { + id: id, + type:2 + }; + return new Request(url, { + method: 'POST', + body: JSON.stringify(params), + headers: { + 'x-origin': this.url, + 'x-referer': this.url, + 'Content-Type': 'application/json;charset=UTF-8', + 'X-Requested-With': 'XMLHttpRequest', + } + }); + } +}