From 193ee8e93bafd14cbd92854d00c92cdfe1232bd2 Mon Sep 17 00:00:00 2001 From: yxxyun Date: Thu, 19 Sep 2024 20:46:18 +0800 Subject: [PATCH] add some vod collection site --- javascript/anime/src/zh/aosikazy.js | 179 ++++++++++++++++++++++++ javascript/anime/src/zh/ffzy.js | 179 ++++++++++++++++++++++++ javascript/anime/src/zh/huaweiba.js | 188 ++++++++++++++++++++++++++ javascript/anime/src/zh/jisuzy.js | 185 +++++++++++++++++++++++++ javascript/anime/src/zh/tiankongzy.js | 184 +++++++++++++++++++++++++ 5 files changed, 915 insertions(+) create mode 100644 javascript/anime/src/zh/aosikazy.js create mode 100644 javascript/anime/src/zh/ffzy.js create mode 100644 javascript/anime/src/zh/huaweiba.js create mode 100644 javascript/anime/src/zh/jisuzy.js create mode 100644 javascript/anime/src/zh/tiankongzy.js diff --git a/javascript/anime/src/zh/aosikazy.js b/javascript/anime/src/zh/aosikazy.js new file mode 100644 index 00000000..83504383 --- /dev/null +++ b/javascript/anime/src/zh/aosikazy.js @@ -0,0 +1,179 @@ +const mangayomiSources = [{ + "name": "奥斯卡资源站", + "lang": "zh", + "baseUrl": "https://aosikazy1.com", + "apiUrl": "", + "iconUrl": "https://aosikazy1.com/template/m1938pc3/image/favicon.ico", + "typeSource": "single", + "isManga": false, + "isNsfw": true, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/zh/aosikazy.js" +}]; + +class DefaultExtension extends MProvider { + dict = new Map([ + [" ", " "], + [""", '"'], + ["<", "<"], + [">", ">"], + ["&", "&"], + ["⋅", "·"], + ]); + text(content) { + if (!content) return ""; + const str = + [...content.matchAll(/>([^<]+?) m[1]) + .join("") + .trim() || content; + return str.replace(/&[a-z]+;/g, (c) => this.dict.get(c) || c); + } + async request(url) { + const preference = new SharedPreferences(); + return (await new Client({ 'useDartHttpClient': true }).get(preference.get("url") + "/api.php/provide/vod?ac=detail" + url, { "Referer": preference.get("url") })).body; + } + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + async getPopular(page) { + // let genres = []; + // const gen = JSON.parse(await this.request("&ac=list")); + // gen.class.forEach((e) => { + // genres.push({ + // type_name: "SelectOption", + // value: e.type_id, + // name: e.type_name + // }); + // }); + // console.log(genres) + const res = JSON.parse(await this.request(`&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getLatestUpdates(page) { + const h = (new Date().getUTCHours() + 9) % 24; + const res = JSON.parse(await this.request(`&pg=${page}&h=${h || 24}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async search(query, page, filters) { + var categories; + for (const filter of filters) { + if (filter["type"] == "categories") { + categories = filter["values"][filter["state"]]["value"]; + } + } + const res = JSON.parse(await this.request(`&wd=${query}&t=${categories ?? ""}&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getDetail(url) { + let desc = "无"; + const anime = JSON.parse(await this.request(url)).list[0]; + const blurb = this.text(anime.vod_blurb); + const content = this.text(anime.vod_content); + desc = desc.length < blurb?.length ? blurb : desc; + desc = desc.length < content.length ? content : desc; + const urls = anime.vod_play_url + .split("#") + .filter((e) => e) + .map((e) => { + const s = e.split("$"); + return { name: s[0], url: s[1] }; + }); + return { + name: anime.vod_name, + imageUrl: anime.vod_pic, + description: desc, + episodes: urls + }; + } + // For anime episode video list + async getVideoList(url) { + return [{ + url: url, + originalUrl: url, + quality: "HLS" + }]; + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + return [{ + type: "categories", + name: "影片類型", + type_name: "SelectFilter", + values: [ + // { type_name: "SelectOption", value: "1", name: "电影" }, + // { type_name: "SelectOption", value: "2", name: "连续剧" }, + // { type_name: "SelectOption", value: "3", name: "综艺" }, + { type_name: "SelectOption", value: "", name: "全部" }, + { type_name: "SelectOption", value: "20", name: "国产视频" }, + { type_name: "SelectOption", value: "21", name: "中文字幕" }, + { type_name: "SelectOption", value: "22", name: "国产传媒" }, + { type_name: "SelectOption", value: "23", name: "日本有码" }, + { type_name: "SelectOption", value: "24", name: "日本无码" }, + { type_name: "SelectOption", value: "25", name: "欧美无码" }, + { type_name: "SelectOption", value: "26", name: "强奸乱伦" }, + { type_name: "SelectOption", value: "27", name: "制服诱惑" }, + { type_name: "SelectOption", value: "28", name: "国产主播" }, + { type_name: "SelectOption", value: "29", name: "激情动漫" }, + { type_name: "SelectOption", value: "30", name: "明星换脸" }, + { type_name: "SelectOption", value: "31", name: "抖阴视频" }, + { type_name: "SelectOption", value: "32", name: "女优明星" }, + { type_name: "SelectOption", value: "33", name: "视频一区" }, + { type_name: "SelectOption", value: "34", name: "视频二区" }, + { type_name: "SelectOption", value: "35", name: "网曝黑料" }, + { type_name: "SelectOption", value: "36", name: "视频三区" }, + { type_name: "SelectOption", value: "37", name: "伦理三级" }, + { type_name: "SelectOption", value: "38", name: "AV解说" }, + { type_name: "SelectOption", value: "39", name: "SM调教" }, + { type_name: "SelectOption", value: "40", name: "萝莉少女" }, + { type_name: "SelectOption", value: "41", name: "极品媚黑" }, + { type_name: "SelectOption", value: "42", name: "女同性恋" }, + { type_name: "SelectOption", value: "43", name: "网红头条" }, + { type_name: "SelectOption", value: "44", name: "视频四区" }, + { type_name: "SelectOption", value: "45", name: "人妖系列" }, + { type_name: "SelectOption", value: "46", name: "韩国主播" }, + { type_name: "SelectOption", value: "47", name: "VR视角" } + ] + }]; + } + getSourcePreferences() { + return [ + { + "key": "url", + "listPreference": { + "title": "Website Url", + "summary": "", + "valueIndex": 0, + "entries": ["aosikazy1", "aosikazy2", "aosikazy3", "aosikazy4", "aosikazy5", "aosikazy6", "aosikazy7", "aosikazy8", "aosikazy9", "aosikazy10"], + "entryValues": ["https://aosikazy1.com", "https://aosikazy2.com", "https://aosikazy3.com", "https://aosikazy4.com", "https://aosikazy5.com", "https://aosikazy6.com", "https://aosikazy7.com", "https://aosikazy8.com", "https://aosikazy9.com", "https://aosikazy10.com"], + } + } + ]; + } +} diff --git a/javascript/anime/src/zh/ffzy.js b/javascript/anime/src/zh/ffzy.js new file mode 100644 index 00000000..f9dd2184 --- /dev/null +++ b/javascript/anime/src/zh/ffzy.js @@ -0,0 +1,179 @@ +const mangayomiSources = [{ + "name": "非凡资源", + "lang": "zh", + "baseUrl": "http://ffzy.tv", + "apiUrl": "", + "iconUrl": "http://ffzy.tv/template/default/img/favicon.png", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/zh/ffzy.js" +}]; + +class DefaultExtension extends MProvider { + dict = new Map([ + [" ", " "], + [""", '"'], + ["<", "<"], + [">", ">"], + ["&", "&"], + ["⋅", "·"], + ]); + text(content) { + if (!content) return ""; + const str = + [...content.matchAll(/>([^<]+?) m[1]) + .join("") + .trim() || content; + return str.replace(/&[a-z]+;/g, (c) => this.dict.get(c) || c); + } + async request(url) { + const preference = new SharedPreferences(); + return (await new Client({ 'useDartHttpClient': true }).get(preference.get("url") + "/api.php/provide/vod?ac=detail" + url, { "Referer": preference.get("url") })).body; + } + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + async getPopular(page) { + // let genres = []; + // const gen = JSON.parse(await this.request("&ac=list")); + // gen.class.forEach((e) => { + // genres.push({ + // type_name: "SelectOption", + // value: e.type_id, + // name: e.type_name + // }); + // }); + // console.log(genres) + const res = JSON.parse(await this.request(`&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getLatestUpdates(page) { + const h = (new Date().getUTCHours() + 9) % 24; + const res = JSON.parse(await this.request(`&pg=${page}&h=${h || 24}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async search(query, page, filters) { + var categories; + for (const filter of filters) { + if (filter["type"] == "categories") { + categories = filter["values"][filter["state"]]["value"]; + } + } + const res = JSON.parse(await this.request(`&wd=${query}&t=${categories ?? ""}&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getDetail(url) { + let desc = "无"; + const anime = JSON.parse(await this.request(url)).list[0]; + const blurb = this.text(anime.vod_blurb); + const content = this.text(anime.vod_content); + desc = desc.length < blurb?.length ? blurb : desc; + desc = desc.length < content.length ? content : desc; + const urls = anime.vod_play_url + .split("#") + .filter((e) => e) + .map((e) => { + const s = e.split("$"); + return { name: s[0], url: s[1] }; + }); + return { + name: anime.vod_name, + imageUrl: anime.vod_pic, + description: desc, + episodes: urls + }; + } + // For anime episode video list + async getVideoList(url) { + return [{ + url: url, + originalUrl: url, + quality: "HLS" + }]; + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + return [{ + type: "categories", + name: "影片類型", + type_name: "SelectFilter", + values: [ + { type_name: "SelectOption", value: "", name: "全部" }, + // {type_name:"SelectOption",value:"1",name:"电影片"}, + // {type_name:"SelectOption",value:"2",name:"连续剧"}, + // {type_name:"SelectOption",value:"3",name:"综艺片"}, + { type_name: "SelectOption", value: "4", name: "动漫片" }, + { type_name: "SelectOption", value: "6", name: "动作片" }, + { type_name: "SelectOption", value: "7", name: "喜剧片" }, + { type_name: "SelectOption", value: "8", name: "爱情片" }, + { type_name: "SelectOption", value: "9", name: "科幻片" }, + { type_name: "SelectOption", value: "10", name: "恐怖片" }, + { type_name: "SelectOption", value: "11", name: "剧情片" }, + { type_name: "SelectOption", value: "12", name: "战争片" }, + { type_name: "SelectOption", value: "13", name: "国产剧" }, + { type_name: "SelectOption", value: "14", name: "香港剧" }, + { type_name: "SelectOption", value: "15", name: "韩国剧" }, + { type_name: "SelectOption", value: "16", name: "欧美剧" }, + { type_name: "SelectOption", value: "20", name: "记录片" }, + { type_name: "SelectOption", value: "21", name: "台湾剧" }, + { type_name: "SelectOption", value: "22", name: "日本剧" }, + { type_name: "SelectOption", value: "23", name: "海外剧" }, + { type_name: "SelectOption", value: "24", name: "泰国剧" }, + { type_name: "SelectOption", value: "25", name: "大陆综艺" }, + { type_name: "SelectOption", value: "26", name: "港台综艺" }, + { type_name: "SelectOption", value: "27", name: "日韩综艺" }, + { type_name: "SelectOption", value: "28", name: "欧美综艺" }, + { type_name: "SelectOption", value: "29", name: "国产动漫" }, + { type_name: "SelectOption", value: "30", name: "日韩动漫" }, + { type_name: "SelectOption", value: "31", name: "欧美动漫" }, + { type_name: "SelectOption", value: "32", name: "港台动漫" }, + { type_name: "SelectOption", value: "33", name: "海外动漫" }, + { type_name: "SelectOption", value: "34", name: "伦理片" }, + { type_name: "SelectOption", value: "36", name: "短剧" } + ] + }]; + } + getSourcePreferences() { + return [ + { + "key": "url", + "listPreference": { + "title": "Website Url", + "summary": "", + "valueIndex": 0, + "entries": ["ffzy", "ffzy1", "ffzy2", "ffzy3", "ffzy4", "ffzy5"], + "entryValues": ["http://ffzy.tv", "http://ffzy1.tv", "http://ffzy2.tv", "http://ffzy3.tv", "http://ffzy4.tv", "http://ffzy5.tv"], + } + } + ]; + } +} diff --git a/javascript/anime/src/zh/huaweiba.js b/javascript/anime/src/zh/huaweiba.js new file mode 100644 index 00000000..200de6f7 --- /dev/null +++ b/javascript/anime/src/zh/huaweiba.js @@ -0,0 +1,188 @@ +const mangayomiSources = [{ + "name": "华为吧资源", + "lang": "zh", + "baseUrl": "https://huaweiba.live", + "apiUrl": "", + "iconUrl": "https://huaweiba.live/template/ziyuan/images/logo2.png", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/zh/huaweiba.js" +}]; + +class DefaultExtension extends MProvider { + dict = new Map([ + [" ", " "], + [""", '"'], + ["<", "<"], + [">", ">"], + ["&", "&"], + ["⋅", "·"], + ]); + text(content) { + if (!content) return ""; + const str = + [...content.matchAll(/>([^<]+?) m[1]) + .join("") + .trim() || content; + return str.replace(/&[a-z]+;/g, (c) => this.dict.get(c) || c); + } + async request(url) { + return (await new Client({ 'useDartHttpClient': true }).get(this.source.baseUrl + "/api.php/provide/vod?ac=detail" + url, { "Referer": this.source.baseUrl })).body; + } + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + async getPopular(page) { + // let genres = []; + // const gen = JSON.parse(await this.request("&ac=list")); + // gen.class.forEach((e) => { + // genres.push({ + // type_name: "SelectOption", + // value: e.type_id, + // name: e.type_name + // }); + // }); + // console.log(genres) + const res = JSON.parse(await this.request(`&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getLatestUpdates(page) { + const h = (new Date().getUTCHours() + 9) % 24; + const res = JSON.parse(await this.request(`&pg=${page}&h=${h || 24}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async search(query, page, filters) { + var categories; + for (const filter of filters) { + if (filter["type"] == "categories") { + categories = filter["values"][filter["state"]]["value"]; + } + } + const res = JSON.parse(await this.request(`&wd=${query}&t=${categories ?? ""}&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getDetail(url) { + let desc = "无"; + const anime = JSON.parse(await this.request(url)).list[0]; + const blurb = this.text(anime.vod_blurb); + const content = this.text(anime.vod_content); + desc = desc.length < blurb?.length ? blurb : desc; + desc = desc.length < content.length ? content : desc; + const urls = anime.vod_play_url + .split("#") + .filter((e) => e) + .map((e) => { + const s = e.split("$"); + return { name: s[0], url: s[1] }; + }); + return { + name: anime.vod_name, + imageUrl: anime.vod_pic, + description: desc, + episodes: urls + }; + } + // For anime episode video list + async getVideoList(url) { + return [{ + url: url, + originalUrl: url, + quality: "HLS" + }]; + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + return [{ + type: "categories", + name: "影片類型", + type_name: "SelectFilter", + values: [ + { type_name: "SelectOption", value: "", name: "全部" }, + { type_name: "SelectOption", value: "20", name: "电影" }, + { type_name: "SelectOption", value: "22", name: "冒险片" }, + { type_name: "SelectOption", value: "24", name: "剧情片" }, + { type_name: "SelectOption", value: "26", name: "动作片" }, + { type_name: "SelectOption", value: "28", name: "动画电影" }, + { type_name: "SelectOption", value: "30", name: "同性片" }, + { type_name: "SelectOption", value: "32", name: "喜剧片" }, + { type_name: "SelectOption", value: "34", name: "奇幻片" }, + { type_name: "SelectOption", value: "36", name: "恐怖片" }, + { type_name: "SelectOption", value: "38", name: "悬疑片" }, + { type_name: "SelectOption", value: "40", name: "惊悚片" }, + { type_name: "SelectOption", value: "42", name: "歌舞片" }, + { type_name: "SelectOption", value: "44", name: "灾难片" }, + { type_name: "SelectOption", value: "46", name: "爱情片" }, + { type_name: "SelectOption", value: "48", name: "科幻片" }, + { type_name: "SelectOption", value: "50", name: "犯罪片" }, + { type_name: "SelectOption", value: "52", name: "经典片" }, + { type_name: "SelectOption", value: "54", name: "网络电影" }, + { type_name: "SelectOption", value: "56", name: "战争片" }, + { type_name: "SelectOption", value: "58", name: "伦理片" }, + { type_name: "SelectOption", value: "60", name: "电视剧" }, + { type_name: "SelectOption", value: "62", name: "欧美剧" }, + { type_name: "SelectOption", value: "64", name: "日剧" }, + { type_name: "SelectOption", value: "66", name: "韩剧" }, + { type_name: "SelectOption", value: "68", name: "台剧" }, + { type_name: "SelectOption", value: "70", name: "泰剧" }, + { type_name: "SelectOption", value: "72", name: "国产剧" }, + { type_name: "SelectOption", value: "74", name: "港剧" }, + { type_name: "SelectOption", value: "76", name: "新马剧" }, + { type_name: "SelectOption", value: "78", name: "其他剧" }, + { type_name: "SelectOption", value: "80", name: "动漫" }, + { type_name: "SelectOption", value: "82", name: "综艺" }, + { type_name: "SelectOption", value: "84", name: "体育" }, + { type_name: "SelectOption", value: "86", name: "纪录片" }, + { type_name: "SelectOption", value: "88", name: "篮球" }, + { type_name: "SelectOption", value: "90", name: "足球" }, + { type_name: "SelectOption", value: "92", name: "网球" }, + { type_name: "SelectOption", value: "94", name: "斯诺克" }, + { type_name: "SelectOption", value: "96", name: "欧美动漫" }, + { type_name: "SelectOption", value: "98", name: "日韩动漫" }, + { type_name: "SelectOption", value: "100", name: "国产动漫" }, + { type_name: "SelectOption", value: "102", name: "新马泰动漫" }, + { type_name: "SelectOption", value: "104", name: "港台动漫" }, + { type_name: "SelectOption", value: "106", name: "其他动漫" }, + { type_name: "SelectOption", value: "108", name: "国产综艺" }, + { type_name: "SelectOption", value: "110", name: "日韩综艺" }, + { type_name: "SelectOption", value: "112", name: "欧美综艺" }, + { type_name: "SelectOption", value: "114", name: "新马泰综艺" }, + { type_name: "SelectOption", value: "116", name: "港台综艺" }, + { type_name: "SelectOption", value: "118", name: "其他综艺" }, + { type_name: "SelectOption", value: "120", name: "短剧" }, + { type_name: "SelectOption", value: "122", name: "预告片" } + ] + }]; + } + getSourcePreferences() { + throw new Error("getSourcePreferences not implemented"); + } +} diff --git a/javascript/anime/src/zh/jisuzy.js b/javascript/anime/src/zh/jisuzy.js new file mode 100644 index 00000000..7600ceb4 --- /dev/null +++ b/javascript/anime/src/zh/jisuzy.js @@ -0,0 +1,185 @@ +const mangayomiSources = [{ + "name": "极速资源", + "lang": "zh", + "baseUrl": "https://wwww.jisuzy.com", + "apiUrl": "", + "iconUrl": "https://www.jisuzy.com/template/default/images/site_logo.png", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/zh/jisuzy.js" +}]; + +class DefaultExtension extends MProvider { + dict = new Map([ + [" ", " "], + [""", '"'], + ["<", "<"], + [">", ">"], + ["&", "&"], + ["⋅", "·"], + ]); + text(content) { + if (!content) return ""; + const str = + [...content.matchAll(/>([^<]+?) m[1]) + .join("") + .trim() || content; + return str.replace(/&[a-z]+;/g, (c) => this.dict.get(c) || c); + } + async request(url) { + const preference = new SharedPreferences(); + return (await new Client({ 'useDartHttpClient': true }).get(preference.get("url") + "/api.php/provide/vod?ac=detail" + url, { "Referer": preference.get("url") })).body; + } + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + async getPopular(page) { + // let genres = []; + // const gen = JSON.parse(await this.request("&ac=list")); + // gen.class.forEach((e) => { + // genres.push({ + // type_name: "SelectOption", + // value: e.type_id, + // name: e.type_name + // }); + // }); + // console.log(genres) + const res = JSON.parse(await this.request(`&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getLatestUpdates(page) { + const h = (new Date().getUTCHours() + 9) % 24; + const res = JSON.parse(await this.request(`&pg=${page}&h=${h || 24}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async search(query, page, filters) { + var categories; + for (const filter of filters) { + if (filter["type"] == "categories") { + categories = filter["values"][filter["state"]]["value"]; + } + } + const res = JSON.parse(await this.request(`&wd=${query}&t=${categories ?? ""}&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getDetail(url) { + let desc = "无"; + const anime = JSON.parse(await this.request(url)).list[0]; + const blurb = this.text(anime.vod_blurb); + const content = this.text(anime.vod_content); + desc = desc.length < blurb?.length ? blurb : desc; + desc = desc.length < content.length ? content : desc; + const urls = anime.vod_play_url + .split("#") + .filter((e) => e) + .map((e) => { + const s = e.split("$"); + return { name: s[0], url: s[1] }; + }); + return { + name: anime.vod_name, + imageUrl: anime.vod_pic, + description: desc, + episodes: urls + }; + } + // For anime episode video list + async getVideoList(url) { + return [{ + url: url, + originalUrl: url, + quality: "HLS" + }]; + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + return [{ + type: "categories", + name: "影片類型", + type_name: "SelectFilter", + values: [ + // { type_name: "SelectOption", value: "1", name: "电影" }, + // { type_name: "SelectOption", value: "2", name: "连续剧" }, + // { type_name: "SelectOption", value: "3", name: "综艺" }, + { type_name: "SelectOption", value: "", name: "全部" }, + { type_name: "SelectOption", value: "1", name: "电视剧" }, + { type_name: "SelectOption", value: "2", name: "电影" }, + { type_name: "SelectOption", value: "3", name: "欧美剧" }, + { type_name: "SelectOption", value: "4", name: "香港剧" }, + { type_name: "SelectOption", value: "5", name: "韩剧" }, + { type_name: "SelectOption", value: "6", name: "日剧" }, + { type_name: "SelectOption", value: "7", name: "马泰剧" }, + { type_name: "SelectOption", value: "8", name: "伦理片" }, + { type_name: "SelectOption", value: "9", name: "动作片" }, + { type_name: "SelectOption", value: "10", name: "爱情片" }, + { type_name: "SelectOption", value: "11", name: "喜剧片" }, + { type_name: "SelectOption", value: "12", name: "科幻片" }, + { type_name: "SelectOption", value: "13", name: "恐怖片" }, + { type_name: "SelectOption", value: "14", name: "剧情片" }, + { type_name: "SelectOption", value: "15", name: "战争片" }, + { type_name: "SelectOption", value: "16", name: "记录片" }, + { type_name: "SelectOption", value: "17", name: "动漫" }, + { type_name: "SelectOption", value: "20", name: "内地剧" }, + { type_name: "SelectOption", value: "23", name: "动画片" }, + { type_name: "SelectOption", value: "24", name: "中国动漫" }, + { type_name: "SelectOption", value: "25", name: "日本动漫" }, + { type_name: "SelectOption", value: "26", name: "欧美动漫" }, + { type_name: "SelectOption", value: "27", name: "综艺" }, + { type_name: "SelectOption", value: "28", name: "台湾剧" }, + { type_name: "SelectOption", value: "29", name: "体育赛事" }, + { type_name: "SelectOption", value: "30", name: "大陆综艺" }, + { type_name: "SelectOption", value: "31", name: "日韩综艺" }, + { type_name: "SelectOption", value: "32", name: "港台综艺" }, + { type_name: "SelectOption", value: "33", name: "欧美综艺" }, + { type_name: "SelectOption", value: "34", name: "灾难片" }, + { type_name: "SelectOption", value: "35", name: "悬疑片" }, + { type_name: "SelectOption", value: "36", name: "犯罪片" }, + { type_name: "SelectOption", value: "37", name: "奇幻片" }, + { type_name: "SelectOption", value: "38", name: "短剧" } + ] + }]; + } + getSourcePreferences() { + return [ + { + "key": "url", + "listPreference": { + "title": "Website Url", + "summary": "", + "valueIndex": 0, + "entries": ["jisuzy.com", "jisuzy.tv", "jisuziyuan.com"], + "entryValues": ["https://www.jisuzy.com", "https://www.jisuzy.tv", "https://www.jisuziyuan.com"], + } + } + ]; + } +} diff --git a/javascript/anime/src/zh/tiankongzy.js b/javascript/anime/src/zh/tiankongzy.js new file mode 100644 index 00000000..e9d21096 --- /dev/null +++ b/javascript/anime/src/zh/tiankongzy.js @@ -0,0 +1,184 @@ +const mangayomiSources = [{ + "name": "天空资源网", + "lang": "zh", + "baseUrl": "https://tiankongzy.com", + "apiUrl": "", + "iconUrl": "https://api.tiankongapi.com/template/v10012/images/logo.jpg", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/zh/tiankongzy.js" +}]; + +class DefaultExtension extends MProvider { + dict = new Map([ + [" ", " "], + [""", '"'], + ["<", "<"], + [">", ">"], + ["&", "&"], + ["⋅", "·"], + ]); + text(content) { + if (!content) return ""; + const str = + [...content.matchAll(/>([^<]+?) m[1]) + .join("") + .trim() || content; + return str.replace(/&[a-z]+;/g, (c) => this.dict.get(c) || c); + } + async request(url) { + const preference = new SharedPreferences(); + return (await new Client({ 'useDartHttpClient': true }).get(preference.get("url") + "/api.php/provide/vod?ac=detail" + url, { "Referer": preference.get("url") })).body; + } + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + async getPopular(page) { + // let genres = []; + // const gen = JSON.parse(await this.request("&ac=list")); + // gen.class.forEach((e) => { + // genres.push({ + // type_name: "SelectOption", + // value: e.type_id, + // name: e.type_name + // }); + // }); + // console.log(genres) + const res = JSON.parse(await this.request(`&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getLatestUpdates(page) { + const h = (new Date().getUTCHours() + 9) % 24; + const res = JSON.parse(await this.request(`&pg=${page}&h=${h || 24}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async search(query, page, filters) { + var categories; + for (const filter of filters) { + if (filter["type"] == "categories") { + categories = filter["values"][filter["state"]]["value"]; + } + } + const res = JSON.parse(await this.request(`&wd=${query}&t=${categories ?? ""}&pg=${page}`)); + return { + list: res.list.map((e) => ({ + link: "&ids=" + e.vod_id, + imageUrl: e.vod_pic, + name: e.vod_name + })), + hasNextPage: true + }; + } + async getDetail(url) { + let desc = "无"; + const anime = JSON.parse(await this.request(url)).list[0]; + const blurb = this.text(anime.vod_blurb); + const content = this.text(anime.vod_content); + desc = desc.length < blurb?.length ? blurb : desc; + desc = desc.length < content.length ? content : desc; + const urls = anime.vod_play_url + .split("#") + .filter((e) => e) + .map((e) => { + const s = e.split("$"); + return { name: s[0], url: s[1] }; + }); + return { + name: anime.vod_name, + imageUrl: anime.vod_pic, + description: desc, + episodes: urls + }; + } + // For anime episode video list + async getVideoList(url) { + return [{ + url: url, + originalUrl: url, + quality: "HLS" + }]; + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + return [{ + type: "categories", + name: "影片類型", + type_name: "SelectFilter", + values: [ + { type_name: "SelectOption", value: "", name: "全部" }, + { type_name: "SelectOption", value: "1", name: "电影" }, + { type_name: "SelectOption", value: "2", name: "纪录片" }, + { type_name: "SelectOption", value: "3", name: "连续剧" }, + { type_name: "SelectOption", value: "4", name: "欧美剧" }, + { type_name: "SelectOption", value: "5", name: "香港剧" }, + { type_name: "SelectOption", value: "6", name: "动作片" }, + { type_name: "SelectOption", value: "7", name: "爱情片" }, + { type_name: "SelectOption", value: "8", name: "科幻片" }, + { type_name: "SelectOption", value: "9", name: "恐怖片" }, + { type_name: "SelectOption", value: "10", name: "剧情片" }, + { type_name: "SelectOption", value: "11", name: "战争片" }, + { type_name: "SelectOption", value: "12", name: "喜剧片" }, + { type_name: "SelectOption", value: "20", name: "动画片" }, + { type_name: "SelectOption", value: "21", name: "犯罪片" }, + { type_name: "SelectOption", value: "22", name: "国产剧" }, + { type_name: "SelectOption", value: "23", name: "韩国剧" }, + { type_name: "SelectOption", value: "24", name: "动漫" }, + { type_name: "SelectOption", value: "25", name: "综艺" }, + { type_name: "SelectOption", value: "26", name: "大陆综艺" }, + { type_name: "SelectOption", value: "27", name: "港台综艺" }, + { type_name: "SelectOption", value: "28", name: "日韩综艺" }, + { type_name: "SelectOption", value: "29", name: "欧美综艺" }, + { type_name: "SelectOption", value: "30", name: "台湾剧" }, + { type_name: "SelectOption", value: "31", name: "国产动漫" }, + { type_name: "SelectOption", value: "32", name: "日本动漫" }, + { type_name: "SelectOption", value: "33", name: "欧美动漫" }, + { type_name: "SelectOption", value: "34", name: "海外动漫" }, + { type_name: "SelectOption", value: "35", name: "泰国剧" }, + { type_name: "SelectOption", value: "36", name: "日剧" }, + { type_name: "SelectOption", value: "37", name: "电影解说" }, + { type_name: "SelectOption", value: "38", name: "奇幻片" }, + { type_name: "SelectOption", value: "39", name: "灾难片" }, + { type_name: "SelectOption", value: "40", name: "悬疑片" }, + { type_name: "SelectOption", value: "41", name: "其他片" }, + { type_name: "SelectOption", value: "42", name: "体育赛事" }, + { type_name: "SelectOption", value: "44", name: "短剧" } + ] + }]; + } + getSourcePreferences() { + return [ + { + "key": "url", + "listPreference": { + "title": "Website Url", + "summary": "", + "valueIndex": 0, + "entries": ["tiankongzy.com", "tkzy1", "tkzy2", "tkzy3", "tkzy4", "tkzy5", "tkzy6", "tkzy7", "tkzy8", "tkzy9"], + "entryValues": ["https://tiankongzy.com", "https://tkzy1.com", "https://tkzy2.com", "https://tkzy3.com", "https://tkzy4.com", "https://tkzy5.com", "https://tkzy6.com", "https://tkzy7.com", "https://tkzy8.com", "https://tkzy9.com"], + } + } + ]; + } +}