From 0bbc914773a33a527de4ea6e2d54986df563623e Mon Sep 17 00:00:00 2001 From: MikeZeDev Date: Wed, 17 Apr 2024 07:32:20 +0000 Subject: [PATCH] update from master (#6991) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add connector doujinku (#6545) * add connector doujinku * add tags manga * convert icon webp to png doujinku * Fix MangaWOW : change domain (#6581) Fixes https://github.com/manga-download/hakuneko/issues/6580 * FIX TonizuToon : change domain (#6577) Fixes https://github.com/manga-download/hakuneko/issues/6569 * FIX SeriManga : change domain (#6575) Fixes https://github.com/manga-download/hakuneko/issues/6568 * FIX MangaSehri: change domain (#6574) and add referer Fixes https://github.com/manga-download/hakuneko/issues/6565 * FIX Hayalistic : change domain (#6572) Fixes https://github.com/manga-download/hakuneko/issues/6562 * FIX GuncelManga : change domain (#6571) Fixes https://github.com/manga-download/hakuneko/issues/6560 * FIX PrismaScans : change domain (#6542) * Update PrismaScans : change domain Fixes https://github.com/manga-download/hakuneko/issues/6541 * update prismascans icon * FIX ComicK.mjs : change domain and accept more domains (#6538) they change too quickly. * feat(Summertoon): add connector (#6590) * Fix AzoraWorld/AzoraManga : domain, getpages etc. (#6493) * Fix AzoraWorld/AzoraManga : domain, getpages etc. * change domain * fix getpages * AzoraManga is now a dummy connector telling use to use AzoraWorld (website are the same domain) * Update AzoraManga.mjs * Fix ManHuaGui.mjs failed download chapter #6605 (#6606) * Fix Cmoa: fix getting chapters pages (#6629) Fixes https://github.com/manga-download/hakuneko/issues/6628 * Fix DiskusScan: use MangaStream (#6624) Fixes https://github.com/manga-download/hakuneko/issues/6622 * FIx GekkouScans : change domain (#6623) * FIx MangaNato : fix domain regex (#6618) Fixes https://github.com/manga-download/hakuneko/issues/6617 chapmanganato.to / readmanganato.to (no more .com? ) * Fix MangaPill: add referrer for pages (#6613) * FIx Mangalek : change domain (#6610) * FIX NinjaScan: change domain (#6602) * FIX ComicBushi: domain change (#6607) Fixes https://github.com/manga-download/hakuneko/issues/6603 * FIX AsuraScans: filter more ad (#6595) * FIX AsuraScans: filter more ad * Update AsuraScans.mjs * FIX ReaperScansTR: change domain (#6589) also, they changed to MangaStream * FIx CeriseScans: change domain (#6593) * Update EvaScans: change label and domain (#6588) Fixes https://github.com/manga-download/hakuneko/issues/6573 * FIx TitanManga: Mangastream > Madara (#6587) Fixes https://github.com/manga-download/hakuneko/issues/6582 * FIX Yanmaga : use SpeedBinb (#6548) Fixes https://github.com/manga-download/hakuneko/issues/6532 * FIX mangaz: change chapter CSS selector (#6540) Fixes https://github.com/manga-download/hakuneko/issues/6537 * FIX GourmetScans: domain change & tweak script (#6531) * FIX GourmetScans: domain change & tweak script Fixes https://github.com/manga-download/hakuneko/issues/6530 * Update GourmetScans.mjs * Fix Miauscan : change domain and with with novels (#6491) Fixes https://github.com/manga-download/hakuneko/issues/6484 * Fix CocoManhua/MangaDig : defeat encryption again (#6470) * Fix CocoManhua/MangaDig : defeat encryption again Fixes https://github.com/manga-download/hakuneko/issues/6468 see relevant commit : https://github.com/manga-download/hakuneko-plugins/commit/ec2ad2ace0b4c21066957702f494d93f052398bc * better solution * FIX Luscious: api change (#6599) * FIX Luscious: api change Fixes https://github.com/manga-download/hakuneko/issues/6598 * fix indent * Fix BeeToon: filter fake images (#6597) * Fix BeeToon: filter fake images Fixes https://github.com/manga-download/hakuneko/issues/6592 * Update BeeToon.mjs * FIX ComicEarthStar : switch to CoreView (#6539) * FIX ComicEarthStar : switch to CoreView Bye by Publus, welcome Coreview and GraphQL Fixes https://github.com/manga-download/hakuneko/issues/6536 * Update ComicEarthStar.mjs * FIX ReaperScans: domain change & fix get chapters (#6527) * FIX ReaperScans: domaine change & fix get chapters Fixes https://github.com/manga-download/hakuneko/issues/6526 Reproduce code from Haruneko, way simpler. * Update ReaperScans.mjs * Update ReaperScans.mjs * FIX ManhwaLatino : mangalist and chapters (#6409) * FIX ManhwaLatino : mangalist and chapters Fixes https://github.com/manga-download/hakuneko/issues/6408 * remove junk pages * add referer for images * FIX NicoNicoSeiga: only use the fallback (#6372) * FIX NicoNicoSeiga: only use the fallback * remove comments * fixes manga listing no more ajax endpoint :/ * Add Comicride (#6635) * Add ComicRide * Add ComicRide icon * [ComicRide] Fix page count from 0 * Fix ComicRide Icon * Delete src/web/img/connectors/ComicRide.mjs * feat(Ascalon): create connector (#6661) * Fid CovenScan domain (#6670) Fixes https://github.com/manga-download/hakuneko/issues/6463 * Fix ZeroScans: change url and fix paste support (#6671) * Change url and fix paste support * Use regex to extract slug * FIx WestManga: change domain (#6669) Fixes https://github.com/manga-download/hakuneko/issues/6666 * Fix PojokManga : change domain (#6652) Fixes https://github.com/manga-download/hakuneko/issues/6650 * FIx XoxoComics: domain & manga listing (#6647) Fixes https://github.com/manga-download/hakuneko/issues/6646 * FIx MangaHub: change API & CDN domains (#6683) Fixes https://github.com/manga-download/hakuneko/issues/6682 Websites based on MH has been tested too :) * FIX MangaEffect : no more wpmangaprotector (#6699) Fixes https://github.com/manga-download/hakuneko/issues/6698 * add mangasusuku (#6704) * Lezhin : change manga list endpoint & language values (#6689) * Lezhin : change manga list endpoint * Lezhin : change locale code * Fix InfernalVoidScans: use referer (#6705) Fixes https://github.com/manga-download/hakuneko/issues/6701 * RandomScan : rebranding to LuraToon (#6726) * RandomScan : rebranding to LuraToon * update randomscan icon * Fix Ainzscans: domain and junk in manga title (#6714) Fixes https://github.com/manga-download/hakuneko/issues/6712 * feat(AGS): create connector (#6753) * feat(Nyrax): create connector (#6754) * Remove Assorted Scans (#6768) * FIx AsuraScansTR : domain, Madara, no junk (#6713) Fixes https://github.com/manga-download/hakuneko/issues/6707 * FIx LikeManga: invalid css selector (#6745) Turns out selector is invalid in our old chrome Filtering picture another way * Fix GekkouScans: change domain (#6740) Fixes https://github.com/manga-download/hakuneko/issues/6739 * Update MangasChan.mjs (#6752) updating the link data * Fix MangaGeko: change domain (#6757) Fixes https://github.com/manga-download/hakuneko/issues/6756 * Fix Nonbiri: rebranding & change domain (#6737) Fixes https://github.com/manga-download/hakuneko/issues/6736 * MangaHub.io: change CDN (#6771) * FIx MangaTR: change manga list path (#6733) Fixes https://github.com/manga-download/hakuneko/issues/6731 * [mangadex] get list from CDN (#6774) * get mangalist from cdn * fix lint error --------- Co-authored-by: MikeZeDev * Websites maintenance : AlliedFansub & Nivera (#6802) * AlliedFansub: change domain and template Fixes https://github.com/manga-download/hakuneko/issues/6793 * Nivera : change domain Fixes https://github.com/manga-download/hakuneko/issues/6792 * Fix ComicK : change domain (#6779) * FIx WebtoonHatti: change selector again (#6775) * FIX TCBScans: workaround for 404 errors (#6376) * FIX TCBScans: workarourd for 404 errors 1) Website changed url (unrelated) 2) They deliberately introduce missing junk pictures in popular manga chapters. Since they cant be distinguished by name pattern, we use another method ;) * requested changes * changed logic for fake pages missing pages are always at the end, so we start testing pictures backwards and stop when its good. * tbcscans: fire all promises and wait * Fix Opiatoon: changte domain (#6809) Fixes https://github.com/manga-download/hakuneko/issues/6791 * ComicWalker: rebrand to KadoComi (#6808) Fixes https://github.com/manga-download/hakuneko/issues/6806 * Fix ManhuaPlus: domain and change template (#6825) No more madara. Fixes https://github.com/manga-download/hakuneko/issues/6824 * FiX KomikAV: change domain & rebrnad to APKomik (#6839) Closes https://github.com/manga-download/hakuneko/issues/6837 * use more recent user-agent header (#6835) * Fix TuMangaOnline: fix getting pages (#6684) * FIx welovemanga.one: getting pages (#6715) Fixes https://github.com/manga-download/hakuneko/issues/6711 * Fix HentaiRead: get chapters and pages (#6777) * Fix HentaiRead: get chapters and pages * fix regex * Fix lint * try catch in promise * Fix ManhwaFreak: change fomain and filters (#6851) Fixes https://github.com/manga-download/hakuneko/issues/6849 * Fix LyraScans: change domain & rebrand (#6857) * Fix LyraScans: change domain & rebrand Fixes https://github.com/manga-download/hakuneko/issues/6856 * update icon * Fix NeoxScan: change domain (#6860) * FIx ResetScans : change domain (#6854) Fixes https://github.com/manga-download/hakuneko/issues/6853 * Fix SwatManga : change domain (#6844) Fixes https://github.com/manga-download/hakuneko/issues/6842 * Fix KomikNesia : change domain (#6873) Fixes https://github.com/manga-download/hakuneko/issues/6871 * Fix MangaToon: change CSS for chapters (#6887) get rid of duplicate chapters * Fix ComicK: update domain (#6897) Fixes https://github.com/manga-download/hakuneko/issues/6896 * Fix MangaSail : change domain (#6898) Fixes https://github.com/manga-download/hakuneko/issues/6894 * Fix MangaBat : change domain (#6899) * Fix MangaStarz : change domain (#6901) Fixes https://github.com/manga-download/hakuneko/issues/6900 * change domain (#6910) Co-authored-by: Abdullah-KS <78895454+Abdullah-KS@users.noreply.github.com> * FIx Siyahmelek: change domain (#6915) Fixes https://github.com/manga-download/hakuneko/issues/6908 * Fix MangaTX : domain changed (#6916) Fixes https://github.com/manga-download/hakuneko/issues/6911 * Fix TopToon : update CSS selectors (#6906) * Fix TopToon : update CSS selectors Fixes https://github.com/manga-download/hakuneko/issues/6905 * Update TopToon.mjs * Update TopToon.mjs * attempt to fix lint error * dont use optional chaining optional chaining doesnt work in stable build because electron version is too old * Fix MagKan: use Comici Viewer (#6927) Similar to YoungChampion, YoungAnimal, Comicride, ComicMedu, etc.... Fixes https://github.com/manga-download/hakuneko/issues/6926 * Fix winterscan : change domain (#6935) https://github.com/manga-download/hakuneko/issues/6933 * fix MangaSect source (#6930) * fix MangaSect source * fix lint * better mangasect fix --------- Co-authored-by: Victor Abrate Co-authored-by: MikeZeDev * Fix MoonWitchInLove : change domain (#6942) Fixes https://github.com/manga-download/hakuneko/issues/6936 * add connector monzeekomik (#6954) * add connector monzeekomik * fix lint --------- Co-authored-by: MikeZeDev * Fix ComicExtra : change domain (#6951) * FIx KomikAV: domain type (#6881) Fixes https://github.com/manga-download/hakuneko/issues/6879 * Fix Saikaiscan : change domain (#6963) Fixes https://github.com/manga-download/hakuneko/issues/6620 * Fix LxHentai: change domain (#6970) Fixes https://github.com/manga-download/hakuneko/issues/6968 * Lock ESLint Version (#6971) * lock eslint version * fix lint errors --------- Co-authored-by: akn19 <86169232+akn19@users.noreply.github.com> Co-authored-by: Tristan Co-authored-by: realabertian <64790396+realabertian@users.noreply.github.com> Co-authored-by: Ignacio Castro Co-authored-by: trendbloat <156368216+trendbloat@users.noreply.github.com> Co-authored-by: ObserverOfTime Co-authored-by: Luis Araújo <97482945+DartinSA@users.noreply.github.com> Co-authored-by: Ronny Co-authored-by: ZIRO <78895454+PD-ZIRO@users.noreply.github.com> Co-authored-by: Abdullah-KS <78895454+Abdullah-KS@users.noreply.github.com> Co-authored-by: Victor Abrate Co-authored-by: Victor Abrate --- package.json | 4 +- src/web/img/connectors/ascalon | Bin 0 -> 5923 bytes src/web/img/connectors/assortedscans | Bin 15716 -> 0 bytes src/web/img/connectors/comicride | Bin 0 -> 3268 bytes src/web/img/connectors/doujinku | Bin 0 -> 1350 bytes src/web/img/connectors/lyrascans | Bin 3750 -> 9826 bytes src/web/img/connectors/mangasusuku | Bin 0 -> 5941 bytes src/web/img/connectors/monzeekomik | Bin 0 -> 1046 bytes src/web/img/connectors/nyrax | Bin 0 -> 2761 bytes src/web/img/connectors/prismascans | Bin 10290 -> 8883 bytes src/web/img/connectors/randomscan | Bin 1454 -> 7941 bytes src/web/img/connectors/summertoon | Bin 0 -> 9091 bytes src/web/mjs/connectors/AGS.mjs | 32 ++++ src/web/mjs/connectors/Ainzscans.mjs | 11 +- src/web/mjs/connectors/AlliedFansub.mjs | 7 +- src/web/mjs/connectors/Ascalon.mjs | 12 ++ src/web/mjs/connectors/AssortedScans.mjs | 78 --------- src/web/mjs/connectors/AsuraScans.mjs | 3 +- src/web/mjs/connectors/AsuraScansTR.mjs | 21 +-- src/web/mjs/connectors/AzoraManga.mjs | 7 +- src/web/mjs/connectors/BeeToon.mjs | 15 +- src/web/mjs/connectors/CeriseScans.mjs | 2 +- src/web/mjs/connectors/Cmoa.mjs | 5 +- src/web/mjs/connectors/ComicBushi.mjs | 6 +- src/web/mjs/connectors/ComicEarthStar.mjs | 141 +++++++++------- src/web/mjs/connectors/ComicExtra.mjs | 2 +- src/web/mjs/connectors/ComicK.mjs | 8 +- src/web/mjs/connectors/ComicRide.mjs | 24 +++ src/web/mjs/connectors/ComicWalker.mjs | 153 ++++++++---------- src/web/mjs/connectors/CovenScan.mjs | 2 +- src/web/mjs/connectors/DiskusScan.mjs | 7 +- src/web/mjs/connectors/Doujinku.mjs | 13 ++ src/web/mjs/connectors/EvaScans.mjs | 6 +- src/web/mjs/connectors/FirstKiss.mjs | 2 +- src/web/mjs/connectors/GekkouScans.mjs | 2 +- src/web/mjs/connectors/GourmetScans.mjs | 19 ++- src/web/mjs/connectors/GuncelManga.mjs | 4 +- src/web/mjs/connectors/Hayalistic.mjs | 4 +- src/web/mjs/connectors/HentaiRead.mjs | 45 ++++-- src/web/mjs/connectors/InfernalVoidScans.mjs | 3 +- src/web/mjs/connectors/KomikAV.mjs | 6 +- src/web/mjs/connectors/KomikNesia.mjs | 11 +- src/web/mjs/connectors/LezhinEN.mjs | 2 +- src/web/mjs/connectors/LezhinJA.mjs | 2 +- src/web/mjs/connectors/LezhinKO.mjs | 2 +- src/web/mjs/connectors/LoveHug.mjs | 22 +-- src/web/mjs/connectors/Luscious.mjs | 118 +++++++++----- src/web/mjs/connectors/LxHentai.mjs | 2 +- src/web/mjs/connectors/LyraScans.mjs | 8 +- src/web/mjs/connectors/MagKan.mjs | 55 +------ src/web/mjs/connectors/ManHuaGui.mjs | 4 +- src/web/mjs/connectors/MangaBat.mjs | 6 +- src/web/mjs/connectors/MangaDex.mjs | 90 +---------- src/web/mjs/connectors/MangaDig.mjs | 89 +--------- src/web/mjs/connectors/MangaEffect.mjs | 17 -- src/web/mjs/connectors/MangaHub.mjs | 4 +- src/web/mjs/connectors/MangaNel.mjs | 2 +- src/web/mjs/connectors/MangaPill.mjs | 3 +- src/web/mjs/connectors/MangaRaw.mjs | 2 +- src/web/mjs/connectors/MangaSail.mjs | 2 +- src/web/mjs/connectors/MangaSect.mjs | 80 +++------ src/web/mjs/connectors/MangaSehri.mjs | 8 +- src/web/mjs/connectors/MangaStarz.mjs | 4 +- src/web/mjs/connectors/MangaSusuku.mjs | 13 ++ src/web/mjs/connectors/MangaSwat.mjs | 2 +- src/web/mjs/connectors/MangaTR.mjs | 4 +- src/web/mjs/connectors/MangaTX.mjs | 4 +- src/web/mjs/connectors/MangaWOW.mjs | 4 +- src/web/mjs/connectors/Mangalek.mjs | 2 +- src/web/mjs/connectors/MangasChan.mjs | 4 +- src/web/mjs/connectors/ManhuaPlus.mjs | 90 +++++++++-- src/web/mjs/connectors/ManhwaFreak.mjs | 5 +- src/web/mjs/connectors/ManhwaLatino.mjs | 33 +++- src/web/mjs/connectors/Miauscan.mjs | 54 ++++++- src/web/mjs/connectors/MonzeeKomik.mjs | 19 +++ src/web/mjs/connectors/MoonWitchInLove.mjs | 4 +- src/web/mjs/connectors/NeoxScan.mjs | 2 +- src/web/mjs/connectors/NicoNicoSeiga.mjs | 49 +++--- src/web/mjs/connectors/NinjaScan.mjs | 4 +- src/web/mjs/connectors/NiveraFansub.mjs | 2 +- src/web/mjs/connectors/Nonbiri.mjs | 4 +- src/web/mjs/connectors/Nyrax.mjs | 12 ++ src/web/mjs/connectors/Opiatoon.mjs | 4 +- src/web/mjs/connectors/PojokManga.mjs | 5 +- src/web/mjs/connectors/PrismaScan.mjs | 4 +- src/web/mjs/connectors/RandomScan.mjs | 4 +- src/web/mjs/connectors/ReaperScans.mjs | 132 ++++++--------- src/web/mjs/connectors/ReaperScansTR.mjs | 13 +- src/web/mjs/connectors/ResetScans.mjs | 2 +- src/web/mjs/connectors/Saikaiscan.mjs | 8 +- src/web/mjs/connectors/SeriManga.mjs | 6 +- src/web/mjs/connectors/Siyahmelek.mjs | 4 +- src/web/mjs/connectors/Summertoon.mjs | 12 ++ src/web/mjs/connectors/TCBScans.mjs | 29 +++- src/web/mjs/connectors/TitanManga.mjs | 7 +- src/web/mjs/connectors/TonizuToon.mjs | 4 +- src/web/mjs/connectors/TopToon.mjs | 14 +- src/web/mjs/connectors/TuMangaOnline.mjs | 2 +- src/web/mjs/connectors/WebtoonHatti.mjs | 1 + src/web/mjs/connectors/WestManga.mjs | 2 +- src/web/mjs/connectors/XoxoComics.mjs | 18 ++- src/web/mjs/connectors/Yanmaga.mjs | 80 +++++---- src/web/mjs/connectors/ZeroScans.mjs | 12 +- src/web/mjs/connectors/azoraworld.mjs | 23 ++- src/web/mjs/connectors/mangaz.mjs | 4 +- src/web/mjs/connectors/templates/Lezhin.mjs | 7 +- .../mjs/connectors/templates/MangaToon.mjs | 4 +- src/web/mjs/connectors/winterscan.mjs | 4 +- src/web/mjs/engine/Connectors.mjs | 6 +- src/web/mjs/engine/HeaderGenerator.mjs | 2 +- 110 files changed, 947 insertions(+), 954 deletions(-) create mode 100644 src/web/img/connectors/ascalon delete mode 100644 src/web/img/connectors/assortedscans create mode 100644 src/web/img/connectors/comicride create mode 100644 src/web/img/connectors/doujinku create mode 100644 src/web/img/connectors/mangasusuku create mode 100644 src/web/img/connectors/monzeekomik create mode 100644 src/web/img/connectors/nyrax create mode 100644 src/web/img/connectors/summertoon create mode 100644 src/web/mjs/connectors/AGS.mjs create mode 100644 src/web/mjs/connectors/Ascalon.mjs delete mode 100644 src/web/mjs/connectors/AssortedScans.mjs create mode 100644 src/web/mjs/connectors/ComicRide.mjs create mode 100644 src/web/mjs/connectors/Doujinku.mjs create mode 100644 src/web/mjs/connectors/MangaSusuku.mjs create mode 100644 src/web/mjs/connectors/MonzeeKomik.mjs create mode 100644 src/web/mjs/connectors/Nyrax.mjs create mode 100644 src/web/mjs/connectors/Summertoon.mjs diff --git a/package.json b/package.json index 8fc06e07b8..e4efee51e5 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "asar": "latest", "discord-rpc": "latest", "electron": "8.3.4", - "eslint": "latest", + "eslint": "^8.57.0", "fs-extra": "latest", "innosetup-compiler": "latest", "jest": "latest", @@ -35,7 +35,7 @@ "start:build": "npm run build:web && electron . --update-url=DISABLED --cache-directory=./build/latest", "lint": "npm run lint:app && npm run lint:web", "lint:app": "eslint ./src/app --ignore-path .gitignore", - "lint:web": "eslint ./src/web/mjs/**/*.mjs --ignore-path .gitignore --ignore-pattern Connectors.mjs", + "lint:web": "eslint ./src/web/mjs/**/*.mjs --ignore-path .gitignore --parser-options ecmaVersion:2020", "format": "npm run format:app && npm run format:web", "format:app": "npm run lint:app -- --fix", "format:web": "npm run lint:web -- --fix", diff --git a/src/web/img/connectors/ascalon b/src/web/img/connectors/ascalon new file mode 100644 index 0000000000000000000000000000000000000000..6180f25e167f35ab423f833ec11ff904f2fb942a GIT binary patch literal 5923 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 FV1kqYOHcp+ literal 0 HcmV?d00001 diff --git a/src/web/img/connectors/assortedscans b/src/web/img/connectors/assortedscans deleted file mode 100644 index 0055fa7cf172637952d6574a76e1ff58e277d2ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15716 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 J-LU)4_W@ocMBM-Y diff --git a/src/web/img/connectors/comicride b/src/web/img/connectors/comicride new file mode 100644 index 0000000000000000000000000000000000000000..ecf8170a4683f77d132e83b0298e55b4cd32f118 GIT binary patch literal 3268 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 Xr@$|2B2wbJ00000NkvXXu0mjfuZwox literal 0 HcmV?d00001 diff --git a/src/web/img/connectors/monzeekomik b/src/web/img/connectors/monzeekomik new file mode 100644 index 0000000000000000000000000000000000000000..07bec10de5e6afd6b8dfff59b622799ef5f6d1cd GIT binary patch literal 1046 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 BI=27- literal 10290 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 Ef)vcAY5)KL diff --git a/src/web/img/connectors/randomscan b/src/web/img/connectors/randomscan index 92ef37ba7b643db365a643767307809ec509b16a..b14c57066a0a481e2de144f03a7d7c41b91c46ac 100644 GIT binary patch literal 7941 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 IM6N<$f(ehimjD0& diff --git a/src/web/img/connectors/summertoon b/src/web/img/connectors/summertoon new file mode 100644 index 0000000000000000000000000000000000000000..4cbf226aabc24b188ff1906f6a90171f326dbb83 GIT binary patch literal 9091 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 B$}|7~ literal 0 HcmV?d00001 diff --git a/src/web/mjs/connectors/AGS.mjs b/src/web/mjs/connectors/AGS.mjs new file mode 100644 index 0000000000..1362f8c795 --- /dev/null +++ b/src/web/mjs/connectors/AGS.mjs @@ -0,0 +1,32 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class AGS extends WordPressMangastream { + + constructor() { + super(); + super.id = 'ags'; + super.label = 'AGS (Animated Glitched Scans)'; + this.tags = [ 'manga', 'english', 'scanlation' ]; + this.url = 'https://agscomics.com'; + this.path = '/series/?list'; + } + + get icon() { + return '/img/connectors/anigliscans'; + } + + async _getPages(chapter) { + const data = await super._getPages(chapter); + return data.map(element => this.createConnectorURI(element)); + } + + async _handleConnectorURI(payload) { + const 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; + } +} diff --git a/src/web/mjs/connectors/Ainzscans.mjs b/src/web/mjs/connectors/Ainzscans.mjs index 2b871c532c..9192334b13 100644 --- a/src/web/mjs/connectors/Ainzscans.mjs +++ b/src/web/mjs/connectors/Ainzscans.mjs @@ -7,7 +7,16 @@ export default class Ainzscans extends WordPressMangastream { super.id = 'ainzscans'; super.label = 'Ainz Scans'; this.tags = [ 'webtoon', 'indonesian', 'scanlation' ]; - this.url = 'https://ainzscans.site'; + this.url = 'https://ainzscans.net'; this.path = '/series/list-mode'; } + + async _getMangas() { + return (await super._getMangas()).map(manga => { + return { + id : manga.id, + title : manga.title.replace('Bahasa Indonesia', '').trim() + }; + }); + } } diff --git a/src/web/mjs/connectors/AlliedFansub.mjs b/src/web/mjs/connectors/AlliedFansub.mjs index bddd3971e7..2e6e3652f0 100644 --- a/src/web/mjs/connectors/AlliedFansub.mjs +++ b/src/web/mjs/connectors/AlliedFansub.mjs @@ -1,14 +1,13 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class AlliedFansub extends WordPressMangastream { +export default class AlliedFansub extends WordPressMadara { constructor() { super(); super.id = 'alliedfansub'; super.label = 'Allied Fansub'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://alliedfansub.online'; - this.path = '/manga/list-mode/'; + this.url = 'https://alliedfansub.net'; this.requestOptions.headers.set('x-referer', this.url); } } diff --git a/src/web/mjs/connectors/Ascalon.mjs b/src/web/mjs/connectors/Ascalon.mjs new file mode 100644 index 0000000000..114f739c02 --- /dev/null +++ b/src/web/mjs/connectors/Ascalon.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Ascalon extends WordPressMangastream { + constructor() { + super(); + super.id = 'ascalon'; + super.label = 'Ascalon'; + this.tags = ['webtoon', 'english', 'scanlation']; + this.url = 'https://ascalonscans.com'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/AssortedScans.mjs b/src/web/mjs/connectors/AssortedScans.mjs deleted file mode 100644 index ea33e58599..0000000000 --- a/src/web/mjs/connectors/AssortedScans.mjs +++ /dev/null @@ -1,78 +0,0 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; - -export default class AssortedScans extends Connector { - constructor() { - super(); - super.id = 'assortedscans'; - super.label = 'assortedscans'; - this.tags = ['manga', 'english']; - this.url = 'https://assortedscans.com'; - } - - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, '#series-title'); - const title = data['0'].text.trim(); - const id = uri.pathname + uri.search; - return Manga(this, id, title); - } - - async _getMangas() { - const request = new Request(new URL('/reader/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'section.series h2.series-title a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim(), - }; - }); - } - - async _getChapters(manga) { - const id = this.getId(manga.id); - const request = new Request(new URL(id, this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'div.chapter > a'); - return data - .map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.title - }; - }); - } - - getId(url) { - return url.match(/\/reader\/.*\/?/)[0]; - } - - async _getMaxSite(chapterId) { - const id = this.getId(chapterId); - const request = new Request(new URL(id + '1/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'li.dropdown-element.page-details:last-child a'); - const maxSite = data['0'].text.match(/Page (\d+)/)[1]; - return [id, parseInt(maxSite)]; - } - - async _getPages(chapter) { - - const id = this.getId(chapter.id); - const request = new Request(new URL(id + '1/', this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'li.dropdown-element.page-details a'); - return data.map(element => { - const maxPage = element.text.match(/Page (\d+)/)[1]; - return this.createConnectorURI(this.url + id + maxPage); - }); - } - - async _handleConnectorURI(payload) { - const request = new Request(payload, this.requestOptions); - const data = await this.fetchDOM(request, 'source#page-image'); - const link = this.getAbsolutePath(data[0], request.url); - const response = await fetch(link, this.requestOptions); - const blob = await response.blob(); - const buffer = await this._blobToBuffer(blob); - this._applyRealMime(buffer); - return buffer; - } -} \ No newline at end of file diff --git a/src/web/mjs/connectors/AsuraScans.mjs b/src/web/mjs/connectors/AsuraScans.mjs index cb2586ad35..1800051fae 100644 --- a/src/web/mjs/connectors/AsuraScans.mjs +++ b/src/web/mjs/connectors/AsuraScans.mjs @@ -36,7 +36,8 @@ export default class AsuraScans extends WordPressMangastream { /panda_gif_large/i, /2021\/04\/page100-10\.jpg/i, /2021\/03\/20-ending-page-\.jpg/i, - /ENDING-PAGE/i + /ENDING-PAGE/i, + /EndDesignPSD/i ]; let images = []; diff --git a/src/web/mjs/connectors/AsuraScansTR.mjs b/src/web/mjs/connectors/AsuraScansTR.mjs index b0d23e77a7..7dcc0c84bf 100644 --- a/src/web/mjs/connectors/AsuraScansTR.mjs +++ b/src/web/mjs/connectors/AsuraScansTR.mjs @@ -1,31 +1,16 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class AsuraScansTR extends WordPressMangastream { +export default class AsuraScansTR extends WordPressMadara { constructor() { super(); super.id = 'asurascans-tr'; super.label = 'Asura Scans (TR)'; this.tags = ['webtoon', 'turkish']; - this.url = 'https://armoniscans.com'; - this.path = '/manga/list-mode/'; - this.queryPages = 'div#readerarea p img'; - this.requestOptions.headers.set('x-user-agent', 'Mozilla/5.0 (Linux; Android 9; Pixel) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4026.0 Mobile Safari/537.36'); + this.url = 'https://asurascans.com.tr'; } get icon() { return '/img/connectors/asurascans'; } - - async _getPages(chapter) { - const excludes = [ - /panda_gif_large/i, - /2021\/04\/page100-10\.jpg/i, - /2021\/03\/20-ending-page-\.jpg/i, - /ENDING-PAGE/i - ]; - const images = await super._getPages(chapter); - return images.filter(link => !excludes.some(rgx => rgx.test(link))); - } - } diff --git a/src/web/mjs/connectors/AzoraManga.mjs b/src/web/mjs/connectors/AzoraManga.mjs index bd3480ca68..3f5bd6adf6 100644 --- a/src/web/mjs/connectors/AzoraManga.mjs +++ b/src/web/mjs/connectors/AzoraManga.mjs @@ -1,12 +1,11 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import AzoraWorld from './AzoraWorld.mjs'; -export default class AzoraManga extends WordPressMadara { +export default class AzoraManga extends AzoraWorld { constructor() { super(); super.id = 'azoramanga'; super.label = 'أزورا مانج (AZORA MANGA)'; this.tags = [ 'webtoon', 'arabic' ]; - this.url = 'https://azoramanga.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/BeeToon.mjs b/src/web/mjs/connectors/BeeToon.mjs index 3d026272de..7eda721c0f 100644 --- a/src/web/mjs/connectors/BeeToon.mjs +++ b/src/web/mjs/connectors/BeeToon.mjs @@ -14,7 +14,7 @@ export default class BeeToon extends WordPressZbulu { } canHandleURI(uri) { - return /(ww2\.)?beetoon\.net/.test(uri.hostname); + return /(ww\d+\.)?beetoon\.net/.test(uri.hostname); } async _initializeConnector() { @@ -37,4 +37,15 @@ export default class BeeToon extends WordPressZbulu { }; }); } -} \ No newline at end of file + + async _getPages(chapter) { + const pages = await super._getPages(chapter); + return pages + .map( page => { + let link = new URL(page); + link = link.searchParams.get('url') || link; //deproxify url if needed + return link.href; + }) + .filter(page => !page.includes('/gadgets/proxy?'));//remove fake images (that were not deproxified) + } +} diff --git a/src/web/mjs/connectors/CeriseScans.mjs b/src/web/mjs/connectors/CeriseScans.mjs index 361dcc07bc..1448e36d2f 100644 --- a/src/web/mjs/connectors/CeriseScans.mjs +++ b/src/web/mjs/connectors/CeriseScans.mjs @@ -7,6 +7,6 @@ export default class CeriseScans extends WordPressMadaraNovel { super.id = 'cerisescans'; super.label = 'Cerise Scans'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://cerisescan.com'; + this.url = 'https://cerisescan.net'; } } diff --git a/src/web/mjs/connectors/Cmoa.mjs b/src/web/mjs/connectors/Cmoa.mjs index 7801fcb637..ce92218d48 100644 --- a/src/web/mjs/connectors/Cmoa.mjs +++ b/src/web/mjs/connectors/Cmoa.mjs @@ -26,9 +26,10 @@ export default class Cmoa extends SpeedBinb { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); - const pages = await this.fetchDOM(request, '#comic_list > .pagination:nth-child(1) li'); + const pages = await this.fetchDOM(request, '#comic_list > .pagination:nth-child(1) li:nth-last-child(2) a'); const chapters = []; - const totalPage = pages.length == 0 ? 1 : pages.length - 1; + const totalPage = pages.length == 0 ? 1 : parseInt(new URL(pages[0].href).searchParams.get('page')); + for (let i = 0; i < totalPage; i++) { const uri = new URL(manga.id, this.url); uri.searchParams.set('page', i + 1); diff --git a/src/web/mjs/connectors/ComicBushi.mjs b/src/web/mjs/connectors/ComicBushi.mjs index 69e8bd39c3..544a34b094 100644 --- a/src/web/mjs/connectors/ComicBushi.mjs +++ b/src/web/mjs/connectors/ComicBushi.mjs @@ -5,9 +5,9 @@ export default class ComicBushi extends CoreView { constructor() { super(); super.id = 'comicbushi'; - super.label = 'コミックブシロードWEB (Comic Bushiroad WEB)'; + super.label = 'コミックブシロードWEB (Comic Bushiroad WEB / Growl)'; this.tags = ['manga', 'japanese']; - this.url = 'https://comicbushi-web.com'; + this.url = 'https://comic-growl.com'; this.path = ['/']; this.queryManga = 'section#lineup ul.lineup-list div.lineup-item a'; this.queryMangaTitle = 'h5.title'; @@ -23,4 +23,4 @@ export default class ComicBushi extends CoreView { }; }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ComicEarthStar.mjs b/src/web/mjs/connectors/ComicEarthStar.mjs index 2a582b0bf3..5e9da2024c 100644 --- a/src/web/mjs/connectors/ComicEarthStar.mjs +++ b/src/web/mjs/connectors/ComicEarthStar.mjs @@ -1,71 +1,94 @@ -import Publus from './templates/Publus.mjs'; -import Manga from '../engine/Manga.mjs'; +import CoreView from './templates/CoreView.mjs'; -export default class ComicEarthStar extends Publus { +export default class ComicEarthStar extends CoreView { constructor() { super(); super.id = 'comicearthstar'; super.label = 'コミック アース・スター (Comic Earth Star)'; this.tags = [ 'manga', 'japanese' ]; - this.url = 'https://www.comic-earthstar.jp'; + this.apiURL = 'https://comic-earthstar.com/graphql'; + this.url = 'https://comic-earthstar.com'; } - async _getMangaFromURI(uri) { - let id = uri.pathname.match(/\/([^/]+)\/?$/)[1]; - let request = new Request(this.url + '/json/contents/detail/' + id + '.json', this.requestOptions); - let data = await this.fetchJSON(request); - let title = data.categorys.comic_category_title; - return new Manga(this, id, title); - } + async _getMangas() { + const mangalist = []; - /** - * - */ - _getMangaList( callback ) { - let request = new Request( this.url + '/json/contents/top/default.json', this.requestOptions ); - this.fetchJSON( request ) - .then( data => { - let ongoingList = data.serial_comics.map( comic => { - return { - id: comic.comic_category_code, - title: comic.title - }; - } ); - let completedList = data.comple_comics.map( comic => { - return { - id: comic.comic_category_code, - title: comic.comic_category_code.toUpperCase() - }; - } ); - let mangaList = ongoingList.concat( completedList ); - callback( null, mangaList ); - } ) - .catch( error => { - console.error( error, this ); - callback( error, undefined ); - } ); - } + let operationName = 'Earthstar_Oneshot'; + let query = ` + query Earthstar_Oneshot { + seriesOneshot: serialGroup(groupName: "連載・読切:読切作品") { + seriesSlice { + seriesList { + id + title + firstEpisode { + permalink + } + } + } + } + } + `; + let uri = new URL(this.apiURL); + uri.searchParams.set('opname', operationName); + let request = new Request(uri, this.requestOptions); + let data = await this.fetchGraphQL(request, operationName, query, {} ); + data.seriesOneshot.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + operationName = 'Earthstar_Series'; + query = ` + query Earthstar_Series { + seriesOngoing: serialGroup(groupName: "連載・読切:連載作品:連載中") { + seriesSlice { + seriesList { + ...Earthstar_SeriesListItem_Series + } + } + } + seriesFinished: serialGroup(groupName: "連載・読切:連載作品:連載終了") { + seriesSlice { + seriesList { + ...Earthstar_SeriesListItem_Series + } + } + } + } + + fragment Earthstar_SeriesListItem_Series on Series { + id + title + firstEpisode { + permalink + } + } + `; + uri = new URL(this.apiURL); + uri.searchParams.set('opname', operationName); + request = new Request(uri, this.requestOptions); + data = await this.fetchGraphQL(request, operationName, query, {} ); + + data.seriesOngoing.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + data.seriesFinished.seriesSlice.seriesList.forEach(manga => { + mangalist.push({ + id: new URL(manga.firstEpisode.permalink).pathname, + title: manga.title.trim() + }); + }); + + return mangalist; - /** - * - */ - _getChapterList( manga, callback ) { - let request = new Request( this.url + '/json/contents/detail/' + manga.id + '.json', this.requestOptions ); - this.fetchJSON( request ) - .then( data => { - let chapterList = data.episodes.map( episode => { - return { - id: new URL( episode.page_url, request.url ).href, // episode.cid, - title: episode.comic_episode_title, - language: '' - }; - } ); - callback( null, chapterList ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); } -} \ No newline at end of file + +} diff --git a/src/web/mjs/connectors/ComicExtra.mjs b/src/web/mjs/connectors/ComicExtra.mjs index 85f973816f..38c04fb575 100644 --- a/src/web/mjs/connectors/ComicExtra.mjs +++ b/src/web/mjs/connectors/ComicExtra.mjs @@ -8,7 +8,7 @@ export default class ComicExtra extends Connector { super.id = 'comicextra'; super.label = 'ComicExtra'; this.tags = ['comic', 'english']; - this.url = 'https://comicextra.me'; + this.url = 'https://comicextra.org'; this.path = '/comic-list/'; } diff --git a/src/web/mjs/connectors/ComicK.mjs b/src/web/mjs/connectors/ComicK.mjs index 2b359a1d36..0f551da2a2 100644 --- a/src/web/mjs/connectors/ComicK.mjs +++ b/src/web/mjs/connectors/ComicK.mjs @@ -9,13 +9,17 @@ export default class ComicK extends Connector { super.id = 'comick'; super.label = 'ComicK'; this.tags = [ 'manga', 'english' ]; - this.url = 'https://comick.ink'; - this.apiurl = 'https://api.comick.ink'; + this.url = 'https://comick.io'; + this.apiurl = 'https://api.comick.io'; this.requestOptions.headers.set('x-origin', this.url ); this.requestOptions.headers.set('x-referer', this.apiurl ); } + canHandleURI(uri) { + return /https?:\/\/comick\.(app|ink|cc|io)/.test(uri.origin); + } + async _getEmbeddedJSON(uri) { const request = new Request(uri, this.requestOptions); request.headers.set('x-user-agent', HeaderGenerator.randomUA() ); diff --git a/src/web/mjs/connectors/ComicRide.mjs b/src/web/mjs/connectors/ComicRide.mjs new file mode 100644 index 0000000000..34d40f0028 --- /dev/null +++ b/src/web/mjs/connectors/ComicRide.mjs @@ -0,0 +1,24 @@ +import YoungChampion from './YoungChampion.mjs'; + +//ComiciViewer +export default class ComicRide extends YoungChampion { + constructor() { + super(); + super.id = 'comicride'; + super.label = 'ComicRide'; + this.tags = ['manga', 'japanese']; + this.url = 'https://comicride.jp'; + this.apiUrl = this.url; + this.links = { + login: 'https://comicride.jp/signin' + }; + } + 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; + } +} diff --git a/src/web/mjs/connectors/ComicWalker.mjs b/src/web/mjs/connectors/ComicWalker.mjs index 89308021ba..5af7780866 100644 --- a/src/web/mjs/connectors/ComicWalker.mjs +++ b/src/web/mjs/connectors/ComicWalker.mjs @@ -6,114 +6,87 @@ export default class ComicWalker extends Connector { constructor() { super(); super.id = 'comicwalker'; - super.label = 'コミックウォーカー (ComicWalker)'; + super.label = 'カドコミ (KadoComi)'; this.tags = [ 'manga', 'japanese' ]; this.url = 'https://comic-walker.com'; + this.apiURL = 'https://comic-walker.com/api/'; } async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'div#mainContent div#detailIndex div.comicIndex-box h1'); - let id = uri.pathname + uri.search; - let title = data[0].textContent.trim(); - return Promise.resolve(new Manga(this, id, title)); + const workCode = uri.pathname.match(/\/detail\/([^/]+)/)[1]; //strip search + const apiCallUrl = new URL(`contents/details/work?workCode=${workCode}`, this.apiURL); + const { work } = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + return new Manga(this, workCode, work.title.trim()); } - async _getMangaListPage(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'div.comicPage ul.tileList li a p.tileTitle span'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.closest('a'), request.url), - title: element.textContent.replace(/^[^\s]+\s/, '').trim() - }; - }); + async _getMangas() { + const mangasList = []; + const apiCallUrl = new URL(`search/initial`, this.apiURL); + const data = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + for (const entry of data) { + mangasList.push(...entry.items.map(manga => { + return { + id: manga.code, + title: manga.title.trim() + }; + })); + } + return mangasList; } - async _getMangaList(callback) { - try { - let mangaList = []; - for(let language of ['en', 'tw', 'jp']) { - let uri = new URL('/contents/list/', this.url); - let request = new Request(`${this.url}/set_lang/${language}/`, this.requestOptions); - request.headers.set('x-referer', uri.href); - let data = await this.fetchDOM(request, 'div.comicPage div.pager ul.clearfix li:nth-last-of-type(2) a'); - let pageCount = parseInt(data[0].text.trim()); - for(let page = 1; page <= pageCount; page++) { - uri.searchParams.set('p', page); - let mangas = await this._getMangaListPage(uri); - mangaList.push(...mangas); - } - } - callback(null, mangaList); - } catch(error) { - console.error(error, this); - callback(error, undefined); + async _getChapters( manga ) { + const chapterList = []; + const apiCallUrl = new URL(`contents/details/work?workCode=${manga.id}`, this.apiURL); + const data = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + + for (const episodeType of ['firstEpisodes', 'latestEpisodes' ]) { + + chapterList.push(...data[episodeType].result.map(episode => { + const title = [episode.title, episode.subtitle].join(' ').trim(); + return { id: episode.id, title : title}; + })); } - } - _getChapterList( manga, callback ) { - let request = new Request( this.url + manga.id, this.requestOptions ); - this.fetchDOM( request, 'div#ulreversible ul#reversible li a' ) - .then( data => { - let chapterList = data.map( element => { - return { - id: this.getRootRelativeOrAbsoluteLink( element, request.url ), - title: element.title.replace( manga.title, '' ).trim(), - language: '' - }; - } ); - callback( null, chapterList ); - } ) - .catch( error => { - console.error( error, manga ); - callback( error, undefined ); - } ); + for (const comic of data.comics.result) { + chapterList.push(...comic.episodes.map(episode => { + return { + id: episode.id, + title : episode.title.trim() + }; + })); + } + + return chapterList.filter(chapter => chapter === chapterList.find(c => c.id === chapter.id)); + } - _getPageList( manga, chapter, callback ) { - let request = new Request( this.url + chapter.id, this.requestOptions ); - this.fetchDOM( request, 'main#app' ) - .then( data => { - const endpoints = data[0].dataset.apiEndpointUrl ? data[0].dataset.apiEndpointUrl : JSON.parse(data[0].dataset.apiEndpointUrls); - let uri = `${endpoints.nc || endpoints.cw || endpoints}/api/v1/comicwalker/episodes/${data[0].dataset.episodeId}/frames`; - request = new Request( uri, this.requestOptions ); - return this.fetchJSON( request ); - } ) - .then( data => { - let pageList = data.data.result.map( page => this.createConnectorURI( this.getAbsolutePath( page.meta.source_url, this.url ) ) ); - callback( null, pageList ); - } ) - .catch( error => { - console.error( error, chapter ); - callback( error, undefined ); - } ); + async _getPages( chapter ) { + const apiCallUrl = new URL(`contents/viewer?episodeId=${chapter.id}&imageSizeType=width:1284`, this.apiURL); + const { manuscripts } = await this.fetchJSON(new Request(apiCallUrl, this.requestOptions)); + return manuscripts.map(page => this.createConnectorURI({ ...page })); } async _handleConnectorURI(payload) { - /* - * TODO: only perform requests when from download manager - * or when from browser for preview and selected chapter matches - */ - let passphrase = payload.split('/').find(part => /^[\da-f]{16}/.test(part)); - if(passphrase) { - let request = new Request(payload, this.requestOptions); - let response = await fetch(request); - return this._decrypt(await response.arrayBuffer(), passphrase); - } else { - return super._handleConnectorURI(payload); + const uri = new URL(payload.drmImageUrl, this.url); + const request = new Request(uri, this.requestOptions); + const response = await fetch(request); + switch (payload.drmMode) { + case 'xor': { + const encrypted = await response.arrayBuffer(); + const data = { + mimeType: response.headers.get('content-type'), + data: this._xor(encrypted, this._generateKey(payload.drmHash)) + }; + this._applyRealMime(data); + return data; + } + case 'raw': { + const data = await response.blob(); + return this._blobToBuffer(data); + } } } - _decrypt(encrypted, passphrase) { - let key = this._generateKey(passphrase); - let decrypted = this._xor(encrypted, key); - return Promise.resolve({ - mimeType: 'image/jpeg', - data: decrypted - }); - } - /** ****************************** * ** COMIC-WALKER CODE BEGIN *** @@ -140,4 +113,4 @@ export default class ComicWalker extends Connector { * ** COMIC-WALKER CODE END *** *************************** */ -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/CovenScan.mjs b/src/web/mjs/connectors/CovenScan.mjs index 24b2e3e0b5..222eed9051 100644 --- a/src/web/mjs/connectors/CovenScan.mjs +++ b/src/web/mjs/connectors/CovenScan.mjs @@ -7,7 +7,7 @@ export default class CovenScan extends WordPressMadara { super.id = 'covenscan'; super.label = 'Coven Scan'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://cvenscan.com'; + this.url = 'https://cvnscan.com'; } } diff --git a/src/web/mjs/connectors/DiskusScan.mjs b/src/web/mjs/connectors/DiskusScan.mjs index 576b6bc4c7..a8588beeb3 100644 --- a/src/web/mjs/connectors/DiskusScan.mjs +++ b/src/web/mjs/connectors/DiskusScan.mjs @@ -1,6 +1,6 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import WordPressMangastream from './templates/WordPressMangastream.mjs'; -export default class DiskusScan extends WordPressMadara { +export default class DiskusScan extends WordPressMangastream { constructor() { super(); @@ -8,5 +8,6 @@ export default class DiskusScan extends WordPressMadara { super.label = 'Diskus Scan'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; this.url = 'https://diskusscan.com'; + this.path = '/manga/list-mode'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Doujinku.mjs b/src/web/mjs/connectors/Doujinku.mjs new file mode 100644 index 0000000000..d4edf87974 --- /dev/null +++ b/src/web/mjs/connectors/Doujinku.mjs @@ -0,0 +1,13 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Doujinku extends WordPressMangastream { + + constructor() { + super(); + super.id = 'doujinku'; + super.label = 'Doujinku'; + this.tags = ['manga', 'hentai', 'indonesian']; + this.url = 'https://doujinku.xyz'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/EvaScans.mjs b/src/web/mjs/connectors/EvaScans.mjs index 7721610213..fe480c489e 100644 --- a/src/web/mjs/connectors/EvaScans.mjs +++ b/src/web/mjs/connectors/EvaScans.mjs @@ -5,9 +5,9 @@ export default class EvaScans extends WordPressMadara { constructor() { super(); super.id = 'evascans'; - super.label = 'EvaScans'; + super.label = 'ManWe'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://evascans.com'; + this.url = 'https://manwe.pro'; this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/FirstKiss.mjs b/src/web/mjs/connectors/FirstKiss.mjs index 29810a6e6c..c4f7e394ff 100644 --- a/src/web/mjs/connectors/FirstKiss.mjs +++ b/src/web/mjs/connectors/FirstKiss.mjs @@ -80,7 +80,7 @@ export default class FirstKiss extends Connector { const imgdata = JSON.parse(atob(parseJwt(tokenElement.getAttribute('value')).data)); resolve(imgdata.map(image => new URL(image, imgCdnUrl).href)); } - const images = [...document.querySelectorAll("div.reading-detail.box_doc img:not(noscript img)")]; + const images = [...document.querySelectorAll("div.reading-detail.box_doc img")].filter(element => element.dataset.index); resolve(images.map(image => image.getAttribute('src'))); }); `; diff --git a/src/web/mjs/connectors/GekkouScans.mjs b/src/web/mjs/connectors/GekkouScans.mjs index b41a96a8b2..7b1b882b05 100644 --- a/src/web/mjs/connectors/GekkouScans.mjs +++ b/src/web/mjs/connectors/GekkouScans.mjs @@ -7,6 +7,6 @@ export default class GekkouScans extends WordPressMadara { super.id = 'gekkouscans'; super.label = 'Gekkou Scans'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://gekkou.com.br'; + this.url = 'https://gekkou.site'; } } diff --git a/src/web/mjs/connectors/GourmetScans.mjs b/src/web/mjs/connectors/GourmetScans.mjs index 2487907afc..7d6beb58a1 100644 --- a/src/web/mjs/connectors/GourmetScans.mjs +++ b/src/web/mjs/connectors/GourmetScans.mjs @@ -7,7 +7,7 @@ export default class GourmetScans extends WordPressMadara { super.id = 'gourmetscans'; super.label = 'Gourmet Scans'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://gourmetscans.net'; + this.url = 'https://gourmetsupremacy.com'; } async _getPages(chapter) { @@ -15,13 +15,20 @@ export default class GourmetScans extends WordPressMadara { const request = new Request(url, this.requestOptions); const script = ` new Promise((resolve, reject) => { - var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { - format: CryptoJSAesJson - }).toString(CryptoJS.enc.Utf8)); - resolve(JSON.parse(imgdata)); + try { + let rocketscript = new RocketLazyLoadScripts; + rocketscript._loadEverythingNow(); + } catch (error) {} + + setTimeout(() => { + var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { + format: CryptoJSAesJson + }).toString(CryptoJS.enc.Utf8)); + resolve(JSON.parse(imgdata)); + }, 2500); }); `; const data = await Engine.Request.fetchUI(request, script); return data.map(picture => this.createConnectorURI({url : picture, referer : url})); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/GuncelManga.mjs b/src/web/mjs/connectors/GuncelManga.mjs index 913a2dcb53..5179731f6e 100644 --- a/src/web/mjs/connectors/GuncelManga.mjs +++ b/src/web/mjs/connectors/GuncelManga.mjs @@ -7,6 +7,6 @@ export default class GuncelManga extends WordPressMadara { super.id = 'guncelmanga'; super.label = 'Güncel Manga'; this.tags = [ 'manga', 'turkish' ]; - this.url = 'https://guncelmanga.com'; + this.url = 'https://guncelmanga.net'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Hayalistic.mjs b/src/web/mjs/connectors/Hayalistic.mjs index 837636ceb5..1a50da1a07 100644 --- a/src/web/mjs/connectors/Hayalistic.mjs +++ b/src/web/mjs/connectors/Hayalistic.mjs @@ -7,6 +7,6 @@ export default class Hayalistic extends WordPressMadara { super.id = 'hayalistic'; super.label = 'Hayalistic'; this.tags = [ 'webtoon', 'turkish' ]; - this.url = 'https://hayalistic.com'; + this.url = 'https://hayalistic.com.tr'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/HentaiRead.mjs b/src/web/mjs/connectors/HentaiRead.mjs index 77493a2f4f..c76d543a11 100644 --- a/src/web/mjs/connectors/HentaiRead.mjs +++ b/src/web/mjs/connectors/HentaiRead.mjs @@ -10,19 +10,36 @@ export default class HentaiRead extends WordPressMadara { this.url = 'https://hentairead.com'; } - // very similar to tritiniascans except that this websites uses an array instead of an object + async _getChapters(manga) { + const request = new Request(new URL(manga.id, this.url), this.requestOptions); + const [ data ] = await this.fetchDOM(request, 'a.btn-read-now'); + return [{ + id : data.pathname, + title : manga.title + }]; + } + async _getPages(chapter) { - let request = new Request(this.url + chapter.id, this.requestOptions); - let response = await fetch(request); - let data = await response.text(); - let chapterImages = data.match(/chapImages\s*=\s*(\[[^\]]+\])/); - let preloadedImages = data.match(/chapter_preloaded_images\s*=\s*(\[[^\]]+\])/); - let pageList = JSON.parse((chapterImages || preloadedImages)[1]); - return pageList.map(link => { - let uri = new URL(link); - uri.searchParams.set('quality', '100'); - uri.searchParams.delete('w'); - return uri.href; - }); + const request = new Request(this.url + chapter.id, this.requestOptions); + const script = ` + new Promise((resolve, reject) => { + setTimeout(() => { + try { + const pagelist = (window.chapterImages ?? window.chapter_preloaded_images); + resolve( pagelist.map(image=> { + const uri = new URL(image.src); + uri.searchParams.set('quality', '100'); + uri.searchParams.delete('w'); + return uri.href; + })); + } catch (error) { + reject(error); + } + }, + 500); + }); + `; + const pages = await Engine.Request.fetchUI(request, script); + return pages.map(page => page.replace(/\/i\d+\.wp\.com/, '')); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/InfernalVoidScans.mjs b/src/web/mjs/connectors/InfernalVoidScans.mjs index 5d4b589ae5..c6c75d1867 100644 --- a/src/web/mjs/connectors/InfernalVoidScans.mjs +++ b/src/web/mjs/connectors/InfernalVoidScans.mjs @@ -9,5 +9,6 @@ export default class InfernalVoidScans extends WordPressMangastream { this.tags = [ 'webtoon', 'scanlation', 'english' ]; this.url = 'https://void-scans.com'; this.path = '/manga/list-mode/'; + this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/KomikAV.mjs b/src/web/mjs/connectors/KomikAV.mjs index aff1e8a4fe..0d5c2b6b6e 100644 --- a/src/web/mjs/connectors/KomikAV.mjs +++ b/src/web/mjs/connectors/KomikAV.mjs @@ -5,9 +5,9 @@ export default class KomikAV extends WordPressMangastream { constructor() { super(); super.id = 'komikav'; - super.label = 'KomikAV'; + super.label = 'APKomik'; this.tags = [ 'manga', 'indonesian' ]; - this.url = 'https://komikav.com'; + this.url = 'https://apkomik.cc'; this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/KomikNesia.mjs b/src/web/mjs/connectors/KomikNesia.mjs index 7a490a1462..84c7c2e7e5 100644 --- a/src/web/mjs/connectors/KomikNesia.mjs +++ b/src/web/mjs/connectors/KomikNesia.mjs @@ -7,12 +7,7 @@ export default class KomikNesia extends WordPressMangastream { super.id = 'komiknesia'; super.label = 'KomikNesia'; this.tags = [ 'manga', 'webtoon', 'indonesian' ]; - this.url = 'https://komiknesia.com'; - this.path = '/latest-update/?list'; - - this.queryMangas = 'div.listttl ul li a'; - this.queryChapters = 'div#chapter_list span.eps a'; - this.queryChaptersTitle = undefined; - this.queryPages = 'div.reader-area img[src]:not([src=""])'; + this.url = 'https://komiknesia.xyz'; + this.path = '/manga/list-mode'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/LezhinEN.mjs b/src/web/mjs/connectors/LezhinEN.mjs index 447ca28bb3..54dd39a4ab 100644 --- a/src/web/mjs/connectors/LezhinEN.mjs +++ b/src/web/mjs/connectors/LezhinEN.mjs @@ -12,7 +12,7 @@ export default class LezhinEN extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=en_US' ); - this.requestOptions.headers.set( 'x-lz-locale', 'en_US' ); + this.requestOptions.headers.set( 'x-lz-locale', 'en-US' ); this.locale = 'en-US'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LezhinJA.mjs b/src/web/mjs/connectors/LezhinJA.mjs index dd7cdb383d..fc475552e2 100644 --- a/src/web/mjs/connectors/LezhinJA.mjs +++ b/src/web/mjs/connectors/LezhinJA.mjs @@ -12,7 +12,7 @@ export default class LezhinJA extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=ja_JP' ); - this.requestOptions.headers.set( 'x-lz-locale', 'ja_JP' ); + this.requestOptions.headers.set( 'x-lz-locale', 'ja-JP' ); this.locale = 'ja-JP'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LezhinKO.mjs b/src/web/mjs/connectors/LezhinKO.mjs index bc4d89953d..253cf1fb68 100644 --- a/src/web/mjs/connectors/LezhinKO.mjs +++ b/src/web/mjs/connectors/LezhinKO.mjs @@ -12,7 +12,7 @@ export default class LezhinKO extends Lezhin { login: this.url + '/login#email' }; this.requestOptions.headers.set( 'x-cookie', 'x-lz-locale=ko_KR' ); - this.requestOptions.headers.set( 'x-lz-locale', 'ko_KR' ); + this.requestOptions.headers.set( 'x-lz-locale', 'ko-KR' ); this.locale = 'ko-KR'; } } \ No newline at end of file diff --git a/src/web/mjs/connectors/LoveHug.mjs b/src/web/mjs/connectors/LoveHug.mjs index f3c29857d9..bf099462b8 100644 --- a/src/web/mjs/connectors/LoveHug.mjs +++ b/src/web/mjs/connectors/LoveHug.mjs @@ -72,22 +72,10 @@ export default class WeLoveManga extends FlatManga { 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(element => { - const link = [ ...element.attributes] - .filter(attribute => !['src', 'class', 'alt'].includes(attribute.name)) - .map(attribute => { - try { - return atob(attribute.value.trim()); - } catch(_) { - return attribute.value.trim(); - } - }) - .find(value => { - return /^http/.test(value); - }); - return this.createConnectorURI(this.getAbsolutePath(link || element, request.url)); - }); + let request = new Request(uri, this.requestOptions); + const chapterid = (await this.fetchDOM(request, 'input#chapter'))[0].value; + request = new Request(new URL(`/app/manga/controllers/cont.listImg.php?cid=${chapterid}`, this.url), this.requestOptions); + const nodes = await this.fetchDOM(request, 'source.chapter-img:not([alt*="nicoscan"])'); + return nodes.map(image => this.createConnectorURI(image.dataset.original.replace(/\n/g, ''))); } } diff --git a/src/web/mjs/connectors/Luscious.mjs b/src/web/mjs/connectors/Luscious.mjs index 5545f22346..84f9a6a309 100644 --- a/src/web/mjs/connectors/Luscious.mjs +++ b/src/web/mjs/connectors/Luscious.mjs @@ -9,15 +9,14 @@ export default class Luscious extends Connector { super.label = 'Luscious'; this.tags = [ 'hentai', 'multi-lingual' ]; this.url = 'https://www.luscious.net'; - this.apiURL = 'https://api.luscious.net/graphql/nobatch/'; + this.apiURL = 'https://apicdn.luscious.net/graphql/nobatch/'; } async _getMangaFromURI(uri) { - let request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'head title'); - let id = uri.pathname; - let title = data[0].textContent.split('|')[0].trim() + ` [${data[0].lang}]`; - return new Manga(this, id, title); + const id = uri.pathname.match(/_(\d+)\/?$/)[1]; + const request = new Request(uri); + const name = (await this.fetchDOM(request, 'main h1.album-heading')).pop().textContent.trim(); + return new Manga(this, id, name); } async _getMangas() { @@ -30,18 +29,49 @@ export default class Luscious extends Connector { } async _getMangasFromPage(page) { - let gql = `{ - album { - list(input: { display: date_newest, page: ${page} }) { - items { url, title } + const url = new URL(this.apiURL); + url.searchParams.set('operationName', 'AlbumList'); + const query = ` + query AlbumList($input: AlbumListInput!) { + album { + list(input: $input) { + items { + id + title + slug + language { + id + title + url + } + } + } } } - }`; - let data = await this.fetchGraphQL(this.apiURL, undefined, gql, undefined); - return data.album.list.items.map(item => { + `; + url.searchParams.set('query', query); + const variables = { + input: { + display: 'date_trending', + filters: [{ name: 'album_type', value: 'manga' }, { name: 'restrict_genres', value: 'loose' }], + page: page, + items_per_page: 30//dont change items_per_page to more than 30 + } + }; + + url.searchParams.set('variables', JSON.stringify(variables)); + const request = new Request(url, { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json', + }, + }); + + const data = await this.fetchJSON(request); + return data.data.album.list.items.map(manga => { return { - id: this.getRootRelativeOrAbsoluteLink(item.url, this.url), - title: item.title.trim() + id: manga.id, + title: manga.title.trim() }; }); } @@ -55,36 +85,50 @@ export default class Luscious extends Connector { } async _getPages(chapter) { + const pagelist = []; + for (let page = 1, run = true; run; page++) { + const pagesResults = await this._getPagesFromChapterPage(page, chapter); + if (pagesResults.data.picture.list.items.length > 0) { + pagesResults.data.picture.list.items.forEach(element => pagelist.push(element.url_to_original)); + } + run = pagesResults.data.picture.list.info.has_next_page; + } + return pagelist; + } + + async _getPagesFromChapterPage(page, chapter) { + const url = new URL(this.apiURL); + url.searchParams.set('operationName', 'AlbumListOwnPictures'); const query = ` - query AlbumListOwnPictures($input: PictureListInput!) { - picture { + query AlbumListOwnPictures($input: PictureListInput!) { + picture { list(input: $input) { - items { - url_to_original - } + info { + has_next_page + } + items { + url_to_original + } } + } } - } `; + url.searchParams.set('query', query); const variables = { input: { - filters: [ - { - name: 'album_id', - value: chapter.id.match(/_(\d+)\/?$/)[1] - } - ], - display : 'date_newest', - page: 0 + filters: [{ name: 'album_id', value: chapter.id }], + display: 'position', + items_per_page: 50, //dont change items_per_page to more than 50 + page: page } }; - let pageList = []; - for(let page = 1, run = true; run; page++) { - variables.input.page = page; - const data = await this.fetchGraphQL(this.apiURL, 'AlbumListOwnPictures', query, variables); - const pages = data.picture.list.items.map(item => item.url_to_original); - pages.length > 0 ? pageList.push(...pages) : run = false; - } - return pageList; + url.searchParams.set('variables', JSON.stringify(variables)); + const request = new Request(url, { + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json', + }, + }); + return this.fetchJSON(request); } } diff --git a/src/web/mjs/connectors/LxHentai.mjs b/src/web/mjs/connectors/LxHentai.mjs index a51937b102..21cd3abf48 100644 --- a/src/web/mjs/connectors/LxHentai.mjs +++ b/src/web/mjs/connectors/LxHentai.mjs @@ -7,7 +7,7 @@ export default class LxHentai extends MojoPortalComic { super.id = 'lxhentai'; super.label = 'LXHENTAI'; this.tags = [ 'manga', 'hentai', 'vietnamese' ]; - this.url = 'https://lxmanga.net'; + this.url = 'https://lxmanga.cc'; this.queryMangaTitle = 'head title'; this.queryChapter = 'div.justify-between ul.overflow-y-auto a'; diff --git a/src/web/mjs/connectors/LyraScans.mjs b/src/web/mjs/connectors/LyraScans.mjs index cabac34399..a22d1f8d9f 100644 --- a/src/web/mjs/connectors/LyraScans.mjs +++ b/src/web/mjs/connectors/LyraScans.mjs @@ -5,9 +5,9 @@ export default class LyraScans extends WordPressMangastream { constructor() { super(); super.id = 'lyrascans'; - super.label = 'Lyra Scans'; + super.label = 'Quantum Scans'; this.tags = [ 'manga', 'english', 'scanlation' ]; - this.url = 'https://lyrascans.com'; - this.path = '/manga/list-mode/'; + this.url = 'https://readers-point.space'; + this.path = '/series/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MagKan.mjs b/src/web/mjs/connectors/MagKan.mjs index f4a26fc0f1..1dd16884c5 100644 --- a/src/web/mjs/connectors/MagKan.mjs +++ b/src/web/mjs/connectors/MagKan.mjs @@ -1,59 +1,12 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; +import YoungChampion from './YoungChampion.mjs'; -export default class MagKan extends Connector { +export default class MagKan extends YoungChampion { constructor() { super(); super.id = 'magkan'; super.label = 'MagKan'; this.tags = [ 'manga', 'japanese' ]; - this.url = 'http://kansai.mag-garden.co.jp'; + this.url = 'https://kansai.mag-garden.co.jp'; } - - 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() { - const uri = new URL(this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div#main div.panel div.box div.inner'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.querySelector('a'), this.url), - title: element.querySelector('h2.comic_name').textContent.trim() - }; - }); - } - - async _getChapters(manga) { - const uri = new URL(manga.id, this.url); - const request = new Request(uri, this.requestOptions); - const body = await this.fetchDOM(request); - const current = [...body.querySelectorAll('div#main div.update_summary div.exp ul.btn li a[href*="/assets/files/"]')].map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url).replace(/\/HTML5\/?$/i, ''), - title: element.text.replace('を読む', '').trim() - }; - }); - const previous = [...body.querySelectorAll('div#main div.sam_exp div.exp')].map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element.querySelector('ul.btn li a[href*="/assets/files/"]'), this.url).replace(/\/HTML5\/?$/i, ''), - title: element.querySelector('div.back_number_summary div.ttl').textContent.trim() - }; - }); - return [ ...current, ...previous ]; - } - - async _getPages(chapter) { - const uri = new URL(chapter.id + '/iPhone/ibook.xml', this.url); - const request = new Request(uri, this.requestOptions); - const response = await fetch(request); - const data = await response.text(); - const pages = parseInt(data.match(/(\d+)<\/total>/)[1]); - return new Array(pages).fill().map((_, index) => this.getAbsolutePath(`${chapter.id}/books/images/2/${index + 1}.jpg`, request.url)); - } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ManHuaGui.mjs b/src/web/mjs/connectors/ManHuaGui.mjs index acf67d310b..0e837313b6 100644 --- a/src/web/mjs/connectors/ManHuaGui.mjs +++ b/src/web/mjs/connectors/ManHuaGui.mjs @@ -27,8 +27,8 @@ export default class ManHuaGui extends SinMH { this.queryPagesScript =` new Promise(resolve => { ${this.api}.imgData = function(data) { - let origin = 'https://' + servs[pVars.curServ].hosts[pVars.curHost].h + '.hamreus.com'; - let pageLinks = data.files.map(file => origin + data.path + file + '?cid=' + data.cid + '&md5=' + data.sl.md5); + let origin = pVars.manga.filePath; + let pageLinks = data.files.map(file => origin + file + '?e=' + data.sl.e + '&m=' + data.sl.m); return { preInit: () => resolve(pageLinks) }; diff --git a/src/web/mjs/connectors/MangaBat.mjs b/src/web/mjs/connectors/MangaBat.mjs index 9d195f8dd8..5a421b9c67 100644 --- a/src/web/mjs/connectors/MangaBat.mjs +++ b/src/web/mjs/connectors/MangaBat.mjs @@ -7,7 +7,7 @@ export default class MangaBat extends MangaNel { super.id = 'mangabat'; super.label = 'MangaBat'; this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://m.mangabat.com'; + this.url = 'https://h.mangabat.com'; this.path = '/manga-list-all/'; this.queryMangas = 'div.panel-list-story div.list-story-item h3 a.item-title'; @@ -16,6 +16,6 @@ export default class MangaBat extends MangaNel { canHandleURI(uri) { // Test: https://regex101.com/r/GlzAw2/2/tests - return /^(m\.|read\.)?mangabat\.com$/.test(uri.hostname); + return /^(m\.|read\.|h\.)?mangabat\.com$/.test(uri.hostname); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaDex.mjs b/src/web/mjs/connectors/MangaDex.mjs index df3cc538e8..ba13e5be18 100644 --- a/src/web/mjs/connectors/MangaDex.mjs +++ b/src/web/mjs/connectors/MangaDex.mjs @@ -69,98 +69,14 @@ export default class MangaDex extends Connector { } async _getMangas() { - const mangaList = []; - const limit = 100; - let lastCreatedAt = '2000-01-01T00:00:00'; - let throttle = Promise.resolve(); - - while(lastCreatedAt) { - await throttle; - throttle = new Promise(resolve => setTimeout(resolve, this.config.throttleRequests.value)); - - const uri = new URL('/manga', this.api); - uri.searchParams.set('limit', `${limit}`); - uri.searchParams.set('order[createdAt]', 'asc'); - uri.searchParams.set('createdAtSince', lastCreatedAt); - uri.searchParams.append('contentRating[]', 'safe'); - uri.searchParams.append('contentRating[]', 'suggestive'); - uri.searchParams.append('contentRating[]', 'erotica'); - uri.searchParams.append('contentRating[]', 'pornographic'); - - const request = new Request(uri, { - headers: { - 'Referer': this.url, - }}); - const { data } = await this.fetchJSON(request); - - lastCreatedAt = data.length === limit ? data.pop().attributes.createdAt.split('+').shift() : null; - if(data.length) { - const mangas = data.map(manga => { - const title = manga.attributes.title.en || Object.values(manga.attributes.title).shift(); - return { - id : manga.id, - title : title, - }; - }); - mangaList.push(...mangas); - } - } - - return mangaList; - } - - /* - async _getMangas() { - - let mangaList = []; - let first10k = await this._getMangasFromPages(0, 99); - mangaList = [...mangaList, ...first10k.data]; - let nextAt = first10k.nextAt; - - for (let i = 1; i <= first10k.total / 10000; i += 1) { - let first100of10k = await this._getMangasFromPages(0, 0, nextAt); - mangaList = [...mangaList, ...first100of10k.data.slice(1)]; - let pages = Math.min(Math.floor(first100of10k.total / 100), 99); - if (pages > 0) { - let data = await this._getMangasFromPages(1, pages, nextAt); - mangaList = [...mangaList, ...data.data]; - nextAt = data.nextAt; - } - } - return mangaList.map(ele => { + return (await this.fetchJSON('https://websites.hakuneko.download/mangadex.json')).map(manga => { return { - id: ele.id, - title: (ele.attributes.title.en || Object.values(ele.attributes.title).shift()).trim() + id: manga.id, + title: manga.title, }; }); - } - async _getMangasFromPages(start, pages, nextAt) { - let tmp = []; - let data100; - for (let page = start; page <= pages; page += 1) { - const uri = new URL('/manga', this.api); - uri.searchParams.set('limit', 100); - uri.searchParams.set('offset', 100 * page); - uri.searchParams.set('order[createdAt]', 'asc'); - uri.searchParams.append('contentRating[]', 'safe'); - uri.searchParams.append('contentRating[]', 'suggestive'); - uri.searchParams.append('contentRating[]', 'erotica'); - uri.searchParams.append('contentRating[]', 'pornographic'); - if (nextAt) uri.searchParams.set('createdAtSince', nextAt); - const request = new Request(uri, this.requestOptions); - data100 = await this.fetchJSON(request, 3); - await this.wait(this.config.throttleRequests.value); - tmp = [...tmp, ...data100.data]; - } - return { - data: tmp, - nextAt: data100.data.pop().attributes.createdAt.replace('+00:00', ''), - total: data100.total - }; - } -*/ async _getChapters(manga) { let chapterList = []; for(let page = 0, run = true; run; page++) { diff --git a/src/web/mjs/connectors/MangaDig.mjs b/src/web/mjs/connectors/MangaDig.mjs index 1ee4d5d79f..bfad131d58 100644 --- a/src/web/mjs/connectors/MangaDig.mjs +++ b/src/web/mjs/connectors/MangaDig.mjs @@ -1,91 +1,4 @@ /* eslint-disable */ import ZYMK from './templates/ZYMK.mjs'; -class MangaDig extends ZYMK { - - constructor() { - super(); - super.id = 'mangadig'; - super.label = 'MangaDig'; - this.tags = [ 'webtoon', 'english', 'manga' ]; - this.url = 'https://mangadig.com'; - this.path = '/show?page='; - this.pathSuffix = ''; - this.queryMangas = 'ul.fed-list-info li.fed-list-item a.fed-list-title'; - this.queryMangasPageCount = 'div.fed-page-info a.fed-show-sm-inline'; - this.queryChapters = 'div.all_data_list ul li a'; - this.queryMangaTitle = 'dl.fed-deta-info dd.fed-deta-content h1.fed-part-eone'; - } - - async _getPages(chapter) { - const script = (() => { return require('electron').remote.BrowserWindow.getFocusedWindow().isDevToolsOpened() && require('electron').remote.BrowserWindow.getFocusedWindow().closeDevTools(), atob('KGZ1bmN0aW9uKF8weDUyNzU3YixfMHgyMWIzMjQpe2NvbnN0IF8weDNkOTEzZT1fMHg1YThhLF8weDM2OGQzMz1fMHg1Mjc1N2IoKTt3aGlsZSghIVtdKXt0cnl7Y29uc3QgXzB4M2Q2MzRkPXBhcnNlSW50KF8weDNkOTEzZSgweDEwYywnQVYpXicpKS8oLTB4MioweDk1YSsweGY2NSsweDM1MCkrcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTFmLCc1YypIJykpLygweDcwMCoweDUrLTB4YjY1Ky0weDE3OTkpKihwYXJzZUludChfMHgzZDkxM2UoMHgxNTEsJzVjKkgnKSkvKDB4YjRhKzB4MTJiKy0weDIxMyoweDYpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTQzLCdkZSNHJykpLygweDFjZTEqLTB4MSstMHg1ZistMHg0Ki0weDc1MSkqKC1wYXJzZUludChfMHgzZDkxM2UoMHgxMGUsJ0ZkVWcnKSkvKDB4NjUyKzB4MyotMHg3ZisweDcwKi0weGIpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4ZmUsJ05yeFknKSkvKDB4MSoweDFhZWUrLTB4M2QwKy0weDE3MTgpK3BhcnNlSW50KF8weDNkOTEzZSgweGZmLCdKc3d5JykpLygweDEqLTB4MjFlKy0weDE5OTcqLTB4MSstMHgyKjB4YmI5KSooLXBhcnNlSW50KF8weDNkOTEzZSgweGZiLCdKc3d5JykpLygtMHgxODk5Ky0weGEqLTB4MmYwKzB4MTk1Ki0weDMpKSstcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTMxLCdwMjA5JykpLygtMHgxZjcxKy0weDNjYiotMHgyKzB4MTdlNCkrcGFyc2VJbnQoXzB4M2Q5MTNlKDB4MTE1LCdtSiV5JykpLygweDJlNSstMHhhYioweDMrLTB4ZGEpO2lmKF8weDNkNjM0ZD09PV8weDIxYjMyNClicmVhaztlbHNlIF8weDM2OGQzM1sncHVzaCddKF8weDM2OGQzM1snc2hpZnQnXSgpKTt9Y2F0Y2goXzB4MTgzMjJlKXtfMHgzNjhkMzNbJ3B1c2gnXShfMHgzNjhkMzNbJ3NoaWZ0J10oKSk7fX19KF8weDVhZWIsLTB4MjlkNyotMHg1ZisweDE2YzA3Ky0weDZhNmFkKSk7ZnVuY3Rpb24gXzB4NWFlYigpe2NvbnN0IF8weDU1ZmRkMj1bJ3NXOFdXNVZkT0NrcmY4bzBtYScsJ1c3cGNITm1SVzUwJywnV1FaZFJJckJGYScsJ1dRTmRWTnVzYXEnLCdXNWxkSUc0VmZTb2x4U29EVzZLcGxDa2wnLCdXTzNkUDNEekZxJywnV08zZFVTa3ZXN0pkSVNvM0Ftb2dqQ296YThrdm84b0hXNmUnLCdXN0pjTEh5U21xJywnejhvTVc2ajJyOG85V1BUVycsJ2x4UmRKU29KV1JqSycsJ2g4a2NpdWlHJywnVzVOY0czSzBXNU8nLCdubW9vVzQzY0pHeGNVRycsJ2YyWmRNQ29QV1I0JywnVzVSZFZNMGtwcScsJ1c3eGNPTjBiVzdsZEd4OERXUjQ2VzR6YVdPcVFEdHhkSXEnLCdGU2src0xTZHZjTmNPOGt1V1A4RycsJ0RmckVlMk8nLCdXUjdkR1NrVFdQaGNKQ29aVzV4Y1ZxdlJXN0JkUzhvVnphJywnV1FtT1c2MHRkbW9PZFd0Y1RkdUlXUlcnLCdqMnJYVzZaZFJXJywnVzQ3Y1VZcGNKU2tTJywnV080Vlc0UzNXUTAnLCdXN2xjU1l1NGhKYScsJ1c0RmRHQ2t1anhEbldQRmNISVMnLCdFQ2tpVzVwY0pta1knLCdtcjNjTUwvY0hta2VDbW9Ca2VxZicsJ2JidTlzdFZkVXgzZExjZkZXN0dsJywnVzdkY1VaMCcsJ1dSN2NNMERZV1JTJywnZ21rZ2Vta0lXUGVJVzVMTldPL2NKMlJkSW1rUmhhJywnbTBCY1Zta2ZXNnBkR2EnLCdXUHhjUHNDWFc3cScsJ1dSbGRLQ2tpZXZ1JywnaXhLYVdRVmRWcScsJ294UmRNOG9iV1JIVlc1T3NFYScsJ1dRbGRWTksxVzczZE94dXknLCdXNFJjSlk4Z2FXJywnV1B4Y05nTFJ2OGtzRjhvRicsJ1dPaGNTWkdNVzZpJywnd21rbFc3dGNNU2tqJywnVzVTSXFtb0NXNnUnLCdpU29uVzdOZE1XJywnYlNrVmQ4a0JXUGEnLCdXNlgvclNveicsJ2hTa3RmbWtuV09DJywnV1FGY09KV0MnLCdwY0x4V1A1TicsJ1dSdGNKcTRYVzdXJywnVzROY1JjQzZocScsJ3NHOFhXUkpkUVNrYW5Tb3RnTjAnLCdod3JGRjhraicsJ29Db0RXN20nLCdXNFpjT0NvQldRdGNKU2taZFNrb3lta3hzQ29KJywnd0NrUWZHR1RXN0NpV09XJywnd1Nrclc0TmNWOGtMJywnVzdSY1VLODFhcUZjSmc0Jywnc1NrR210OFdXN2VuV09pdFc3WG56WmI3JywnRW1rQXJ2R3InLCdXUmxjU2RHM1c1UycsJ1c1ZGNHMXFsVzd5JywnRWJkZFFTb2dXUnhkSGRWY1BTa0F0Q29lJywnb1NrSFc2dnR0bW85V1IxR244b1FGeEdBQXFpJywnbWdMRnRta1huR05jVGEnLCdXN0JjUEdSY1VDay8nLCdydmIwYWh4Y09XJywnRkNra1c0N2NLOGt6JywnY3ZkY1E4a3BXNjgnLCdXUnVWVzZ5eldRZScsJ1dQbGRKOGtzVzdsZFZXJywnRFNrQlc2ZGNPYnhjUEs3ZE1XJywnaXJGY0x2N2NLOGtFJywnVzVwZElHNE9lOG9sajhraVc0Q1dibWt4V09sZE1HJywnQ1p1K2RDbzFBTC9jUUNrR2FDb2dvZTQnLCdEQ2t6V1AvZEtMTmRSWGRkUVNrM2gzalR0cScsJ2hDa2Vjd2kzJywneDNYM3B1RycsJ1c1VmNJd1NmVzVHJywndEdXV1dSVmNJU28wc1Nrc2swRmRLQ2tmd21rUCcsJ25nRFJ4Q2tRb1cnLCdqU294VzVOZEhaVmNLd2ExJywnV1JubFc1aGRJMEMnLCdXNm1mQzhvdVc0VycsJ29MaGRKU29OV1JTJywnV1B0ZE5keGRNWlMnLCdXNFpkTHY4Qm5hJywnaThva1c1N2NSVzNjUUtOZE5Da1NwZTFQJywnVzZUTFdSTHBXNVcyV1BlS1dSYUdXUUtWJywnV1F0Y1NJNGdXN3hjR3EnLCdBU2tsV1IzY0dOWmNMZzBDVzdSY0xNaScsJ1c0WmNLSDhmYmY0JywnVzV0Y1ZZN2NTU2tUJywnV09PeVc0R3FuYScsJ1dRcGNVYldhVzZ0Y0doYXAnLCdqQ2szV1FaZFZIcXpkbWtPdG1rRHZkTmNLYScsJ3VOaVpXUDVvVzY0QWZnNCcsJ1c0eGRLcXU5VzZsY09iZGNRWFJkVnJGZEdta3BXNTgnLCdXUGRjSnV2QVdSM2RTM3BkUXNlJywnaENrQ1dQSmRJZVMnLCdXNmRkUzFlTWhTa2snLCdXUVpkVThrRGNNQycsJ1dReGRSWHZReUtxOVdPZGRPbWszVzQzY0tTbzlXUTRGVzRhMicsJ2hta1pXNHhjUWRGY1JyZlJ3Q29OJywnVzZHa0FTb1VXNU8nLCdCbWttZVl1QycsJ1c2QmRPeFBuV1FwZE1jeXBwTXVLV1JmSSddO18weDVhZWI9ZnVuY3Rpb24oKXtyZXR1cm4gXzB4NTVmZGQyO307cmV0dXJuIF8weDVhZWIoKTt9Y29uc3QgXzB4NGIzODA2PShmdW5jdGlvbigpe2NvbnN0IF8weDI0ODMwZD1fMHg1YThhLF8weDQ3MGM1Mz17J1hpS3R6JzpfMHgyNDgzMGQoMHgxM2EsJ3YwcFEnKSwnVnNGSEInOmZ1bmN0aW9uKF8weDFiZjhmMyxfMHg0MjdhOTEpe3JldHVybiBfMHgxYmY4ZjMrXzB4NDI3YTkxO30sJ3ZFZmtGJzpmdW5jdGlvbihfMHg1OTc0NWUsXzB4MTNkZjE5KXtyZXR1cm4gXzB4NTk3NDVlKF8weDEzZGYxOSk7fSwnaXNmWWInOmZ1bmN0aW9uKF8weDExOGRiYSxfMHgzZTNlYzMpe3JldHVybiBfMHgxMThkYmE8PV8weDNlM2VjMzt9LCdNSlNNUyc6XzB4MjQ4MzBkKDB4MTJlLCdkZSNHJyksJ2NIUnNKJzpmdW5jdGlvbihfMHg0MmZjMGYsXzB4MzdkMjAxKXtyZXR1cm4gXzB4NDJmYzBmPT09XzB4MzdkMjAxO30sJ2pkUlNaJzpfMHgyNDgzMGQoMHgxNGYsJ2F5dlEnKSwnZlVQQ3InOl8weDI0ODMwZCgweDEyMSwnKiNAMycpLCdYWXdjVCc6ZnVuY3Rpb24oXzB4MjlmNTFlLF8weGY3ODFlYSl7cmV0dXJuIF8weDI5ZjUxZSE9PV8weGY3ODFlYTt9LCdKQnNLaCc6XzB4MjQ4MzBkKDB4MTRlLCdANTFrJyksJ05VUUdZJzpfMHgyNDgzMGQoMHgxNjEsJ0ckRTQnKSwnVmR3UnQnOl8weDI0ODMwZCgweGZhLCcpcDYjJyl9O2xldCBfMHgzZTNjOWU9ISFbXTtyZXR1cm4gZnVuY3Rpb24oXzB4MWY2NTNmLF8weDQ0NzE4OSl7Y29uc3QgXzB4YjBiMzNmPV8weDI0ODMwZCxfMHgzOGM2ZWM9eydZYlNHSic6XzB4NDcwYzUzW18weGIwYjMzZigweDEzMCwndjBwUScpXSwndE5HSGgnOmZ1bmN0aW9uKF8weDU3NjIzMixfMHg1Yzk2ODYpe2NvbnN0IF8weDFiMTk4Mz1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHgxYjE5ODMoMHgxMzUsJ0FWKV4nKV0oXzB4NTc2MjMyLF8weDVjOTY4Nik7fSwnRklMaW8nOmZ1bmN0aW9uKF8weDNkNzg4MSxfMHgyNTE5NzMpe2NvbnN0IF8weDU0NjUwYT1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHg1NDY1MGEoMHgxNDgsJ2M4N2MnKV0oXzB4M2Q3ODgxLF8weDI1MTk3Myk7fSwnTUNzZ0EnOmZ1bmN0aW9uKF8weDM3ZTdiYyxfMHgxMjAxMjEpe2NvbnN0IF8weDUwOTdmMj1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHg1MDk3ZjIoMHgxMTAsJ3dtMmsnKV0oXzB4MzdlN2JjLF8weDEyMDEyMSk7fSwnZWd3Q00nOl8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMDYsJ2tMSlInKV0sJ21za2ZOJzpmdW5jdGlvbihfMHgxYzgyNWEsXzB4ZTgzNTQ5KXtjb25zdCBfMHg0YjQ5MzY9XzB4YjBiMzNmO3JldHVybiBfMHg0NzBjNTNbXzB4NGI0OTM2KDB4MTE3LCdIRFhoJyldKF8weDFjODI1YSxfMHhlODM1NDkpO30sJ2VLYXBmJzpfMHg0NzBjNTNbXzB4YjBiMzNmKDB4MTQwLCdaRzZPJyldLCdlTGtJRCc6XzB4NDcwYzUzW18weGIwYjMzZigweDEwMCwnYmFNYicpXSwnRW1MWXknOmZ1bmN0aW9uKF8weDFhZGY4NCxfMHgzMTliOGIpe2NvbnN0IF8weDI4NGJlZT1fMHhiMGIzM2Y7cmV0dXJuIF8weDQ3MGM1M1tfMHgyODRiZWUoMHgxMzMsJzVjKkgnKV0oXzB4MWFkZjg0LF8weDMxOWI4Yik7fSwnT0lhVkMnOl8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMjQsJ0s4dTYnKV19O2lmKF8weDQ3MGM1M1tfMHhiMGIzM2YoMHgxMjYsJ15JNVAnKV0oXzB4NDcwYzUzW18weGIwYjMzZigweDExMSwnUkNOZScpXSxfMHg0NzBjNTNbXzB4YjBiMzNmKDB4MTQ2LCdheXZRJyldKSlyZXR1cm4gXzB4MTgyZjIwW18weGIwYjMzZigweDExMiwnYXl2UScpXSgpW18weGIwYjMzZigweDEwZCwnYXl2UScpXShfMHgzOGM2ZWNbXzB4YjBiMzNmKDB4MTUyLCdOcnhZJyldKVtfMHhiMGIzM2YoMHgxNDUsJ0pbY1QnKV0oKVtfMHhiMGIzM2YoMHgxMzksJ01vOFonKV0oXzB4NTBmNjBkKVtfMHhiMGIzM2YoMHhmYywnTW84WicpXShfMHgzOGM2ZWNbXzB4YjBiMzNmKDB4MTJkLCcyZyhBJyldKTtlbHNle2NvbnN0IF8weDExNDA0OT1fMHgzZTNjOWU/ZnVuY3Rpb24oKXtjb25zdCBfMHhlNmRiMTY9XzB4YjBiMzNmLF8weDQ1MThhMT17J2ROYXZqJzpmdW5jdGlvbihfMHg0NDBiN2UsXzB4YmE1NzEyKXtjb25zdCBfMHgxMjVlZjY9XzB4NWE4YTtyZXR1cm4gXzB4MzhjNmVjW18weDEyNWVmNigweDExOSwnWkc2TycpXShfMHg0NDBiN2UsXzB4YmE1NzEyKTt9LCd5TGt6bic6ZnVuY3Rpb24oXzB4MzFlODk3LF8weDI1ZGIzMCl7Y29uc3QgXzB4NmI3NDkxPV8weDVhOGE7cmV0dXJuIF8weDM4YzZlY1tfMHg2Yjc0OTEoMHgxNWIsJ2RlI0cnKV0oXzB4MzFlODk3LF8weDI1ZGIzMCk7fSwnRFNxTEMnOmZ1bmN0aW9uKF8weDFkNTIyMixfMHgyZDM1NzYpe2NvbnN0IF8weDRmYmEzZT1fMHg1YThhO3JldHVybiBfMHgzOGM2ZWNbXzB4NGZiYTNlKDB4MTAyLCdkZSNHJyldKF8weDFkNTIyMixfMHgyZDM1NzYpO30sJ0FJVllDJzpfMHgzOGM2ZWNbXzB4ZTZkYjE2KDB4MTVhLCdheXZRJyldLCdzd2tlYyc6ZnVuY3Rpb24oXzB4MzA2MzU3LF8weDExYTZkNil7Y29uc3QgXzB4ZWQzYWU9XzB4ZTZkYjE2O3JldHVybiBfMHgzOGM2ZWNbXzB4ZWQzYWUoMHgxNTYsJ0ckRTQnKV0oXzB4MzA2MzU3LF8weDExYTZkNik7fX07aWYoXzB4MzhjNmVjW18weGU2ZGIxNigweGY5LCdBVileJyldKF8weDM4YzZlY1tfMHhlNmRiMTYoMHgxNTksJ04qVWYnKV0sXzB4MzhjNmVjW18weGU2ZGIxNigweDEyMCwnZGUjRycpXSkpe2NvbnN0IF8weDU0YWJkMj1fMHgyYzIxZGRbXzB4ZTZkYjE2KDB4MTIyLCdSN3JYJyldKF8weDUwMTA1OSxhcmd1bWVudHMpO3JldHVybiBfMHg1MDFmZWM9bnVsbCxfMHg1NGFiZDI7fWVsc2V7aWYoXzB4NDQ3MTg5KXtpZihfMHgzOGM2ZWNbXzB4ZTZkYjE2KDB4MTFjLCdjODdjJyldKF8weDM4YzZlY1tfMHhlNmRiMTYoMHgxMmEsJ2RlI0cnKV0sXzB4MzhjNmVjW18weGU2ZGIxNigweDEwYSwnMmcoQScpXSkpe2xldCBfMHgyZjhjYWM9JycsXzB4MjE4ODEzPV8weDQ1MThhMVtfMHhlNmRiMTYoMHgxMDgsJ0c2VSknKV0oXzB4MmQ4ODI1W18weGU2ZGIxNigweDE1OCwnRXlCWycpXSgpWzB4MWM3KjB4MSstMHgxYmE4KzB4MTllMioweDFdLF8weDIwMjU5MltfMHhlNmRiMTYoMHgxMmIsJ0pzd3knKV1bXzB4ZTZkYjE2KDB4MTA1LCdGZFVnJyldKCkpO18weDJmOGNhYz1fMHg1OTJkNmJbXzB4ZTZkYjE2KDB4MTE4LCcyZyhBJyldKF8weDIxODgxMyksXzB4MmY4Y2FjPV8weDQ1MThhMVtfMHhlNmRiMTYoMHgxNGEsJ2YwYzknKV0oXzB4NDY1YTIxLF8weDJmOGNhYyk7bGV0IF8weDMwOWVjNj1bXTtmb3IobGV0IF8weDMxZDkyMD0tMHgxN2I5KzB4ODU0KjB4MSstMHgxMiotMHhkYjtfMHg0NTE4YTFbXzB4ZTZkYjE2KDB4MTQ3LCdHJEU0JyldKF8weDMxZDkyMCxfMHgyZjhjYWMpO18weDMxZDkyMCsrKXtfMHgzMDllYzZbXzB4ZTZkYjE2KDB4MTRkLCdheXZRJyldKF8weDFlYzczNFtfMHhlNmRiMTYoMHgxMTYsJ21KJXknKV0oXzB4MzFkOTIwKSk7fV8weDE2OTdlZltfMHhlNmRiMTYoMHgxNWQsJ0hpWzMnKV09XzB4NDUxOGExW18weGU2ZGIxNigweDExZCwnRXlCWycpXTtsZXQgXzB4NTljNTgyPV8weDUwZTJkZFtfMHhlNmRiMTYoMHgxMzIsJ1JDTmUnKV0oKTtjb25zdCBfMHgzMTg4Mjc9e307XzB4MzE4ODI3W18weGU2ZGIxNigweDEzNiwnXkk1UCcpXT1fMHgzMDllYzYsXzB4MzE4ODI3W18weGU2ZGIxNigweDEzYiwnXkk1UCcpXT1fMHg1OWM1ODIsXzB4NDUxOGExW18weGU2ZGIxNigweDEzNCwnd20yaycpXShfMHhhNTNiNWUsXzB4MzE4ODI3KTt9ZWxzZXtjb25zdCBfMHgzYzdlNGY9XzB4NDQ3MTg5W18weGU2ZGIxNigweDE0YywnZjBjOScpXShfMHgxZjY1M2YsYXJndW1lbnRzKTtyZXR1cm4gXzB4NDQ3MTg5PW51bGwsXzB4M2M3ZTRmO319fX06ZnVuY3Rpb24oKXt9O3JldHVybiBfMHgzZTNjOWU9IVtdLF8weDExNDA0OTt9fTt9KCkpLF8weDJlMWFjMz1fMHg0YjM4MDYodGhpcyxmdW5jdGlvbigpe2NvbnN0IF8weDU2ZDZlMT1fMHg1YThhLF8weDNlNDIxYT17fTtfMHgzZTQyMWFbXzB4NTZkNmUxKDB4MTYyLCdyQlheJyldPV8weDU2ZDZlMSgweDE1NCwnKXA2IycpO2NvbnN0IF8weDI0NWNkYz1fMHgzZTQyMWE7cmV0dXJuIF8weDJlMWFjM1tfMHg1NmQ2ZTEoMHgxNTUsJ0V5QlsnKV0oKVtfMHg1NmQ2ZTEoMHgxMjgsJ0c2VSknKV0oXzB4MjQ1Y2RjW18weDU2ZDZlMSgweDEzYywnbUoleScpXSlbXzB4NTZkNmUxKDB4MTVlLCdOcnhZJyldKClbXzB4NTZkNmUxKDB4MTJmLCdOKlVmJyldKF8weDJlMWFjMylbXzB4NTZkNmUxKDB4MTNlLCdyQlheJyldKF8weDI0NWNkY1tfMHg1NmQ2ZTEoMHgxMmMsJ0c2VSknKV0pO30pO2Z1bmN0aW9uIF8weDVhOGEoXzB4MzQzNjYxLF8weDIxOTQ1MCl7Y29uc3QgXzB4Yjg1ZWZlPV8weDVhZWIoKTtyZXR1cm4gXzB4NWE4YT1mdW5jdGlvbihfMHgzMDgyODUsXzB4NDJlYWY1KXtfMHgzMDgyODU9XzB4MzA4Mjg1LSgtMHgxKi0weDE2ZjkrMHgyMTQqMHgyKy0weDhiOCoweDMpO2xldCBfMHg3YTI2ZjU9XzB4Yjg1ZWZlW18weDMwODI4NV07aWYoXzB4NWE4YVsnTm5xZGtBJ109PT11bmRlZmluZWQpe3ZhciBfMHg4ZGExYjg9ZnVuY3Rpb24oXzB4NWE0NzA4KXtjb25zdCBfMHhkNjcyNjA9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Ky89JztsZXQgXzB4NWNkYmMwPScnLF8weDE4OTMxZj0nJyxfMHg1YTUxMWI9XzB4NWNkYmMwK18weDhkYTFiODtmb3IobGV0IF8weDE2NzI4NT0tMHgzMDgqLTB4MSstMHg5NWMrMHg2YyoweGYsXzB4MjFmOWRiLF8weDE0MTBlMCxfMHhhMTcyY2Y9LTB4NzkrLTB4Mzc1KjB4MysweGFkODtfMHgxNDEwZTA9XzB4NWE0NzA4WydjaGFyQXQnXShfMHhhMTcyY2YrKyk7fl8weDE0MTBlMCYmKF8weDIxZjlkYj1fMHgxNjcyODUlKC0weDU3KjB4MjcrMHgxMDk1Ky0weDM1MCk/XzB4MjFmOWRiKigtMHgzZDEqMHg1Ky0weDI2KjB4NysweDE0NWYpK18weDE0MTBlMDpfMHgxNDEwZTAsXzB4MTY3Mjg1KyslKDB4MTZmNCstMHgyZWMqMHg3Ky0weDI3YykpP18weDVjZGJjMCs9XzB4NWE1MTFiWydjaGFyQ29kZUF0J10oXzB4YTE3MmNmKygweDEqLTB4MTY1KzB4MjE5NysweDEyNiotMHgxYykpLSgweDFjNjkrMHgyMzMqLTB4MisweDE2OSotMHgxMSkhPT0weDQqLTB4MTNmKzB4YSotMHgxZWQrMHgxODNlP1N0cmluZ1snZnJvbUNoYXJDb2RlJ10oMHgzZDUqMHg5KzB4MjFhKy0weDIzOTgmXzB4MjFmOWRiPj4oLSgweDIxZmUrMHgxMjkyKy0weDc4MioweDcpKl8weDE2NzI4NSYweGQ0KjB4MSstMHhkZGIrMHhkMGQqMHgxKSk6XzB4MTY3Mjg1OjB4MjE4KzB4YjgzKjB4MSstMHhkOWIpe18weDE0MTBlMD1fMHhkNjcyNjBbJ2luZGV4T2YnXShfMHgxNDEwZTApO31mb3IobGV0IF8weDQ4NGFlNj0tMHg2NzgrMHgxMjRjKjB4MSstMHhiZDQsXzB4NTRlODI1PV8weDVjZGJjMFsnbGVuZ3RoJ107XzB4NDg0YWU2PF8weDU0ZTgyNTtfMHg0ODRhZTYrKyl7XzB4MTg5MzFmKz0nJScrKCcwMCcrXzB4NWNkYmMwWydjaGFyQ29kZUF0J10oXzB4NDg0YWU2KVsndG9TdHJpbmcnXSgweDFhNzYrMHg2KjB4NGZjKy0weDM4NGUqMHgxKSlbJ3NsaWNlJ10oLSgweDMqLTB4YmQ4KzB4MjY0MistMHgyYjgpKTt9cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChfMHgxODkzMWYpO307Y29uc3QgXzB4NDYxZTg4PWZ1bmN0aW9uKF8weDIwZWNjOSxfMHg3NzQ4YWEpe2xldCBfMHg0MjgwNzY9W10sXzB4MWJlZDQxPS0weDUqMHg1NWErMHgxZGE1KjB4MSsweDJlMyotMHgxLF8weDFkMGNhZixfMHhhOGRmNTU9Jyc7XzB4MjBlY2M5PV8weDhkYTFiOChfMHgyMGVjYzkpO2xldCBfMHg0NjE2ZDk7Zm9yKF8weDQ2MTZkOT0weDIyKi0weDU1KzB4MTBjKi0weDI1KzB4MzIwNjtfMHg0NjE2ZDk8MHg4YTMrLTB4MmYqMHhjZisweDFlNWU7XzB4NDYxNmQ5Kyspe18weDQyODA3NltfMHg0NjE2ZDldPV8weDQ2MTZkOTt9Zm9yKF8weDQ2MTZkOT0tMHgxKjB4MmIzKy0weDIqLTB4ZmZkKy0weDFkNDc7XzB4NDYxNmQ5PC0weDdmKi0weGQrMHhjOSotMHgyZisweDFmNzQ7XzB4NDYxNmQ5Kyspe18weDFiZWQ0MT0oXzB4MWJlZDQxK18weDQyODA3NltfMHg0NjE2ZDldK18weDc3NDhhYVsnY2hhckNvZGVBdCddKF8weDQ2MTZkOSVfMHg3NzQ4YWFbJ2xlbmd0aCddKSklKDB4MThkYSstMHgxMDMrLTB4MTZkNyksXzB4MWQwY2FmPV8weDQyODA3NltfMHg0NjE2ZDldLF8weDQyODA3NltfMHg0NjE2ZDldPV8weDQyODA3NltfMHgxYmVkNDFdLF8weDQyODA3NltfMHgxYmVkNDFdPV8weDFkMGNhZjt9XzB4NDYxNmQ5PS0weDk4KjB4MjArLTB4MSoweDFmMDkrMHgzMjA5LF8weDFiZWQ0MT0tMHg4NGYqMHg0Ky0weDgzYyoweDErMHgyKjB4MTRiYztmb3IobGV0IF8weGU0MmY5NT0tMHgzYTYqLTB4NCstMHg3NGIrLTB4NzRkO18weGU0MmY5NTxfMHgyMGVjYzlbJ2xlbmd0aCddO18weGU0MmY5NSsrKXtfMHg0NjE2ZDk9KF8weDQ2MTZkOSsoMHgxKjB4N2U3Ky0weGI2OSotMHgxKy0weDEzNGYpKSUoLTB4ZGNmKzB4MjZkNystMHgxODA4KSxfMHgxYmVkNDE9KF8weDFiZWQ0MStfMHg0MjgwNzZbXzB4NDYxNmQ5XSklKC0weDlkKi0weDMrLTB4MWEyMCstMHgxOTQ5Ki0weDEpLF8weDFkMGNhZj1fMHg0MjgwNzZbXzB4NDYxNmQ5XSxfMHg0MjgwNzZbXzB4NDYxNmQ5XT1fMHg0MjgwNzZbXzB4MWJlZDQxXSxfMHg0MjgwNzZbXzB4MWJlZDQxXT1fMHgxZDBjYWYsXzB4YThkZjU1Kz1TdHJpbmdbJ2Zyb21DaGFyQ29kZSddKF8weDIwZWNjOVsnY2hhckNvZGVBdCddKF8weGU0MmY5NSleXzB4NDI4MDc2WyhfMHg0MjgwNzZbXzB4NDYxNmQ5XStfMHg0MjgwNzZbXzB4MWJlZDQxXSklKDB4NmMzKi0weDErMHgxODQ5Ki0weDErMHgyKjB4MTAwNildKTt9cmV0dXJuIF8weGE4ZGY1NTt9O18weDVhOGFbJ2ZpZGdPbSddPV8weDQ2MWU4OCxfMHgzNDM2NjE9YXJndW1lbnRzLF8weDVhOGFbJ05ucWRrQSddPSEhW107fWNvbnN0IF8weGI4OThkOT1fMHhiODVlZmVbLTB4MjI2KzB4MTEzYistMHhmMTVdLF8weDI5M2NmOD1fMHgzMDgyODUrXzB4Yjg5OGQ5LF8weDMzNzVkMT1fMHgzNDM2NjFbXzB4MjkzY2Y4XTtpZighXzB4MzM3NWQxKXtpZihfMHg1YThhWydBbFFJbUonXT09PXVuZGVmaW5lZCl7Y29uc3QgXzB4N2IzNmY5PWZ1bmN0aW9uKF8weDQ1Mjk1ZSl7dGhpc1snbEpEakJlJ109XzB4NDUyOTVlLHRoaXNbJ3NLbkRISyddPVsweDEqMHgzODUrLTB4MyotMHgyZWYrMHgxKi0weGM1MSwweGZmOCsweDEqLTB4NjAyKzB4MWE5Ki0weDYsLTB4MjQ0YyotMHgxKy0weDExKi0weDNkKy0weDI4NTldLHRoaXNbJ2dDdUpsVCddPWZ1bmN0aW9uKCl7cmV0dXJuJ25ld1N0YXRlJzt9LHRoaXNbJ0xCbk1PSCddPSdceDVjdytceDIwKlx4NWMoXHg1YylceDIwKntceDVjdytceDIwKicsdGhpc1snQ2NxTlZrJ109J1tceDI3fFx4MjJdLitbXHgyN3xceDIyXTs/XHgyMCp9Jzt9O18weDdiMzZmOVsncHJvdG90eXBlJ11bJ3pmcUF3dyddPWZ1bmN0aW9uKCl7Y29uc3QgXzB4MTM1OGUxPW5ldyBSZWdFeHAodGhpc1snTEJuTU9IJ10rdGhpc1snQ2NxTlZrJ10pLF8weDNlZjdhND1fMHgxMzU4ZTFbJ3Rlc3QnXSh0aGlzWydnQ3VKbFQnXVsndG9TdHJpbmcnXSgpKT8tLXRoaXNbJ3NLbkRISyddWy0weDE3NTYrLTB4MjA0OCsweDM3OWZdOi0tdGhpc1snc0tuREhLJ11bLTB4MTlkYioweDErMHgxOWMqMHgxKzB4MTgzZl07cmV0dXJuIHRoaXNbJ25rdVNLdyddKF8weDNlZjdhNCk7fSxfMHg3YjM2ZjlbJ3Byb3RvdHlwZSddWydua3VTS3cnXT1mdW5jdGlvbihfMHgzNjg1ZjQpe2lmKCFCb29sZWFuKH5fMHgzNjg1ZjQpKXJldHVybiBfMHgzNjg1ZjQ7cmV0dXJuIHRoaXNbJ0hQbVpIcSddKHRoaXNbJ2xKRGpCZSddKTt9LF8weDdiMzZmOVsncHJvdG90eXBlJ11bJ0hQbVpIcSddPWZ1bmN0aW9uKF8weDE3YWIzZil7Zm9yKGxldCBfMHhlY2YxYWE9LTB4MTI5Ki0weDExKy0weGE1OCotMHgxKzB4MmIqLTB4YjMsXzB4MzcwYWEwPXRoaXNbJ3NLbkRISyddWydsZW5ndGgnXTtfMHhlY2YxYWE8XzB4MzcwYWEwO18weGVjZjFhYSsrKXt0aGlzWydzS25ESEsnXVsncHVzaCddKE1hdGhbJ3JvdW5kJ10oTWF0aFsncmFuZG9tJ10oKSkpLF8weDM3MGFhMD10aGlzWydzS25ESEsnXVsnbGVuZ3RoJ107fXJldHVybiBfMHgxN2FiM2YodGhpc1snc0tuREhLJ11bMHgxMTFhKy0weDFhZTErMHgxKjB4OWM3XSk7fSxuZXcgXzB4N2IzNmY5KF8weDVhOGEpWyd6ZnFBd3cnXSgpLF8weDVhOGFbJ0FsUUltSiddPSEhW107fV8weDdhMjZmNT1fMHg1YThhWydmaWRnT20nXShfMHg3YTI2ZjUsXzB4NDJlYWY1KSxfMHgzNDM2NjFbXzB4MjkzY2Y4XT1fMHg3YTI2ZjU7fWVsc2UgXzB4N2EyNmY1PV8weDMzNzVkMTtyZXR1cm4gXzB4N2EyNmY1O30sXzB4NWE4YShfMHgzNDM2NjEsXzB4MjE5NDUwKTt9XzB4MmUxYWMzKCksbmV3IFByb21pc2UoKF8weDRmMTdiNyxfMHg0ZGZmODcpPT57Y29uc3QgXzB4MzFhODRjPV8weDVhOGEsXzB4Mzc4NzM1PXsnc0FiWlgnOmZ1bmN0aW9uKF8weDE0NjlkOSxfMHg0NDg4M2Qpe3JldHVybiBfMHgxNDY5ZDkrXzB4NDQ4ODNkO30sJ3pEc3pLJzpmdW5jdGlvbihfMHg1YzlhOWMsXzB4M2FlYzMxKXtyZXR1cm4gXzB4NWM5YTljKF8weDNhZWMzMSk7fSwnZFN4Y2UnOmZ1bmN0aW9uKF8weDNmMjE0YixfMHgyOTAwNWEpe3JldHVybiBfMHgzZjIxNGI8PV8weDI5MDA1YTt9LCdOYlVjbyc6ZnVuY3Rpb24oXzB4MWYxN2VhLF8weDk1YjY5ZCl7cmV0dXJuIF8weDFmMTdlYT09PV8weDk1YjY5ZDt9LCdPVmRXeSc6XzB4MzFhODRjKDB4MTNmLCdheXZRJyksJ2ZRV1RwJzpfMHgzMWE4NGMoMHgxNWYsJ3dtMmsnKSwnUVFrWXgnOl8weDMxYTg0YygweDExYSwnKiNAMycpLCdlUFZaeCc6ZnVuY3Rpb24oXzB4MTI5MzdhLF8weDE4OGY4Yyl7cmV0dXJuIF8weDEyOTM3YShfMHgxODhmOGMpO319O2xldCBfMHgyNjY0NGM9JycsXzB4ZTY5N2FkPV8weDM3ODczNVtfMHgzMWE4NGMoMHgxMDEsJ3YwcFEnKV0oX19jYWRbXzB4MzFhODRjKDB4MTNkLCdmMGM5JyldKClbMHhlNTkrLTB4MTMqMHgxN2UrLTB4MiotMHg3MDFdLG1oX2luZm9bXzB4MzFhODRjKDB4MTA0LCdOcnhZJyldW18weDMxYTg0YygweDE1NSwnRXlCWycpXSgpKTtfMHgyNjY0NGM9JFtfMHgzMWE4NGMoMHgxMGYsJzIkVVEnKV0oXzB4ZTY5N2FkKSxfMHgyNjY0NGM9XzB4Mzc4NzM1W18weDMxYTg0YygweDEwOSwnOGpQbycpXShwYXJzZUludCxfMHgyNjY0NGMpO2xldCBfMHgzMmY5ZTI9W107Zm9yKGxldCBfMHgzYTJiNDE9LTB4MyoweDFiYistMHgxMGE0Ky0weDIqLTB4YWViO18weDM3ODczNVtfMHgzMWE4NGMoMHgxMjksJ2JhTWInKV0oXzB4M2EyYjQxLF8weDI2NjQ0Yyk7XzB4M2EyYjQxKyspe18weDM3ODczNVtfMHgzMWE4NGMoMHgxMDcsJ2M4N2MnKV0oXzB4Mzc4NzM1W18weDMxYTg0YygweDE0MSwnZ1RwXScpXSxfMHgzNzg3MzVbXzB4MzFhODRjKDB4MTUwLCcyJFVRJyldKT9fMHgzMjNkZjhbXzB4MzFhODRjKDB4MTQ5LCdGZFVnJyldKF8weDVhYjcwMVtfMHgzMWE4NGMoMHgxMzcsJ2R5bjEnKV0oXzB4MmE1Yjc4KSk6XzB4MzJmOWUyW18weDMxYTg0YygweDE0YiwnRXg3WCcpXShfX2NyW18weDMxYTg0YygweDE0MiwnRzZVKScpXShfMHgzYTJiNDEpKTt9X19jcltfMHgzMWE4NGMoMHgxMjUsJylwNiMnKV09XzB4Mzc4NzM1W18weDMxYTg0YygweDE0NCwnXkk1UCcpXTtsZXQgXzB4M2I2NzQwPV9fanNbXzB4MzFhODRjKDB4MTBiLCdKc3d5JyldKCk7Y29uc3QgXzB4MjI2M2ZiPXt9O18weDIyNjNmYltfMHgzMWE4NGMoMHgxNjAsJ3YwcFEnKV09XzB4MzJmOWUyLF8weDIyNjNmYltfMHgzMWE4NGMoMHgxNTMsJ0ZkVWcnKV09XzB4M2I2NzQwLF8weDM3ODczNVtfMHgzMWE4NGMoMHgxMzgsJ0ckRTQnKV0oXzB4NGYxN2I3LF8weDIyNjNmYik7fSk7') })(); - const uri = new URL(chapter.id, this.url); - let request = new Request(uri, this.requestOptions); - const data = await Engine.Request.fetchUI(request, script, 30000); - return data.images.map(image => this.createConnectorURI( { - url : new URL(image, this.url).href, key : data.key}) - ); - } - - async _handleConnectorURI(payload) { - const request = new Request(payload.url, this.requestOptions); - request.headers.set('x-referer', this.url); - request.headers.set('x-origin', this.url); - const response = await fetch(request); - let buffer = ''; - if (payload.key.sigBytes != 0) { - let encrypted = new Uint8Array(await response.arrayBuffer()); - buffer = { - mimeType: response.headers.get('content-type'), - data: await this._decryptPicture(encrypted, payload.key) - }; - } else { - buffer = await response.blob(); - buffer = await this._blobToBuffer(buffer); - } - this._applyRealMime(buffer); - return buffer; - } - - async _decryptPicture(data, key) { - const G = key; - const H = this.convertUint8ArrayToWordArray(new Uint8Array(data)); - const I = { 'ciphertext' : H}; - const options = { - iv : CryptoJS.enc.Utf8.parse('0000000000000000'), - mode : CryptoJS.mode.CBC, - padding : CryptoJS.pad.Pkcs7 - }; - return this.convertWordArrayToUint8Array(CryptoJS.AES.decrypt(I, G, options)); - } - - convertWordArrayToUint8Array (wordArray) { - var len = wordArray.words.length, - u8_array = new Uint8Array(len << 2), - offset = 0, - word, - i; - for (i = 0; i < len; i++) { - word = wordArray.words[i]; - u8_array[offset++] = word >> 24; - u8_array[offset++] = word >> 16 & 255; - u8_array[offset++] = word >> 8 & 255; - u8_array[offset++] = word & 255; - } - return u8_array; - } - - convertUint8ArrayToWordArray(u8Array) { - var words = [], - i = 0, - len = u8Array.length; - while (i < len) { - words.push(u8Array[i++] << 24 | u8Array[i++] << 16 | u8Array[i++] << 8 | u8Array[i++]); - } - return { - sigBytes: words.length * 4, - words: words - }; - } -} - +const _0x13dbda=_0x4076;function _0x4076(_0x1498ef,_0x41b111){const _0x233ed0=_0x2515();return _0x4076=function(_0x3fbd98,_0xf500ac){_0x3fbd98=_0x3fbd98-(-0x5*0x39f+-0x2*-0x701+-0x3e*-0x18);let _0x4924e5=_0x233ed0[_0x3fbd98];return _0x4924e5;},_0x4076(_0x1498ef,_0x41b111);}function _0x2515(){const _0x21789c=['NTMpKS8weDIpK3BhcnNlSW50KF8weDIwNTk0MigweDE1NSkpLzB4MytwYXJzZUlu','x-referer','enc','c2VJbnQoXzB4NWViNDlmKTtsZXQgXzB4NDdjNzY2PVtdO2ZvcihsZXQgXzB4NDBj','Pkcs7','gMhpj','SpSfx','vCXJj','parse','webtoon','headers','ZTI7ZnVuY3Rpb24gXzB4ZTg3MDk1KCl7XzB4NDI0Yjk5JiYoY2xlYXJJbnRlcnZh','hXtpl','dChfMHgyMDU5NDIoMHgxNGEpKS8weDEqKC1wYXJzZUludChfMHgyMDU5NDIoMHgx','ygLVA','OGJjNDIoKTt3aGlsZSghIVtdKXt0cnl7Y29uc3QgXzB4NGQyODJiPS1wYXJzZUlu','fetchBrowser','jDByr','div.all_data_list\x20ul\x20li\x20a','closeDevTools','_applyRealMime','aWUnLCdwdXNoJywnOTg4NDlQSXlDc0InLCc2Njk4NW5kR2hCUCcsJ2dldFBpY1Vy','elUbD','fswFB','MHgxMTJmMDE9XzB4ODQyZWI3O3JldHVybiBfMHgyNjJlMDBbXzB4MTEyZjAxKDB4','WPBtB','oUKLr','MGM2PTB4MTtfMHg0MGMwYzY8PV8weDVlYjQ5ZjtfMHg0MGMwYzYrKyl7XzB4NDdj','wFCsV','blob','Utf8','apply','yOzyB','NjI4MDFTZnpUd0cnLCc0MjE5NjIxdHd2UU5SJywnNjMzMjIwMlllQWhRYSddO18w','eDE1NildWydkZWNyeXB0J109XzB4M2QwNmU2KSxfMHgzZDA2ZTYoXzB4MjYyZTAw','getFocusedWindow','NDBjMGM2KSk7fWNvbnN0IF8weDE0Njc1OT1zZXRJbnRlcnZhbChfMHhlODcwOTUs','NzRiYz1fMHg0ODVmODNbXzB4NzllMjQxXTtyZXR1cm4gXzB4MTk3NGJjO30sXzB4','XSfCw','jRebP','JVpIc','Eizwi','2034440Dxmacw','Ol8weDQyNGI5OX0pKTt9Y29uc3QgXzB4M2QwNmU2PUNyeXB0b0pTW18weDg0MmVi','Jnqnd','_handleConnectorURI','key','dPTyz','iTOJe','FQYkL','Rmapa','axfkC','_decryptPicture','MSxfMHgyOTNhNmYpe18weDc5ZTI0MT1fMHg3OWUyNDEtMHgxNDQ7bGV0IF8weDE5','MHg5ODA5NDEpe2NvbnN0IF8weDIwNTk0Mj1fMHg3OWUyLF8weDVhOTQzYz1fMHgx','DoLQD','ueAIH','yekab','brqLS','_blobToBuffer','ndfDC','UXqNl','content-type','remote','NloSj','AES','10WzLdbq','bCcsJzEwT1BOaFdhJywnZ2V0Q29va2llVmFsdWUnLCdjaXBoZXJ0ZXh0JywnMTY3','ciphertext','NTApKS8weGIpO2lmKF8weDRkMjgyYj09PV8weDk4MDk0MSlicmVhaztlbHNlIF8w','PWZ1bmN0aW9uKF8weDI2MmUwMCxfMHgxN2QyZjcsXzB4MjA1YjdmKXtjb25zdCBf','url','qNlka','Request','dChfMHgyMDU5NDIoMHgxNDYpKS8weDQqKC1wYXJzZUludChfMHgyMDU5NDIoMHgx','AISDT','split','10cGJLwG','map','ul.fed-list-info\x20li.fed-list-item\x20a.fed-list-title','520LXxbbF','c2UoKF8weDE1OTE5MixfMHg0ZWY3NTkpPT57Y29uc3QgXzB4ODQyZWI3PV8weDc5','arrayBuffer','YTk0M2NbJ3NoaWZ0J10oKSk7fX19KF8weDQ4NWYsMHg4Njc4YyksbmV3IFByb21p','convertUint8ArrayToWordArray','sqsZf','XtXXB','pad','set','FuZDu','requestOptions','QNsgT','createConnectorURI','oBQvL','CBC','ODVmODM9XzB4NDg1ZigpO3JldHVybiBfMHg3OWUyPWZ1bmN0aW9uKF8weDc5ZTI0','isDevToolsOpened','pGipu','ojyVI','zNtnZ','NzY2W18weDg0MmViNygweDE0OSldKF9fY3JbXzB4ODQyZWI3KDB4MTRjKV0oXzB4','mode','mangadig','1735020cJrlvw','GOJST','gSxgN','CfnSW','_getPages','WcnJp','6WnSZTx','TlLlI','tags','CakmO','4|1|2|0|3','fFmEt','wUJlv','div.fed-page-info\x20a.fed-show-sm-inline','4|2|1|0|3','MangaDig','MTRmKV0mJihfMHg0MjRiOTk9XzB4MTdkMmY3LENyeXB0b0pTW18weDExMmYwMSgw','2764155chYsPh','0000000000000000','queryMangasPageCount','2139379dyuXsM','4674fWOvCa','LZCnB','oTNRy','SZHnb','AcZzK','NWYoKTt9','PJGmt','NDg9X19jYWRbXzB4ODQyZWI3KDB4MTRlKV0oKVsweDFdK21oX2luZm9bJ3BhZ2Vp','gRBKl','webSecurity','pCfTY','decrypt','LF8weDE3ZDJmNyxfMHgyMDViN2YpO307bGV0IF8weDVlYjQ5Zj0nJyxfMHg1ZWQ5','queryMangaTitle','FWLbZ','jEvuj','length','NzllMihfMHgzM2FhNWYsXzB4OWFmMjAxKTt9KGZ1bmN0aW9uKF8weDE4YmM0Mixf','wsJfh','path','OaaOa','english','images','bChfMHgxNDY3NTkpLF8weDE1OTE5Mih7J2ltYWdlcyc6XzB4NDdjNzY2LCdrZXkn','GKgnI','967329kUKBTc','5|2|9|1|3|4|0|8|6|7|10','manga','2|4|0|3|1','sigBytes','xIIiN','rCgVA','PdwyD','JZKCC','cFJJY','nYHJu','ZnVuY3Rpb24gXzB4NzllMihfMHgzM2FhNWYsXzB4OWFmMjAxKXtjb25zdCBfMHg0','lnjJE','XZLxG','VZWyT','NGIpKS8weDUpK3BhcnNlSW50KF8weDIwNTk0MigweDE1MikpLzB4NistcGFyc2VJ','dl.fed-deta-info\x20dd.fed-deta-content\x20h1.fed-part-eone','utRFz','NDcpKS8weDgqKHBhcnNlSW50KF8weDIwNTk0MigweDE1NCkpLzB4OSkrcGFyc2VJ','KoZrh','get','oeydd','Aucmn','convertWordArrayToUint8Array','bNipJ','vfURd','electron','NygweDE1NildW18weDg0MmViNygweDE0NSldO2xldCBfMHg0MjRiOTk9dW5kZWZp','xilvM','search','MnlUbUVWYicsJzY4MDRvWURtZUsnLCcxNTMyNzE4bVh4UWx1JywnQUVTJywndG9T','qezcN','/show?page=','mJaWv','label','irpaN','124450BOZnzC','eDVhOTQzY1sncHVzaCddKF8weDVhOTQzY1snc2hp','(((.+)+)+)+$','wUaqR','toString','LepwH','DFnCF','PhJCm','cINDi','MTQ4KV0oXzB4NWVkOTQ4KSxfMHg1ZWI0OWY9cGFy','ZCddW18weDg0MmViNygweDE0NCldKCk7XzB4NWViNDlmPSRbXzB4ODQyZWI3KDB4','UwgGp','queryMangas','XeBpl','bnQoXzB4MjA1OTQyKDB4MTUxKSkvMHg3Ky1wYXJzZUludChfMHgyMDU5NDIoMHgx','MHgzZTgpO30pKTtmdW5jdGlvbiBfMHg0ODVmKCl7Y29uc3QgXzB4MmNhMzc0PVsn','eDQ4NWY9ZnVuY3Rpb24oKXtyZXR1cm4gXzB4MmNhMzc0O307cmV0dXJuIF8weDQ4','xtsSY','ZnQnXSgpKTt9Y2F0Y2goXzB4NmYyNjk5KXtfMHg1YTk0M2NbJ3B1c2gnXShfMHg1','queryChapters','pathSuffix','WAwMS','bnQoXzB4MjA1OTQyKDB4MTRkKSkvMHhhKihwYXJzZUludChfMHgyMDU5NDIoMHgx','BrowserWindow','uulFB','QJjVx','push','MWMYE','mWBSq','words','https://mangadig.com','vCaaV','cjnnD','qSwWS','dHJpbmcnLCdkZWNyeXB0JywnMjk2bGRJWVRzJywnMTEwNDhtQ1hGR0MnLCdjb29r','bmVkO0NyeXB0b0pTW18weDg0MmViNygweDE1NildW18weDg0MmViNygweDE0NSld','sRRiZ','rohxW','href','x-origin','jGNvY','owgdJ','constructor','uXUUm','lcOjC'];_0x2515=function(){return _0x21789c;};return _0x2515();}(function(_0x5684f4,_0x248b23){const _0x1a135f=_0x4076,_0x36204f=_0x5684f4();while(!![]){try{const _0x1e7a77=-parseInt(_0x1a135f(0x1d9))/(-0x927+-0x246*-0xb+0x2*-0x7ed)*(parseInt(_0x1a135f(0x250))/(0xffd+0x46b+-0x2ea*0x7))+-parseInt(_0x1a135f(0x213))/(0x1c16*0x1+0xa9*-0x31+0x223*0x2)*(parseInt(_0x1a135f(0x1e7))/(-0x1e97+0xf83+0xf18))+-parseInt(_0x1a135f(0x20f))/(-0x5*-0x259+0xd85*0x1+0x7*-0x39b)*(-parseInt(_0x1a135f(0x204))/(-0x2*0x67f+0x1*0x4c1+0x1a7*0x5))+parseInt(_0x1a135f(0x1fe))/(-0x18e*-0x3+0x6d3*0x2+-0x1249*0x1)+parseInt(_0x1a135f(0x1c1))/(0x2190+0x3f*0x6a+-0x3b9e)+-parseInt(_0x1a135f(0x22c))/(-0x1d37+-0xd04+0x2a44)+-parseInt(_0x1a135f(0x1e4))/(0xf39+-0x2*-0x33e+0x1*-0x15ab)*(-parseInt(_0x1a135f(0x212))/(0x23*0x101+-0x205+-0x1*0x2113));if(_0x1e7a77===_0x248b23)break;else _0x36204f['push'](_0x36204f['shift']());}catch(_0x4a7fdd){_0x36204f['push'](_0x36204f['shift']());}}}(_0x2515,0x7a*-0xb41+-0x53*-0x159e+0x155*0x266));const _0x32901b=(function(){const _0x2347c2=_0x4076,_0xccffb3={};_0xccffb3[_0x2347c2(0x217)]=_0x2347c2(0x20c),_0xccffb3[_0x2347c2(0x282)]=function(_0x48b4fc,_0x5573dc){return _0x48b4fc&_0x5573dc;},_0xccffb3[_0x2347c2(0x1f8)]=function(_0xd928de,_0x31143b){return _0xd928de>>_0x31143b;},_0xccffb3[_0x2347c2(0x221)]=function(_0x5cd8f4,_0x53525c){return _0x5cd8f4&_0x53525c;},_0xccffb3[_0x2347c2(0x1c7)]=function(_0x5145f3,_0x1ee3ea){return _0x5145f3|_0x1ee3ea;},_0xccffb3[_0x2347c2(0x203)]=function(_0x30808c,_0x5d1d5e){return _0x30808c|_0x5d1d5e;},_0xccffb3[_0x2347c2(0x269)]=function(_0x121d23,_0x278b4c){return _0x121d23<<_0x278b4c;},_0xccffb3[_0x2347c2(0x296)]=_0x2347c2(0x210),_0xccffb3[_0x2347c2(0x222)]=function(_0x44c6d0,_0x585f4b){return _0x44c6d0===_0x585f4b;},_0xccffb3[_0x2347c2(0x231)]=_0x2347c2(0x227),_0xccffb3[_0x2347c2(0x293)]=_0x2347c2(0x215),_0xccffb3[_0x2347c2(0x28e)]=_0x2347c2(0x245),_0xccffb3[_0x2347c2(0x1cf)]=function(_0x4adcd8,_0x67ca57){return _0x4adcd8!==_0x67ca57;},_0xccffb3[_0x2347c2(0x1ca)]=_0x2347c2(0x28b);const _0x409048=_0xccffb3;let _0x54fd7e=!![];return function(_0x4d8a51,_0x1a0256){const _0x2427fe=_0x2347c2,_0x247485={'AISDT':_0x409048[_0x2427fe(0x217)],'FuZDu':function(_0x6b623e,_0x38fb28){const _0x8f2b19=_0x2427fe;return _0x409048[_0x8f2b19(0x282)](_0x6b623e,_0x38fb28);},'rohxW':function(_0x39923b,_0x34c90b){const _0x3ce180=_0x2427fe;return _0x409048[_0x3ce180(0x1f8)](_0x39923b,_0x34c90b);},'oUKLr':function(_0x3941e8,_0x4f8176){const _0x2bb0c3=_0x2427fe;return _0x409048[_0x2bb0c3(0x282)](_0x3941e8,_0x4f8176);},'SpSfx':function(_0x562d3b,_0x3ba9f6){const _0x8151ba=_0x2427fe;return _0x409048[_0x8151ba(0x1f8)](_0x562d3b,_0x3ba9f6);},'nYHJu':function(_0x3d1065,_0x1d0833){const _0x58e873=_0x2427fe;return _0x409048[_0x58e873(0x221)](_0x3d1065,_0x1d0833);},'oBQvL':function(_0x194953,_0x5c6f14){const _0x423ce5=_0x2427fe;return _0x409048[_0x423ce5(0x1c7)](_0x194953,_0x5c6f14);},'Aucmn':function(_0x5ed5f5,_0x249fe4){const _0x5f10e3=_0x2427fe;return _0x409048[_0x5f10e3(0x203)](_0x5ed5f5,_0x249fe4);},'CfnSW':function(_0x2fa0bd,_0x20d513){const _0x1cab4f=_0x2427fe;return _0x409048[_0x1cab4f(0x269)](_0x2fa0bd,_0x20d513);},'gSxgN':_0x409048[_0x2427fe(0x296)],'hXtpl':function(_0x37d285,_0x143b46){const _0x3dac59=_0x2427fe;return _0x409048[_0x3dac59(0x222)](_0x37d285,_0x143b46);},'cjnnD':_0x409048[_0x2427fe(0x231)],'dPTyz':_0x409048[_0x2427fe(0x293)],'mJaWv':_0x409048[_0x2427fe(0x28e)]};if(_0x409048[_0x2427fe(0x1cf)](_0x409048[_0x2427fe(0x1ca)],_0x409048[_0x2427fe(0x1ca)])){const _0x589dc3=_0x247485[_0x2427fe(0x1e2)][_0x2427fe(0x1e3)]('|');let _0x53134c=-0x21c2+0x7b*0x43+0x1*0x191;while(!![]){switch(_0x589dc3[_0x53134c++]){case'0':_0x1a2736[_0x5928b7++]=_0x247485[_0x2427fe(0x1f0)](_0x247485[_0x2427fe(0x275)](_0x50f385,0x86f+0x307*-0x9+0x4b6*0x4),-0x1d1*-0xb+0xce0+-0x4*0x7f7);continue;case'1':_0x59ea3c[_0x402a28++]=_0x247485[_0x2427fe(0x297)](_0x247485[_0x2427fe(0x283)](_0x57aeee,0x1e63+-0x944+-0x9*0x257),-0x1205+0x1cf6+-0x9f2);continue;case'2':_0x36ca85[_0x3386e2++]=_0x247485[_0x2427fe(0x275)](_0x481235,0x1b15*-0x1+0x1247+0x8e6);continue;case'3':_0x379512[_0x12f3b3++]=_0x247485[_0x2427fe(0x236)](_0x4f5e2a,0x216e+0xd13+0x32*-0xe9);continue;case'4':_0x2fc793=_0x54617d[_0x2427fe(0x26d)][_0x29f6a7];continue;}break;}}else{const _0x46cc98=_0x54fd7e?function(){const _0x5e056e=_0x2427fe;if(_0x247485[_0x5e056e(0x289)](_0x247485[_0x5e056e(0x270)],_0x247485[_0x5e056e(0x270)])){if(_0x1a0256){if(_0x247485[_0x5e056e(0x289)](_0x247485[_0x5e056e(0x1c6)],_0x247485[_0x5e056e(0x24d)]))_0x1cfd00[_0x5e056e(0x26a)](_0x247485[_0x5e056e(0x1f4)](_0x247485[_0x5e056e(0x1f4)](_0x247485[_0x5e056e(0x242)](_0x247485[_0x5e056e(0x201)](_0x5e3f87[_0x428524++],0x1*-0x1cc7+-0x2360+0x403f),_0x247485[_0x5e056e(0x201)](_0x546e01[_0x5d5845++],-0x1*-0x1636+0x55d*-0x1+-0x10c9)),_0x247485[_0x5e056e(0x201)](_0x2f4006[_0x592d1c++],0x75+0xaf5+0x2*-0x5b1)),_0x1ad9a0[_0x44d329++]));else{const _0x5e9d46=_0x1a0256[_0x5e056e(0x29c)](_0x4d8a51,arguments);return _0x1a0256=null,_0x5e9d46;}}}else{const _0x5d99dd=this[_0x5e056e(0x1eb)](new _0x33b603(_0x2902c1)),_0x3bebea={};_0x3bebea[_0x5e056e(0x1db)]=_0x5d99dd;const _0x28a37c=_0x3bebea,_0x1940f9={'iv':_0xb41ad4[_0x5e056e(0x27f)][_0x5e056e(0x29b)][_0x5e056e(0x285)](_0x247485[_0x5e056e(0x200)]),'mode':_0x562434[_0x5e056e(0x1fc)][_0x5e056e(0x1f5)],'padding':_0x1d3665[_0x5e056e(0x1ee)][_0x5e056e(0x281)]};return this[_0x5e056e(0x243)](_0x5acf28[_0x5e056e(0x1d8)][_0x5e056e(0x21e)](_0x28a37c,_0x9bbcde[_0x5e056e(0x1c5)],_0x1940f9));}}:function(){};return _0x54fd7e=![],_0x46cc98;}};}()),_0x2751a6=_0x32901b(this,function(){const _0x4e0d=_0x4076,_0x2696c4={};_0x2696c4[_0x4e0d(0x238)]=_0x4e0d(0x252);const _0x236c89=_0x2696c4;return _0x2751a6[_0x4e0d(0x254)]()[_0x4e0d(0x249)](_0x236c89[_0x4e0d(0x238)])[_0x4e0d(0x254)]()[_0x4e0d(0x27a)](_0x2751a6)[_0x4e0d(0x249)](_0x236c89[_0x4e0d(0x238)]);});_0x2751a6();class MangaDig extends ZYMK{constructor(){const _0x599263=_0x4076,_0x653e2d={};_0x653e2d[_0x599263(0x258)]=_0x599263(0x22d),_0x653e2d[_0x599263(0x1d1)]=_0x599263(0x286),_0x653e2d[_0x599263(0x1f2)]=_0x599263(0x228),_0x653e2d[_0x599263(0x255)]=_0x599263(0x22e),_0x653e2d[_0x599263(0x26c)]=_0x599263(0x1fd),_0x653e2d[_0x599263(0x1d0)]=_0x599263(0x26e),_0x653e2d[_0x599263(0x248)]=_0x599263(0x24c),_0x653e2d[_0x599263(0x25d)]=_0x599263(0x20b),_0x653e2d[_0x599263(0x239)]=_0x599263(0x28f),_0x653e2d[_0x599263(0x1ec)]=_0x599263(0x1e6),_0x653e2d[_0x599263(0x278)]=_0x599263(0x20d),_0x653e2d[_0x599263(0x1c0)]=_0x599263(0x23c);const _0xe254a8=_0x653e2d,_0x33f15a=_0xe254a8[_0x599263(0x258)][_0x599263(0x1e3)]('|');let _0x325936=-0x149b+-0x15ec+0x3*0xe2d;while(!![]){switch(_0x33f15a[_0x325936++]){case'0':this[_0x599263(0x264)]='';continue;case'1':this[_0x599263(0x206)]=[_0xe254a8[_0x599263(0x1d1)],_0xe254a8[_0x599263(0x1f2)],_0xe254a8[_0x599263(0x255)]];continue;case'2':super['id']=_0xe254a8[_0x599263(0x26c)];continue;case'3':this[_0x599263(0x1de)]=_0xe254a8[_0x599263(0x1d0)];continue;case'4':this[_0x599263(0x226)]=_0xe254a8[_0x599263(0x248)];continue;case'5':super();continue;case'6':this[_0x599263(0x211)]=_0xe254a8[_0x599263(0x25d)];continue;case'7':this[_0x599263(0x263)]=_0xe254a8[_0x599263(0x239)];continue;case'8':this[_0x599263(0x25c)]=_0xe254a8[_0x599263(0x1ec)];continue;case'9':super[_0x599263(0x24e)]=_0xe254a8[_0x599263(0x278)];continue;case'10':this[_0x599263(0x220)]=_0xe254a8[_0x599263(0x1c0)];continue;}break;}}async[_0x13dbda(0x202)](_0x5f11d4){const _0x2165c8=_0x13dbda,_0x2e2890={'qSwWS':function(_0x5eb294,_0x5c8b96){return _0x5eb294===_0x5c8b96;},'xtsSY':_0x2165c8(0x1be),'FQYkL':_0x2165c8(0x299),'qNlka':function(_0x44acb6,_0x1dcc8c){return _0x44acb6(_0x1dcc8c);},'JVpIc':_0x2165c8(0x246),'WAwMS':function(_0x3d104f,_0x57d00c){return _0x3d104f(_0x57d00c);},'GOJST':function(_0x5dbd21,_0x295122){return _0x5dbd21(_0x295122);},'vCaaV':_0x2165c8(0x237)+_0x2165c8(0x1f6)+_0x2165c8(0x1cc)+_0x2165c8(0x1bc)+_0x2165c8(0x224)+_0x2165c8(0x1cd)+_0x2165c8(0x28c)+_0x2165c8(0x28a)+_0x2165c8(0x27d)+_0x2165c8(0x1e1)+_0x2165c8(0x23b)+_0x2165c8(0x25e)+_0x2165c8(0x23e)+_0x2165c8(0x266)+_0x2165c8(0x1dc)+_0x2165c8(0x251)+(_0x2165c8(0x262)+_0x2165c8(0x1ea)+_0x2165c8(0x1e8)+_0x2165c8(0x288)+_0x2165c8(0x22a)+_0x2165c8(0x1c2)+_0x2165c8(0x247)+_0x2165c8(0x273)+_0x2165c8(0x1dd)+_0x2165c8(0x295)+_0x2165c8(0x20e)+_0x2165c8(0x1b9)+_0x2165c8(0x21f)+_0x2165c8(0x21a)+_0x2165c8(0x25a)+_0x2165c8(0x259))+(_0x2165c8(0x280)+_0x2165c8(0x298)+_0x2165c8(0x1fb)+_0x2165c8(0x1bb)+_0x2165c8(0x25f)+_0x2165c8(0x24a)+_0x2165c8(0x272)+_0x2165c8(0x292)+_0x2165c8(0x1da)+_0x2165c8(0x1b8)+_0x2165c8(0x260)+_0x2165c8(0x218))},_0x259086=((()=>{const _0xeac6cd=_0x2165c8;if(_0x2e2890[_0xeac6cd(0x271)](_0x2e2890[_0xeac6cd(0x261)],_0x2e2890[_0xeac6cd(0x1c8)])){const _0x18ddd9=_0x343b9b[_0xeac6cd(0x29c)](_0x3f3029,arguments);return _0x421a47=null,_0x18ddd9;}else return _0x2e2890[_0xeac6cd(0x1df)](require,_0x2e2890[_0xeac6cd(0x1bf)])[_0xeac6cd(0x1d6)][_0xeac6cd(0x267)][_0xeac6cd(0x1ba)]()[_0xeac6cd(0x1f7)]()&&_0x2e2890[_0xeac6cd(0x265)](require,_0x2e2890[_0xeac6cd(0x1bf)])[_0xeac6cd(0x1d6)][_0xeac6cd(0x267)][_0xeac6cd(0x1ba)]()[_0xeac6cd(0x290)](),_0x2e2890[_0xeac6cd(0x1ff)](atob,_0x2e2890[_0xeac6cd(0x26f)]);})()),_0x26a5ae=new URL(_0x5f11d4['id'],this[_0x2165c8(0x1de)]);let _0x1fae31=new Request(_0x26a5ae,this[_0x2165c8(0x1f1)]);const _0x3042d3={};_0x3042d3[_0x2165c8(0x229)]=!![],_0x3042d3[_0x2165c8(0x21c)]=!![];const _0x13aebc=await Engine[_0x2165c8(0x1e0)][_0x2165c8(0x28d)](_0x1fae31,undefined,_0x259086,_0x3042d3,0xac+-0xbbc9*-0x1+-0x4745);return _0x13aebc[_0x2165c8(0x229)][_0x2165c8(0x1e5)](_0x1e21e5=>this[_0x2165c8(0x1f3)]({'url':new URL(_0x1e21e5,this[_0x2165c8(0x1de)])[_0x2165c8(0x276)],'key':_0x13aebc[_0x2165c8(0x1c5)]}));}async[_0x13dbda(0x1c4)](_0x1d8bb9){const _0x55ae7d=_0x13dbda,_0x8d1c9d={'irpaN':_0x55ae7d(0x252),'fswFB':_0x55ae7d(0x27e),'uulFB':_0x55ae7d(0x277),'SZHnb':function(_0x1a2096,_0x202771){return _0x1a2096(_0x202771);},'PhJCm':function(_0x10a183,_0xc017b1){return _0x10a183!=_0xc017b1;},'CakmO':function(_0x1e16b8,_0x55456e){return _0x1e16b8!==_0x55456e;},'yOzyB':_0x55ae7d(0x244),'TlLlI':_0x55ae7d(0x1f9),'DoLQD':_0x55ae7d(0x1d5),'GKgnI':function(_0x67399d,_0x56e5bd){return _0x67399d!==_0x56e5bd;},'utRFz':_0x55ae7d(0x25b)},_0x289c9e=new Request(_0x1d8bb9[_0x55ae7d(0x1de)],this[_0x55ae7d(0x1f1)]);_0x289c9e[_0x55ae7d(0x287)][_0x55ae7d(0x1ef)](_0x8d1c9d[_0x55ae7d(0x294)],this[_0x55ae7d(0x1de)]),_0x289c9e[_0x55ae7d(0x287)][_0x55ae7d(0x1ef)](_0x8d1c9d[_0x55ae7d(0x268)],this[_0x55ae7d(0x1de)]);const _0x5320a5=await _0x8d1c9d[_0x55ae7d(0x216)](fetch,_0x289c9e);let _0x51eb43='';if(_0x8d1c9d[_0x55ae7d(0x257)](_0x1d8bb9[_0x55ae7d(0x1c5)][_0x55ae7d(0x230)],-0x1*0x6e3+0x239a+0x1cb7*-0x1)){if(_0x8d1c9d[_0x55ae7d(0x207)](_0x8d1c9d[_0x55ae7d(0x1b7)],_0x8d1c9d[_0x55ae7d(0x205)])){let _0x26343b=new Uint8Array(await _0x5320a5[_0x55ae7d(0x1e9)]());_0x51eb43={'mimeType':_0x5320a5[_0x55ae7d(0x287)][_0x55ae7d(0x240)](_0x8d1c9d[_0x55ae7d(0x1ce)]),'data':await this[_0x55ae7d(0x1cb)](_0x26343b,_0x1d8bb9)};}else return _0x20b15e[_0x55ae7d(0x254)]()[_0x55ae7d(0x249)](QXynwH[_0x55ae7d(0x24f)])[_0x55ae7d(0x254)]()[_0x55ae7d(0x27a)](_0x58a337)[_0x55ae7d(0x249)](QXynwH[_0x55ae7d(0x24f)]);}else{if(_0x8d1c9d[_0x55ae7d(0x22b)](_0x8d1c9d[_0x55ae7d(0x23d)],_0x8d1c9d[_0x55ae7d(0x23d)])){const _0x44e7b0=_0x2a2465?function(){const _0x1cd16d=_0x55ae7d;if(_0x8085cc){const _0x294997=_0x524cdb[_0x1cd16d(0x29c)](_0x2b24bd,arguments);return _0x538ab5=null,_0x294997;}}:function(){};return _0x2c8a6c=![],_0x44e7b0;}else _0x51eb43=await _0x5320a5[_0x55ae7d(0x29a)](),_0x51eb43=await this[_0x55ae7d(0x1d2)](_0x51eb43);}return this[_0x55ae7d(0x291)](_0x51eb43),_0x51eb43;}async[_0x13dbda(0x1cb)](_0xe99a30,_0x89f40c){const _0x3974eb=_0x13dbda,_0x49277f={};_0x49277f[_0x3974eb(0x21d)]=_0x3974eb(0x210);const _0x18fa36=_0x49277f,_0xe6d8ee=this[_0x3974eb(0x1eb)](new Uint8Array(_0xe99a30)),_0x36eb4c={};_0x36eb4c[_0x3974eb(0x1db)]=_0xe6d8ee;const _0x538849=_0x36eb4c,_0x510bc1={'iv':CryptoJS[_0x3974eb(0x27f)][_0x3974eb(0x29b)][_0x3974eb(0x285)](_0x18fa36[_0x3974eb(0x21d)]),'mode':CryptoJS[_0x3974eb(0x1fc)][_0x3974eb(0x1f5)],'padding':CryptoJS[_0x3974eb(0x1ee)][_0x3974eb(0x281)]};return this[_0x3974eb(0x243)](CryptoJS[_0x3974eb(0x1d8)][_0x3974eb(0x21e)](_0x538849,_0x89f40c[_0x3974eb(0x1c5)],_0x510bc1));}[_0x13dbda(0x243)](_0x2a9dae){const _0x19d985=_0x13dbda,_0x48005a={};_0x48005a[_0x19d985(0x209)]=function(_0x5a6f10,_0x388af1){return _0x5a6f10<<_0x388af1;},_0x48005a[_0x19d985(0x235)]=function(_0x27b198,_0x5d34ff){return _0x27b198<_0x5d34ff;},_0x48005a[_0x19d985(0x256)]=_0x19d985(0x208),_0x48005a[_0x19d985(0x214)]=function(_0x14e972,_0x322e3f){return _0x14e972&_0x322e3f;},_0x48005a[_0x19d985(0x284)]=function(_0x513b2f,_0x112f81){return _0x513b2f>>_0x112f81;},_0x48005a[_0x19d985(0x1bd)]=function(_0x756469,_0x26e60d){return _0x756469&_0x26e60d;},_0x48005a[_0x19d985(0x1c3)]=function(_0x459462,_0x47bc26){return _0x459462&_0x47bc26;},_0x48005a[_0x19d985(0x225)]=function(_0x484c03,_0x3b58be){return _0x484c03<_0x3b58be;},_0x48005a[_0x19d985(0x23f)]=function(_0x1c0949,_0x87c63d){return _0x1c0949!==_0x87c63d;},_0x48005a[_0x19d985(0x219)]=_0x19d985(0x27b),_0x48005a[_0x19d985(0x232)]=_0x19d985(0x22f),_0x48005a[_0x19d985(0x23a)]=function(_0x41e130,_0x3be1d2){return _0x41e130>>_0x3be1d2;},_0x48005a[_0x19d985(0x21b)]=function(_0x2d4316,_0x34b0cb){return _0x2d4316&_0x34b0cb;},_0x48005a[_0x19d985(0x26b)]=function(_0x5d1946,_0x29c284){return _0x5d1946>>_0x29c284;};const _0x1ac2ff=_0x48005a;let _0x47f9f0=_0x2a9dae[_0x19d985(0x26d)][_0x19d985(0x223)],_0x52b68f=new Uint8Array(_0x1ac2ff[_0x19d985(0x209)](_0x47f9f0,0x1674+0x3*-0x373+-0x1*0xc19)),_0x413a87=-0x9*-0x40e+0x1168+-0x35e6,_0x4f7918,_0x2dfbbe;for(_0x2dfbbe=-0x18cb+-0x2652+0x3f1d;_0x1ac2ff[_0x19d985(0x225)](_0x2dfbbe,_0x47f9f0);_0x2dfbbe++){if(_0x1ac2ff[_0x19d985(0x23f)](_0x1ac2ff[_0x19d985(0x219)],_0x1ac2ff[_0x19d985(0x219)])){let _0x1254bc=_0x4a96c4[_0x19d985(0x26d)][_0x19d985(0x223)],_0x724dc4=new _0x14f215(_0x1ac2ff[_0x19d985(0x209)](_0x1254bc,0x6d2+0x4*0x658+-0x14*0x19c)),_0x1535e8=0x3b*0x1f+-0x1ac3*0x1+0x139e,_0x1e7138,_0x42b01e;for(_0x42b01e=-0x1f1d+-0x3b*-0x3b+0x1184;_0x1ac2ff[_0x19d985(0x235)](_0x42b01e,_0x1254bc);_0x42b01e++){const _0x2c4885=_0x1ac2ff[_0x19d985(0x256)][_0x19d985(0x1e3)]('|');let _0x4ea739=0x2*0x94b+-0xe58*-0x2+0x2f46*-0x1;while(!![]){switch(_0x2c4885[_0x4ea739++]){case'0':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x214)](_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,0x1*0x1442+0x121b+-0xcc7*0x3),0x3*0xab+0xd09*-0x2+0x8*0x322);continue;case'1':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,0x2f*-0x60+-0x1b24+0x2cdc);continue;case'2':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x1bd)](_0x1ac2ff[_0x19d985(0x284)](_0x1e7138,-0x12f1+-0xd*0x107+-0x13*-0x1b4),0x1cde+-0x35e*-0x6+-0x3013);continue;case'3':_0x724dc4[_0x1535e8++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x1e7138,-0x1*0x1b0a+0x5*0x32b+0xc32);continue;case'4':_0x1e7138=_0x249251[_0x19d985(0x26d)][_0x42b01e];continue;}break;}}return _0x724dc4;}else{const _0x3bc1a3=_0x1ac2ff[_0x19d985(0x232)][_0x19d985(0x1e3)]('|');let _0x13091d=0x26e3+0x2*-0xc77+-0xdf5;while(!![]){switch(_0x3bc1a3[_0x13091d++]){case'0':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x1ac2ff[_0x19d985(0x23a)](_0x4f7918,-0x11ad+0xff3+-0x1ca*-0x1),0x1706+0x1d5e+-0x3365);continue;case'1':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x1c3)](_0x4f7918,0x95c+-0x228*-0xe+0x8b*-0x47);continue;case'2':_0x4f7918=_0x2a9dae[_0x19d985(0x26d)][_0x2dfbbe];continue;case'3':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x21b)](_0x1ac2ff[_0x19d985(0x26b)](_0x4f7918,-0xed7*-0x1+0x1265+-0xa*0x352),-0x2491+-0x77d+0x13*0x25f);continue;case'4':_0x52b68f[_0x413a87++]=_0x1ac2ff[_0x19d985(0x284)](_0x4f7918,0x1b38+-0x16f*-0x13+-0x365d);continue;}break;}}}return _0x52b68f;}[_0x13dbda(0x1eb)](_0x7cd1ef){const _0x4ea9fd=_0x13dbda,_0x5d2382={};_0x5d2382[_0x4ea9fd(0x233)]=function(_0x8a2f4f,_0x4e60c3){return _0x8a2f4f<_0x4e60c3;},_0x5d2382[_0x4ea9fd(0x1d4)]=function(_0x4b6473,_0x9fe6f7){return _0x4b6473|_0x9fe6f7;},_0x5d2382[_0x4ea9fd(0x1d7)]=function(_0xef367a,_0xd16ed){return _0xef367a|_0xd16ed;},_0x5d2382[_0x4ea9fd(0x1fa)]=function(_0x2f1e27,_0x5b84d8){return _0x2f1e27|_0x5b84d8;},_0x5d2382[_0x4ea9fd(0x253)]=function(_0x176bf3,_0x40b3b9){return _0x176bf3<<_0x40b3b9;},_0x5d2382[_0x4ea9fd(0x24b)]=function(_0x225cf8,_0xba5f5a){return _0x225cf8<<_0xba5f5a;},_0x5d2382[_0x4ea9fd(0x241)]=function(_0x523c16,_0x20e370){return _0x523c16*_0x20e370;},_0x5d2382[_0x4ea9fd(0x1d3)]=function(_0x5338fd,_0x4588b9){return _0x5338fd===_0x4588b9;},_0x5d2382[_0x4ea9fd(0x279)]=_0x4ea9fd(0x20a),_0x5d2382[_0x4ea9fd(0x274)]=_0x4ea9fd(0x234),_0x5d2382[_0x4ea9fd(0x27c)]=function(_0xe38bdd,_0x4e4cf8){return _0xe38bdd|_0x4e4cf8;},_0x5d2382[_0x4ea9fd(0x1ed)]=function(_0x18e8a1,_0x540fd7){return _0x18e8a1|_0x540fd7;},_0x5d2382[_0x4ea9fd(0x1c9)]=function(_0x36c233,_0x43c2f4){return _0x36c233<<_0x43c2f4;};const _0x5726be=_0x5d2382;let _0x3681ba=[],_0x1f325c=0x1*-0x1763+0x2*-0xd8d+-0x327d*-0x1,_0x4e00a6=_0x7cd1ef[_0x4ea9fd(0x223)];while(_0x5726be[_0x4ea9fd(0x233)](_0x1f325c,_0x4e00a6)){if(_0x5726be[_0x4ea9fd(0x1d3)](_0x5726be[_0x4ea9fd(0x279)],_0x5726be[_0x4ea9fd(0x274)])){let _0x593714=[],_0x4b43f5=-0x262d+0x1062+-0x31d*-0x7,_0x4d6dcb=_0x48788a[_0x4ea9fd(0x223)];while(_0x5726be[_0x4ea9fd(0x233)](_0x4b43f5,_0x4d6dcb)){_0x593714[_0x4ea9fd(0x26a)](_0x5726be[_0x4ea9fd(0x1d4)](_0x5726be[_0x4ea9fd(0x1d7)](_0x5726be[_0x4ea9fd(0x1fa)](_0x5726be[_0x4ea9fd(0x253)](_0x261e7d[_0x4b43f5++],0x769*-0x1+-0x2b*0x7b+0xe*0x203),_0x5726be[_0x4ea9fd(0x253)](_0x304c11[_0x4b43f5++],-0x1*-0x1e3a+0x4cd*0x1+-0x22f7*0x1)),_0x5726be[_0x4ea9fd(0x24b)](_0x2dd2b4[_0x4b43f5++],0xc37*-0x1+0x149b+-0x85c)),_0x1815ae[_0x4b43f5++]));}return{'sigBytes':_0x5726be[_0x4ea9fd(0x241)](_0x593714[_0x4ea9fd(0x223)],-0xa6*-0x12+-0x2*-0x642+-0x182c),'words':_0x593714};}else _0x3681ba[_0x4ea9fd(0x26a)](_0x5726be[_0x4ea9fd(0x1d7)](_0x5726be[_0x4ea9fd(0x27c)](_0x5726be[_0x4ea9fd(0x1ed)](_0x5726be[_0x4ea9fd(0x24b)](_0x7cd1ef[_0x1f325c++],0x161*-0x2+0xca4+-0x9ca*0x1),_0x5726be[_0x4ea9fd(0x253)](_0x7cd1ef[_0x1f325c++],0x1*-0x7b2+-0x18d6*0x1+0x7*0x4a8)),_0x5726be[_0x4ea9fd(0x1c9)](_0x7cd1ef[_0x1f325c++],0x6d*0x26+0x22a6+0xcb3*-0x4)),_0x7cd1ef[_0x1f325c++]));}return{'sigBytes':_0x5726be[_0x4ea9fd(0x241)](_0x3681ba[_0x4ea9fd(0x223)],0x26d8+0x62a*0x3+-0x2e*0x13f),'words':_0x3681ba};}} export default MangaDig; diff --git a/src/web/mjs/connectors/MangaEffect.mjs b/src/web/mjs/connectors/MangaEffect.mjs index 49b449cf73..2090f6eb2d 100644 --- a/src/web/mjs/connectors/MangaEffect.mjs +++ b/src/web/mjs/connectors/MangaEffect.mjs @@ -12,21 +12,4 @@ export default class MangaEffect extends WordPressMadara { _createMangaRequest(page) { return new Request(new URL(`/manga/page/${page}/`, this.url), this.requestOptions); } - - async _getPages(chapter) { - const url = new URL(chapter.id, this.url); - const request = new Request(url, this.requestOptions); - const script = ` - new Promise((resolve, reject) => { - setTimeout(() => { - var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { - format: CryptoJSAesJson - }).toString(CryptoJS.enc.Utf8)); - resolve(JSON.parse(imgdata)); - },3000); - }); - `; - const data = await Engine.Request.fetchUI(request, script); - return data.map(picture => this.createConnectorURI({url : picture, referer : url})); - } } diff --git a/src/web/mjs/connectors/MangaHub.mjs b/src/web/mjs/connectors/MangaHub.mjs index 7067870aae..7931e78671 100644 --- a/src/web/mjs/connectors/MangaHub.mjs +++ b/src/web/mjs/connectors/MangaHub.mjs @@ -11,8 +11,8 @@ export default class MangaHub extends Connector { super.label = 'MangaHub'; this.tags = [ 'manga', 'english' ]; this.url = 'https://mangahub.io'; - this.apiURL = 'https://api.mghubcdn.com/graphql'; - this.cdnURL = 'https://img.mghubcdn.com/file/imghub/'; + this.apiURL = 'https://api2.mangahub.io/graphql'; + this.cdnURL = 'https://imgx.mghcdn.com'; this.path = 'm01'; this.requestOptions.headers.set('x-origin', this.url); diff --git a/src/web/mjs/connectors/MangaNel.mjs b/src/web/mjs/connectors/MangaNel.mjs index a79af47956..8677e83e0d 100644 --- a/src/web/mjs/connectors/MangaNel.mjs +++ b/src/web/mjs/connectors/MangaNel.mjs @@ -33,7 +33,7 @@ export default class MangaNel extends Connector { canHandleURI(uri) { // Test: https://regex101.com/r/aPR3zy/3/tests - return /^(chap|read)?manganato\.com$/.test(uri.hostname); + return /^(chap|read)?manganato\.(com|to)$/.test(uri.hostname); } async _getMangaFromURI(uri) { diff --git a/src/web/mjs/connectors/MangaPill.mjs b/src/web/mjs/connectors/MangaPill.mjs index 263a0d20d9..b66898994f 100644 --- a/src/web/mjs/connectors/MangaPill.mjs +++ b/src/web/mjs/connectors/MangaPill.mjs @@ -9,6 +9,7 @@ export default class MangaPill extends Connector { super.label = 'Mangapill'; this.tags = [ 'manga', 'english' ]; this.url = 'https://mangapill.com'; + this.requestOptions.headers.set('x-referer', this.url); } async _getMangaFromURI(uri) { @@ -54,6 +55,6 @@ export default class MangaPill extends Connector { async _getPages(chapter) { let request = new Request(new URL(chapter.id, this.url), this.requestOptions); let data = await this.fetchDOM(request, 'source'); - return data.map(element => this.getAbsolutePath(element.dataset.src, request.url)); + return data.map(element => this.createConnectorURI(this.getAbsolutePath(element.dataset.src, request.url))); } } diff --git a/src/web/mjs/connectors/MangaRaw.mjs b/src/web/mjs/connectors/MangaRaw.mjs index 46f44f7c86..6603c9facb 100644 --- a/src/web/mjs/connectors/MangaRaw.mjs +++ b/src/web/mjs/connectors/MangaRaw.mjs @@ -8,7 +8,7 @@ export default class MangaRaw extends Connector { super.id = 'mangaraw'; super.label = 'MangaGeko'; this.tags = ['multi-lingual', 'manga', 'webtoon']; - this.url = 'https://www.mangageko.com'; + this.url = 'https://www.mgeko.com'; } async _getMangaFromURI(uri) { diff --git a/src/web/mjs/connectors/MangaSail.mjs b/src/web/mjs/connectors/MangaSail.mjs index bfc66ad6a4..a022e6e596 100644 --- a/src/web/mjs/connectors/MangaSail.mjs +++ b/src/web/mjs/connectors/MangaSail.mjs @@ -7,7 +7,7 @@ export default class MangaSail extends Connector { super.id = 'mangasail'; super.label = 'MangaSail'; this.tags = [ 'manga', 'english' ]; - this.url = 'https://www.mangasail.net'; + this.url = 'https://sailmg.com'; this.config = { username: { diff --git a/src/web/mjs/connectors/MangaSect.mjs b/src/web/mjs/connectors/MangaSect.mjs index f5945dac76..9605bc3459 100644 --- a/src/web/mjs/connectors/MangaSect.mjs +++ b/src/web/mjs/connectors/MangaSect.mjs @@ -1,70 +1,40 @@ -import Connector from '../engine/Connector.mjs'; -import Manga from '../engine/Manga.mjs'; +import MojoPortalComic from './templates/MojoPortalComic.mjs'; -export default class MangaSect extends Connector { +export default class MangaSect extends MojoPortalComic { constructor() { super(); super.id = 'mangasect'; super.label = 'MangaSect'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://mangasect.com'; + this.url = 'https://mangasect.net'; this.path = '/all-manga/'; } - async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'header h1'); - return new Manga(this, uri.pathname, data[0].textContent.trim()); - } + async _getPages(chapter) { + const request = new Request(new URL(chapter.id, this.url), this.requestOptions); + const script = ` + new Promise(resolve => { - 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, 'div.blog-pager span:last-of-type a'); - const pageCount = parseInt(data[0].href.match(/\/(\d)+\//)[1]); - for(let page = 1; page <= pageCount; page++) { - const mangas = await this._getMangasFromPage(page); - mangaList.push(...mangas); - } - return mangaList; - } + function parseResults(data) { + const dom = new DOMParser().parseFromString(data, 'text/html'); + let nodes = [...dom.querySelectorAll('img')]; + resolve(nodes.map(element => element.dataset.original)); + } - async _getMangasFromPage(page) { - const uri = new URL(this.path + page, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.grid div.text-center > a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim() - }; - }); + const ajaxendpoint = new URL('/ajax/image/list/chap/' + CHAPTER_ID, window.location.href); + fetch(ajaxendpoint, { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + } + }) + .then(response => response.json()) + .then(jsonData => { + parseResults(jsonData.html); + }); + }); + `; + return Engine.Request.fetchUI(request, script); } - async _getChapters(manga) { - const uri = new URL(manga.id, this.url); - const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'li.chapter > a'); - return data.map(element => { - return { - id: this.getRootRelativeOrAbsoluteLink(element, this.url), - title: element.text.trim() - }; - }); - } - - async _getPages(chapter) { - const referer = new URL(chapter.id, this.url); - const chapterid = chapter.id.match(/\/([\d]+)$/)[1]; - const uri = new URL ('/ajax/image/list/chap/' + chapterid, this.url); - const request = new Request(uri, this.requestOptions); - request.headers.set('x-referer', referer); - request.headers.set('X-Requested-With', 'XMLHttpRequest'); - const response = await this.fetchJSON(request); - const dom = this.createDOM(response.html); - const data = dom.querySelectorAll('source[data-src]'); - return Array.from(data).map(image => this.getAbsolutePath(image.dataset['src'], request.url)); - } } diff --git a/src/web/mjs/connectors/MangaSehri.mjs b/src/web/mjs/connectors/MangaSehri.mjs index d72fdef946..7924aedec1 100644 --- a/src/web/mjs/connectors/MangaSehri.mjs +++ b/src/web/mjs/connectors/MangaSehri.mjs @@ -7,13 +7,15 @@ export default class MangaSehri extends WordPressMadara { super.id = 'mangasehri'; super.label = 'Manga Şehri'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://mangasehri.com'; + this.url = 'https://manga-sehri.com'; + this.requestOptions.headers.set('x-referer', this.url); } 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(element => this.getAbsolutePath(element.dataset.src || element, request.url)).filter(image => !/grumpybumpers/.test(image)); + const images = data.map(element =>this.getAbsolutePath(element.dataset.src || element, request.url)).filter(image => !/grumpybumpers/.test(image)); + return images.map(image => this.createConnectorURI({url : image, referer : this.url})); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaStarz.mjs b/src/web/mjs/connectors/MangaStarz.mjs index 22e895a838..7e6dca81c5 100644 --- a/src/web/mjs/connectors/MangaStarz.mjs +++ b/src/web/mjs/connectors/MangaStarz.mjs @@ -7,6 +7,6 @@ export default class MangaStarz extends WordPressMadara { super.id = 'mangastarz'; super.label = 'مانجا ستارز (Mangastarz)'; this.tags = [ 'manga', 'webtoon', 'arabic' ]; - this.url = 'https://mangastarz.org'; + this.url = 'https://manga-starz.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaSusuku.mjs b/src/web/mjs/connectors/MangaSusuku.mjs new file mode 100644 index 0000000000..bcab1eccf1 --- /dev/null +++ b/src/web/mjs/connectors/MangaSusuku.mjs @@ -0,0 +1,13 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class MangaSusuku extends WordPressMangastream { + + constructor() { + super(); + super.id = 'mangasusuku'; + super.label = 'MangaSusuku'; + this.tags = ['manga', 'indonesian']; + this.url = 'https://mangasusuku.xyz '; + this.path = '/komik/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/MangaSwat.mjs b/src/web/mjs/connectors/MangaSwat.mjs index 4fc61961f3..e772229c6a 100644 --- a/src/web/mjs/connectors/MangaSwat.mjs +++ b/src/web/mjs/connectors/MangaSwat.mjs @@ -7,7 +7,7 @@ export default class MangaSwat extends WordPressMangastream { super.id = 'mangaswat'; super.label = 'Goldragon (SWAT Manga)'; this.tags = ['webtoon', 'arabic']; - this.url = 'https://goldragon.me'; + this.url = 'https://swatmanhua.com'; this.path = '/manga/list-mode'; this.queryChapters = 'div.bxcl ul li span.lchx a'; diff --git a/src/web/mjs/connectors/MangaTR.mjs b/src/web/mjs/connectors/MangaTR.mjs index ee9f49a212..baa5929866 100644 --- a/src/web/mjs/connectors/MangaTR.mjs +++ b/src/web/mjs/connectors/MangaTR.mjs @@ -8,7 +8,7 @@ export default class MangaTR extends FlatManga { super.label = 'Manga-TR'; this.tags = [ 'manga', 'turkish' ]; this.url = 'https://manga-tr.com'; - + this.path = '/manga-list.html'; this.queryMangaTitle = 'meta[property="og:title"]'; this.queryMangas = 'div.container a[data-toggle="mangapop"]'; this.requestOptions.headers.set('x-referer', this.url); @@ -62,4 +62,4 @@ export default class MangaTR extends FlatManga { }; }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaTX.mjs b/src/web/mjs/connectors/MangaTX.mjs index 8857e45e7b..43fb39a6ec 100644 --- a/src/web/mjs/connectors/MangaTX.mjs +++ b/src/web/mjs/connectors/MangaTX.mjs @@ -7,6 +7,6 @@ export default class MangaTX extends WordPressMadara { super.id = 'mangatx'; super.label = 'Mangatx'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://mangatx.com'; + this.url = 'https://mangatx.to'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/MangaWOW.mjs b/src/web/mjs/connectors/MangaWOW.mjs index 1cff3d9cb4..9a084984e9 100644 --- a/src/web/mjs/connectors/MangaWOW.mjs +++ b/src/web/mjs/connectors/MangaWOW.mjs @@ -7,6 +7,6 @@ export default class MangaWOW extends WordPressMadara { super.id = 'mangawow'; super.label = 'MangaWOW'; this.tags = [ 'webtoon', 'turkish' ]; - this.url = 'https://mangawow.net'; + this.url = 'https://mangawow.org'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Mangalek.mjs b/src/web/mjs/connectors/Mangalek.mjs index 319f0a2306..2950438b50 100644 --- a/src/web/mjs/connectors/Mangalek.mjs +++ b/src/web/mjs/connectors/Mangalek.mjs @@ -7,7 +7,7 @@ export default class Mangalek extends WordPressMadara { super.id = 'mangalek'; super.label = 'مانجا ليك (Mangalek)'; this.tags = [ 'manga', 'webtoon', 'arabic' ]; - this.url = 'https://mangaleku.com'; + this.url = 'https://lekmanga.net'; this.queryTitleForURI = 'div.profile-manga div.post-title h1'; this.requestOptions.headers.set('x-referer', this.url); } diff --git a/src/web/mjs/connectors/MangasChan.mjs b/src/web/mjs/connectors/MangasChan.mjs index d31f302390..e179276222 100644 --- a/src/web/mjs/connectors/MangasChan.mjs +++ b/src/web/mjs/connectors/MangasChan.mjs @@ -7,7 +7,7 @@ export default class MangasChan extends WordPressMangastream { super.id = 'mangaschan'; super.label = 'Mangás Chan'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://mangaschan.com'; + this.url = 'https://mangaschan.net'; this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ManhuaPlus.mjs b/src/web/mjs/connectors/ManhuaPlus.mjs index 7458e8e5d0..74ea28d2d8 100644 --- a/src/web/mjs/connectors/ManhuaPlus.mjs +++ b/src/web/mjs/connectors/ManhuaPlus.mjs @@ -1,40 +1,98 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import Connector from '../engine/Connector.mjs'; +import Manga from '../engine/Manga.mjs'; -export default class ManhuaPlus extends WordPressMadara { +export default class ManhuaPlus extends Connector { constructor() { super(); super.id = 'manhuaplus'; super.label = 'ManhuaPlus'; this.tags = [ 'webtoon', 'english' ]; - this.url = 'https://manhuaplus.com'; + this.url = 'https://manhuaplus.org'; + this.path = '/all-manga/'; - this.queryPages = 'figure source, div.page-break source, div.chapter-video-frame source, div.reading-content p source'; - this.requestOptions.headers.set('x-referer', this.url); - this.requestOptions.headers.set('x-origin', this.url); - this.requestOptions.headers.set('x-user-agent', 'Mozilla/5.0 (Windows NT 10.0; rv:111.0) Gecko/20100101 Firefox/111.0'); + } + + async _getMangaFromURI(uri) { + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'header h1'); + return new Manga(this, uri.pathname, data[0].textContent.trim()); } async _getMangas() { let mangaList = []; - let request = new Request(new URL('', this.url), this.requestOptions); - let data = await this.fetchDOM(request, 'div.wp-pagenavi a.last'); - let pageCount = parseInt(data[0].href.match(/\d+/)[0]); - for(let page = 0; page <= pageCount; page++) { - let mangas = await this._getMangasFromPage(page); + const uri = new URL(this.path, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.blog-pager span:last-of-type a'); + const pageCount = parseInt(data[0].href.match(/\/(\d)+\//)[1]); + for(let page = 1; page <= pageCount; page++) { + const mangas = await this._getMangasFromPage(page); mangaList.push(...mangas); } return mangaList; } async _getMangasFromPage(page) { - let request = new Request(new URL('/page/' + page+'/', this.url), this.requestOptions); - let data = await this.fetchDOM(request, 'div.item-thumb a'); + const uri = new URL(this.path + page, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.grid div.text-center > a'); return data.map(element => { return { - id: this.getRootRelativeOrAbsoluteLink(element, request.url), - title: element.title.trim() + 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, 'li.chapter > a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + + async _getPages(chapter) { + const script = ` + new Promise((resolve, reject) => { + + function parseResults(data) { + const dom = new DOMParser().parseFromString(data, 'text/html'); + let nodes = [...dom.querySelectorAll('div.separator')]; + if (nodes.length == 0) reject(); + + //sort if needed + if (nodes[0].hasAttribute('data-index')) { + nodes = nodes.sort(function (a, b) { + const za = parseInt(a.dataset.index); + const zb = parseInt(b.dataset.index); + return za - zb; + }); + } + resolve(nodes.map(element => { + const anchorElement = element.querySelector('a.readImg'); + return anchorElement.href ; + })); + } + + const ajaxendpoint = new URL('/ajax/image/list/chap/'+ CHAPTER_ID, window.location.href); + fetch(ajaxendpoint, { + headers: { + 'X-Requested-With' : 'XMLHttpRequest', + }}) + .then(response => response.json()) + .then(jsonData => { + parseResults(jsonData.html); + }); + }); + `; + + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + return Engine.Request.fetchUI(request, script); + } } diff --git a/src/web/mjs/connectors/ManhwaFreak.mjs b/src/web/mjs/connectors/ManhwaFreak.mjs index a919c3b417..1c49f18d72 100644 --- a/src/web/mjs/connectors/ManhwaFreak.mjs +++ b/src/web/mjs/connectors/ManhwaFreak.mjs @@ -7,7 +7,7 @@ export default class ManhwaFreak extends WordPressMangastream { super.id = 'manhwafreak'; super.label = 'ManhwaFreak'; this.tags = [ 'manga', 'english', 'webtoon']; - this.url = 'https://manhwa-freak.com'; + this.url = 'https://freakcomic.com'; this.path = '/manga/'; this.queryMangas = 'div.lastest-serie > a'; this.queryChapters = 'div.chapter-li > a'; @@ -15,6 +15,7 @@ export default class ManhwaFreak extends WordPressMangastream { } async _getPages(chapter) { - return (await super._getPages(chapter)).filter(page => !page.includes('ajax-loader')); + return (await super._getPages(chapter)) + .filter(page => !page.includes('ajax-loader') && !page.endsWith('/100.5.gif')); } } diff --git a/src/web/mjs/connectors/ManhwaLatino.mjs b/src/web/mjs/connectors/ManhwaLatino.mjs index 9840356cfd..9050403804 100644 --- a/src/web/mjs/connectors/ManhwaLatino.mjs +++ b/src/web/mjs/connectors/ManhwaLatino.mjs @@ -8,5 +8,36 @@ export default class ManhwaLatino extends WordPressMadara { super.label = 'Manhwa-Latino'; this.tags = [ 'webtoon', 'hentai', 'spanish' ]; this.url = 'https://manhwa-latino.com'; + this.requestOptions.headers.set('x-referer', this.url); + + } + + _createMangaRequest(page) { + return new Request(new URL(`/manga/page/${page}/`, this.url), this.requestOptions); + } + + async _getChapters(manga) { + const uri = new URL(manga.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'li.wp-manga-chapter div.mini-letters > a'); + return data.map(element => { + return { + id: this.getRootRelativeOrAbsoluteLink(element, this.url), + title: element.text.trim() + }; + }); + } + + async _getPages(chapter) { + const uri = new URL(chapter.id, this.url); + const request = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(request, 'div.page-break source.img-responsive'); + return data.map(image => { + const payload = { + url : image.getAttribute('data-src'), + referer : request.url + }; + return this.createConnectorURI(payload); + }); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Miauscan.mjs b/src/web/mjs/connectors/Miauscan.mjs index 06b88d291a..ff3d1ba892 100644 --- a/src/web/mjs/connectors/Miauscan.mjs +++ b/src/web/mjs/connectors/Miauscan.mjs @@ -7,7 +7,59 @@ export default class MiauScan extends WordPressMangastream { super.id = 'miauscan'; super.label = 'MiauScan'; this.tags = [ 'manga', 'spanish', 'portuguese', 'scanlation' ]; - this.url = 'https://miauscans.com'; + this.url = 'https://miaucomics.org'; this.path = '/manga/list-mode/'; + + this.novelContainer = 'div.entry-content'; + this.novelContent = 'div#readerarea.rdminimal'; + this.novelFormat = 'image/png'; + this.novelWidth = '56em';// parseInt(1200 / window.devicePixelRatio) + 'px'; + this.novelPadding = '1.5em'; + } + + async _getPages(chapter) { + let request = new Request(new URL(chapter.id, this.url), this.requestOptions); + const data = await this.fetchDOM(request, 'div#readerarea.rdminimal'); + //reader for novel have this class. When its a manga there is no class at all so we call super. + if (data.length == 0) { + return await super._getPages(chapter).filter(image => !/dis2\.jpg/.test(image)); + } + const darkmode = Engine.Settings.NovelColorProfile(); + const script = ` + new Promise((resolve, reject) => { + document.body.style.width = '${this.novelWidth}'; + document.body.style.backgroundColor = '${darkmode.background}'; + let container = document.querySelector('${this.novelContainer}'); + container.style.maxWidth = '${this.novelWidth}'; + container.style.padding = '0'; + container.style.margin = '0'; + container.style.backgroundColor = '${darkmode.background}'; + + let novel = document.querySelector('${this.novelContent}'); + 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); + resolve(canvas.toDataURL('${this.novelFormat}')); + } + catch (error){ + reject(error) + } + } + script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; + document.body.appendChild(script); + }); + `; + return [await Engine.Request.fetchUI(request, script, 30000, true)]; } } diff --git a/src/web/mjs/connectors/MonzeeKomik.mjs b/src/web/mjs/connectors/MonzeeKomik.mjs new file mode 100644 index 0000000000..3ad2366838 --- /dev/null +++ b/src/web/mjs/connectors/MonzeeKomik.mjs @@ -0,0 +1,19 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class MonzeeKomik extends WordPressMangastream { + + constructor() { + super(); + super.id = 'monzeekomik'; + super.label = 'MonzeeKomik'; + this.tags = ['manga', 'manhwa', 'indonesian']; + this.url = 'https://monzeekomik.my.id'; + this.path = '/manga/list-mode/'; + } + + async _getMangas() { + const mangas = await super._getMangas(); + mangas.forEach(manga => manga.title = manga.title.replace(/Bahasa Indonesia$/i, '').trim()); + return mangas; + } +} diff --git a/src/web/mjs/connectors/MoonWitchInLove.mjs b/src/web/mjs/connectors/MoonWitchInLove.mjs index 4e6af0bded..661d9ed26a 100644 --- a/src/web/mjs/connectors/MoonWitchInLove.mjs +++ b/src/web/mjs/connectors/MoonWitchInLove.mjs @@ -7,6 +7,6 @@ export default class MoonWitchInLove extends WordPressMadara { super.id = 'moonwitchinlove'; super.label = 'Moon Witch In Love'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://moonwitchinlove.com'; + this.url = 'https://moonwitchinlovescan.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NeoxScan.mjs b/src/web/mjs/connectors/NeoxScan.mjs index 1118962c6f..99c14790e4 100644 --- a/src/web/mjs/connectors/NeoxScan.mjs +++ b/src/web/mjs/connectors/NeoxScan.mjs @@ -7,7 +7,7 @@ export default class NeoxScan extends WordPressMadara { super.id = 'neoxscan'; super.label = 'Neox Scanlator'; this.tags = [ 'manga', 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://nexoscans.com'; + this.url = 'https://nexoscans.net'; this.queryTitleForURI = '.post-title'; this.requestOptions.headers.set('x-referer', this.url); } diff --git a/src/web/mjs/connectors/NicoNicoSeiga.mjs b/src/web/mjs/connectors/NicoNicoSeiga.mjs index f7e97e33aa..68159e58f5 100644 --- a/src/web/mjs/connectors/NicoNicoSeiga.mjs +++ b/src/web/mjs/connectors/NicoNicoSeiga.mjs @@ -14,8 +14,7 @@ export default class NicoNicoSeiga extends Connector { }; this.mangaListPage = "/manga/list"; - this.mangaListEndPoint = "/ajax/manga/list"; - + this.queryManga = 'div#comic_list ul li.mg_item div.mg_title div.title a'; this.querySeriesCount = 'div#main div#mg_main_column'; this.queryMangaTitle = 'div.main_title h1'; @@ -23,7 +22,6 @@ export default class NicoNicoSeiga extends Connector { this.queryChapters = 'div.mg_episode_list div.inner ul li.episode_item div.episode div.description div.title a'; this.queryPages = 'div.pages ul#page_contents li.page div.note source.lazyload'; - this.pageTemplateURL = 'https://seiga.nicovideo.jp/image/source/'; } async _getMangaFromURI(uri) { @@ -36,11 +34,11 @@ export default class NicoNicoSeiga extends Connector { async _getMangasFromRequest(uri) { let request = new Request(uri, this.requestOptions); - let data = await this.fetchJSON(request); - return data.map(series => { + let data = await this.fetchDOM(request, this.queryManga); + return data.map(anchor => { return { - id: this.getRootRelativeOrAbsoluteLink('/comic/' + series.id, request.url), - title: series.title + id: anchor.pathname, + title: anchor.text }; }); } @@ -50,7 +48,7 @@ export default class NicoNicoSeiga extends Connector { let data = await this.fetchDOM(request, this.querySeriesCount); let totalPages = Math.ceil(data[0].dataset.count/10); let mangaList = []; - let uri = new URL(this.mangaListEndPoint, this.url); + let uri = new URL(this.mangaListPage, this.url); for(let page = 1; page <= totalPages; page++) { uri.searchParams.set('page', page); let mangas = await this._getMangasFromRequest(uri); @@ -84,27 +82,18 @@ export default class NicoNicoSeiga extends Connector { } async _handleConnectorURI(payload) { - try { - // first try to get high quality image (await promise, otherwise try/catch won't work) - let data = await super._handleConnectorURI(this.pageTemplateURL + payload.id); - if(data.mimeType.startsWith('image/')) { - return data; - } - throw new Error('Failed to get high quality image => downloading low quality image!'); - } catch(error) { - // get low quality DRM image as fallback - let uri = new URL(payload.original); - let request = new Request(uri, this.requestOptions); - let response = await fetch(request); - let encrypted = new Uint8Array(await response.arrayBuffer()); - let key = this._getKeyFromUrl(payload.original); - let buffer = { - mimeType: 'application/octet-stream', - data: this._decrypt(encrypted, key) - }; - this._applyRealMime(buffer); - return buffer; - } + let uri = new URL(payload.original); + let request = new Request(uri, this.requestOptions); + let response = await fetch(request); + let encrypted = new Uint8Array(await response.arrayBuffer()); + let key = this._getKeyFromUrl(payload.original); + let buffer = { + mimeType: 'application/octet-stream', + data: this._decrypt(encrypted, key) + }; + this._applyRealMime(buffer); + return buffer; + //} } /********************************* @@ -128,4 +117,4 @@ export default class NicoNicoSeiga extends Connector { e[n] = e[n] ^ r[n % i]; return e; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NinjaScan.mjs b/src/web/mjs/connectors/NinjaScan.mjs index 703a702e3c..7049eca3c8 100644 --- a/src/web/mjs/connectors/NinjaScan.mjs +++ b/src/web/mjs/connectors/NinjaScan.mjs @@ -7,6 +7,6 @@ export default class NinjaScan extends WordPressMadara { super.id = 'ninjascan'; super.label = 'Ninja Scan'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://ninjascan.xyz'; + this.url = 'https://ninjascan.site'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/NiveraFansub.mjs b/src/web/mjs/connectors/NiveraFansub.mjs index ae34a29444..ee42c9c194 100644 --- a/src/web/mjs/connectors/NiveraFansub.mjs +++ b/src/web/mjs/connectors/NiveraFansub.mjs @@ -7,7 +7,7 @@ export default class NiveraFansub extends WordPressMadara { super.id = 'niverafansub'; super.label = 'Nivera Fansub'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://niverafansub.com'; + this.url = 'https://niverafansub.co'; this.requestOptions.headers.set('x-referer', this.url); } } \ No newline at end of file diff --git a/src/web/mjs/connectors/Nonbiri.mjs b/src/web/mjs/connectors/Nonbiri.mjs index 498c0c265c..420ec7cff8 100644 --- a/src/web/mjs/connectors/Nonbiri.mjs +++ b/src/web/mjs/connectors/Nonbiri.mjs @@ -5,9 +5,9 @@ export default class Nonbiri extends WordPressMangastream { constructor() { super(); super.id = 'nonbiri'; - super.label = 'Nonbiri'; + super.label = 'Comic21'; this.tags = ['manga', 'indonesian']; - this.url = 'https://nonbiri.space'; + this.url = 'https://comic21.me'; this.path = '/manga/list-mode/'; } } diff --git a/src/web/mjs/connectors/Nyrax.mjs b/src/web/mjs/connectors/Nyrax.mjs new file mode 100644 index 0000000000..958dc19b3e --- /dev/null +++ b/src/web/mjs/connectors/Nyrax.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Nyrax extends WordPressMangastream { + constructor() { + super(); + super.id = 'nyrax'; + super.label = 'Nyrax'; + this.tags = ['webtoon', 'english', 'scanlation']; + this.url = 'https://nyraxmanga.com'; + this.path = '/manga/list-mode/'; + } +} \ No newline at end of file diff --git a/src/web/mjs/connectors/Opiatoon.mjs b/src/web/mjs/connectors/Opiatoon.mjs index 9948fc6e18..76a4c18f31 100644 --- a/src/web/mjs/connectors/Opiatoon.mjs +++ b/src/web/mjs/connectors/Opiatoon.mjs @@ -7,9 +7,9 @@ export default class Opiatoon extends WordPressMadara { super.id = 'opiatoon'; super.label = 'Opiatoon (Opia&Shipperland)'; this.tags = [ 'manga', 'turkish', 'webtoon' ]; - this.url = 'https://opiatoon.org'; + this.url = 'https://opiatoon.biz'; this.links = { - login: 'https://opiatoon.org/login' + login: 'https://opiatoon.biz/login' }; } } diff --git a/src/web/mjs/connectors/PojokManga.mjs b/src/web/mjs/connectors/PojokManga.mjs index e43b910a2c..4055a4a690 100644 --- a/src/web/mjs/connectors/PojokManga.mjs +++ b/src/web/mjs/connectors/PojokManga.mjs @@ -7,8 +7,7 @@ export default class PojokManga extends WordPressMadara { super.id = 'pojokmanga'; super.label = 'PojokManga'; this.tags = [ 'manga', 'webtoon', 'indonesian' ]; - this.url = 'https://pojokmanga.com'; - + this.url = 'https://pojokmanga.id'; this.queryTitleForURI = 'div.profile-manga div.post-title h1'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/PrismaScan.mjs b/src/web/mjs/connectors/PrismaScan.mjs index 06b1725034..03eca8e8cd 100644 --- a/src/web/mjs/connectors/PrismaScan.mjs +++ b/src/web/mjs/connectors/PrismaScan.mjs @@ -5,8 +5,8 @@ export default class PrismaScan extends WordPressMadara { constructor() { super(); super.id = 'prismascans'; - super.label = 'Prisma Scan'; + super.label = 'Demon Scan'; this.tags = [ 'webtoon', 'portuguese' ]; - this.url = 'https://prismascans.net'; + this.url = 'https://demonsect.com.br'; } } diff --git a/src/web/mjs/connectors/RandomScan.mjs b/src/web/mjs/connectors/RandomScan.mjs index 5d3f8a0939..a995a09406 100644 --- a/src/web/mjs/connectors/RandomScan.mjs +++ b/src/web/mjs/connectors/RandomScan.mjs @@ -4,8 +4,8 @@ export default class RandomScan extends WordPressMadara { constructor() { super(); super.id = 'randomscan'; - super.label = 'Random Scans'; + super.label = 'Lura Toon'; this.tags = [ 'manga', 'webtoon', 'portuguese' ]; - this.url = 'https://randomscanlators.net'; + this.url = 'https://luratoon.com'; } } diff --git a/src/web/mjs/connectors/ReaperScans.mjs b/src/web/mjs/connectors/ReaperScans.mjs index f52bb0f539..1e5a56e795 100644 --- a/src/web/mjs/connectors/ReaperScans.mjs +++ b/src/web/mjs/connectors/ReaperScans.mjs @@ -7,15 +7,16 @@ export default class ReaperScans extends Connector { super.id = 'reaperscans'; super.label = 'Reaper Scans'; this.tags = ['webtoon', 'english']; - this.url = 'https://reapercomics.com'; + this.url = 'https://reaperscans.com'; this.links = { - login: 'https://reapercomics.com/login' + login: 'https://reaperscans.com/login' }; + this.requestOptions.headers.set('x-referer', this.url); this.path = '/comics'; this.queryMangas = 'a.my-2.text-sm.font-medium.text-white.hover\\3A text-blue-700'; this.queryChapters = 'div[wire\\3A id] ul[role] li a'; - this.queryPages = 'source.max-w-full.mx-auto.display-block'; - this.queryMangaTitle = 'div.overflow-hidden h1'; + this.queryPages = 'main source.max-w-full'; + this.queryMangaTitle = 'h1.text-xl'; this.config = { throttle: { label: 'Chapter list Throttle [ms]', @@ -27,18 +28,22 @@ export default class ReaperScans extends Connector { } }; } + async _getMangas() { - let mangaList = []; + const mangaList = []; for (let page = 1, run = true; run; page++) { + await this.wait(this.config.throttle.value); let mangas = await this._getMangasFromPage(page); mangas.length > 0 ? mangaList.push(...mangas) : run = false; } 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); + const uri = new URL(this.path + '?page='+page, this.url); + const request = new Request(uri, this.requestOptions); + await this.wait(this.config.throttle.value); + const data = await this.fetchDOM(request, this.queryMangas); return data.map(element => { return{ id: this.getRootRelativeOrAbsoluteLink(element, request.url), @@ -46,61 +51,48 @@ export default class ReaperScans extends Connector { }; }); } + async _getChapters(manga) { - const messageurl="https://reaperscans.com/livewire/message/"; - let chapterList = []; - let requestdata = undefined; - let chapters = []; - //fetch first page for csrf-token, wireid and other informations - let url = new URL(manga.id, this.url); - let request = new Request(url, this.requestOptions); - let response = await fetch(request); - let responseText = await response.text(); - //and chapters from first page - let parser = new DOMParser(); - let doc = parser.parseFromString(responseText, 'text/html'); - chapters = this.getChaptersFromDoc(doc); - chapterList.push(...chapters); - //build payload from first page data - requestdata = this.createPayloadForChapterPages(doc); - for (let page = 2, run = true; run; page++) { - chapters = []; - url = new URL(requestdata.payload.fingerprint.name, messageurl); - request = new Request(url, { - method: 'POST', - mode: 'cors', - referrer: requestdata.referrer, - referrerPolicy: 'strict-origin-when-cross-origin', - body: JSON.stringify(requestdata.payload), - credentials: 'include', - headers: { - 'Accept': 'text/html, application/xhtml+xml', - "Content-Type": "application/json", - "X-CSFRF-TOKEN": requestdata.token, - "X-Livewire": "true", - 'x-referrer': requestdata.referrer, - } - }); - response = await fetch(request); - let data = await response.json(); - //data contains the html nodes with the chapters - //and the informations needed to request the next page - doc = parser.parseFromString(data.effects.html, 'text/html'); - chapters = this.getChaptersFromDoc(doc); - chapters.length > 0 ? chapterList.push(...chapters) : run = false; - //update payload data using response data, for next fetch - requestdata.payload.serverMemo.checksum = data.serverMemo.checksum; - requestdata.payload.serverMemo.htmlHash = data.serverMemo.htmlHash; - requestdata.referrer = new URL(manga.id+"?page="+page, this.url).href; - requestdata.payload.serverMemo.data.page = page; - requestdata.payload.serverMemo.data.paginators.page = page; - requestdata.payload.updates[0].payload.params[0] = page+1; + const uri = new URL(manga.id, this.url); + const [ data ] = await this.fetchDOM(new Request(uri, this.requestOptions), 'main div[wire\\:id][wire\\:initial-data]'); + const chapterList = this.getChaptersFromDoc(data); + const body = JSON.parse(data.getAttribute('wire:initial-data')); + delete body.effects; + for(let page = 2, run = true; run; page++) { await this.wait(this.config.throttle.value); + const chapters = await this.getChaptersFromPage(manga, page, body); + chapters.length > 0 ? chapterList.push(...chapters) : run = false; } return chapterList; } + + async getChaptersFromPage(manga, page, body) { + const uri = new URL(manga.id, this.url); + uri.pathname = '/livewire/message/' + body.fingerprint.name; + + body.updates = [{ + type: 'callMethod', + payload: { + id: '00000', + method: 'gotoPage', + params: [ page, 'page' ] + } + }]; + + const request = new Request(uri, { + method: 'POST', + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json' + } + }); + const message = await this.fetchJSON(request); + const dom = new DOMParser().parseFromString(message.effects.html, 'text/html'); + return this.getChaptersFromDoc(dom); + } + getChaptersFromDoc(doc) { - let chapterList = []; + const chapterList = []; const data = doc.querySelectorAll(this.queryChapters); data.forEach(element => { let chapter = { @@ -111,28 +103,7 @@ export default class ReaperScans extends Connector { }); return chapterList; } - createPayloadForChapterPages(doc) { - const token = doc.querySelector('meta[name="csrf-token"]').getAttribute("content"); - const payloadid = (Math.random() + 1).toString(36).substring(8); - let wiredata = JSON.parse(doc.querySelector('.max-w-6xl div[wire\\:initial-data]').getAttribute("wire:initial-data")); - const referrer = wiredata.effects.path;//of course the current url could be used too and i - delete wiredata.effects; - wiredata.serverMemo.data.page = 1; - wiredata.serverMemo.data.paginators.page = 1; - wiredata['updates']=[{ - type: "callMethod", - payload: { - id: payloadid, - method: "gotoPage", - params: [ - 2, - "page" - ] - } - }]; - return { - payload : wiredata, token :token, referrer : referrer}; - } + async _getPages(chapter) { const uri = new URL(chapter.id, this.url); const request = new Request(uri, this.requestOptions); @@ -141,10 +112,11 @@ export default class ReaperScans extends Connector { return this.getAbsolutePath(element.getAttribute('src'), this.url); }); } + async _getMangaFromURI(uri) { const request = new Request(uri, this.requestOptions); const id = uri.pathname; - const title = (await this.fetchDOM(request, this.queryMangatitle))[0].textContent.trim(); + const title = (await this.fetchDOM(request, this.queryMangaTitle))[0].textContent.trim(); return new Manga(this, id, title); } } diff --git a/src/web/mjs/connectors/ReaperScansTR.mjs b/src/web/mjs/connectors/ReaperScansTR.mjs index d3fb3dd841..de9ca4413a 100644 --- a/src/web/mjs/connectors/ReaperScansTR.mjs +++ b/src/web/mjs/connectors/ReaperScansTR.mjs @@ -1,17 +1,16 @@ -import WordPressMadara from './templates/WordPressMadara.mjs'; +import WordPressMangastream from './templates/WordPressMangastream.mjs'; -export default class ReaperScansTR extends WordPressMadara { +export default class ReaperScansTR extends WordPressMangastream { constructor() { super(); super.id = 'reaperscanstr'; super.label = 'Reaper Scans (Turkish)'; this.tags = ['webtoon', 'turkish']; - this.url = 'https://reaperscanstr.com'; - this.queryChapters = 'div.chapter-link > a'; - this.queryChaptersTitleBloat ='span.chapter-release-date'; + this.url = 'https://reaperscans.com.tr'; + this.path = '/manga/list-mode/'; this.links = { - login: 'https://reaperscanstr.com/login' + login: 'https://reaperscans.com.tr/login' }; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/ResetScans.mjs b/src/web/mjs/connectors/ResetScans.mjs index 882407c5ee..d1b5630d30 100644 --- a/src/web/mjs/connectors/ResetScans.mjs +++ b/src/web/mjs/connectors/ResetScans.mjs @@ -7,7 +7,7 @@ export default class ResetScans extends WordPressMadara { super.id = 'resetscans'; super.label = 'Reset Scans'; this.tags = [ 'manga', 'webtoon', 'english' ]; - this.url = 'https://reset-scans.us'; + this.url = 'https://reset-scans.xyz'; this.queryChapters = 'li.wp-manga-chapter div.li__text > a'; } } diff --git a/src/web/mjs/connectors/Saikaiscan.mjs b/src/web/mjs/connectors/Saikaiscan.mjs index 0b3f21b4a2..8cec74c246 100644 --- a/src/web/mjs/connectors/Saikaiscan.mjs +++ b/src/web/mjs/connectors/Saikaiscan.mjs @@ -8,15 +8,15 @@ export default class SaikaiScan extends Connector { super.id = 'saikaiscan'; super.label = 'Saikaiscan'; this.tags = [ 'manga', 'portuguese', 'webtoon', 'novel' ]; - this.url = 'https://saikaiscan.com.br'; - this.api = 'https://api.saikai.com.br/api/stories'; - this.imagesurl = 'https://s3-alpha.saikai.com.br'; + this.url = 'https://saikaiscans.net'; + this.api = 'https://api.saikaiscans.net/api/stories'; + this.imagesurl = 'https://s3-alpha.saikaiscans.net'; this.novelContentQuery = 'div#leitor-serie-body'; this.novelFormat = 'image/png'; this.novelWidth = '56em'; this.novelPadding = '1.5em'; this.links = { - login: 'https://saikaiscan.com.br/login' + login: 'https://saikaiscan.net/login' }; } diff --git a/src/web/mjs/connectors/SeriManga.mjs b/src/web/mjs/connectors/SeriManga.mjs index 1b79f4629f..6a23e36577 100644 --- a/src/web/mjs/connectors/SeriManga.mjs +++ b/src/web/mjs/connectors/SeriManga.mjs @@ -8,9 +8,9 @@ export default class SeriManga extends Connector { super.id = 'serimanga'; super.label = 'Seri Manga'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://serimanga.com'; + this.url = 'https://serimangas.com'; this.links = { - login: 'https://serimanga.com/#login' + login: 'https://serimangas.com/#login' }; } @@ -80,4 +80,4 @@ export default class SeriManga extends Connector { let data = await this.fetchDOM(request, 'div.reader-manga.chapter-pages source.chapter-pages__item'); return data.map(element => this.getAbsolutePath(element.dataset.src || element, request.url)); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Siyahmelek.mjs b/src/web/mjs/connectors/Siyahmelek.mjs index 38b1a879e1..2752318fc8 100644 --- a/src/web/mjs/connectors/Siyahmelek.mjs +++ b/src/web/mjs/connectors/Siyahmelek.mjs @@ -7,9 +7,9 @@ export default class Siyahmelek extends WordPressMadara { super.id = 'siyahmelek'; super.label = 'Gri Melek (Siyahmelek)'; this.tags = [ 'manga', 'webtoon', 'turkish' ]; - this.url = 'https://grimelek.net'; + this.url = 'https://grimelek.co'; this.links = { - login : 'https://grimelek.net'//this website needs login to see content ! + login : 'https://grimelek.co'//this website needs login to see content ! }; } diff --git a/src/web/mjs/connectors/Summertoon.mjs b/src/web/mjs/connectors/Summertoon.mjs new file mode 100644 index 0000000000..93747cf4ae --- /dev/null +++ b/src/web/mjs/connectors/Summertoon.mjs @@ -0,0 +1,12 @@ +import WordPressMangastream from './templates/WordPressMangastream.mjs'; + +export default class Summertoon extends WordPressMangastream { + constructor() { + super(); + super.id = 'summertoon'; + super.label = 'Summertoon'; + this.tags = ['webtoon', 'turkish', 'scanlation']; + this.url = 'https://summertoon.com'; + this.path = '/manga/list-mode/'; + } +} diff --git a/src/web/mjs/connectors/TCBScans.mjs b/src/web/mjs/connectors/TCBScans.mjs index 2d12669a6e..0059be7e0c 100644 --- a/src/web/mjs/connectors/TCBScans.mjs +++ b/src/web/mjs/connectors/TCBScans.mjs @@ -8,7 +8,7 @@ export default class TCBScans extends Connector { super.id = 'tcbscans'; super.label = 'TCB Scans'; this.tags = [ 'manga', 'english', 'scanlation' ]; - this.url = 'https://onepiecechapters.com'; + this.url = 'https://tcbscans.com'; } async _getMangaFromURI(uri) { @@ -44,8 +44,27 @@ export default class TCBScans extends Connector { async _getPages(chapter) { const uri = new URL(chapter.id, this.url); - const request = new Request(uri, this.requestOptions); - let data = await this.fetchDOM(request, 'picture > source'); - return data.map(x => x.src); + const chapterRequest = new Request(uri, this.requestOptions); + const data = await this.fetchDOM(chapterRequest, 'picture > source'); + + const promises = []; + for(const image of data) { + const promise = new Promise( (resolve, reject) => { + const pageUrl= this.getAbsolutePath(image, chapterRequest.url); + const request = new Request(pageUrl, { + method : 'HEAD', + }); + try { + fetch(request) + .then(response => response.status == 200 ? resolve(pageUrl) : reject()); + } catch(error) { + reject(); + } + }); + promises.push(promise); + } + + const results = await Promise.allSettled(promises); + return results.filter(promise => /fulfilled/i.test(promise.status)).map(promise => promise.value); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TitanManga.mjs b/src/web/mjs/connectors/TitanManga.mjs index a90c79b267..86eff5afb8 100644 --- a/src/web/mjs/connectors/TitanManga.mjs +++ b/src/web/mjs/connectors/TitanManga.mjs @@ -1,6 +1,6 @@ -import WordPressMangastream from './templates/WordPressMangastream.mjs'; +import WordPressMadara from './templates/WordPressMadara.mjs'; -export default class TitanManga extends WordPressMangastream { +export default class TitanManga extends WordPressMadara { constructor() { super(); @@ -8,6 +8,5 @@ export default class TitanManga extends WordPressMangastream { super.label = 'Titan Manga'; this.tags = [ 'manga', 'turkish', 'webtoon' ]; this.url = 'https://titanmanga.com'; - this.path = '/manga/list-mode/'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TonizuToon.mjs b/src/web/mjs/connectors/TonizuToon.mjs index d7d950d67f..9fcbcdf0d4 100644 --- a/src/web/mjs/connectors/TonizuToon.mjs +++ b/src/web/mjs/connectors/TonizuToon.mjs @@ -7,7 +7,7 @@ export default class TonizuToon extends WordPressMadara { super.id = 'tonizutoon'; super.label = 'Tonizu Toon'; this.tags = [ 'webtoon', 'turkish', 'scanlation' ]; - this.url = 'https://tonizutoon.com'; + this.url = 'https://tonizu.com'; this.requestOptions.headers.set('x-referer', this.url); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TopToon.mjs b/src/web/mjs/connectors/TopToon.mjs index 8934361579..4051063cf6 100644 --- a/src/web/mjs/connectors/TopToon.mjs +++ b/src/web/mjs/connectors/TopToon.mjs @@ -15,12 +15,12 @@ export default class TopToon extends Connector { } async _getMangaFromURI(uri) { const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.bnr_episode_info p.tit_toon'); + const data = await this.fetchDOM(request, 'div.ep_comic_info span.comic_tit span'); return new Manga(this, uri.pathname, data[0].textContent.trim()); } async _getMangas() { - const req = new Request('https://toptoon.com/hashtag', this.requestOptions); + const req = new Request(new URL('/hashtag', this.url), this.requestOptions); const api = await this.fetchRegex(req, /fileUrl\s*:\s*'([^']+)'/g); const request = new Request(api[0], this.requestOptions); const data = await this.fetchJSON(request); @@ -34,11 +34,11 @@ export default class TopToon extends Connector { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); - const data = await this.fetchDOM(request, 'div.episode_list ul a.episode-items'); + const data = await this.fetchDOM(request, 'div.eplist ul a.episode-items'); return data.map(element => { - let title = element.querySelector('p.episode_title').textContent.trim(); - const subtitle = element.querySelector('p.episode_stitle'); - title += subtitle ? ' - ' + subtitle.textContent.trim() : ''; + let title = element.querySelector('p.ep_title').textContent.trim(); + const subtitle = element.querySelector('p.ep_stitle'); + title += subtitle && subtitle.textContent.trim() != '' ? ' - ' + subtitle.textContent.trim() : ''; return { id: `/comic/ep_view/${element.dataset.comicId}/${element.dataset.episodeId}`, title: title @@ -51,4 +51,4 @@ export default class TopToon extends Connector { const data = await this.fetchDOM(request, 'div#viewerContentsWrap source.document_img'); return data.map(element => this.getAbsolutePath(element.dataset.src || element, request.url)); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/TuMangaOnline.mjs b/src/web/mjs/connectors/TuMangaOnline.mjs index 0e473c5565..0ec1bab684 100644 --- a/src/web/mjs/connectors/TuMangaOnline.mjs +++ b/src/web/mjs/connectors/TuMangaOnline.mjs @@ -1,5 +1,5 @@ /* eslint-disable */ import Connector from '../engine/Connector.mjs'; import Manga from '../engine/Manga.mjs'; -const _0x26e904=_0xdbd7;function _0x5169(){const _0x464752=['W5X1WPmwWRddO07dOmkxW6KcqdldNCoVWOddQeOmWR4','BsZdJKxdLCoIW5uJ','yePaWReN','W7VcOqxdKM1XkSklWQZcHSomW6HNm8kBW6VcTwtdStJcMCocD8kjACoSWQJcISo+W7ddH8kAivxcQ8kvAXdcOSo9ksxcQLldMq1JW5ddLrhdS0tcMSkDWRJdGmo4fCknmmkTewLq','ae1RCrNdSJu','kheNexC','dsRcUq','WRhdPSkIW6S','WRSDDCoyWPxdJmkGzHRdHGPU','WOa6xCkHWRPKFCkxWPZcUHT0umkqWQTVy8oHCmohWQlcHmoXp8oUW50gtZtcPhhcVXhcNvD/WPzTWQHnW6WgW7yFWOPTAIn5WPxcHSkcrCoYlgZcGHtdVsRdPmkbWO9d','W59ZhCo1','W5TIgmoOW7m','uSogW5DzW5pcOSk6W5VcICoIWOhdPKxcOG','iXOkW4zfssJdQSkWoCoJWRS','ddhcUSksW77cKwvLW57dL1xcNCktzSkmgCoDtSoii3BdUmoinCkpgSoxEYtdHvxdLmk6W6DcEmkYi8kxeCo7W6hdV8ozuLzdBCoiiK4hW5ddT27dTwamW5HQWRxdNCoxWQS','gCo4mCoqq8kaW7tcKWzmrXiUbsyWeCkPWPvWW6OFW4hdUCoWWPJcTmolW4uNhXSQW6OCyxqcmmkKW5TSW7ZdJmokWRZdUvfskSkTcWBdJCk3wComWP/dUXRcSMxdQey','WPCFzmo4WR/dICkKErVdL1a1WO3cTryzACouu8owW7JcSGRdH8oTWRNdSSkzW7hdPfeocCoXW4JcJ8kTWRnfWQedWQa1cSk/WOPNaCkvWRdcMdiDrSo5W7pdUZdcSSoSz2pcPxi','WRyhWO5pWOm','gSkEnCkMqSoBAv5wW7/cQq','jrtdV8kEr8ocWPWfoshdMJZcNCo5aCoQ','WOldU8kmWPbIW6im','W50eWRDqcmkvk2KHvXBcNfJcQxGXWP3dHG0jWQ7cRepcUZzBpqSXyKtcSCkLW4pcMt/cUmkdlaJcMCkUWPTWW67dTJtdL2D6BZVdQSkeW547W7BcUcXrWRpdISkwuW','W6ddKsldRchcImoVWRPJWRKxztScCCkkW7rEWP8gW7NdVSk5W5TUWQvzB0KWWO5slSkEhmoIWQP5g8kGgWnIgZSuWRrNW5bbW6ldP8ofWQ3cM8kWFSoDW48pxXtdGea','mmk8WO44WPu','vmklsmkEWOFcRCkFCu5kWQ8BkueDqKlcTrVdUH7cM0FdMCoAy8oyW7u3W68AWOu2WOJdOmkRW71BeH8gm8k3WOJcHmkVW7fDWQddQCkvW4uqW4j7WQ7cGbtcHCo+qSktW53dTG','b3FdGNJdKCoMW7WLveC9W5K4BCkAdmozjY3cOa','jL13zrldPIdcVfu8oSovW6K','WQnQpKry','W5BcGSk3W4iu','nmoNACoRWPpcHupdOmoDeCojW4BdJGJcMq','W5xcRCoiW4LWW6uUW4ZcSd4','x1PhW4GhdwlcPmo+mmkSW7ddLMXTW4RdQ0hcUNVcGmkaW7S/drOQbmoBCKCMWQX0u8kHW7CmWPhdMSkdW7NdSJtdOdRcTmkAAbxcTvVdRgldMeVcJx5PAq0n','cWhdT8oPW44','b8oBbmoxW5m','CCk7umkeaa','qs3dOmk+yW','WOr9W5qAW7BcPvdcS8ovW7Xhu3i','W7X6bSoUW7mUmCkjWRBdIf4LbCovW7G7mmoHc8kkW7hdUq','c0FcQSojmCoeWONdHSkRgSkqmG','ev/cS8oti8k5W5hcQSouDSoE','W6NdPGO','y8k6zSk9aq','W77dRa7cN00','aCozba','W7mIW47dH8ky','W6yZWR7cKCksqSop','WPeiFa','F0iwW5hcVmkpWOBdLJFdJq','mwJcGSkQWOrKd8oPb3STWRVcHIFdPCkiuWDoW4ZcQSoTCMlcHH0hhSkcW7NcHCk2W5ZdKcVdOqPPwSk9WQddSmoRxJVdPSoJW4aijSkCwmkcl8kdawz3WOZcLCoBamkYoa','W7dcOSkpW5yp','W4qNWRtcK8ko','pfWBbM5ArSkbW7pcISo7','WRvNW7FcI8ksrColuY10W4/dQWtcIKagWOK2s8kGWOpcKd91gZPQFCoGjmkMs3VdKwHsxKFcS0ddPbnThSkUkfBcTmoGzmonkSoyemoWxYRcQSk0pq5lCH8','W6xdGZtcRMq','WRddPSkN','AI7cNsxcNmoBW64mAxG9','r07cP8oklCoZWR0XdedcIc/cJmkmiCogft7cHtRdRCkJW5ldT8kFvYJcJ8oAW4jtW4JcJxPCAmk7j1dcNdD1mSk4WOj4WO7dT1m5bajvoSocguRcKXunW63dK8oRWRe','W6S6FuK8','v3ncW5KQW4ZcO8kVWORdV1mfWQScW55UW496yWvPhr1cWO0jWQnLWR7dMCo2emooDYL6WQdcRCosWP/dIhHCWOBdQ8k5C8kCmCo5W6zNnSolW6aQfu3dIN0tWRVcStS','ur3dRCkvoSoqWPZdJ8oYvSorCWPQF0RcOwBcQCoEkqPIFaqprN8kW6ZcH8kIWP/dGqxdPSkPzY5YW5xcULTMqthcLZ/dRCkSwYPwjW3cS8oCbqacW4rhW54b','W5vciSkBW6/dT8kJxHNdLri','WRyfrSoteN96W6/dO2pdO2BcHgrzWONcLmoqWPRdSSoAWRlcHuZcPSobWRXgWQddUXFdPqT+W43cHJpdImkaW5pcLb7cJCkoW4TiW4CsW7dcTmk4WOKTimkOqCosW7uTWP0JqmojaW','W4BcUSkfW7SXWQDyWRxdQhFcVmktW6jUW5W+W4BcUSkDrCovdI3cOmkLF8oaWQFcLIXcW7pdO1iorYBdTHSJkmkZjxH1W7yxWObrtsH7FmkxhCkUdCkDxNHgWQxcTgq','gmomySoQWQG','sfCWWP9Z','WPCFCCoEWRxdJa','trRdR8kcAmkeW4e','WQtdPmk7W6RcGG','a8kXWRddS8klDmkFbsuo','gGldICoFW6i','hbRdPSoKW597wcD7D8kpbemre8kNW6/dTq','WQjkW5NcV13cPCkyohP4W5HpWOD6WORcSsy/bSkKxvFdMeNcRMpdO8oZgwmFqNCpkHLaW7WuW4NcMb3cIXuyd8odrSkQWRybq04go8kOufVcN8oGESoqECo9','h8kHW4JcOSkVs8kJpwLQ','C304WOnqaq','exjbomkNW54','ACowW49jW4BcTmkTW43dO8kaW5JcRtxdUWpcVmoDuJnvWPeZiu7dTmoPWRFcPsjXWPnDWOdcGcRcMuBcScZdKbLlASoaWRBcRtD0W4nHkmkfgbpcNM0xmmovgCoUWQtdRIu','yHRdGxVdSgFcM8oXjNldHhDqW6qRWOhdIX3cJf7cLSkhiuhdHNpdUxD/WOddTmoIFCoXzHH+DSklW6FcLXGRWONdVs3dPmkOW7aDCmkbfCkHW7fiWR3cNvuow09nuG','W6ffWO3cVSkkhta+eSkJy8kRW6Hjsf9ckrKoW75hWQJdJSkezSkInrdcUSkzcSkkqq/dPuSjW7NdStSQWR0rbu0DW6BdMHNdMYChq1RcHdhdIvS+kSonDd0','W7eMWPFdQGu','WRdcSmoiW5/dPa','W6eEWQFcVSkkhta+eSkJy8kRW6Hjsf9czvXAW74eW6dcJ8oumSoNnqBdSmobsCkLnfhcNrLgWQVdUcaaWR0rbu0DW6BdMHNdMYChq1RcHhFcHGK2zSkiFrC','W5P3bCo0W6iPkCkJW6BdRLi7hSod','WQmZWQHWWQK','WPC+WRjwWRu','yZnirtWtfSovWRRdHCk1xXTKb3GwW5tcU8keoSoQfmkdWRGBmca2W7rourGibSkTWRvtWOhcHNKaW5lcUs7dJ2jqnSkUWR3cMWSxmSo6W4COWQXzW4vwgd0','W7/cOX7cRqu','W4LIbmoTW74','iu1U','rSoUW5BcT8kZsSk4oW','WOxdOuNdGeCxW4/dKZhdUbJcJLqTW5RcLSkRFCk0W5xcLGigiSo8WOC+cmkRzCksfCoMW5VdI8kLaCkHW6xcTu9MW7NcQG1ifstdLuZcIGq3rNj/W7XRW715kG7cSIS','W7XCB8oJW6K','W6JcRH3cHZu','ibqAahPwrmkqW6G','WOr4bKLz','nZ4BWQTV','zLns','luSe','kbBdQ8kFB8oqWOy','W6vaeG','crBdRG','fSkZdmkHCa','WQZcM8oiWOBdKCohmtVcMqhdMSoWW5ZdSMj1WQJcSCogdG','WOuoDCoiW7hcImoHmq3dGGT+W4xdSu4aymkgySo8W7JcSGRdH8oTWRNdSSkzW7hdPfeocCoXW4JcJ8kTWRnfW7vrW7K1uCkvWOPNaCkvWRdcMdjaxCotW7pdUZdcSSoSz2pcPxi','yGVdHCkKWQDWja','WOj4W6JdTSo4','y2fwWO4a','p0LI','isddJG','WOGFzmkmWRxdJmkGzHRdHGPuW6dcTryh','W7u0tSoCW7VdKJldG3VcTSoHiSoZW5y1jSo2WPjzEIa9tLtdS8kPW7zXWQhcPSoTc8ovWPHXW5nSW7bIWRxcUa3dOSkbWQ3cR2WRuZ/cLHdcSmkkl8kIWRxdK8koWP3cJJpcO3C','W6OXthem','f8kulmo1zmomE3HAW6ddSY7dUwGxWQVdUSknWPNdTmkmathcLmk7W47dS23dLrrvW4PXW4CmWPZdKInDW7BdUSkSuvZdL8o4dCo7WPhdKXlcGmohWQ9cW4ZcKSk4bsG6WQLtWQy','o0zQCqG','W4ddJHxcGxa','W4jxW6TvyCoAz8oTxc1f','F1DAWPWTd23cT8o+FSk8','W4bxl8kKsG','dSkOjCkvW7ddJqlcSmkjvmkBWQRcH0BdKSkGrZOKW5GSbSoaWPhdImkEax/cKGldO8k+qbVdISozW4LKqSkd','WRfaWOZcVSobWQtcNaH5WPf5W6bLlINcGq0fmvFcPmoWrgTouN1WWRGRlmoYkLyYW4nLlCkNodtcQSkZW44Yp1NdMmkNW7XCW6VcLmogB8k+W6mvWRjLWRxdGHxdSG','W4jnd8kaeIG/WQ3cScRcTYpcHcawW4ZdH8oqW5tcVCkoWRldLr7cPCowWRTfWRdcUHhcOfW/W5hcHchcNCkaW47dIqBdGmoaW5XrW4muW6BcOSodWOmSnmk0gCoUWPfPWP1ZaCkAvW','W4pcPb3cGW9IWQy','W4pcQSkxW5SG','n18FW4FcSSkjWORdKsVdH8k1yCk5W7jLpmkXFSobtW42W69QlSoqW7zRW6/dMbFcPmo1WOq4pc06W6dcGq3cJGRdM8oskmkHl8oeWPipBKNdRcG0xL3cNqr2WPKIWQy','h8oOFSoWWQtcMu7dTq','WRDtsmk+cG','fHldUmkpzG','sSo1WQ3dQSoVv8k5ecyWWONcVqldPCkLW53dIXTqWPJcTHxcJgJcN2fmFs/cV1bKWQuUWQfpzSk+lmobomk/W6tdJdpcPxWEW5pcNutdGSoYW5ucWO7cSudcISkuoCoCzcS','WPLnW6hdHSoK','W50NEhqxmG','WOxdOuNdGeCxW4/dKZhdUbJcGabLWP/dMmo+i8oXWPFdLL1yEmkIWQ0JfSkRn8oxrSkPWPFcNCoGcCoZW73dRWqdWRFdUuHgqhBcMui','W4LDW6rcCmoAyq','BCkTxmkrdCohWRxdVeGadLXR','W41zWPqZWOy','W6nxcG','iZBcRCoEWPDMtmohW6NcQ8kgy15qwmkqW5ZcUCkAW6LHWPP6CZVdGmkTkCkgdCo7ovhcTmkAlq3cHM7dKLX7CSo+W5BdVCoNW6xdT8olWOG0WO3cTG0RWPVcOvGUW4NdKHxcQq','WPFcO8o4W43dNG','hc/dMCoOW68','WPrRd1nEWRWAo8o8D8k8W4dcS8k1yhxcQ8oRWPRdVf3dOCosWRtdTehcLSoSWO/dVwv1uIBcMMeZWPFdH8k+AZ/cK8kbvCk1mb4pW63cQCksWO3cQmo7WQC0WOVcN1ldIutcNbS','W4OiW6BcIxmJf8kHuJu3WQfZW4ddG8kwW7jyW7aqvbBcIGylAwddVHJcOSkxWRVdLmkoWPxcGCoNW6KYWQa','W6RcKSoDAWW','W6ZdIbZcKue','W4zlWR/dNsfQwCoM','W6xcTmoRWQBdM8k4WQCKWPVcLt8SW5P9W7iqkLNdGthdQCoRiHiMW73cKSotW68JjSkbk8kJW5NdRxtdV8oNqHvncHXLW6rjEudcKSoXhwyPW5KBj8k4o1dcPmkAr8oS','WPRdKSoeWQ5fqCk+s8oYdMRcQSkxisLdWQhcRw9Ho8kmv8oMW4bTW4ZcGCksW7KlW6ddHupdNsD0WRFcSIT3WQXTW6nBBCo9h8oYxbKNWO5ed8oiW47cTmkdutVdLteY','WOujW6uvtSoqEsXZ','gSkbWQ0eWQW','buf7nCkI','aL7dQmkpBmogWOahkG','jh3cLYpcMG','W5/cGCkqWQzcdCo3mmk2tZ7dQ8kAAgChW6tdTu9VkCkOemkJWPrLW5ZcImksWQvxW6ddGuVcMgSXW7RdT2uJWQu+WOOxiSkUwSkHcbeGW5SiaCklWOBdTCotbx7cHZX+','ktNdU8k7Eq','W5TkWOJdJcSJcSkHqI43W6G9WOtcHSooW7jeW7bceuxdN0PFzZtcT0ZdRSosWRZcK8kwWPZcISk6WR0OW74fWRddV8khm3SjvctcP8oRhXyKW7arheVdQ3tcNmozW77dLa','EbLirtWtfSovWRRdHCk1xXTKb3GwW5tcU8keoSoQfmkdW6TyCw56WRuAhKPBhmkTW45DW53dJs5hWPNcUIFdIxrkpSoWWRVcMWLwp8oWW5f0WQTfW40rftO','isjMW5ukurnUW73cQwldUuy','W7BcTdVcIIO','WOxdOuNdGeCxW4/dKZhdUbJcGabLWP/dMmkJl8k9W4pcKK0qoCoRWOC+fSoLCSkarSorW7RdSCkixCkNW7dcLfP4W6lcVbSssh/cGMJdMefNcJm8WRLJW7OPA0NdU2u','cCocBSogWQK','CeVdKmowWQzuug89WQXeW70uW45aWReOWRbBW4BdTbJdNCo1WQe+W7udWQRcMCkMi8kUWO3cGCkQq0SdytPJcSkQW4zFBX9iomoqW43dTCoMWO19AqyMlSoAWO1QW6a','WRbrs8kMna','W4aaWP7cQCkz','kceo','W5CKveCU','rmkVW7hcPSk5v8o7kdSYWOlcRcddSmkZWP/dIM9qWPZcUqBdIhJcL2fsmgBcVX82WRTJWQvnESoZo8okpCoKW6JdKsNcSYLJWP/dHuVdPSkMWODlW4pcUuNcG8kye8oCzcS','WPjEW5KAra','eSkHWQxdO8k1sSkImcW0W5BdRXRcQSo4WPBdHXPzWOtcTfJcG3xcMNrlmhRdPLnIW7y3W6bnDSk+oSonp8oKW7xdMJ/cONzfWPpdMLFcVmo1W5X/WOddVahdMSkCFmkqiwy','W6vxbq','WQ7cG8oRW4hdHmo8wSk7W5G','s0ldT8khFSoBWRSr','W4zDW7fND8oBFCoIxtzsW43dGYeR','W6FcSmoFvWaLF8oCWPFdIG','wCorE8o1fSkjpb0cWRddUYNcVYrwW6ZdT8oeW5RcU8ocddNdR8k2WORdP1VdKf4EWOO7W7CvW6JdGcnDW7BdUSkSuvZdL8o4dCo7WPhdKXlcGmohWQ9cW4ZcKSk4wdmqWQLtWQy','ls3dPmonW6O','jYddGq','wCo5W6FcMSki','W73cIcVcNXq','WR4HW4DgW6pdUuhdR8obWQbrd2ddH8oNWPJdPNKrWRZdHfiWWPddL8ocp8kvW4vMW69UWPHErmoff8oFW5GWlSkYASoZBrxcGSkwiSkqWRldNmkBWRrUAahcPa9XWQnQWP06','WOPVW6i+zG','W48YAwOn','ed3cTmkyWRFdQty','BgnAW4K/W5RcTmk5W6dcNqPoW5TB','WOlcI8o7W4FdT8o4e8kOW4ldPfFcL8oDWQPfbCo0WOauqcVdIxVcMSkismoyjMdcHComWR53WOhdVHtcHmop','cY3cUCkiW7ZdRYWXWPlcKGBdPSoAkmoixmkfm8oikhBdV8oitSkigSoCE3BcGaBcGCo2WRnmk8oXySozxCk6WRxdTmokvwWqi8kiB1a1WOlcSwFdVe5oWOyjW7tcKCkEW7e','dIVdRCkuWQe','dmowWQCiWO3dOCodWOJcQmopW5y','sLRdOCorW5TZuYi','jJFdK8k5WO5LfSkigMOWWRZcHZa','bmo6qSo1WRW','sWRdO8kdF8kFW5e','W4RcGZ7cLce','fmo4xmkrdCoiWQpdKGzb','WRyfrSoteN96W6/dO2pdO2BcHgrzWONdHSkvW5dcT8kzW6BcJqlcR8oxW7jKWQFdQb/dSHL5W6VcLG3dNmkcW4ddMZ3cGSkmW4vtW4nvW6BcOSkrWPyMnSoTw8oJWPbUW5zMbmojqG','W7FdQHdcTeFdTmoCACorl0y3sCk+FCkHnLWOW4miW7L1W4ldUuZcGWBcNCkMmrbfyervyM3cM8oDWOdcKCoEm0LRW5RdJ8o3W4ddKmkSWOmRW5dcSfBcHCook8kUWRH4W5a','W59fWOldJJi','W6HDWQpdSrK','W7BcNaxcLd4','W7hdVqG','W7ZcOCkTW7SH','v3ncW5KQW4ZcO8kVWORdV1mfWQTmWPS5W48kmuOKve4hWOubW7eGW63cLSk6rSklEYKOW6xcTCosWPBdMtiiWPpcSmoRESo5y8oWW71nnSolW6aQfu3dIN0tWRVcStS','swNcUmkrWQBdOWW2','jKDjCa7dQc/cTa','jI7cKSodusxdVq','cHldRSkczmocWP8h','WOddV8kmWPj5W4m3W5G','dub7AHJdRstcKfq+pCoEW69MWQmNW5X8W7K','W5faFmoEW64','AqLDvvzKF8kSW7BcRa','W648cCoqqwddGSkEW5fUca','WPu/W7SRiCo1Aq','WONdOSknfsedq8oqWRRdGq','W6WbW5FdTW/dOmoEohX+W5GdW440WO3dUJv6b8kxqapcLWdcTh7dPCk4qYeeqh0hFLu7W4C2WOtcNqBcJbWEq8kbgSkLWRHyaLjLDCoPbb7dM8oNC8oqjCkH','wXVcR8keF8kdW5BcISoYe8osoa9YnKJdVN3cPCodBGrWkWPcbY8cWQNdI8oNW5lcHeVcSSkPEJbYWPddTH4Rbh/dGZhcRSoGgNLysqNcSSoktK0yWROeWPyj','icj/W54ZrGC7WRVdVGhcOWncW65mpc1lrh7cQqblW6ldQ3pcTeG','yCo0W5FcQCkm','W6lcGCkcW5yR','kN9mm8k3W5CttmoNsW/cTmkKWRfyWRtdHCoWla','gmoLBCoTWRpcHq','WPT6mND6','vgedWPjb','W4iWqveJ','W7HMx8os','W5xcTSourcW','wmkSDmkurmkmW7tcLeunfffVqwm3rCk7WRzAW6OFW4hdUCoWWPJcTmolW4uNhXSQW6OCyxqcmmkKW5TSW7ZcHCkmWRtdVvLvySoOsKldJCoJemkwWPddV0NdUcpcTey','mK8siha','dCkEcmkHrmoaCLO','eSkHWQxdO8oHa8o2FgLNW4ZdR2hcPmo2WPJdG1muWPdcOf7cKNJcINfAjNZdOGqbWQvJW6abp8k+FSke','WOGkq8oGWQC','WO9bW6yftCogFWzXa1/dKXBdUG','mJ3dKmkjWOP1cG','WQjrWP7cQ8osWRtdVN8WW5qwWRa','W5vdj8kAW6pdJCkMyIJdTrO','WRvFW6ddRq','kc7cH8oexbpdGCks','WQejW5q7fW','W4jrxCo8W58','WOHPFSkHWQD6FComWRBcUHT0umkqWQTVy8oHCmohWQlcHmoXp8oUW50gtZtdQdtcP1tcMXjGWOPVWRDnW6WgWQK9WO04jI06W53dH8oseCk3FMhdJL3cRN7dPmonW4zd','WOqCWRe2WO8yW5uMW73cHvGXW64hq2ndaXLcWR/cI8k9q3pdJmoag2yngYVdUxyUWRHxmCktvSk2ECk7W6pdOmkHWQD2AW0gW4S4lbKnWPZdUmopW6dcPMuBWR4','AqXFu3b0zmkEW5BcNq','BMVdK8khfhFcRSo/vc/cT3hdVqRdPHxcQSk6uc5aW5ZdHCkObCktW73cT8kjjSkcW5eOhwFdJSkuu8k5gHWEy2tdHSo9ASk6B1LlCCk0AmkfF8khWQ7cTGCYfmkeWRi','WRfaWOZcVSobW6JdMvX5W5aZWQe9lJtcGqKlCb3dPCoKhG8jbZW3W714nSoYuvG8W41HjCkGBxJcPmoWWOzZBW3cNCoXW79rW6JcHSokB8oVWQPhWRn9WRBcIrldOW','dq3dSSoWW45TBWDLBCkdcfKn','dhfGhmkj','qhShWQX4','ia/dPSoXW6H2EJHHFmkyk14qcG','s8k9ymkfbSotWQddVfyydL1GvG','kLWzehLaqSk6W6RcKCo8efu3','W7pdJCkSW67cT8o+W4e','W7VdHYFcVM3dLCoRWOD2WRTwltey','WQusvSoluZ0mWPBcUYO','WRVcKCoNWPVdHG','W7DCWOJdPHS','iu17DH/dQq','W5neW7uTW4HnW68fWRNcKN4M','WPKIrmkXWRrTACkzW7ddRxGUfq','WQ/dUCkYW5tcNG','W6edWRNcVSornZa+eSkJy8kRW6Hjsf9ckrKoW75hWQJdJSkezSkIz1xdSmoCsCoEsqpdSreuW67cQxvfW65fcXLeWRBcNXFcJ2HYeWRdGwpcQHPTB8ofibC','nSk1WQ4/WOq','W5zJWQP4zSo5FmokW7Xgaa','DhlcGSoSW4S2qSoNsJ55W7pdIwpdQCkIuWDoW4ZcQSoTCMlcHH0hhSkcWOlcI8k4W5ldLcpdPKWMcmoWWQFdUCkwuh3cQCkXWQvjzCouumkrmSkDvMySW53dH8oqqCkHnG','eWqoWP9z','WO9TASkUoq','leSbca','W4NcItZcTXa','gvOIcxO','hY/cM8owWQ8','WQDBW7pdVCocAfK','WOuYoCoGW6K9pmomWRS','W7f3tSkffvRdLmo2WPS4sIikW6pdOg3dTmkMW47dIeafrKrQbmkDWQK3W6BcRCoKo13dHHNcICk7WPxcK1RdMSkDW49xsvKjW64jWRqEW4NdNmkfW7JcR8kiB8kcuHVcLSot','W4NcL8kfW7Wgcq','W5fWW4PsFG','xKS0W7/dPa','WPbfW7Kxsq','W5FcPbNcJazuWOO','WRFdVSktWP1K','W4i7WO/cI8kJ'];_0x5169=function(){return _0x464752;};return _0x5169();}(function(_0x322e64,_0x5530c0){const _0x48f4fa=_0xdbd7,_0x2c231f=_0x322e64();while(!![]){try{const _0x4e0989=-parseInt(_0x48f4fa(0x184,'b6@A'))/(0x163*-0x17+0x2470+-0x48a)*(parseInt(_0x48f4fa(0xb2,'Aslv'))/(0x632+0x337+-0x967))+-parseInt(_0x48f4fa(0x147,'muSx'))/(-0x17*-0x113+-0xbc7*-0x2+-0x3040)+parseInt(_0x48f4fa(0x103,'Nlnl'))/(-0xbc*-0x1b+0x1448+-0x2818)*(parseInt(_0x48f4fa(0x14b,'C%cx'))/(0x1845*0x1+-0xa97+-0xda9))+parseInt(_0x48f4fa(0x142,'Jh6K'))/(-0xdc9+-0x1140+0x1*0x1f0f)*(parseInt(_0x48f4fa(0x118,'Wds8'))/(-0x6ca+0x69d+-0xd*-0x4))+parseInt(_0x48f4fa(0x11b,'A(we'))/(-0x1*0x1387+-0x1*0x146b+0x27fa)*(-parseInt(_0x48f4fa(0x199,'tR^N'))/(-0x5e3*0x1+-0x1*-0x897+0x2ab*-0x1))+parseInt(_0x48f4fa(0x12f,'IiJT'))/(-0xf28*-0x2+-0x2338+-0xd3*-0x6)*(-parseInt(_0x48f4fa(0xf2,'o0xn'))/(-0x1*-0x1ff9+0xcc7+-0x2cb5))+parseInt(_0x48f4fa(0x169,'@z*E'))/(0x11f3+-0x67d+-0xb6a);if(_0x4e0989===_0x5530c0)break;else _0x2c231f['push'](_0x2c231f['shift']());}catch(_0x4f4fba){_0x2c231f['push'](_0x2c231f['shift']());}}}(_0x5169,0x36d05*0x1+0xd*0x62ff+-0x51b57));const _0x282754=(function(){const _0x58ff8a=_0xdbd7,_0x96f82a={};_0x96f82a[_0x58ff8a(0x101,'Aslv')]=_0x58ff8a(0x16a,'l1NV'),_0x96f82a[_0x58ff8a(0x15f,'l1NV')]=function(_0x5ecd4e,_0x19c202){return _0x5ecd4e!==_0x19c202;},_0x96f82a[_0x58ff8a(0x123,'4#3v')]=_0x58ff8a(0xe9,'rxR4'),_0x96f82a[_0x58ff8a(0xd7,'^)u5')]=_0x58ff8a(0x151,'Wds8'),_0x96f82a[_0x58ff8a(0x14e,'rxR4')]=function(_0x55a51d,_0x2a9c81){return _0x55a51d===_0x2a9c81;},_0x96f82a[_0x58ff8a(0x157,'JWa4')]=_0x58ff8a(0x18e,'npl!'),_0x96f82a[_0x58ff8a(0xaf,'Rl3o')]=function(_0x3a0098,_0x1f95ac){return _0x3a0098!==_0x1f95ac;},_0x96f82a[_0x58ff8a(0x10f,'npl!')]=_0x58ff8a(0x19d,'fi]w'),_0x96f82a[_0x58ff8a(0x15b,'BUcV')]=_0x58ff8a(0x187,'^)u5');const _0x4c09e4=_0x96f82a;let _0xf3f5c4=!![];return function(_0xe9a483,_0x5ecf22){const _0x19d81a=_0x58ff8a,_0x2c4829={'hStfn':_0x4c09e4[_0x19d81a(0x10c,'b%L^')],'WxPtX':function(_0x1ef42f,_0x5961a2){const _0x105f8e=_0x19d81a;return _0x4c09e4[_0x105f8e(0xf8,'1(jY')](_0x1ef42f,_0x5961a2);},'jvzEl':_0x4c09e4[_0x19d81a(0x125,'mpA0')],'NWlfS':_0x4c09e4[_0x19d81a(0x1a2,'Nlnl')],'pVVhq':function(_0x28ddcb,_0x50d979){const _0x3b073d=_0x19d81a;return _0x4c09e4[_0x3b073d(0x13c,'fi]w')](_0x28ddcb,_0x50d979);},'SJaQs':_0x4c09e4[_0x19d81a(0x162,'Wds8')]};if(_0x4c09e4[_0x19d81a(0x107,'PC6!')](_0x4c09e4[_0x19d81a(0x133,'C%cx')],_0x4c09e4[_0x19d81a(0x18f,'zS5q')])){const _0x4cb549=_0xf3f5c4?function(){const _0x952733=_0x19d81a;if(_0x2c4829[_0x952733(0x15c,'zS5q')](_0x2c4829[_0x952733(0x129,'Wds8')],_0x2c4829[_0x952733(0x14d,'V*ko')])){if(_0x5ecf22){if(_0x2c4829[_0x952733(0xdd,'k^w]')](_0x2c4829[_0x952733(0xe1,'o0xn')],_0x2c4829[_0x952733(0x174,'@z*E')])){const _0x37e33a=_0x5ecf22[_0x952733(0xfc,'mpA0')](_0xe9a483,arguments);return _0x5ecf22=null,_0x37e33a;}else return _0x359f71[_0x952733(0x112,'S99u')]()[_0x952733(0x19e,'tR^N')](_0x2c4829[_0x952733(0x10d,')j%w')])[_0x952733(0xd8,'b%L^')]()[_0x952733(0x16f,'Rl3o')](_0x6f4dd0)[_0x952733(0x156,'npl!')](_0x2c4829[_0x952733(0xb4,'l1NV')]);}}else{const _0x4472b0=_0x269086?function(){const _0x53b371=_0x952733;if(_0x4434b1){const _0x3303b3=_0x4245d7[_0x53b371(0xa1,'muSx')](_0x4f5d23,arguments);return _0xcf457d=null,_0x3303b3;}}:function(){};return _0x14991f=![],_0x4472b0;}}:function(){};return _0xf3f5c4=![],_0x4cb549;}else _0x9de4fb=_0x500bd1[_0x19d81a(0x17e,'Lts1')](_0x3b3940)[0x1ff0+0x30f+0x121*-0x1f][_0x19d81a(0x164,'S(jO')]();};}()),_0xa22f77=_0x282754(this,function(){const _0x9539b0=_0xdbd7,_0xd08be7={};_0xd08be7[_0x9539b0(0x180,'b6@A')]=_0x9539b0(0x183,'b6@A');const _0x1035bf=_0xd08be7;return _0xa22f77[_0x9539b0(0x12a,'Rl3o')]()[_0x9539b0(0x145,'S99u')](_0x1035bf[_0x9539b0(0x189,'IiJT')])[_0x9539b0(0xa3,'1(jY')]()[_0x9539b0(0xbd,'JWa4')](_0xa22f77)[_0x9539b0(0xcb,'mpA0')](_0x1035bf[_0x9539b0(0xe7,'uVEN')]);});_0xa22f77();function _0xdbd7(_0x5a3b5c,_0x58c7f8){const _0x5926d9=_0x5169();return _0xdbd7=function(_0x1a65cc,_0x4fcb6c){_0x1a65cc=_0x1a65cc-(-0x2bf*0x5+-0x35a+-0x5e5*-0x3);let _0x91b5ed=_0x5926d9[_0x1a65cc];if(_0xdbd7['SbpUsT']===undefined){var _0x11a12e=function(_0xc51ac){const _0x4c7062='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x104f4d='',_0x4d9731='',_0x3fe99a=_0x104f4d+_0x11a12e;for(let _0x2fc08d=0x14ad*-0x1+-0x1a5*-0x5+-0x31d*-0x4,_0x402081,_0x2b731a,_0x1cf2d8=0x1a24+-0xc*0x190+0x3b2*-0x2;_0x2b731a=_0xc51ac['charAt'](_0x1cf2d8++);~_0x2b731a&&(_0x402081=_0x2fc08d%(0x11fd+0x194a*-0x1+0x751)?_0x402081*(-0x1d3*0x13+-0x2*-0x79d+0x1*0x13af)+_0x2b731a:_0x2b731a,_0x2fc08d++%(0x2*-0x8ad+-0x1d44+0x2ea2))?_0x104f4d+=_0x3fe99a['charCodeAt'](_0x1cf2d8+(0x1*-0x22f3+0x2*0x123a+-0x177))-(0xf4f*0x1+-0x1*0x20f8+-0x11b3*-0x1)!==-0x2021+-0xb31+0x2*0x15a9?String['fromCharCode'](-0x7*-0x2bf+0x3bf*0x3+0x13*-0x18d&_0x402081>>(-(-0xb8*-0x20+-0x17fb+0xfd)*_0x2fc08d&-0x1970+-0x8*0x3fb+0x2d*0x146)):_0x2fc08d:-0xc7*-0x1+-0x22ee+0x2227){_0x2b731a=_0x4c7062['indexOf'](_0x2b731a);}for(let _0x3ca180=-0x2351+0x131f+0x2*0x819,_0x4a3b86=_0x104f4d['length'];_0x3ca180<_0x4a3b86;_0x3ca180++){_0x4d9731+='%'+('00'+_0x104f4d['charCodeAt'](_0x3ca180)['toString'](-0x2*0xf3f+0x22*-0x1+0x2*0xf58))['slice'](-(0x5e*0x6a+0x2052+-0x473c));}return decodeURIComponent(_0x4d9731);};const _0x7f4f79=function(_0x24770c,_0x130b6e){let _0x1e430f=[],_0x404bbe=-0x8a2*-0x4+-0x1a8f*0x1+-0x7f9,_0x1a49c6,_0x320e88='';_0x24770c=_0x11a12e(_0x24770c);let _0x584fc6;for(_0x584fc6=-0x1bcc+-0x7*-0x4cd+-0x5cf;_0x584fc6<-0xa*0xbf+-0xe39+0x16af;_0x584fc6++){_0x1e430f[_0x584fc6]=_0x584fc6;}for(_0x584fc6=0x529*-0x1+-0x8f*-0x6+0x1cf;_0x584fc6<0x9*-0x185+-0x17*-0x13+0xcf8;_0x584fc6++){_0x404bbe=(_0x404bbe+_0x1e430f[_0x584fc6]+_0x130b6e['charCodeAt'](_0x584fc6%_0x130b6e['length']))%(-0x1*0x1bdf+-0x1ba1+0x3880),_0x1a49c6=_0x1e430f[_0x584fc6],_0x1e430f[_0x584fc6]=_0x1e430f[_0x404bbe],_0x1e430f[_0x404bbe]=_0x1a49c6;}_0x584fc6=0x1*-0x65a+-0x241b+0x2a75,_0x404bbe=0x3a*-0x3b+0x1*-0x23f8+0x3156;for(let _0x241119=-0x13b0+0x1254+0x3a*0x6;_0x241119<_0x24770c['length'];_0x241119++){_0x584fc6=(_0x584fc6+(0x1318+0x1c71+-0x138*0x27))%(-0x1*0x13+-0x11*0x5c+-0x1*-0x72f),_0x404bbe=(_0x404bbe+_0x1e430f[_0x584fc6])%(0x1af5+-0x187c+-0x1d*0xd),_0x1a49c6=_0x1e430f[_0x584fc6],_0x1e430f[_0x584fc6]=_0x1e430f[_0x404bbe],_0x1e430f[_0x404bbe]=_0x1a49c6,_0x320e88+=String['fromCharCode'](_0x24770c['charCodeAt'](_0x241119)^_0x1e430f[(_0x1e430f[_0x584fc6]+_0x1e430f[_0x404bbe])%(0x214*0x3+0x1e9a+-0x23d6)]);}return _0x320e88;};_0xdbd7['UwnaUj']=_0x7f4f79,_0x5a3b5c=arguments,_0xdbd7['SbpUsT']=!![];}const _0x41b6e9=_0x5926d9[-0x8*-0x376+0x225d*0x1+-0x3e0d],_0x5ef105=_0x1a65cc+_0x41b6e9,_0x3e7a9c=_0x5a3b5c[_0x5ef105];if(!_0x3e7a9c){if(_0xdbd7['mceUvj']===undefined){const _0x391f87=function(_0x1ac3e6){this['wGZqaw']=_0x1ac3e6,this['iBUJPG']=[0x772*-0x2+-0x2579*-0x1+-0x11*0x154,0x2548+0x62*0x50+0x21f4*-0x2,-0x1*0x1d4b+0x224e+0x503*-0x1],this['EaRImi']=function(){return'newState';},this['PkxMSc']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['vCbriU']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x391f87['prototype']['wnuIuJ']=function(){const _0x123c8=new RegExp(this['PkxMSc']+this['vCbriU']),_0x3a23d0=_0x123c8['test'](this['EaRImi']['toString']())?--this['iBUJPG'][0x1b68+0x1f3*-0x10+-0x11*-0x39]:--this['iBUJPG'][0x875+-0x1*-0xd46+0x15bb*-0x1];return this['mDyiNX'](_0x3a23d0);},_0x391f87['prototype']['mDyiNX']=function(_0x52067d){if(!Boolean(~_0x52067d))return _0x52067d;return this['iaHAnF'](this['wGZqaw']);},_0x391f87['prototype']['iaHAnF']=function(_0x402838){for(let _0x25c196=-0x101*-0xe+0x1df5+-0x2c03,_0x36ce4a=this['iBUJPG']['length'];_0x25c196<_0x36ce4a;_0x25c196++){this['iBUJPG']['push'](Math['round'](Math['random']())),_0x36ce4a=this['iBUJPG']['length'];}return _0x402838(this['iBUJPG'][0x2501+-0x5d*-0x23+-0x31b8]);},new _0x391f87(_0xdbd7)['wnuIuJ'](),_0xdbd7['mceUvj']=!![];}_0x91b5ed=_0xdbd7['UwnaUj'](_0x91b5ed,_0x4fcb6c),_0x5a3b5c[_0x5ef105]=_0x91b5ed;}else _0x91b5ed=_0x3e7a9c;return _0x91b5ed;},_0xdbd7(_0x5a3b5c,_0x58c7f8);}class TuMangaOnline extends Connector{constructor(){const _0x3c4d9f=_0xdbd7,_0x4017f0={};_0x4017f0[_0x3c4d9f(0x14a,'@z*E')]=_0x3c4d9f(0x181,'Edzx'),_0x4017f0[_0x3c4d9f(0xec,'mpA0')]=_0x3c4d9f(0x10b,'b%L^'),_0x4017f0[_0x3c4d9f(0xb3,'()Qh')]=_0x3c4d9f(0x18a,'zS5q'),_0x4017f0[_0x3c4d9f(0x12c,'tR^N')]=_0x3c4d9f(0x182,'muSx'),_0x4017f0[_0x3c4d9f(0xa0,'PC6!')]=_0x3c4d9f(0xd1,'aN&#')+_0x3c4d9f(0x17c,'l1NV'),_0x4017f0[_0x3c4d9f(0xf9,')j%w')]=_0x3c4d9f(0x19f,'b6@A'),_0x4017f0[_0x3c4d9f(0x150,'PC6!')]=_0x3c4d9f(0x177,'S99u'),_0x4017f0[_0x3c4d9f(0xbc,'^)u5')]=_0x3c4d9f(0x15d,'Edzx'),_0x4017f0[_0x3c4d9f(0xca,'()Qh')]=_0x3c4d9f(0xce,'(oeN'),_0x4017f0[_0x3c4d9f(0x16e,'lfn%')]=_0x3c4d9f(0xdb,'VawC');const _0x338c5a=_0x4017f0,_0x1a8dbb=_0x338c5a[_0x3c4d9f(0xea,'zS5q')][_0x3c4d9f(0x168,'muSx')]('|');let _0x2b86d7=-0x171a*0x1+0xb*0x1f3+0x1a9;while(!![]){switch(_0x1a8dbb[_0x2b86d7++]){case'0':super();continue;case'1':this[_0x3c4d9f(0x131,'()Qh')]=[_0x338c5a[_0x3c4d9f(0x13b,'k^w]')],_0x338c5a[_0x3c4d9f(0x9d,'lfn%')]];continue;case'2':const _0x122688={};_0x122688[_0x3c4d9f(0xc8,'o0xn')]=_0x338c5a[_0x3c4d9f(0x179,'npl!')],_0x122688[_0x3c4d9f(0x190,'Wds8')]=_0x338c5a[_0x3c4d9f(0x186,'(oeN')],_0x122688[_0x3c4d9f(0xbb,'S99u')]=_0x338c5a[_0x3c4d9f(0xd3,'Nlnl')],_0x122688[_0x3c4d9f(0x185,'U%Tj')]=0x0,_0x122688[_0x3c4d9f(0xb5,'S99u')]=0x1388,_0x122688[_0x3c4d9f(0xa6,')j%w')]=0x1f4;const _0x478f7f={};_0x478f7f[_0x3c4d9f(0xc6,'uVEN')]=_0x122688,this[_0x3c4d9f(0x1a6,'fi]w')]=_0x478f7f;continue;case'3':super['id']=_0x338c5a[_0x3c4d9f(0xa5,'(0%r')];continue;case'4':this[_0x3c4d9f(0xeb,'V*ko')]=_0x338c5a[_0x3c4d9f(0x158,'Ggx2')];continue;case'5':super[_0x3c4d9f(0x192,'^)u5')]=_0x338c5a[_0x3c4d9f(0x120,'npl!')];continue;case'6':this[_0x3c4d9f(0x104,'Aslv')][_0x3c4d9f(0xfd,'TTru')][_0x3c4d9f(0xad,'Jh6K')](_0x338c5a[_0x3c4d9f(0xbf,'Jh6K')],this[_0x3c4d9f(0xb6,'Aslv')]);continue;}break;}}async[_0x26e904(0x176,'AIVa')](){const _0x1dacd4=_0x26e904;await super[_0x1dacd4(0xb0,'pLKV')](),await this[_0x1dacd4(0x167,'muSx')](-0x13*0x1d+-0x157*-0x9+0x1*-0x24);}async[_0x26e904(0x170,'o0xn')](_0x5ddfce){const _0x174508=_0x26e904,_0x5b75e3={};_0x5b75e3[_0x174508(0x9e,'lfn%')]=_0x174508(0x18c,'Ggx2'),_0x5b75e3[_0x174508(0x148,'S(jO')]=function(_0x1d68e7,_0x4f15ba){return _0x1d68e7+_0x4f15ba;},_0x5b75e3[_0x174508(0x152,'aN&#')]=_0x174508(0x154,'muSx'),_0x5b75e3[_0x174508(0x19c,'uVEN')]=_0x174508(0x1a5,'1(jY'),_0x5b75e3[_0x174508(0x144,'b%L^')]=_0x174508(0x108,'(oeN'),_0x5b75e3[_0x174508(0x105,'uVEN')]=function(_0x1a682e,_0x4f7388){return _0x1a682e===_0x4f7388;},_0x5b75e3[_0x174508(0xc4,'npl!')]=_0x174508(0x178,'4#3v'),_0x5b75e3[_0x174508(0x11f,'1(jY')]=_0x174508(0xc7,'rxR4');const _0x15792c=_0x5b75e3;let _0x352e4d=new Request(_0x5ddfce,this[_0x174508(0x13f,'Wds8')]),_0x5c9a53=await this[_0x174508(0x115,'BUcV')](_0x352e4d,_0x15792c[_0x174508(0xfb,'VawC')]),_0x496693=_0x15792c[_0x174508(0xa9,'V*ko')](_0x5ddfce[_0x174508(0x114,'o0xn')],_0x5ddfce[_0x174508(0x122,'uVEN')]),_0x2141e4=_0x5c9a53[-0x850+0x2330*-0x1+0x2b80][_0x174508(0xbe,'l1NV')];for(let _0x4e2482 of[_0x15792c[_0x174508(0xdc,'@z*E')],_0x15792c[_0x174508(0x1ab,'Y])X')],_0x15792c[_0x174508(0x196,'mpA0')]]){if(_0x15792c[_0x174508(0xee,'VawC')](_0x15792c[_0x174508(0xcf,'Edzx')],_0x15792c[_0x174508(0xe5,'PC6!')])){const _0x99319=_0x425eec[_0x174508(0x1a0,'S(jO')](_0x772ff6,arguments);return _0x35a65d=null,_0x99319;}else _0x2141e4=_0x2141e4[_0x174508(0xa8,'4#3v')](_0x4e2482)[-0x1*0x74c+-0xab6*-0x2+0x71*-0x20][_0x174508(0x14f,'Wds8')]();}return new Manga(this,_0x496693,_0x2141e4);}async[_0x26e904(0xf4,'A(we')](){const _0x38bc97=_0x26e904,_0x4b5d66={};_0x4b5d66[_0x38bc97(0x117,'(0%r')]=_0x38bc97(0xc2,'Jh6K')+_0x38bc97(0xb8,'(0%r')+_0x38bc97(0x102,'@z*E');const _0x3e3c78=_0x4b5d66;let _0x2f6aae=_0x3e3c78[_0x38bc97(0x9a,'Dy@9')];throw new Error(_0x2f6aae);}async[_0x26e904(0x165,'tR^N')](_0x596bd2){const _0x580959=_0x26e904;let _0x1ee977=_0x580959(0xfa,'Edzx')+_0x580959(0x166,'muSx')+_0x580959(0xef,'1(jY')+_0x580959(0x160,')j%w')+_0x580959(0xe0,'npl!')+_0x580959(0x173,'^)u5')+_0x580959(0x191,'zS5q')+_0x580959(0xe3,'Wds8')+_0x580959(0xed,'1(jY')+_0x580959(0xc1,'IiJT')+_0x580959(0x11d,'b6@A')+_0x580959(0xba,'Rl3o')+_0x580959(0x9b,'()Qh')+_0x580959(0xe2,'b%L^')+_0x580959(0xd9,'S(jO')+_0x580959(0xd5,'b%L^')+(_0x580959(0x100,'TTru')+_0x580959(0x19a,'Jh6K')+_0x580959(0xda,'npl!')+_0x580959(0x10a,'U%Tj')+_0x580959(0x11e,'fi]w')),_0x2725ac=new Request(new URL(_0x596bd2['id'],this[_0x580959(0xab,'Wds8')]),this[_0x580959(0x9c,'muSx')]),_0x372ddf=await Engine[_0x580959(0xac,'o0xn')][_0x580959(0x153,'()Qh')](_0x2725ac,_0x1ee977);return _0x372ddf[_0x580959(0x12e,'Aslv')](_0x13b6e7=>_0x13b6e7[_0x580959(0x17d,'Nlnl')]=_0x13b6e7[_0x580959(0x17d,'Nlnl')][_0x580959(0x15a,'PC6!')](/\s+/g,'\x20')),_0x372ddf;}async[_0x26e904(0x17a,'uVEN')](_0x5df718){const _0x33f90b=_0x26e904,_0x56cc75={};_0x56cc75[_0x33f90b(0x17f,'(oeN')]=function(_0x4427ec,_0x5d79de){return _0x4427ec+_0x5d79de;};const _0x156897=_0x56cc75;let _0x5e1ae8=_0x33f90b(0x110,'V*ko')+_0x33f90b(0x16d,'tR^N')+_0x33f90b(0x139,'IiJT')+_0x33f90b(0x149,'()Qh')+_0x33f90b(0x195,'o0xn')+_0x33f90b(0xe6,'PC6!')+_0x33f90b(0x138,'A0HH')+_0x33f90b(0x1a9,'25r]')+_0x33f90b(0x1a4,'Y])X')+_0x33f90b(0xc5,'Ggx2')+_0x33f90b(0x9f,'Wds8')+_0x33f90b(0xb1,'tR^N')+_0x33f90b(0x172,'VawC')+_0x33f90b(0x197,'V*ko')+_0x33f90b(0xe8,'FCI0')+_0x33f90b(0x12b,'1(jY')+(_0x33f90b(0x16c,'(oeN')+_0x33f90b(0xc9,'1(jY')+_0x33f90b(0x109,'Jh6K')+_0x33f90b(0xd4,'4#3v')+_0x33f90b(0x135,'muSx')+_0x33f90b(0x136,'lfn%')+_0x33f90b(0x11c,'Y])X')+_0x33f90b(0x175,'Lts1')+_0x33f90b(0xa4,'PC6!')+_0x33f90b(0x128,'(oeN')+_0x33f90b(0x198,'b6@A')+_0x33f90b(0x14c,'Aslv')+_0x33f90b(0x155,'rxR4')+_0x33f90b(0x18d,'Aslv')+_0x33f90b(0x16b,'TTru')+_0x33f90b(0xc0,'uVEN'))+(_0x33f90b(0x1a8,'@z*E')+_0x33f90b(0xf5,'Rl3o')+_0x33f90b(0x19b,'BUcV')+_0x33f90b(0x1aa,'()Qh')+_0x33f90b(0xcc,'PC6!')),_0x884e36=new Request(new URL(_0x5df718[_0x33f90b(0x127,'A(we')]['id'],this[_0x33f90b(0x18b,'tR^N')]),this[_0x33f90b(0x12d,'VawC')]),_0x5b7496=await Engine[_0x33f90b(0x161,'S99u')][_0x33f90b(0xc3,'PC6!')](_0x884e36,_0x156897[_0x33f90b(0x143,'pLKV')](_0x33f90b(0xb7,'tR^N')+_0x5df718['id']+';',_0x5e1ae8));return new URL(_0x5b7496,_0x884e36[_0x33f90b(0x10e,'U%Tj')]);}async[_0x26e904(0xf1,'Dy@9')](_0x44b4bb){const _0x3683e4=_0x26e904,_0x349726={};_0x349726[_0x3683e4(0xb9,'mpA0')]=_0x3683e4(0xa7,'Wds8'),_0x349726[_0x3683e4(0xdf,'25r]')]=_0x3683e4(0xff,'Dy@9');const _0x2cd2b7=_0x349726;let _0x5a3526=await this[_0x3683e4(0x13d,'Nlnl')](_0x44b4bb),_0x181986=new Request(_0x5a3526,this[_0x3683e4(0x13a,'Nlnl')]);_0x181986[_0x3683e4(0xcd,'JWa4')][_0x3683e4(0xa2,'S99u')](_0x2cd2b7[_0x3683e4(0x124,'fi]w')],new URL(_0x44b4bb[_0x3683e4(0x159,'VawC')]['id'],this[_0x3683e4(0x193,'S(jO')])[_0x3683e4(0x126,'(0%r')]);let _0x2caa67=await this[_0x3683e4(0x132,'A0HH')](_0x181986,_0x2cd2b7[_0x3683e4(0xd2,'Dy@9')]);return _0x2caa67[_0x3683e4(0xaa,'l1NV')](_0x11ed7d=>this[_0x3683e4(0x1a3,'Nlnl')]({'url':this[_0x3683e4(0xf3,'JWa4')](_0x11ed7d[_0x3683e4(0x171,'BUcV')][_0x3683e4(0xf0,'Jh6K')]||_0x11ed7d[_0x3683e4(0xf7,'Aslv')],_0x181986[_0x3683e4(0xd0,'Jh6K')]),'referer':_0x181986[_0x3683e4(0x188,'Lts1')]}));}[_0x26e904(0x121,'k^w]')](_0x330d12){const _0x2fe6b3=_0x26e904,_0x5991de={};_0x5991de[_0x2fe6b3(0xd6,'A(we')]=_0x2fe6b3(0xde,'o0xn');const _0x32993d=_0x5991de;this[_0x2fe6b3(0x13e,'(oeN')][_0x2fe6b3(0x106,'b6@A')][_0x2fe6b3(0xae,'o0xn')](_0x32993d[_0x2fe6b3(0xf6,'Nlnl')],_0x330d12[_0x2fe6b3(0x11a,'C%cx')]);let _0x13716b=super[_0x2fe6b3(0x116,'S99u')](_0x330d12[_0x2fe6b3(0x163,'TTru')]);return this[_0x2fe6b3(0x141,'^)u5')][_0x2fe6b3(0x113,'A0HH')][_0x2fe6b3(0x1a7,'k^w]')](_0x32993d[_0x2fe6b3(0x134,'(0%r')]),_0x13716b;}} +const _0x2337bc=_0x3bc7;function _0x55e1(){const _0x450371=['\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20scanlators:\x20[...$(\x27ul.chapter-list\x20li\x20di','referer','oFAwT','const\x20nodes\x20=\x20[...document.querySelectorAll(\x27img.viewer-img,\x20img','CIpCc','_getChapters','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20uri\x20=\x20xhr.responseURL.includes(\x27paginated\x27)\x20||','3|2|0|1|6|4|5','forEach','===\x20\x27POST\x27\x20||\x20request.url.includes(\x27uploads/\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','x-referer','WBiIx','o\x20HakuNeko.','xt().toLowerCase().includes(\x27too\x20many\x20requests\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','getAbsolutePath','search','HGyNH','sult.titles[index]\x20+\x20\x27\x20[\x27\x20+\x20result.scanlators[index]\x20+\x20\x27]\x27,\x0a\x20\x20\x20\x20','\x20$(title).find(\x27h4\x27).text().trim();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}),\x0a',';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resolve(uri.replace(\x27pagin','VpLgo','input','This\x20website\x20does\x20not\x20provide\x20a\x20manga\x20list,\x20please\x20copy\x20and\x20past','manga','throttle','oUVxX','setTimeout(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20try\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','delete','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','let\x20chapterID\x20=\x20','pathname','toString','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new\x20Promise(resolve\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20setTimeout','aZzPu','-\x20Manhua\x20-','est(\x27li[data-index]\x27).get(0)\x20||\x20$(element).closest(\x27ul.chapter-l','YdkvQ','Request','(((.+)+)+)+$','e()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}));','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if($(\x27head\x20title\x27).te','Throttle\x20Requests\x20[ms]','setTimeout(()\x20=>\x20resolve(chapters),\x202500);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x2010','rDZBf','YwHbF','_initializeConnector','PrZcO','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fetch(link.href)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','8YEcgWu','_getMangas','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20languages:\x20[...$(\x27ul.chapter-list\x20li\x20div.te','config','AaWdZ','ist\x27).prev(\x27div.row\x27).get(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return','3SrOofV','\x20\x20\x20\x20titles:\x20[...$(\x27ul.chapter-list\x20li\x20div.text-right\x27)].map(elem','trim','textContent','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20xhr\x20=\x20new\x20XMLHttpRequest();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','set','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20chapters.push({\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20id:\x20inde','spanish','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20.then(response\x20=>\x20resolve(response.url.replace(\x27pagin','lgipG','_handleConnectorURI','BcFwJ','tags','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20link.click();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','split','ated\x27,\x20\x27cascade\x27)))\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20.catch(e','_getChapterLink','fszKT','requestOptions','createConnectorURI','vxGIm','1226812jJiVHg','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','411430Xvlyyn','x,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title:\x20re','.submit\x20=\x20()\x20=>\x20$.ajax({\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20typ','href','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20link.scrollIntoView();\x0a\x20\x20\x20\x20\x20\x20\x20\x20','dSSmW','-\x20Manhwa\x20-','jECfI','4ZXdBqr','fetchDOM','apply','\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20link\x20=\x20$(\x27ul.chapter-list\x20li\x20','ent\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20title\x20=\x20$(element).clos','vkZNd','\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20catch(error)','div.text-right\x20a\x27)[chapterID];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(li','1848YAEfkO','NbsgY','VpxSu','Enter\x20the\x20timespan\x20in\x20[ms]\x20to\x20delay\x20consecuitive\x20HTTP\x20requests.\x0a','wait','avdGg','\x20xhr.responseURL.includes(\x27cascade\x27)\x20?\x20xhr.responseURL\x20:\x20content','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.xhr\x20=\x20()\x20=>\x20xhr;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','00);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','The\x20image\x20download\x20may\x20fail\x20for\x20to\x20many\x20consecuitive\x20requests.','title','149268rCazRG','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.success\x20=\x20content\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','url','-\x20Manga\x20-','min','ccess:\x20429\x20Too\x20Many\x20Requests!\x27));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else','VKRya','\x20\x20\x20\x20\x20let\x20ajax\x20=\x20$.ajax;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20$.ajax\x20=\x20request','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(new\x20Error(\x27TuMangaOnline\x20server\x20blocked\x20a','numeric','tion,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20data:\x20$(form).serializ','Vzbdf','WSTEz','NRUqq','xt-center\x20i.flag-icon\x27)].map(element\x20=>\x20element.className.match(','nk.href\x20&&\x20link.getAttribute(\x27href\x27).includes(\x27/\x27))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','TuMangaOnline','qZfuP','v.text-truncate\x27)].map(element\x20=>\x20element.innerText.trim()),\x0a\x20\x20\x20','rror\x20=>\x20reject(error));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20},\x201000);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','new\x20RegExp(\x27flag-icon-([a-z]+)\x27))[1])\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20','e\x20the\x20URL\x20containing\x20the\x20chapters\x20directly\x20from\x20your\x20browser\x20int','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20[...$(\x27form\x27)].forEach(form\x20=>\x20form','map','YxoXg','ated\x27,\x20\x27cascade\x27));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20','value','constructor','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new\x20Promise((resolve,\x20reject)\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','label','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ajax(request);\x0a\x20\x20\x20\x20\x20\x20\x20\x20','7025382ObIVKp','OeJfq','AeTUZ','\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if(request.type.toUpperCase()\x20','e:\x20form.method,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20url:\x20form.ac','ge.dataset.src\x20||\x20image.src));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20','https://visortmo.com','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','index\x20=\x200;\x20index\x20<\x20result.titles.length;\x20index++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','.viewer-image\x27)];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resolve(nodes.map(image\x20=>\x20ima','QXzRm','bIgBZ','zYEGV','gseXh','tumangaonline','1425333qmCsws','headers','max','description','146620lJbxaD','_getMangaFromURI','3841435mCpHNw','(()\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20result\x20=\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','_getPages','replace','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request.error\x20=\x20(xhr,\x20status,\x20error)\x20=>\x20{','\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20reject(error);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a','head\x20title','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20chapters\x20=\x20[];\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for(let\x20','fetchUI','\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20language:\x20result.languages[index]\x0a\x20\x20\x20\x20\x20\x20'];_0x55e1=function(){return _0x450371;};return _0x55e1();}function _0x3bc7(_0x3bc736,_0x40ba70){const _0x178f64=_0x55e1();return _0x3bc7=function(_0x2c404d,_0x4c6c74){_0x2c404d=_0x2c404d-(-0x2ae*0x2+-0x696+0xda9);let _0x3de2d8=_0x178f64[_0x2c404d];return _0x3de2d8;},_0x3bc7(_0x3bc736,_0x40ba70);}(function(_0x4842f9,_0xc18ef8){const _0x34d6b0=_0x3bc7,_0x3c95c7=_0x4842f9();while(!![]){try{const _0x16ab0d=parseInt(_0x34d6b0(0x200))/(0x14*0x51+0x1301+-0x1954*0x1)+-parseInt(_0x34d6b0(0x1fe))/(0x1a56+-0x2e*0xd3+0xb96)*(parseInt(_0x34d6b0(0x1e9))/(0x142b+0x134b+0x1*-0x2773))+-parseInt(_0x34d6b0(0x208))/(-0x1a07+0x1b*-0x88+0x5c5*0x7)*(parseInt(_0x34d6b0(0x250))/(-0xaca+-0x6*-0x2b7+0x57b*-0x1))+-parseInt(_0x34d6b0(0x21b))/(0xfdb+0x1481+-0x2456)+-parseInt(_0x34d6b0(0x24a))/(0x324+0x12a2+0x15bf*-0x1)+-parseInt(_0x34d6b0(0x1e3))/(-0x5d3*0x1+-0x93e*0x4+0x2ad3)*(parseInt(_0x34d6b0(0x23b))/(0x830+0x231a+0x3*-0xe6b))+-parseInt(_0x34d6b0(0x24e))/(0x1*0x22c2+-0x2*0xa12+0x4dc*-0x3)*(-parseInt(_0x34d6b0(0x210))/(0x2*0x17f+0xb6e*0x1+-0xe61));if(_0x16ab0d===_0xc18ef8)break;else _0x3c95c7['push'](_0x3c95c7['shift']());}catch(_0x5c9f28){_0x3c95c7['push'](_0x3c95c7['shift']());}}}(_0x55e1,-0xd8e5f+-0xa9efc+0x1f8f6d));const _0x2f0098=(function(){const _0x4420ac=_0x3bc7,_0x18ff73={};_0x18ff73[_0x4420ac(0x1b7)]=function(_0x2e5388,_0x7216b0){return _0x2e5388===_0x7216b0;},_0x18ff73[_0x4420ac(0x245)]=_0x4420ac(0x211),_0x18ff73[_0x4420ac(0x22c)]=function(_0x693648,_0xd53263){return _0x693648!==_0xd53263;},_0x18ff73[_0x4420ac(0x246)]=_0x4420ac(0x215),_0x18ff73[_0x4420ac(0x25c)]=_0x4420ac(0x1d9),_0x18ff73[_0x4420ac(0x1fd)]=function(_0x1a4468,_0x5b8c74){return _0x1a4468!==_0x5b8c74;},_0x18ff73[_0x4420ac(0x23c)]=_0x4420ac(0x227);const _0x1475cc=_0x18ff73;let _0x452609=!![];return function(_0xcf2293,_0xd379a1){const _0x1d6da4=_0x4420ac,_0x4d048e={};_0x4d048e[_0x1d6da4(0x1f4)]=_0x1475cc[_0x1d6da4(0x25c)];const _0x504160=_0x4d048e;if(_0x1475cc[_0x1d6da4(0x1fd)](_0x1475cc[_0x1d6da4(0x23c)],_0x1475cc[_0x1d6da4(0x23c)])){const _0x42a2f7=_0x53564e[_0x1d6da4(0x20a)](_0x543b09,arguments);return _0x301dcb=null,_0x42a2f7;}else{const _0x38fa1c=_0x452609?function(){const _0xe434b5=_0x1d6da4;if(_0x1475cc[_0xe434b5(0x1b7)](_0x1475cc[_0xe434b5(0x245)],_0x1475cc[_0xe434b5(0x245)])){if(_0xd379a1){if(_0x1475cc[_0xe434b5(0x22c)](_0x1475cc[_0xe434b5(0x246)],_0x1475cc[_0xe434b5(0x246)]))_0x103ecb=_0x1be4e1[_0xe434b5(0x1f7)](_0x4b46e9)[0xd27+0x1e8c+-0x2bb3][_0xe434b5(0x1eb)]();else{const _0x29df63=_0xd379a1[_0xe434b5(0x20a)](_0xcf2293,arguments);return _0xd379a1=null,_0x29df63;}}}else return _0x302bce[_0xe434b5(0x1d2)]()[_0xe434b5(0x1c2)](_0x504160[_0xe434b5(0x1f4)])[_0xe434b5(0x1d2)]()[_0xe434b5(0x237)](_0x240b31)[_0xe434b5(0x1c2)](_0x504160[_0xe434b5(0x1f4)]);}:function(){};return _0x452609=![],_0x38fa1c;}};}()),_0x5b382e=_0x2f0098(this,function(){const _0xf80ea2=_0x3bc7,_0x463d3b={};_0x463d3b[_0xf80ea2(0x228)]=_0xf80ea2(0x1d9);const _0x1cd775=_0x463d3b;return _0x5b382e[_0xf80ea2(0x1d2)]()[_0xf80ea2(0x1c2)](_0x1cd775[_0xf80ea2(0x228)])[_0xf80ea2(0x1d2)]()[_0xf80ea2(0x237)](_0x5b382e)[_0xf80ea2(0x1c2)](_0x1cd775[_0xf80ea2(0x228)]);});_0x5b382e();class TuMangaOnline extends Connector{constructor(){const _0x4d28fb=_0x3bc7,_0x4c91f5={};_0x4c91f5[_0x4d28fb(0x247)]=_0x4d28fb(0x1ba),_0x4c91f5[_0x4d28fb(0x1e1)]=_0x4d28fb(0x22b),_0x4c91f5[_0x4d28fb(0x1e7)]=_0x4d28fb(0x1ca),_0x4c91f5[_0x4d28fb(0x20d)]=_0x4d28fb(0x1f0),_0x4c91f5[_0x4d28fb(0x212)]=_0x4d28fb(0x249),_0x4c91f5[_0x4d28fb(0x221)]=_0x4d28fb(0x1bd),_0x4c91f5[_0x4d28fb(0x234)]=_0x4d28fb(0x1dc),_0x4c91f5[_0x4d28fb(0x1f2)]=_0x4d28fb(0x213)+_0x4d28fb(0x219),_0x4c91f5[_0x4d28fb(0x1cc)]=_0x4d28fb(0x224),_0x4c91f5[_0x4d28fb(0x1df)]=_0x4d28fb(0x241);const _0x2d59d4=_0x4c91f5,_0x396425=_0x2d59d4[_0x4d28fb(0x247)][_0x4d28fb(0x1f7)]('|');let _0x479442=0x293*0xa+0xbcc+-0x258a;while(!![]){switch(_0x396425[_0x479442++]){case'0':super[_0x4d28fb(0x239)]=_0x2d59d4[_0x4d28fb(0x1e1)];continue;case'1':this[_0x4d28fb(0x1f5)]=[_0x2d59d4[_0x4d28fb(0x1e7)],_0x2d59d4[_0x4d28fb(0x20d)]];continue;case'2':super['id']=_0x2d59d4[_0x4d28fb(0x212)];continue;case'3':super();continue;case'4':this[_0x4d28fb(0x1fb)][_0x4d28fb(0x24b)][_0x4d28fb(0x1ee)](_0x2d59d4[_0x4d28fb(0x221)],this[_0x4d28fb(0x21d)]);continue;case'5':const _0x41bd13={};_0x41bd13[_0x4d28fb(0x239)]=_0x2d59d4[_0x4d28fb(0x234)],_0x41bd13[_0x4d28fb(0x24d)]=_0x2d59d4[_0x4d28fb(0x1f2)],_0x41bd13[_0x4d28fb(0x1c8)]=_0x2d59d4[_0x4d28fb(0x1cc)],_0x41bd13[_0x4d28fb(0x21f)]=0x0,_0x41bd13[_0x4d28fb(0x24c)]=0x1388,_0x41bd13[_0x4d28fb(0x236)]=0x1f4;const _0x2683b1={};_0x2683b1[_0x4d28fb(0x1cb)]=_0x41bd13,this[_0x4d28fb(0x1e6)]=_0x2683b1;continue;case'6':this[_0x4d28fb(0x21d)]=_0x2d59d4[_0x4d28fb(0x1df)];continue;}break;}}async[_0x2337bc(0x1e0)](){const _0x91baa1=_0x2337bc;await super[_0x91baa1(0x1e0)](),await this[_0x91baa1(0x214)](0x1a1*0x2+-0x127+0x7a9);}async[_0x2337bc(0x24f)](_0x178ec6){const _0x1415b2=_0x2337bc,_0x5703f6={};_0x5703f6[_0x1415b2(0x1fa)]=_0x1415b2(0x256),_0x5703f6[_0x1415b2(0x1c7)]=function(_0x27343c,_0x1b39e6){return _0x27343c+_0x1b39e6;},_0x5703f6[_0x1415b2(0x207)]=_0x1415b2(0x21e),_0x5703f6[_0x1415b2(0x226)]=_0x1415b2(0x1d5),_0x5703f6[_0x1415b2(0x23d)]=_0x1415b2(0x206),_0x5703f6[_0x1415b2(0x1d7)]=function(_0x53188c,_0x3a826b){return _0x53188c===_0x3a826b;},_0x5703f6[_0x1415b2(0x248)]=_0x1415b2(0x1de);const _0x54f4d3=_0x5703f6;let _0x5df849=new Request(_0x178ec6,this[_0x1415b2(0x1fb)]),_0xb71ea=await this[_0x1415b2(0x209)](_0x5df849,_0x54f4d3[_0x1415b2(0x1fa)]),_0x5d7b69=_0x54f4d3[_0x1415b2(0x1c7)](_0x178ec6[_0x1415b2(0x1d1)],_0x178ec6[_0x1415b2(0x1c2)]),_0x4ef109=_0xb71ea[0x113*0x19+0x2684+0x5*-0xd13][_0x1415b2(0x1ec)];for(let _0x12e4a6 of[_0x54f4d3[_0x1415b2(0x207)],_0x54f4d3[_0x1415b2(0x226)],_0x54f4d3[_0x1415b2(0x23d)]]){if(_0x54f4d3[_0x1415b2(0x1d7)](_0x54f4d3[_0x1415b2(0x248)],_0x54f4d3[_0x1415b2(0x248)]))_0x4ef109=_0x4ef109[_0x1415b2(0x1f7)](_0x12e4a6)[0x7ac+0x303+-0x223*0x5][_0x1415b2(0x1eb)]();else{if(_0x54faba){const _0x3d78ba=_0x1794a3[_0x1415b2(0x20a)](_0x5b57a0,arguments);return _0x673b62=null,_0x3d78ba;}}}return new Manga(this,_0x5d7b69,_0x4ef109);}async[_0x2337bc(0x1e4)](){const _0x6beca2=_0x2337bc,_0x5a9475={};_0x5a9475[_0x6beca2(0x1be)]=_0x6beca2(0x1c9)+_0x6beca2(0x231)+_0x6beca2(0x1bf);const _0x501c45=_0x5a9475;let _0xac6902=_0x501c45[_0x6beca2(0x1be)];throw new Error(_0xac6902);}async[_0x2337bc(0x1b8)](_0x1595b2){const _0x7cbb4c=_0x2337bc;let _0x43f6c8=_0x7cbb4c(0x1d3)+_0x7cbb4c(0x251)+_0x7cbb4c(0x1ea)+_0x7cbb4c(0x20c)+_0x7cbb4c(0x1d6)+_0x7cbb4c(0x1e8)+_0x7cbb4c(0x1c5)+_0x7cbb4c(0x25a)+_0x7cbb4c(0x22d)+_0x7cbb4c(0x1e5)+_0x7cbb4c(0x229)+_0x7cbb4c(0x230)+_0x7cbb4c(0x257)+_0x7cbb4c(0x243)+_0x7cbb4c(0x1ef)+_0x7cbb4c(0x201)+(_0x7cbb4c(0x1c4)+_0x7cbb4c(0x259)+_0x7cbb4c(0x1ff)+_0x7cbb4c(0x1dd)+_0x7cbb4c(0x218)),_0xffbbcf=new Request(new URL(_0x1595b2['id'],this[_0x7cbb4c(0x21d)]),this[_0x7cbb4c(0x1fb)]),_0x202a2b=await Engine[_0x7cbb4c(0x1d8)][_0x7cbb4c(0x258)](_0xffbbcf,_0x43f6c8);return _0x202a2b[_0x7cbb4c(0x1bb)](_0x5b391c=>_0x5b391c[_0x7cbb4c(0x21a)]=_0x5b391c[_0x7cbb4c(0x21a)][_0x7cbb4c(0x253)](/\s+/g,'\x20')),_0x202a2b;}async[_0x2337bc(0x1f9)](_0x4b6240){const _0x50654d=_0x2337bc,_0x4ec991={};_0x4ec991[_0x50654d(0x1d4)]=function(_0x5ad188,_0x457c94){return _0x5ad188+_0x457c94;};const _0x3a5d22=_0x4ec991;let _0xaa694b=_0x50654d(0x238)+_0x50654d(0x1cd)+_0x50654d(0x222)+_0x50654d(0x23e)+_0x50654d(0x1bc)+_0x50654d(0x1ed)+_0x50654d(0x217)+_0x50654d(0x21c)+_0x50654d(0x1b9)+_0x50654d(0x216)+_0x50654d(0x1c6)+_0x50654d(0x235)+_0x50654d(0x254)+_0x50654d(0x242)+_0x50654d(0x1cf)+_0x50654d(0x23a)+(_0x50654d(0x1db)+_0x50654d(0x1c0)+_0x50654d(0x223)+_0x50654d(0x220)+_0x50654d(0x20b)+_0x50654d(0x20f)+_0x50654d(0x22a)+_0x50654d(0x1e2)+_0x50654d(0x1f1)+_0x50654d(0x1f8)+_0x50654d(0x22e)+_0x50654d(0x232)+_0x50654d(0x202)+_0x50654d(0x23f)+_0x50654d(0x225)+_0x50654d(0x1da))+(_0x50654d(0x204)+_0x50654d(0x1f6)+_0x50654d(0x20e)+_0x50654d(0x255)+_0x50654d(0x22f)),_0x544c31=new Request(new URL(_0x4b6240[_0x50654d(0x1ca)]['id'],this[_0x50654d(0x21d)]),this[_0x50654d(0x1fb)]),_0x298f7f=await Engine[_0x50654d(0x1d8)][_0x50654d(0x258)](_0x544c31,_0x3a5d22[_0x50654d(0x1d4)](_0x50654d(0x1d0)+_0x4b6240['id']+';',_0xaa694b));return new URL(_0x298f7f,_0x544c31[_0x50654d(0x21d)]);}async[_0x2337bc(0x252)](_0x28d377){const _0x3d7a8b=_0x2337bc,_0x45f185={};_0x45f185[_0x3d7a8b(0x205)]=_0x3d7a8b(0x1bd);const _0x2d4254=_0x45f185,_0x3e6348=_0x3d7a8b(0x238)+_0x3d7a8b(0x25d)+_0x3d7a8b(0x244)+_0x3d7a8b(0x240),_0x45cb5a=await this[_0x3d7a8b(0x1f9)](_0x28d377),_0x789558=new Request(_0x45cb5a,this[_0x3d7a8b(0x1fb)]);_0x789558[_0x3d7a8b(0x24b)][_0x3d7a8b(0x1ee)](_0x2d4254[_0x3d7a8b(0x205)],new URL(_0x28d377[_0x3d7a8b(0x1ca)]['id'],this[_0x3d7a8b(0x21d)])[_0x3d7a8b(0x203)]);const _0x4c00fb=await Engine[_0x3d7a8b(0x1d8)][_0x3d7a8b(0x258)](_0x789558,_0x3e6348,0x1c9*-0x2+0x5b*0x49+-0x2d9);return _0x4c00fb[_0x3d7a8b(0x233)](_0x58f3d0=>this[_0x3d7a8b(0x1fc)]({'url':this[_0x3d7a8b(0x1c1)](_0x58f3d0,_0x789558[_0x3d7a8b(0x21d)]),'referer':_0x789558[_0x3d7a8b(0x21d)]}));}[_0x2337bc(0x1f3)](_0x5539e1){const _0x502fee=_0x2337bc,_0x41807b={};_0x41807b[_0x502fee(0x1c3)]=_0x502fee(0x1bd);const _0x2035dc=_0x41807b;this[_0x502fee(0x1fb)][_0x502fee(0x24b)][_0x502fee(0x1ee)](_0x2035dc[_0x502fee(0x1c3)],_0x5539e1[_0x502fee(0x25b)]);let _0x3b8295=super[_0x502fee(0x1f3)](_0x5539e1[_0x502fee(0x21d)]);return this[_0x502fee(0x1fb)][_0x502fee(0x24b)][_0x502fee(0x1ce)](_0x2035dc[_0x502fee(0x1c3)]),_0x3b8295;}} export default TuMangaOnline; diff --git a/src/web/mjs/connectors/WebtoonHatti.mjs b/src/web/mjs/connectors/WebtoonHatti.mjs index cf92d728e1..648d9b115a 100644 --- a/src/web/mjs/connectors/WebtoonHatti.mjs +++ b/src/web/mjs/connectors/WebtoonHatti.mjs @@ -8,5 +8,6 @@ export default class WebtoonHatti extends WordPressMadara { super.label = 'Webtoon Hatti'; this.tags = [ 'webtoon', 'turkish' ]; this.url = 'https://webtoonhatti.net'; + this.queryPages = 'div.page-break:not([style*="display:"]) source'; } } diff --git a/src/web/mjs/connectors/WestManga.mjs b/src/web/mjs/connectors/WestManga.mjs index 2ab96a8644..a193f0fb14 100644 --- a/src/web/mjs/connectors/WestManga.mjs +++ b/src/web/mjs/connectors/WestManga.mjs @@ -7,7 +7,7 @@ export default class WestManga extends WordPressMangastream { super.id = 'westmanga'; super.label = 'WestManga'; this.tags = [ 'manga', 'indonesian' ]; - this.url = 'https://westmanga.org'; + this.url = 'https://westmanga.fun'; this.path = '/manga/list-mode/'; } } diff --git a/src/web/mjs/connectors/XoxoComics.mjs b/src/web/mjs/connectors/XoxoComics.mjs index 873fb77d22..64761b57ce 100644 --- a/src/web/mjs/connectors/XoxoComics.mjs +++ b/src/web/mjs/connectors/XoxoComics.mjs @@ -8,7 +8,7 @@ export default class XoxoComics extends Connector { super.id = 'xoxocomics'; super.label = 'XoxoComics'; this.tags = [ 'comic', 'english' ]; - this.url = 'https://xoxocomics.net'; + this.url = 'https://xoxocomic.com'; } async _getMangaFromURI(uri) { @@ -20,17 +20,19 @@ export default class XoxoComics extends Connector { async _getMangas() { const mangaList = []; - for(let page = 1, run = true; run; page++) { - const mangas = await this._getMangasFromPage(page); - mangas.length > 0 ? mangaList.push(...mangas) : run = false; + for (const letter of '0abcdefghijklmnopqrstuvwxyz'.split('')) { + for(let page = 1, run = true; run; page++) { + const mangas = await this._getMangasFromPage(page, letter); + mangas.length > 0 ? mangaList.push(...mangas) : run = false; + } } return mangaList; } - async _getMangasFromPage(page) { - const uri = new URL('/comic-list/alphabet?c=&page=' + page, this.url); + async _getMangasFromPage(page, letter) { + const uri = new URL(`/comic-list/?c=${letter}&page=${page}`, this.url); const request = new Request(uri, this.requestOptions); - const data = await this.fetchDOM(request, 'div.chapter > a'); + const data = await this.fetchDOM(request, 'div.chapter a'); return data.map(element => { return { id: this.getRootRelativeOrAbsoluteLink(element, this.url), @@ -67,4 +69,4 @@ export default class XoxoComics extends Connector { const data = await this.fetchDOM(request, 'div.page-chapter source'); return data.map(element => element.dataset['original'] || element.src); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/Yanmaga.mjs b/src/web/mjs/connectors/Yanmaga.mjs index 2d78449fa5..9786cf9124 100644 --- a/src/web/mjs/connectors/Yanmaga.mjs +++ b/src/web/mjs/connectors/Yanmaga.mjs @@ -1,19 +1,15 @@ -import YoungChampion from './YoungChampion.mjs'; +import SpeedBinb from './templates/SpeedBinb.mjs'; -export default class Yanmaga extends YoungChampion { +export default class Yanmaga extends SpeedBinb { constructor() { super(); super.id = 'yanmaga'; super.label = 'Yanmaga'; this.tags = ['manga', 'japanese']; this.url = 'https://yanmaga.jp'; - this.apiUrl = 'https://api2-yanmaga.comici.jp'; this.links = { login: 'https://yanmaga.jp/customers/sign-in' }; - - this.mangaListPath = '/series/list?page={page}'; - this.queryMangaTitleURI = '.detailv2-outline-title'; } async _getMangas() { @@ -28,43 +24,45 @@ export default class Yanmaga extends YoungChampion { } async _getChapters(manga) { + const chapterScript = ` + new Promise(resolve => { + const interval = setInterval(() => { + let morebtn = document.querySelector('.mod-episode-more-button') ; + if (morebtn) morebtn.click() + else { + clearInterval(interval); + const chapters = [...document.querySelectorAll('a.mod-episode-link')]; + resolve(chapters.map(chapter => { + return { + id: chapter.pathname, + title: chapter.querySelector('.mod-episode-title').textContent.trim() + } + })); + } + }, 1000); + }); + `; + const uri = new URL(manga.id, this.url); - const request = new Request(uri); - const dom = await this.fetchDOM(request); - const csrfToken = dom.querySelector('meta[name=csrf-token]').content; - const contents = dom.querySelector('#contents'); - const count = contents ? Math.ceil(contents.dataset.count / 50) : 1; - const chapters = []; - for (let i = 0; i < count; i++) { - const epUri = new URL(`${manga.id}/episodes`, this.url); - epUri.searchParams.set('offset', String(i * 50)); - epUri.searchParams.set('cb', Date.now()); - const epRequest = new Request(epUri); - epRequest.headers.set('x-csrf-token', csrfToken); - const matches = await this.fetchRegex(epRequest, /'beforeend', "(.*)"/g); - for (const value of matches) { - if (!value.includes(' { + if (response.redirected) { + const newurl = new URL(response.url); + return super._getPageList(manga, { id: newurl.pathname+newurl.search }, callback); + } + if (!uri.searchParams.get('cid')) { + throw new Error(`You need to login to see ${chapter.title}`); + } + return super._getPageList(manga, chapter, callback); + }); } - } diff --git a/src/web/mjs/connectors/ZeroScans.mjs b/src/web/mjs/connectors/ZeroScans.mjs index deaf27dbe4..45c22289bf 100644 --- a/src/web/mjs/connectors/ZeroScans.mjs +++ b/src/web/mjs/connectors/ZeroScans.mjs @@ -7,7 +7,7 @@ export default class ZeroScans extends Connector { super.id = 'zeroscans'; super.label = 'ZeroScans'; this.tags = [ 'manga', 'high-quality', 'english', 'scanlation' ]; - this.url = 'https://zeroscans.com'; + this.url = 'https://zscans.com'; this.config = { quality: { @@ -24,11 +24,11 @@ export default class ZeroScans extends Connector { } async _getMangaFromURI(uri) { - const request = new Request(uri, this.requestOptions); - const script = `new Promise(resolve => resolve(JSON.stringify(window.__ZEROSCANS__)));`; - const { data } = await Engine.Request.fetchUI(request, script); - const details = data[0].details; - return new Manga(this, `${details.id}_${details.slug}`, details.name.trim()); + const slug = uri.href.match(/\/comics\/([^/]+)$/)[1]; + const detailsUrl = new URL(`/swordflake/comic/${slug}`, this.url); + const request = new Request(detailsUrl, this.requestOptions); + const { data } = await this.fetchJSON(request); + return new Manga(this, `${data.id}_${data.slug}`, data.name.trim()); } async _getMangas() { diff --git a/src/web/mjs/connectors/azoraworld.mjs b/src/web/mjs/connectors/azoraworld.mjs index cfb1fa1d13..efc9edad9a 100644 --- a/src/web/mjs/connectors/azoraworld.mjs +++ b/src/web/mjs/connectors/azoraworld.mjs @@ -1,12 +1,29 @@ import WordPressMadara from './templates/WordPressMadara.mjs'; - export default class AzoraWorld extends WordPressMadara { constructor() { super(); super.id = 'azoraworld'; - super.label = 'AzoraWorld'; + super.label = 'AzoraWorld (AzoraManga)'; this.tags = [ 'webtoon', 'arabic', 'manga' ]; - this.url = 'https://azoranov.com'; + this.url = 'https://azoramoon.com'; + } + + async _getPages(chapter) { + const url = new URL(chapter.id, this.url); + const request = new Request(url, this.requestOptions); + const script = ` + new Promise((resolve, reject) => { + setTimeout(() => { + var imgdata = JSON.parse(CryptoJS.AES.decrypt(chapter_data, wpmangaprotectornonce, { + format: CryptoJSAesJson + }).toString(CryptoJS.enc.Utf8)); + resolve(JSON.parse(imgdata)); + },3000); + }); + `; + const data = await Engine.Request.fetchUI(request, script); + return data.map(picture => this.createConnectorURI({url : picture, referer : url})); } + } diff --git a/src/web/mjs/connectors/mangaz.mjs b/src/web/mjs/connectors/mangaz.mjs index 40dbb34c98..dd974a737f 100644 --- a/src/web/mjs/connectors/mangaz.mjs +++ b/src/web/mjs/connectors/mangaz.mjs @@ -81,7 +81,7 @@ export default class Mangaz extends Connector { async _getChapters(manga) { const request = new Request(new URL(manga.id, this.url), this.requestOptions); const data = await this.fetchDOM(request, 'body'); - return data[0].querySelector("li.box") ? [...data[0].querySelectorAll("li.box")].map(ele => { + return data[0].querySelector("li.item") ? [...data[0].querySelectorAll("li.item")].map(ele => { return{ id:ele.querySelector('button').dataset['url'].replace('navi', 'virgo/view'), title:ele.querySelector('span').textContent.trim() @@ -91,4 +91,4 @@ export default class Mangaz extends Connector { title:manga.title }]; } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/templates/Lezhin.mjs b/src/web/mjs/connectors/templates/Lezhin.mjs index 943497e5f3..d351dc21c0 100644 --- a/src/web/mjs/connectors/templates/Lezhin.mjs +++ b/src/web/mjs/connectors/templates/Lezhin.mjs @@ -101,14 +101,15 @@ export default class Lezhin extends Connector { } async _getMangasFromPage(page) { - const uri = new URL('/lz-api/v2/comics', this.apiURL); + const uri = new URL('/lz-api/v2/contents', this.apiURL); uri.searchParams.set('menu', 'general'); uri.searchParams.set('limit', this.mangasPerPage); uri.searchParams.set('offset', page * this.mangasPerPage); uri.searchParams.set('order', 'popular'); - uri.searchParams.set('adult_kind', 'all'); - const request = new Request(uri, this.requestOptions); + + request.headers.set('X-LZ-Adult', '0'); + request.headers.set('X-LZ-AllowAdult', 'true'); const data = await this.fetchJSON(request); return data.data.map( manga => { return { diff --git a/src/web/mjs/connectors/templates/MangaToon.mjs b/src/web/mjs/connectors/templates/MangaToon.mjs index 174db52cee..bde6896234 100644 --- a/src/web/mjs/connectors/templates/MangaToon.mjs +++ b/src/web/mjs/connectors/templates/MangaToon.mjs @@ -79,7 +79,7 @@ export default class MangaToon extends Connector { * Alternative mobile request (id, token and signature calculations are all handled within the WEEX + VUE application => to much effort to break in): * https://sg.mangatoon.mobi/api/content/episodes?sign=e9da6de28b76408e77040935fd221cd3&id=5&_=1557650222&_v=1.3.6&_language=en&_token=4f9b604ed0055dd569105a7b32b6489c10&_udid=1246361632e50c7a9daef1e187471778 */ - this.fetchDOM(this.baseURL + manga.id + '/episodes', 'div.episodes-wrap a.episode-item, div.episodes-wrap-new a.episode-item-new') + this.fetchDOM(this.baseURL + manga.id + '/episodes', 'div.episode-content-asc div.episodes-wrap a.episode-item, div.episode-content-asc div.episodes-wrap-new a.episode-item-new') .then( data => { let chapterList = data.map( element => { let title = element.querySelector('div.episode-title, div.episode-title-new:last-of-type').innerText.replace(/\s+/g, ' ').trim(); @@ -122,4 +122,4 @@ export default class MangaToon extends Connector { callback( error, undefined ); } ); } -} \ No newline at end of file +} diff --git a/src/web/mjs/connectors/winterscan.mjs b/src/web/mjs/connectors/winterscan.mjs index 6c0ba17162..7d0a621954 100644 --- a/src/web/mjs/connectors/winterscan.mjs +++ b/src/web/mjs/connectors/winterscan.mjs @@ -7,6 +7,6 @@ export default class winterscan extends WordPressMadara { super.id = 'winterscan'; super.label = 'Winter Scan'; this.tags = [ 'webtoon', 'portuguese', 'scanlation' ]; - this.url = 'https://winterscan.com.br'; + this.url = 'https://winterscan.com'; } -} \ No newline at end of file +} diff --git a/src/web/mjs/engine/Connectors.mjs b/src/web/mjs/engine/Connectors.mjs index ee6d094555..e09b7fd1fb 100644 --- a/src/web/mjs/engine/Connectors.mjs +++ b/src/web/mjs/engine/Connectors.mjs @@ -9,7 +9,7 @@ export default class Connectors { try { let response = await fetch(uri); let data = await response.json(); - return data.filter(plugin => !plugin.startsWith('.') && plugin.endsWith('.mjs')).map(plugin => uri + plugin) + return data.filter(plugin => !plugin.startsWith('.') && plugin.endsWith('.mjs')).map(plugin => uri + plugin); } catch(error) { //console.warn(error); return []; @@ -50,13 +50,13 @@ export default class Connectors { } } this._list.sort( ( a, b ) => { - return ( a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1 ); + return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; } ); } catch(error) { console.warn(`Failed to load connector`, error); } } - + async _onConnectorProtocolHandler(request) { try { let uri = new URL(request.url); diff --git a/src/web/mjs/engine/HeaderGenerator.mjs b/src/web/mjs/engine/HeaderGenerator.mjs index b3881a5eb1..e64d5b9c04 100644 --- a/src/web/mjs/engine/HeaderGenerator.mjs +++ b/src/web/mjs/engine/HeaderGenerator.mjs @@ -40,7 +40,7 @@ export default class HeaderGenerator { static get _browserChrome() { let $ = HeaderGenerator; - let version = $._rn( 105, 113 ) + '.' + $._rn( 0, 99 ) + '.' + $._rn( 0, 9999 ) + '.' + $._rn( 0, 999 ); + let version = $._rn( 120, 122 ) + '.' + $._rn( 0, 99 ) + '.' + $._rn( 0, 9999 ) + '.' + $._rn( 0, 999 ); return 'Mozilla/5.0 (' + $._os + ') AppleWebKit/537.36 (KHTML, like Gecko) Chrome/' + version + ' Safari/537.36'; }