mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
+
This commit is contained in:
@@ -14,7 +14,7 @@ const mangayomiSources = [
|
|||||||
"pkgPath": "novel/src/all/annasarchive.js",
|
"pkgPath": "novel/src/all/annasarchive.js",
|
||||||
"isNsfw": false,
|
"isNsfw": false,
|
||||||
"hasCloudflare": true,
|
"hasCloudflare": true,
|
||||||
"notes": "EPUBs need to be downloaded to view chapters!",
|
"notes": "EPUBs need to be downloaded to view chapters! Downloads from Libgen might be slow!",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ class DefaultExtension extends MProvider {
|
|||||||
const mangaElements = doc.select("a");
|
const mangaElements = doc.select("a");
|
||||||
const list = [];
|
const list = [];
|
||||||
for (const element of mangaElements) {
|
for (const element of mangaElements) {
|
||||||
const name = element.selectFirst("h3").text;
|
const name = element.selectFirst("h3")?.text.replaceAll("🔍", "").trim();
|
||||||
const imageUrl = element.selectFirst("img").getSrc;
|
const imageUrl = element.selectFirst("img").getSrc;
|
||||||
const link = element.getHref;
|
const link = element.getHref;
|
||||||
if (link.includes("/md5/")) {
|
if (link.includes("/md5/")) {
|
||||||
@@ -46,32 +46,28 @@ class DefaultExtension extends MProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getPopular(page) {
|
async getPopular(page) {
|
||||||
const lang = this.source.lang != "all" ? `&lang=${this.source.lang}` : "";
|
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=&display=&ext=epub&src=lgli&sort=`;
|
||||||
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=&display=&ext=epub&src=zlib&sort=`;
|
if (this.source.lang != "all") {
|
||||||
if (lang !== "") {
|
url += `&lang=${this.source.lang}`;
|
||||||
url += `&lang=${lang}`;
|
|
||||||
}
|
}
|
||||||
const res = await new Client().get(url, this.headers);
|
const res = await new Client().get(url, this.headers);
|
||||||
return this.mangaListFromPage(res);
|
return this.mangaListFromPage(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getLatestUpdates(page) {
|
async getLatestUpdates(page) {
|
||||||
const lang = this.source.lang != "all" ? `&lang=${this.source.lang}` : "";
|
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=&display=&ext=epub&src=lgli&sort=newest`;
|
||||||
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=&display=&ext=epub&src=zlib&sort=newest`;
|
if (this.source.lang != "all") {
|
||||||
if (lang !== "") {
|
url += `&lang=${this.source.lang}`;
|
||||||
url += `&lang=${lang}`;
|
|
||||||
}
|
}
|
||||||
const res = await new Client().get(url, this.headers);
|
const res = await new Client().get(url, this.headers);
|
||||||
return this.mangaListFromPage(res);
|
return this.mangaListFromPage(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
async search(query, page, filters) {
|
async search(query, page, filters) {
|
||||||
const lang = this.source.lang != "all" ? `&lang=${this.source.lang}` : "";
|
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=${query}&display=&ext=epub&src=lgli&sort=`;
|
||||||
let url = `${this.source.baseUrl}/search?index=&page=${page}&q=${query}&display=&ext=epub&src=zlib&sort=`;
|
if (this.source.lang != "all") {
|
||||||
if (lang !== "") {
|
url += `&lang=${this.source.lang}`;
|
||||||
url += `&lang=${lang}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = await new Client().get(url, this.headers);
|
const res = await new Client().get(url, this.headers);
|
||||||
return this.mangaListFromPage(res);
|
return this.mangaListFromPage(res);
|
||||||
}
|
}
|
||||||
@@ -82,140 +78,88 @@ class DefaultExtension extends MProvider {
|
|||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
const main = doc.selectFirst('main[class="main"]');
|
const main = doc.selectFirst('main[class="main"]');
|
||||||
|
|
||||||
|
const name = doc.selectFirst('div.text-3xl.font-bold')?.text.trim();
|
||||||
const description = doc
|
const description = doc
|
||||||
.selectFirst('div[class="mb-1"]')
|
.selectFirst('div[class="mb-1"]')
|
||||||
?.text.trim()
|
?.text.trim()
|
||||||
.replace("description", "");
|
.replace("description", "");
|
||||||
const author = doc.selectFirst('div[class="italic"]')?.text.trim();
|
const author = doc.selectFirst('div[class="italic"]')?.text.replaceAll("🔍", "").trim();
|
||||||
const status = 1;
|
const status = 1;
|
||||||
const genre = [];
|
const genre = [];
|
||||||
console.log(description);
|
|
||||||
|
|
||||||
const mirrorLink = main
|
const mirrorLink = main
|
||||||
.selectFirst('ul[class="list-inside mb-4 ml-1 js-show-external hidden"]')
|
.selectFirst('ul[class="list-inside mb-4 ml-1 js-show-external hidden"]')
|
||||||
.select("li > a")
|
.select("li > a")
|
||||||
.find((el) => el.getHref?.includes("z-lib.fm")).getHref;
|
.find((el) => el.getHref?.includes("libgen.is")).getHref;
|
||||||
|
|
||||||
const bookLink = await this._getMirrorLink(client, mirrorLink);
|
const bookLink = await this._getMirrorLink(client, mirrorLink);
|
||||||
|
|
||||||
const bytes = await client.getBytes("https://z-lib.fm" + bookLink, {
|
if (!bookLink) {
|
||||||
|
return {
|
||||||
|
description,
|
||||||
|
genre,
|
||||||
|
author,
|
||||||
|
status,
|
||||||
|
chapters: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const book = await parseEpub(name, bookLink, {
|
||||||
Connection: "Keep-Alive",
|
Connection: "Keep-Alive",
|
||||||
...this.headers,
|
...this.headers,
|
||||||
});
|
});
|
||||||
|
|
||||||
const book = await parseEpub(this.Utf8ArrayToStr(bytes));
|
|
||||||
|
|
||||||
const chapters = [];
|
const chapters = [];
|
||||||
for (const chapterTitle in book.chapters) {
|
for (const chapterTitle of book.chapters) {
|
||||||
chapters.push({
|
chapters.push({
|
||||||
name: chapterTitle,
|
name: chapterTitle,
|
||||||
url: mirrorLink + ";;;" + chapterTitle,
|
url: mirrorLink + ";;;" + chapterTitle,
|
||||||
dateUpload: Date.now(),
|
dateUpload: String(Date.now()),
|
||||||
scanlator: null,
|
scanlator: null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
chapters.reverse();
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
description,
|
description,
|
||||||
genre,
|
genre,
|
||||||
author,
|
author,
|
||||||
artist,
|
|
||||||
status,
|
status,
|
||||||
chapters,
|
chapters,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
|
|
||||||
/* utf.js - UTF-8 <=> UTF-16 convertion
|
|
||||||
*
|
|
||||||
* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
|
|
||||||
* Version: 1.0
|
|
||||||
* LastModified: Dec 25 1999
|
|
||||||
* This library is free. You can redistribute it and/or modify it.
|
|
||||||
*/
|
|
||||||
Utf8ArrayToStr(array) {
|
|
||||||
var out, i, len, c;
|
|
||||||
var char2, char3;
|
|
||||||
|
|
||||||
out = "";
|
|
||||||
len = array.length;
|
|
||||||
i = 0;
|
|
||||||
while (i < len) {
|
|
||||||
c = array[i++];
|
|
||||||
switch (c >> 4) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
case 7:
|
|
||||||
// 0xxxxxxx
|
|
||||||
out += String.fromCharCode(c);
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
case 13:
|
|
||||||
// 110x xxxx 10xx xxxx
|
|
||||||
char2 = array[i++];
|
|
||||||
out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
// 1110 xxxx 10xx xxxx 10xx xxxx
|
|
||||||
char2 = array[i++];
|
|
||||||
char3 = array[i++];
|
|
||||||
out += String.fromCharCode(
|
|
||||||
((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
async _getMirrorLink(client, mirrorLink) {
|
async _getMirrorLink(client, mirrorLink) {
|
||||||
const res = await client.get(mirrorLink, {
|
const res = await client.get(mirrorLink, {
|
||||||
Origin: this.source.baseUrl,
|
Origin: this.source.baseUrl,
|
||||||
...this.headers,
|
...this.headers,
|
||||||
});
|
});
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
return doc.selectFirst(
|
const links = doc.select(
|
||||||
"div.book-details-button > div.btn-group > a.addDownloadedBook"
|
"a"
|
||||||
).getHref;
|
);
|
||||||
/*const res = await client.get(mirrorLink, {
|
const libgenRs = links.find((el) => el.getHref?.includes("books.ms"))?.getHref;
|
||||||
"Host": "annas-archive.org",
|
const libgenLi = links.find((el) => el.getHref?.includes("libgen.li"))?.getHref;
|
||||||
"Origin": this.source.baseUrl,
|
if (libgenRs && (await client.head(libgenRs, this.headers)).statusCode === 200) {
|
||||||
"Sec-Fetch-Dest": "document",
|
const response = await client.get(libgenRs, this.headers);
|
||||||
"Sec-Fetch-Mode": "navigate",
|
const document = new Document(response.body);
|
||||||
"Sec-Fetch-Site": "none",
|
return document.selectFirst('div#download > h2 > a')?.getHref;
|
||||||
...this.headers
|
} else if (libgenLi && (await client.head(libgenLi, this.headers)).statusCode === 200) {
|
||||||
});
|
const response = await client.get(libgenLi, this.headers);
|
||||||
const doc = new Document(res.body);
|
const document = new Document(response.body);
|
||||||
const links = doc.select('ul[class="mb-4"] > li > a').map((el) => el.getHref).filter((el) => el);
|
return "https://libgen.li/" + document.selectFirst('tbody > tr > td > a')?.getHref;
|
||||||
for (var url in links) {
|
|
||||||
try {
|
|
||||||
const response = await client.head(url, this.headers);
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
}
|
||||||
return null;*/
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getHtmlContent(url) {
|
async getHtmlContent(chapterName, url) {
|
||||||
const urls = url.split(";;;");
|
const urls = url.split(";;;");
|
||||||
const client = await new Client();
|
const client = await new Client();
|
||||||
const bookLink = await this._getMirrorLink(client, urls[0]);
|
const bookLink = await this._getMirrorLink(client, urls[0]);
|
||||||
|
|
||||||
const bytes = await client.getBytes("https://z-lib.fm" + bookLink, {
|
return await parseEpubChapter(chapterName, bookLink, {
|
||||||
Connection: "Keep-Alive",
|
Connection: "Keep-Alive",
|
||||||
...this.headers,
|
...this.headers,
|
||||||
});
|
}, urls[1]);
|
||||||
|
|
||||||
return await parseEpubChapter(this.Utf8ArrayToStr(bytes), urls[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async cleanHtmlContent(html) {
|
async cleanHtmlContent(html) {
|
||||||
|
|||||||
Reference in New Issue
Block a user