diff --git a/javascript/manga/src/zh/77mh.js b/javascript/manga/src/zh/77mh.js index 5ec512d8..d72999f4 100644 --- a/javascript/manga/src/zh/77mh.js +++ b/javascript/manga/src/zh/77mh.js @@ -1,258 +1,258 @@ const mangayomiSources = [{ - "name": "新新漫画", - "lang": "zh", - "baseUrl": "https://www.77mh.nl", - "apiUrl": "", - "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.77mh.png", - "typeSource": "single", - "itemType": 0, - "isNsfw": false, - "version": "0.0.25", - "apiUrl": "", - "dateFormat": "", - "dateFormatLocale": "", - "pkgName": "manga/src/zh/77mh.js" -}]; - -class DefaultExtension extends MProvider { - StringResolve1(p, a, c, k, e, d) { - e = function(c) { - return c.toString(36) - }; - if (!''.replace(/^/, String)) { - while (c--) { - d[c.toString(a)] = k[c] || c.toString(a) - } - k = [function(e) { - return d[e] - }]; - e = function() { - return '\\w+' - }; - c = 1 - }; - while (c--) { - if (k[c]) { - p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) - } - } - return p - } - - StringResolve2(p, a, c, k, e, d) { - e = function(c) { - return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) - }; - if (!''.replace(/^/, String)) { - while (c--) { - d[e(c)] = k[c] || e(c) - } - k = [function(e) { - return d[e] - }]; - e = function() { - return '\\w+' - }; - c = 1 - }; - while (c--) { - if (k[c]) { - p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) - } - } - return p - } - - async getIndex1(url) { - const res = await new Client().get(url); - const doc = new Document(res.body); - const elements = doc.select("div.ar_list_co li"); - const mangas = []; - for (const element of elements) { - const title = element.selectFirst("span a").text; - const url = element.selectFirst("span a").attr("href"); - const cover = element.selectFirst("img").attr("src"); - mangas.push({ - name: title, - link: url, - imageUrl: cover - }); - } - return { - list: mangas, - hasNextPage: true - }; - - } - - async getIndex2(url) { - const res = await new Client().get(url); - const doc = new Document(res.body); - const elements = doc.select("div.ar_list_co dl"); - const mangas = []; - for (const element of elements) { - const title = element.selectFirst("h1 a").text.replace("", "").replace("", ""); - const url = element.selectFirst("h1 a").attr("href"); - const cover = element.selectFirst("img").attr("src"); - mangas.push({ - name: title, - link: url, - imageUrl: cover - }); - } - return { - list: mangas, - hasNextPage: true - }; - - } + "name": "新新漫画", + "lang": "zh", + "baseUrl": "http://www.77mh.xyz", + "apiUrl": "", + "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.77mh.png", + "typeSource": "single", + "itemType": 0, + "isNsfw": false, + "version": "0.0.3", + "apiUrl": "", + "dateFormat": "", + "dateFormatLocale": "", + "pkgName": "manga/src/zh/77mh.js" + }]; - async getPopular(page) { - return await this.getIndex1(this.source.baseUrl + "/new_coc.html"); - } - - async getLatestUpdates(page) { - return await this.getIndex1(`${this.source.baseUrl}/lianzai/index_${page - 1}.html`); - } - - async search(query, page, filters) { - var url; - if (query == "") { - url = `${this.source.baseUrl}${filters[0]["values"][filters[0]["state"]]["value"]}/index_${page-1}.html` - } else { - url = `${this.source.baseUrl.replace("www","so")}/k.php?k=${query}&p=${page}`; - } - return await this.getIndex2(url); - } - - async getDetail(url) { - const res = await new Client().get(this.source.baseUrl + url); - const doc = new Document(res.body); - const info = doc.selectFirst("div.ar_list_coc"); - const cover = info.selectFirst("img").attr("src"); - const title = info.selectFirst("h1").text; - const info_other = info.selectFirst("ul.ar_list_coc"); - const author = info_other.selectFirst("a").text; - const status_str = info_other.select("a")[1].text; - var status; - if (status_str == "已完结") { - status = 1; - } else { - status = 0; - } - const desc = info.selectFirst("i#det").text; - const elements = doc.select("ul.ar_rlos_bor li a"); - const chapters = []; - for (const element of elements) { - chapters.push({ - name: element.text, - url: element.attr("href") - }); - } - return { - name: title, - imageUrl: cover, - description: desc, - author: author, - status: status, - episodes: chapters - }; - } - - async getPageList(url) { - const preference = new SharedPreferences(); - const image_host = preference.get("imghost"); - const res = await new Client().get(this.source.baseUrl + url); - const strs = res.body.match(/return p}\('(.*?)'.split\('/)[1].split(','); - var result; - try { - result = this.StringResolve1(strs[0], strs[1], strs[2], strs[3].split('|'), 0, {}).replaceAll("'", ""); - } catch { - result = this.StringResolve2(strs[0], strs[1], strs[2], strs[3].split('|'), 0, {}).replaceAll("'", ""); - } - const url_part = result.match(/var img_s=(.*?);var preLink_b/)[1]; - const urls = result.match(/var msg=(.*?);var maxPage/)[1].replaceAll("\\", "").split('|'); - const pages = []; - for (const url of urls) { - pages.push(image_host + `/h${url_part}/` + url); - } - return pages; - } - - getFilterList() { - return [{ - type: "category", - name: "分类", - type_name: "SelectFilter", - values: [{ - value: "/rexue", - name: "热血机战", - type_name: "SelectOption" - }, - { - value: "/kehuan", - name: "科幻未来", - type_name: "SelectOption" - }, - { - value: "/kongbu", - name: "恐怖惊悚", - type_name: "SelectOption" - }, - { - value: "/xuanyi", - name: "推理悬疑", - type_name: "SelectOption" - }, - { - value: "/gaoxiao", - name: "滑稽搞笑", - type_name: "SelectOption" - }, - { - value: "/love", - name: "恋爱生活", - type_name: "SelectOption" - }, - { - value: "/danmei", - name: "耽美人生", - type_name: "SelectOption" - }, - { - value: "/tiyu", - name: "体育竞技", - type_name: "SelectOption" - }, - { - value: "/chunqing", - name: "纯情少女", - type_name: "SelectOption" - }, - { - value: "/qihuan", - name: "魔法奇幻", - type_name: "SelectOption" - }, - { - value: "/wuxia", - name: "武侠经典", - type_name: "SelectOption" + class DefaultExtension extends MProvider { + StringResolve1(p, a, c, k, e, d) { + e = function(c) { + return c.toString(36) + }; + if (!''.replace(/^/, String)) { + while (c--) { + d[c.toString(a)] = k[c] || c.toString(a) + } + k = [function(e) { + return d[e] + }]; + e = function() { + return '\\w+' + }; + c = 1 + }; + while (c--) { + if (k[c]) { + p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } - ] - }]; - } - - getSourcePreferences() { - return [{ - "key": "imghost", - "listPreference": { - "title": "图片服务器", - "summary": "", - "valueIndex": 0, - "entries": ["服务器1", "服务器2"], - "entryValues": ["https://picsh.77dm.top", "https://imgsh.dm365.top"], } - }]; + return p + } + + StringResolve2(p, a, c, k, e, d) { + e = function(c) { + return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) + }; + if (!''.replace(/^/, String)) { + while (c--) { + d[e(c)] = k[c] || e(c) + } + k = [function(e) { + return d[e] + }]; + e = function() { + return '\\w+' + }; + c = 1 + }; + while (c--) { + if (k[c]) { + p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) + } + } + return p + } + + async getIndex1(url) { + const res = await new Client().get(url); + const doc = new Document(res.body); + const elements = doc.select("div.ar_list_co li"); + const mangas = []; + for (const element of elements) { + const title = element.selectFirst("span a").text; + const url = element.selectFirst("span a").attr("href"); + const cover = element.selectFirst("img").attr("src"); + mangas.push({ + name: title, + link: url, + imageUrl: cover + }); + } + return { + list: mangas, + hasNextPage: true + }; + + } + + async getIndex2(url) { + const res = await new Client().get(url); + const doc = new Document(res.body); + const elements = doc.select("div.ar_list_co dl"); + const mangas = []; + for (const element of elements) { + const title = element.selectFirst("h1 a").text.replace("", "").replace("", ""); + const url = "/" + element.selectFirst("h1 a").attr("href").split("/").slice(-1)[0]; + const cover = element.selectFirst("img").attr("src"); + mangas.push({ + name: title, + link: url, + imageUrl: cover + }); + } + return { + list: mangas, + hasNextPage: true + }; + + } + + async getPopular(page) { + return await this.getIndex1(this.source.baseUrl + "/new_coc.html"); + } + + async getLatestUpdates(page) { + return await this.getIndex1(`${this.source.baseUrl}/lianzai/index_${page - 1}.html`); + } + + async search(query, page, filters) { + var url; + if (query == "") { + url = `${this.source.baseUrl}${filters[0]["values"][filters[0]["state"]]["value"]}/index_${page-1}.html` + } else { + url = `${this.source.baseUrl.replace("www","so")}/k.php?k=${query}&p=${page}`; + } + return await this.getIndex2(url); + } + + async getDetail(url) { + const res = await new Client().get(this.source.baseUrl + url); + const doc = new Document(res.body); + const info = doc.selectFirst("div.ar_list_coc"); + const cover = info.selectFirst("img").attr("src"); + const title = info.selectFirst("h1").text; + const info_other = info.selectFirst("ul.ar_list_coc"); + const author = info_other.selectFirst("a").text; + const status_str = info_other.select("a")[1].text; + var status; + if (status_str == "已完结") { + status = 1; + } else { + status = 0; + } + const desc = info.selectFirst("i#det").text; + const elements = doc.select("ul.ar_rlos_bor li a"); + const chapters = []; + for (const element of elements) { + chapters.push({ + name: element.text, + url: element.attr("href") + }); + } + return { + name: title, + imageUrl: cover, + description: desc, + author: author, + status: status, + episodes: chapters + }; + } + + async getPageList(url) { + const preference = new SharedPreferences(); + const image_host = preference.get("imghost"); + const res = await new Client().get(this.source.baseUrl + url); + const strs = res.body.match(/return p}\('(.*?)'.split\('/)[1].split(','); + var result; + try { + result = this.StringResolve1(strs[0], strs[1], strs[2], strs[3].split('|'), 0, {}).replaceAll("'", ""); + } catch { + result = this.StringResolve2(strs[0], strs[1], strs[2], strs[3].split('|'), 0, {}).replaceAll("'", ""); + } + const url_part = result.match(/var img_s=(.*?);var preLink_b/)[1]; + const urls = result.match(/var msg=(.*?);var maxPage/)[1].replaceAll("\\", "").split('|'); + const pages = []; + for (const url of urls) { + pages.push(image_host + `/h${url_part}/` + url); + } + return pages; + } + + getFilterList() { + return [{ + type: "category", + name: "分类", + type_name: "SelectFilter", + values: [{ + value: "/rexue", + name: "热血机战", + type_name: "SelectOption" + }, + { + value: "/kehuan", + name: "科幻未来", + type_name: "SelectOption" + }, + { + value: "/kongbu", + name: "恐怖惊悚", + type_name: "SelectOption" + }, + { + value: "/xuanyi", + name: "推理悬疑", + type_name: "SelectOption" + }, + { + value: "/gaoxiao", + name: "滑稽搞笑", + type_name: "SelectOption" + }, + { + value: "/love", + name: "恋爱生活", + type_name: "SelectOption" + }, + { + value: "/danmei", + name: "耽美人生", + type_name: "SelectOption" + }, + { + value: "/tiyu", + name: "体育竞技", + type_name: "SelectOption" + }, + { + value: "/chunqing", + name: "纯情少女", + type_name: "SelectOption" + }, + { + value: "/qihuan", + name: "魔法奇幻", + type_name: "SelectOption" + }, + { + value: "/wuxia", + name: "武侠经典", + type_name: "SelectOption" + } + ] + }]; + } + + getSourcePreferences() { + return [{ + "key": "imghost", + "listPreference": { + "title": "图片服务器", + "summary": "", + "valueIndex": 0, + "entries": ["服务器1", "服务器2"], + "entryValues": ["https://picsh.77dm.top", "https://imgsh.dm365.top", "https://hws.gdbyhtl.net"], + } + }]; + } } -}