From 868c6254bb46585c2a77ce9c69a3f91dc2bbe1ea Mon Sep 17 00:00:00 2001 From: lushunming <1357197829@qq.com> Date: Thu, 15 Aug 2024 08:14:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=97=E7=93=9Cjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jar/js/nangua.js | 362 +++++++++++++++++++++++++++++++++++++++++++++++ json/index.json | 9 ++ 2 files changed, 371 insertions(+) create mode 100644 jar/js/nangua.js diff --git a/jar/js/nangua.js b/jar/js/nangua.js new file mode 100644 index 00000000..822ac09f --- /dev/null +++ b/jar/js/nangua.js @@ -0,0 +1,362 @@ +/* +* @File : nangua.js +* @Author : jade +* @Date : 2024/3/18 10:54 +* @Email : jadehh@1ive.com +* @Software : Samples +* @Desc : 南瓜影视 +*/ +import {Crypto, jinja2, _} from "../lib/cat.js"; +import {Spider} from "./spider.js"; +import {VodDetail, VodShort} from "../lib/vod.js"; + +function stripHtmlTag(src) { + return src + .replace(/<\/?[^>]+(>|$)/g, '') + .replace(/&.{1,5};/g, '') + .replace(/\s{2,}/g, ' '); +} + +function formatPlayUrl(src, name) { + return name + .trim() + .replaceAll(src, '') + .replace(/<|>|《|》/g, '') + .replace(/\$|#/g, ' ') + .trim(); +} + + +class NanGuaSpider extends Spider { + constructor() { + super(); + this.siteUrl = 'http://ys.changmengyun.com'; + } + + getName() { + return "🎃┃南瓜影视┃🎃" + } + + getAppName() { + return "南瓜影视" + } + + getJSName() { + return "nangua" + } + + getType() { + return 3 + } + + async init(cfg) { + await super.init(cfg); + this.danmuStaus = true + } + + getHeader() { + let t = new Date().getTime().toString(); + return { + 'version_name': '1.0.6', + 'version_code': '6', + 'package_name': 'com.app.nanguatv', + 'sign': Crypto.MD5('c431ea542cee9679#uBFszdEM0oL0JRn@' + t).toString().toLowerCase(), + 'imei': 'c431ea542cee9679', + 'timeMillis': t, + 'User-Agent': 'okhttp/4.6.0' + } + } + + async setClasses() { + let data = JSON.parse(await this.fetch(this.siteUrl + '/api.php/provide/home_nav', null, this.getHeader())); + for (const key in data) { + if (data[key].name !== '精选') this.classes.push({ + type_id: data[key].id, type_name: data[key].name, + }); + } + } + + async setFilterObj() { + this.filterObj = { + "2": [{ + "key": "class", + "name": "类型", + "value": [{"n": "全部", "v": "类型"}, {"n": "国产剧", "v": "国产剧"}, {"n": "港台剧", "v": "港台剧"}] + }, { + "key": "area", "name": "地区", "value": [{"n": "全部", "v": "地区"}, {"n": "内地", "v": "内地"}, { + "n": "香港地区", "v": "香港地区" + }, {"n": "台湾地区", "v": "台湾地区"}] + }, { + "key": "year", + "name": "年份", + "value": [{"n": "全部", "v": "年份"}, {"n": "2024", "v": "2024"}, {"n": "2023", "v": "2023"}, {"n": "2022", "v": "2022"}, { + "n": "2021", "v": "2021" + }, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, { + "n": "2017", "v": "2017" + }, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "10年代", "v": "10年代"}, { + "n": "00年代", "v": "00年代" + }, {"n": "90年代", "v": "90年代"}, {"n": "80年代", "v": "80年代"}] + }, { + "key": "by", "name": "排序", "value": [{"n": "热播榜", "v": "热播榜"}, {"n": "好评榜", "v": "好评榜"}, { + "n": "新上线", "v": "新上线" + }] + }], "1": [{ + "key": "class", "name": "类型", "value": [{"n": "全部", "v": "类型"}, {"n": "动作片", "v": "动作片"}, { + "n": "喜剧片", "v": "喜剧片" + }, {"n": "爱情片", "v": "爱情片"}, {"n": "科幻片", "v": "科幻片"}, { + "n": "恐怖片", "v": "恐怖片" + }, {"n": "剧情片", "v": "剧情片"}, {"n": "战争片", "v": "战争片"}, {"n": "惊悚片", "v": "惊悚片"}] + }, { + "key": "area", "name": "地区", "value": [{"n": "全部", "v": "地区"}, {"n": "华语", "v": "华语"}, { + "n": "香港地区", "v": "香港地区" + }, {"n": "美国", "v": "美国"}, {"n": "欧洲", "v": "欧洲"}, {"n": "韩国", "v": "韩国"}, { + "n": "日本", "v": "日本" + }, {"n": "台湾地区", "v": "台湾地区"}, {"n": "泰国", "v": "泰国"}, { + "n": "台湾地区", "v": "台湾地区" + }, {"n": "印度", "v": "印度"}, {"n": "其它", "v": "其它"}] + }, { + "key": "year", + "name": "年份", + "value": [{"n": "全部", "v": "年份"}, {"n": "2024", "v": "2024"}, {"n": "2023", "v": "2023"}, {"n": "2022", "v": "2022"}, { + "n": "2021", "v": "2021" + }, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, { + "n": "2017", "v": "2017" + }, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "10年代", "v": "10年代"}, { + "n": "00年代", "v": "00年代" + }, {"n": "90年代", "v": "90年代"}, {"n": "80年代", "v": "80年代"}] + }, { + "key": "by", "name": "排序", "value": [{"n": "热播榜", "v": "热播榜"}, {"n": "好评榜", "v": "好评榜"}, { + "n": "新上线", "v": "新上线" + }] + }], "4": [{ + "key": "class", "name": "类型", "value": [{"n": "全部", "v": "类型"}, {"n": "国产漫", "v": "国产漫"}, { + "n": "欧美漫", "v": "欧美漫" + }, {"n": "日韩漫", "v": "日韩漫"}, {"n": "港台漫", "v": "港台漫"}] + }, { + "key": "area", + "name": "地区", + "value": [{"n": "全部", "v": "地区"}, {"n": "中国大陆", "v": "中国大陆"}, { + "n": "日本", "v": "日本" + }, {"n": "韩国", "v": "韩国"}, {"n": "欧美", "v": "欧美"}, {"n": "其它", "v": "其它"}] + }, { + "key": "year", + "name": "年份", + "value": [{"n": "全部", "v": "年份"}, {"n": "2024", "v": "2024"}, {"n": "2023", "v": "2023"}, {"n": "2022", "v": "2022"}, { + "n": "2021", "v": "2021" + }, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, { + "n": "2017", "v": "2017" + }, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "10年代", "v": "10年代"}, { + "n": "00年代", "v": "00年代" + }, {"n": "90年代", "v": "90年代"}, {"n": "80年代", "v": "80年代"}] + }, { + "key": "by", "name": "排序", "value": [{"n": "热播榜", "v": "热播榜"}, {"n": "新上线", "v": "新上线"}] + }, { + "key": "total", + "name": "状态", + "value": [{"n": "全部", "v": "状态"}, {"n": "连载", "v": "连载"}, {"n": "完结", "v": "完结"}] + }], "3": [{ + "key": "class", + "name": "类型", + "value": [{"n": "全部", "v": "类型"}, {"n": "大陆", "v": "大陆"}, {"n": "港台", "v": "港台"}, { + "n": "日韩", "v": "日韩" + }, {"n": "欧美", "v": "欧美"}] + }, { + "key": "area", + "name": "地区", + "value": [{"n": "全部", "v": "地区"}, {"n": "内地", "v": "内地"}, {"n": "港台", "v": "港台"}, { + "n": "日韩", "v": "日韩" + }, {"n": "欧美", "v": "欧美"}, {"n": "其它", "v": "其它"}] + }, { + "key": "year", + "name": "年份", + "value": [{"n": "全部", "v": "年份"}, {"n": "2024", "v": "2024"}, {"n": "2023", "v": "2023"}, {"n": "2022", "v": "2022"}, { + "n": "2021", "v": "2021" + }, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, { + "n": "2017", "v": "2017" + }, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "10年代", "v": "10年代"}, { + "n": "00年代", "v": "00年代" + }, {"n": "90年代", "v": "90年代"}, {"n": "80年代", "v": "80年代"}] + }, { + "key": "by", "name": "排序", "value": [{"n": "热播榜", "v": "热播榜"}, {"n": "新上线", "v": "新上线"}] + }], "46": [{ + "key": "class", "name": "类型", "value": [{"n": "全部", "v": "类型"}, {"n": "日韩剧", "v": "日韩剧"}, { + "n": "欧美剧", "v": "欧美剧" + }, {"n": "海外剧", "v": "海外剧"}] + }, { + "key": "area", + "name": "地区", + "value": [{"n": "全部", "v": "地区"}, {"n": "韩国", "v": "韩国"}, {"n": "美剧", "v": "美剧"}, { + "n": "日本", "v": "日本" + }, {"n": "泰国", "v": "泰国"}, {"n": "英国", "v": "英国"}, {"n": "新加坡", "v": "新加坡"}, { + "n": "其他", "v": "其他" + }] + }, { + "key": "year", + "name": "年份", + "value": [{"n": "全部", "v": "年份"}, {"n": "2024", "v": "2024"}, {"n": "2023", "v": "2023"}, {"n": "2022", "v": "2022"}, { + "n": "2021", "v": "2021" + }, {"n": "2020", "v": "2020"}, {"n": "2019", "v": "2019"}, {"n": "2018", "v": "2018"}, { + "n": "2017", "v": "2017" + }, {"n": "2016", "v": "2016"}, {"n": "2015", "v": "2015"}, {"n": "10年代", "v": "10年代"}, { + "n": "00年代", "v": "00年代" + }, {"n": "90年代", "v": "90年代"}, {"n": "80年代", "v": "80年代"}] + }, { + "key": "by", "name": "排序", "value": [{"n": "热播榜", "v": "热播榜"}, {"n": "好评榜", "v": "好评榜"}, { + "n": "新上线", "v": "新上线" + }] + }] + }; + } + + async parseVodShortListFromJSONByHome(obj){ + let vod_list = [] + for (const data of obj["video"]){ + let video_vod_list = await this.parseVodShortListFromJson(data["data"]) + vod_list.push(...video_vod_list) + } + return vod_list + } + + async parseVodShortListFromJson(obj) { + let vod_list = [] + for (const data of obj){ + let vodShort = new VodShort() + vodShort.vod_id = data["id"] + vodShort.vod_name = data["name"] + vodShort.vod_pic = data["img"] + vodShort.vod_remarks = data["remarks"] + if (_.isEmpty(vodShort.vod_remarks)){ + vodShort.vod_remarks = data["msg"] + } + vod_list.push(vodShort) + } + + return vod_list + } + + async parseVodShortListFromJsonBySearch(obj) { + let videos = []; + obj.forEach(function (it) { + videos.push({ + vod_id: it.id, vod_name: it["video_name"], vod_pic: it.img, vod_remarks: it["qingxidu"] + '/' + it.category, + }); + }); + return videos + } + + async parseVodDetailfromJson(obj) { + let vodDetail = new VodDetail() + vodDetail.vod_id = obj["id"] + vodDetail.vod_name = obj["name"] + vodDetail.vod_pic = obj["img"] + vodDetail.type_name = obj["type"] + vodDetail.vod_year = obj["year"] + vodDetail.vod_content = stripHtmlTag(obj["info"]) + vodDetail.vod_remarks = '更新至: ' + obj["msg"] + ' / 评分: ' + obj["score"] + let episodes = obj["player_info"]; + let playlist = {}; + episodes.forEach(function (it) { + let playurls = it["video_info"]; + playurls.forEach(function (playurl) { + let source = it.show; + let t = formatPlayUrl(vodDetail.vod_name, playurl.name); + if (t.length === 0) t = playurl.name.trim(); + if (!playlist.hasOwnProperty(source)) { + playlist[source] = []; + } + playlist[source].push(t + '$' + playurl.url); + }); + }); + vodDetail.vod_play_from = _.keys(playlist).join('$$$'); + let urls = _.values(playlist); + let vod_play_url = []; + urls.forEach(function (it) { + vod_play_url.push(it.join('#')); + }); + vodDetail.vod_play_url = vod_play_url.join('$$$'); + return vodDetail + } + + async setHomeVod() { + let data = JSON.parse(await this.fetch(this.siteUrl + '/api.php/provide/home_data?app=ylys&devices=android&imei=c431ea542cee9679&deviceModel=Subsystem%20for%20Android(TM)&deviceVersion=33&appVersionName=1.0.9&deviceScreen=427*250&appVersionCode=9&deviceBrand=Windows', null, this.getHeader())); + this.homeVodList = await this.parseVodShortListFromJSONByHome(data) + } + + async setCategory(tid, pg, filter, extend) { + if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; + let reqUrl = this.siteUrl + '/api.php/provide/vod_list?app=ylys&id=' + tid + '&page=' + pg + '&imei=c431ea542cee9679&'; + reqUrl += jinja2('area={{ext.area}}&year={{ext.year}}&type={{ext.class}}&total={{ext.total}}&order={{ext.by}}', {ext: extend}); + let data = JSON.parse(await this.fetch(reqUrl, null, this.getHeader())).list; + this.vodList = await this.parseVodShortListFromJson(data) + let pgChk = JSON.parse(await this.fetch(this.siteUrl + '/api.php/provide/vod_list?app=ylys&id=' + tid + '&page=' + (parseInt(pg) + 1) + '&imei=c431ea542cee9679&', null, this.getHeader())).msg; + this.count = (pgChk === 'ok') ? parseInt(pg) + 1 : parseInt(pg); + this.limit = 20 + this.total = this.limit * this.count + } + + async setDetail(id) { + let data = JSON.parse(await this.fetch(this.siteUrl + '/api.php/provide/vod_detail?app=ylys&imei=c431ea542cee9679&id=' + id, null, this.getHeader())).data; + this.vodDetail = await this.parseVodDetailfromJson(data) + } + + async setSearch(wd, quick) { + let data = JSON.parse(await this.fetch(this.siteUrl + '/api.php/provide/search_result_more?app=ylys&video_name=' + wd + '&pageSize=20&tid=0&imei=c431ea542cee9679&page=0', null, this.getHeader())).data; + this.vodList = await this.parseVodShortListFromJsonBySearch(data) + } + + async setPlay(flag, id, flags) { + try { + if (id.indexOf('m3u8') !== -1) { + this.playUrl = id.split('url=')[1] + } else if (id.indexOf(',') !== -1) { + let mjurl = id.split(',')[1] + let jData = JSON.parse(await this.fetch(mjurl, null, this.getHeader())); + this.playUrl = jData["data"]["url"] + } else { + let jData = JSON.parse(await this.fetch(id, null, this.getHeader())); + this.playUrl = jData["data"]["url"] + } + } catch (e) { + await this.jadeLog.error("播放失败") + } + } + +} + + +let spider = new NanGuaSpider() + +async function init(cfg) { + await spider.init(cfg) +} + +async function home(filter) { + return await spider.home(filter) +} + +async function homeVod() { + return await spider.homeVod() +} + +async function category(tid, pg, filter, extend) { + return await spider.category(tid, pg, filter, extend) +} + +async function detail(id) { + return await spider.detail(id) +} + +async function play(flag, id, flags) { + return await spider.play(flag, id, flags) +} + +async function search(wd, quick) { + return await spider.search(wd, quick) +} + +export function __jsEvalReturn() { + return { + init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search, + }; +} +export {spider} \ No newline at end of file diff --git a/json/index.json b/json/index.json index b6eee94e..84da214c 100644 --- a/json/index.json +++ b/json/index.json @@ -120,6 +120,15 @@ "searchable": 0, "filterable": 1 }, + { + "key": "nangua", + "name": "🎃┃南瓜影视┃🎃", + "playerType": 0, + "type": 3, + "api": "./js/nangua.js", + "timeout": 30, + "ext": "{\"box\": \"TVBox\", \"danmu\": false}" + }, { "key": "NGkt", "name": "瓜瓜",