mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-15 11:21:11 +00:00
add some manga extensions
This commit is contained in:
668
javascript/manga/src/zh/manhuadb.js
Normal file
668
javascript/manga/src/zh/manhuadb.js
Normal file
@@ -0,0 +1,668 @@
|
||||
const mangayomiSources = [{
|
||||
"name": "漫画DB",
|
||||
"lang": "zh",
|
||||
"baseUrl": "https://www.manhuadb.com",
|
||||
"apiUrl": "",
|
||||
"iconUrl": "https://www.manhuadb.com/assets/www/img/favicon.png",
|
||||
"typeSource": "single",
|
||||
"isManga": true,
|
||||
"isNsfw": false,
|
||||
"version": "0.0.1",
|
||||
"dateFormat": "",
|
||||
"dateFormatLocale": "",
|
||||
"pkgPath": "manga/src/zh/manhuadb.js"
|
||||
}];
|
||||
|
||||
class DefaultExtension extends MProvider {
|
||||
base64decode(str) {
|
||||
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
|
||||
var c1, c2, c3, c4;
|
||||
var i, len, out;
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while (i < len) {
|
||||
do {
|
||||
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
|
||||
} while (i < len && c1 == -1);
|
||||
if (c1 == -1)
|
||||
break;
|
||||
do {
|
||||
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
|
||||
} while (i < len && c2 == -1);
|
||||
if (c2 == -1)
|
||||
break;
|
||||
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
|
||||
do {
|
||||
c3 = str.charCodeAt(i++) & 0xff;
|
||||
if (c3 == 61)
|
||||
return out;
|
||||
c3 = base64DecodeChars[c3]
|
||||
} while (i < len && c3 == -1);
|
||||
if (c3 == -1)
|
||||
break;
|
||||
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
|
||||
do {
|
||||
c4 = str.charCodeAt(i++) & 0xff;
|
||||
if (c4 == 61)
|
||||
return out;
|
||||
c4 = base64DecodeChars[c4]
|
||||
} while (i < len && c4 == -1);
|
||||
if (c4 == -1)
|
||||
break;
|
||||
out += String.fromCharCode(((c3 & 0x03) << 6) | c4)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
coverUrlConvert(cover_url) {
|
||||
if (cover_url.search("com") == -1) {
|
||||
return this.source.baseUrl + cover_url;
|
||||
}
|
||||
return cover_url;
|
||||
}
|
||||
|
||||
async getMangas(url, search) {
|
||||
const res = await new Client().get(this.source.baseUrl + url);
|
||||
const doc = new Document(res.body);
|
||||
var str;
|
||||
if (search) {
|
||||
str = "div.comicbook-index";
|
||||
} else {
|
||||
str = "div.media";
|
||||
}
|
||||
const items = doc.select(str);
|
||||
const mangas = [];
|
||||
for (const item of items) {
|
||||
const cover = this.coverUrlConvert(item.selectFirst("a.d-block img").attr("src"));
|
||||
var title;
|
||||
if (search) {
|
||||
title = item.selectFirst("a.d-block").attr("title");
|
||||
} else {
|
||||
title = item.selectFirst("a.d-block img").attr("alt");
|
||||
title = title.replace("的封面图", "");
|
||||
}
|
||||
const url = item.selectFirst("a.d-block").attr("href");
|
||||
mangas.push({
|
||||
name: title,
|
||||
link: url,
|
||||
imageUrl: cover
|
||||
});
|
||||
}
|
||||
return {
|
||||
list: mangas,
|
||||
hasNextPage: true
|
||||
}
|
||||
}
|
||||
|
||||
async getPopular(page) {
|
||||
const res = await new Client().get(this.source.baseUrl);
|
||||
const doc = new Document(res.body);
|
||||
const items = doc.select("div.comicbook-index");
|
||||
var mangas = [];
|
||||
for (let item of items) {
|
||||
const cover = this.coverUrlConvert(item.selectFirst("a img").attr("src"));
|
||||
const title = item.selectFirst("a img").attr("alt");
|
||||
const url = item.selectFirst("a").attr("href")
|
||||
mangas.push({
|
||||
name: title.replace("封面", ""),
|
||||
link: url,
|
||||
imageUrl: cover
|
||||
});
|
||||
}
|
||||
return {
|
||||
list: mangas,
|
||||
hasNextPage: false
|
||||
};
|
||||
}
|
||||
|
||||
async getLatestUpdates(page) {
|
||||
return await this.getMangas(`/manhua/list-page-${page}.html`, false);
|
||||
}
|
||||
|
||||
async search(query, page, filters) {
|
||||
if (query == "") {
|
||||
var locations, readers, status, categories;
|
||||
for (const filter of filters) {
|
||||
if (filter["type"] == "locations") {
|
||||
locations = filter["values"][filter["state"]]["value"];
|
||||
} else if (filter["type"] == "readers") {
|
||||
readers = filter["values"][filter["state"]]["value"];
|
||||
} else if (filter["type"] == "status") {
|
||||
status = filter["values"][filter["state"]]["value"];
|
||||
} else if (filter["type"] == "categories") {
|
||||
categories = filter["values"][filter["state"]]["value"];
|
||||
}
|
||||
}
|
||||
const url = `/manhua/list${locations}${readers}${status}${categories}-page-${page}.html`;
|
||||
return await this.getMangas(url.replaceAll("all", ""), false);
|
||||
} else {
|
||||
return await this.getMangas(`/search?q=${query}&p=${page}`, true);
|
||||
}
|
||||
}
|
||||
|
||||
async getDetail(url) {
|
||||
const res = await new Client().get(this.source.baseUrl + url);
|
||||
const doc = new Document(res.body);
|
||||
const title = doc.selectFirst("h1.comic-title").text;
|
||||
const cover = this.coverUrlConvert(doc.selectFirst("td.comic-cover img").attr("src"));
|
||||
const desc = doc.selectFirst("p.comic_story").text;
|
||||
const author = doc.selectFirst("ul.creators a").text;
|
||||
var tags = doc.select("ul.tags a").map(e => e.text);
|
||||
var status = 5;
|
||||
if (tags[0] == "已完结") {
|
||||
status = 1;
|
||||
tags.shift();
|
||||
}
|
||||
if (tags[0] == "连载中") {
|
||||
status = 0;
|
||||
tags.shift();
|
||||
}
|
||||
const items = doc.select("ol.links-of-books");
|
||||
const episodes = [];
|
||||
const ep_names = doc.select("span.h3");
|
||||
const ep_titles = [];
|
||||
for (const ep_name of ep_names) {
|
||||
ep_titles.push(ep_name.text);
|
||||
}
|
||||
var index = 0;
|
||||
for (const lists of items) {
|
||||
const chapters = lists.select("li");
|
||||
for (const chapter of chapters) {
|
||||
const name = chapter.selectFirst("a").attr("title");
|
||||
const url = chapter.selectFirst("a").attr("href");
|
||||
episodes.push({
|
||||
name: `[[${ep_titles[index]}]]${name}`,
|
||||
url: url
|
||||
});
|
||||
}
|
||||
index = index + 1;
|
||||
}
|
||||
return {
|
||||
name: title,
|
||||
imageUrl: cover,
|
||||
description: desc,
|
||||
episodes: episodes,
|
||||
genre: tags,
|
||||
author: author,
|
||||
status: status
|
||||
};
|
||||
}
|
||||
|
||||
async getPageList(url) {
|
||||
const res = await new Client().get(this.source.baseUrl + url);
|
||||
const html = res.body;
|
||||
const doc = new Document(html);
|
||||
const urls = [];
|
||||
var script_str = html.match(/<script>var img_data = '([^']*)';<\/script>/)[1];
|
||||
const img_urls = JSON.parse(this.base64decode(script_str));
|
||||
var img_base = doc.selectFirst("img.show-pic").attr("src");
|
||||
img_base = img_base.substring(0, img_base.search(img_urls[0]['img']));
|
||||
for (const url of img_urls) {
|
||||
urls.push(img_base + url['img']);
|
||||
}
|
||||
return urls;
|
||||
}
|
||||
|
||||
getFilterList() {
|
||||
return [{
|
||||
type: "locations",
|
||||
name: "地区",
|
||||
type_name: "SelectFilter",
|
||||
values: [{
|
||||
value: "all",
|
||||
name: "全部",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-4",
|
||||
name: "日本",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-5",
|
||||
name: "香港",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-6",
|
||||
name: "韩国",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-7",
|
||||
name: "台湾",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-8",
|
||||
name: "内地",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-r-9",
|
||||
name: "欧美",
|
||||
type_name: "SelectOption"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "readers",
|
||||
name: "读者",
|
||||
type_name: "SelectFilter",
|
||||
values: [{
|
||||
value: "all",
|
||||
name: "全部",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-3",
|
||||
name: "少年",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-4",
|
||||
name: "青年",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-5",
|
||||
name: "少女",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-6",
|
||||
name: "男性",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-7",
|
||||
name: "女性",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-9",
|
||||
name: "通用",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-10",
|
||||
name: "儿童",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-11",
|
||||
name: "女青",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-a-12",
|
||||
name: "18限",
|
||||
type_name: "SelectOption"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "status",
|
||||
name: "状态",
|
||||
type_name: "SelectFilter",
|
||||
values: [{
|
||||
value: "all",
|
||||
name: "全部",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-s-1",
|
||||
name: "连载中",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-s-2",
|
||||
name: "已完结",
|
||||
type_name: "SelectOption"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "categories",
|
||||
name: "类型",
|
||||
type_name: "SelectFilter",
|
||||
values: [{
|
||||
value: "all",
|
||||
name: "全部",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-26",
|
||||
name: "爱情",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-66",
|
||||
name: "东方",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-12",
|
||||
name: "冒险",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-64",
|
||||
name: "欢乐向",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-39",
|
||||
name: "百合",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-41",
|
||||
name: "搞笑",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-20",
|
||||
name: "科幻",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-40",
|
||||
name: "校园",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-33",
|
||||
name: "生活",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-48",
|
||||
name: "魔幻",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-13",
|
||||
name: "奇幻",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-46",
|
||||
name: "热血",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-44",
|
||||
name: "格斗",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-71",
|
||||
name: "其他",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-52",
|
||||
name: "神鬼",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-43",
|
||||
name: "魔法",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-27",
|
||||
name: "悬疑",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-18",
|
||||
name: "动作",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-55",
|
||||
name: "竞技",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-72",
|
||||
name: "纯爱",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-32",
|
||||
name: "喜剧",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-59",
|
||||
name: "萌系",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-16",
|
||||
name: "恐怖",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-53",
|
||||
name: "耽美",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-56",
|
||||
name: "四格",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-80",
|
||||
name: "ゆり",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-54",
|
||||
name: "治愈",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-60",
|
||||
name: "伪娘",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-73",
|
||||
name: "舰娘",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-47",
|
||||
name: "励志",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-58",
|
||||
name: "职场",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-30",
|
||||
name: "战争",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-51",
|
||||
name: "侦探",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-21",
|
||||
name: "惊悚",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-22",
|
||||
name: "职业",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-9",
|
||||
name: "历史",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-11",
|
||||
name: "体育",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-45",
|
||||
name: "美食",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-68",
|
||||
name: "秀吉",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-67",
|
||||
name: "性转换",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-19",
|
||||
name: "推理",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-70",
|
||||
name: "音乐舞蹈",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-57",
|
||||
name: "后宫",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-29",
|
||||
name: "料理",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-61",
|
||||
name: "机战",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-78",
|
||||
name: "AA",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-37",
|
||||
name: "社会",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-76",
|
||||
name: "节操",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-17",
|
||||
name: "音乐",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-23",
|
||||
name: "武侠",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-65",
|
||||
name: "西方魔幻",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-28",
|
||||
name: "资料集",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-10",
|
||||
name: "传记",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-49",
|
||||
name: "宅男",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-69",
|
||||
name: "轻小说",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-62",
|
||||
name: "黑道",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-50",
|
||||
name: "舞蹈",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-42",
|
||||
name: "杂志",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-34",
|
||||
name: "灾难",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-77",
|
||||
name: "宅系",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-74",
|
||||
name: "颜艺",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-63",
|
||||
name: "腐女",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-81",
|
||||
name: "露营",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-82",
|
||||
name: "旅行",
|
||||
type_name: "SelectOption"
|
||||
},
|
||||
{
|
||||
value: "-c-83",
|
||||
name: "TS",
|
||||
type_name: "SelectOption"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
getSourcePreferences() {
|
||||
throw new Error("getSourcePreferences not implemented");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user