From d0ac350bfc6a48b4cd32c18611ddd6ef5341bebf Mon Sep 17 00:00:00 2001
From: dxawi <107306227+dxawi@users.noreply.github.com>
Date: Sat, 21 Oct 2023 08:36:05 +0800
Subject: [PATCH] Add files via upload
---
js/bili_open.js | 621 ++++++++++++++++++++++++++++++++++++++++++++++++
js/jp.js | 90 +++++++
2 files changed, 711 insertions(+)
create mode 100644 js/bili_open.js
create mode 100644 js/jp.js
diff --git a/js/bili_open.js b/js/bili_open.js
new file mode 100644
index 0000000..5f62fd5
--- /dev/null
+++ b/js/bili_open.js
@@ -0,0 +1,621 @@
+import { Crypto, jinja2, _ } from 'assets://js/lib/cat.js';
+
+let siteKey = '';
+let siteType = 0;
+
+let cookie = '';
+let login = '';
+let vip = false;
+let extendObj = {};
+let bili_jct = '';
+let vod_audio_id = {
+ 30280: 192000,
+ 30232: 132000,
+ 30216: 64000,
+};
+
+let vod_codec = {
+ // 13: 'AV1',
+ 12: 'HEVC',
+ 7: 'AVC',
+};
+
+const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36';
+
+async function request(reqUrl, ua, buffer) {
+ let res = await req(reqUrl, {
+ method: 'get',
+ headers: ua ? ua : { 'User-Agent': UA },
+ timeout: 60000,
+ buffer: buffer ? 1 : 0,
+ });
+ return res.content;
+}
+
+async function post(reqUrl, postData, ua, posttype) {
+ let res = await req(reqUrl, {
+ method: 'post',
+ headers: ua ? ua : { 'User-Agent': UA },
+ data: postData,
+ timeout: 60000,
+ postType: posttype,
+ });
+ return res.content;
+}
+
+function getHeaders() {
+ const headers = {
+ 'User-Agent': UA,
+ };
+ if (!_.isEmpty(cookie)) {
+ headers.cookie = cookie;
+ }
+ return headers;
+}
+
+async function getCookie() {
+ let result = await req('https://www.bilibili.com', {
+ method: 'get',
+ headers: { 'User-Agent': UA },
+ timeout: 60000,
+ });
+ const setCookieHeaders = result.headers['set-cookie'];
+ cookie = setCookieHeaders.map((kk) => kk.split(';')[0] + ';').join('');
+}
+
+async function init(cfg) {
+ siteKey = cfg.skey;
+ siteType = cfg.stype;
+ let extend = cfg.ext;
+
+ if (cfg.ext.hasOwnProperty('categories')) extend = cfg.ext.categories;
+ if (cfg.ext.hasOwnProperty('cookie')) cookie = cfg.ext.cookie;
+ // 获取csrf
+ const cookies = cookie.split(';');
+ cookies.forEach(cookie => {
+ if (cookie.includes('bili_jct')) {
+ bili_jct = cookie.split('=')[1];
+ }
+ });
+
+ if (_.isEmpty(cookie)) await getCookie();
+ let result = JSON.parse(await request('https://api.bilibili.com/x/web-interface/nav', getHeaders()));
+ login = result.data.isLogin;
+ vip = result.data.vipStatus;
+ const ext = extend.split('#');
+ const jsonData = [
+ {
+ key: 'order',
+ name: '排序',
+ value: [
+ { n: '综合排序', v: '0' },
+ { n: '最多点击', v: 'click' },
+ { n: '最新发布', v: 'pubdate' },
+ { n: '最多弹幕', v: 'dm' },
+ { n: '最多收藏', v: 'stow' },
+ ],
+ },
+ {
+ key: 'duration',
+ name: '时长',
+ value: [
+ { n: '全部时长', v: '0' },
+ { n: '60分钟以上', v: '4' },
+ { n: '30~60分钟', v: '3' },
+ { n: '10~30分钟', v: '2' },
+ { n: '10分钟以下', v: '1' },
+ ],
+ },
+ ];
+ const newarr = [];
+ const d = {};
+ const sc = {
+ type_name: "首页",
+ type_id: "首页",
+ land: 1,
+ ratio: 1.33,
+ }
+ newarr.push(sc);
+ for (const kk of ext) {
+ const c = {
+ type_name: kk,
+ type_id: kk,
+ land: 1,
+ ratio: 1.33,
+ };
+ newarr.push(c);
+ d[kk] = jsonData;
+ }
+ if (!_.isEmpty(bili_jct)) {
+ const hc = {
+ type_name: "历史记录",
+ type_id: "历史记录",
+ land: 1,
+ ratio: 1.33,
+ }
+ newarr.push(hc);
+ }
+ extendObj = {
+ classes: newarr,
+ filter: d,
+ };
+}
+
+function home(filter) {
+ try {
+ const jSONObject = {
+ class: extendObj.classes,
+ };
+ if (filter) {
+ jSONObject.filters = extendObj.filter;
+ }
+ return JSON.stringify(jSONObject);
+ } catch (e) {
+ return '';
+ }
+}
+
+async function homeVod() {
+ try {
+ const list = [];
+ const url = 'https://api.bilibili.com/x/web-interface/index/top/rcmd?ps=14&fresh_idx=1&fresh_idx_1h=1';
+
+ const response = await request(url, getHeaders());
+ const responseData = JSON.parse(response);
+ const vods = responseData.data.item;
+
+ for (const item of vods) {
+ const vod = {};
+ let imageUrl = item.pic;
+ if (imageUrl.startsWith('//')) {
+ imageUrl = 'https:' + imageUrl;
+ }
+ let cd = getFullTime(item.duration);
+
+ vod.vod_id = item.bvid;
+ vod.vod_name = removeTags(item.title);
+ vod.vod_pic = imageUrl;
+ vod.vod_remarks = cd;
+ vod.style = {
+ type: 'rect',
+ ratio: 1.33,
+ },
+ list.push(vod);
+ }
+
+ const result = { list: list };
+ return JSON.stringify(result);
+ } catch (e) { }
+}
+
+async function category(tid, page, filter, ext) {
+ if (page < 1) page = 1;
+ try {
+ if (Object.keys(ext).length > 0 && ext.hasOwnProperty('tid') && ext['tid'].length > 0) {
+ tid = ext['tid'];
+ }
+ let url = '';
+ url = `https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=${encodeURIComponent(tid)}`;
+
+ if (Object.keys(ext).length > 0) {
+ for (const k in ext) {
+ if (k == 'tid') {
+ continue;
+ }
+ url += `&${encodeURIComponent(k)}=${encodeURIComponent(ext[k])}`;
+ }
+ }
+
+ url += `&page=${encodeURIComponent(page)}`;
+
+ if (tid == "首页") {
+ url = "https://api.bilibili.com/x/web-interface/index/top/rcmd?ps=14&fresh_idx=" + page + "&fresh_idx_1h=" + page;
+ } else if (tid == "历史记录") {
+ url = "https://api.bilibili.com/x/v2/history?pn=" + page;
+ }
+
+ const data = JSON.parse(await request(url, getHeaders())).data;
+ let items = data.result;
+ if (tid == "首页") {
+ items = data.item;
+ } else if (tid == "历史记录") {
+ items = data;
+ }
+
+ const videos = [];
+ for (const item of items) {
+ const video = {};
+ let pic = item.pic;
+ if (pic.startsWith('//')) {
+ pic = 'https:' + pic;
+ }
+ let cd = getFullTime(item.duration);
+
+ video.vod_remarks = cd;
+ video.vod_id = item.bvid;
+ video.vod_name = removeTags(item.title);
+ video.vod_pic = pic;
+
+ video.style = {
+ type: 'rect',
+ ratio: 1.33,
+ },
+ videos.push(video);
+ }
+
+ const result = {
+ page: page,
+ pagecount: data.numPages ?? (page + 1),
+ limit: videos.length,
+ total: videos.length * (page + 1),
+ list: videos,
+ };
+
+ return JSON.stringify(result);
+ } catch (e) { }
+ return null;
+}
+
+async function detail(ids) {
+ try {
+ const bvid = ids;
+ const detailUrl = `https://api.bilibili.com/x/web-interface/view?bvid=${bvid}`;
+
+ const detailData = JSON.parse(await request(detailUrl, getHeaders())).data;
+ // 记录历史
+ if (!_.isEmpty(bili_jct)) {
+ const historyReport = 'https://api.bilibili.com/x/v2/history/report';
+ let dataPost = {
+ aid: detailData.aid,
+ cid: detailData.cid,
+ csrf: bili_jct,
+ }
+ await post(historyReport, dataPost, getHeaders(), 'form');
+ }
+ let cd = getFullTime(detailData.duration);
+ const aid = detailData.aid;
+ const video = {
+ vod_id: bvid,
+ vod_name: detailData.title,
+ vod_pic: detailData.pic,
+ type_name: detailData.tname,
+ vod_year: '',
+ vod_area: '',
+ vod_remarks: cd,
+ vod_actor: '',
+ vod_director: '',
+ vod_content: detailData.desc,
+ };
+
+ const playurldata = 'https://api.bilibili.com/x/player/playurl?avid=' + aid + '&cid=' + detailData.cid + '&qn=127&fnval=4048&fourk=1';
+ const playurldatas = JSON.parse(await request(playurldata, getHeaders()));
+
+ const playurldatalist = playurldatas.data;
+ const accept_quality = playurldatalist.accept_quality;
+ const accept_description = playurldatalist.accept_description;
+ const qualitylist = [];
+ const descriptionList = [];
+
+ for (let i = 0; i < accept_quality.length; i++) {
+ if (!vip) {
+ if (!login) {
+ if (accept_quality[i] > 32) continue;
+ } else {
+ if (accept_quality[i] > 80) continue;
+ }
+ }
+ descriptionList.push(base64Encode(accept_description[i]));
+ qualitylist.push(accept_quality[i]);
+ }
+
+ let treeMap = {};
+ const jSONArray = detailData.pages;
+ let playList = [];
+ for (let j = 0; j < jSONArray.length; j++) {
+ const jSONObject6 = jSONArray[j];
+ const cid = jSONObject6.cid;
+ const playUrl = j + '$' + aid + '+' + cid + '+' + qualitylist.join(':') + '+' + descriptionList.join(':');
+ playList.push(playUrl);
+ }
+ treeMap['dash'] = playList.join('#');
+ treeMap['mp4'] = playList.join('#');
+
+ const relatedUrl = 'https://api.bilibili.com/x/web-interface/archive/related?bvid=' + bvid;
+ const relatedData = JSON.parse(await request(relatedUrl, getHeaders())).data;
+ playList = [];
+ for (let j = 0; j < relatedData.length; j++) {
+ const jSONObject6 = relatedData[j];
+ const cid = jSONObject6.cid;
+ const title = jSONObject6.title;
+ const aaid = jSONObject6.aid;
+ const playUrl = title + '$' + aaid + '+' + cid + '+' + qualitylist.join(':') + '+' + descriptionList.join(':');
+ playList.push(playUrl);
+ }
+ treeMap['相关'] = playList.join('#');
+
+ video.vod_play_from = Object.keys(treeMap).join("$$$");
+ video.vod_play_url = Object.values(treeMap).join("$$$");
+
+ const list = [video];
+ const result = { list };
+ return JSON.stringify(result);
+ } catch (e) { }
+ return null;
+}
+
+async function play(flag, id, flags) {
+ try {
+ const playHeaders = { Referer: 'https://www.bilibili.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' };
+ const ids = id.split('+');
+ const aid = ids[0];
+ const cid = ids[1];
+ const qualityIds = ids[2].split(':');
+ const qualityName = ids[3].split(':');
+ const dan = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + cid;
+ if (flag == 'dash' || flag == '相关') {
+ // dash mpd 代理
+ const js2Base = await js2Proxy(true, siteType, siteKey, 'dash/', {});
+ let urls = [];
+ for (let i = 0; i < qualityIds.length; i++) {
+ urls.push(base64Decode(qualityName[i]), js2Base + base64Encode(aid + '+' + cid + '+' + qualityIds[i]));
+ }
+ return JSON.stringify({
+ parse: 0,
+ url: urls,
+ danmaku: dan,
+ header: playHeaders,
+ });
+ } else if (flag == 'mp4') {
+ // 直链
+ let urls = [];
+ for (let i = 0; i < qualityIds.length; i++) {
+ const url = `https://api.bilibili.com/x/player/playurl?avid=${aid}&cid=${cid}&qn=${qualityIds[i]}&fourk=1`;
+ const resp = JSON.parse(await request(url, getHeaders()));
+ const data = resp.data;
+ if (data.quality != qualityIds[i]) continue;
+ let durl = data.durl[0].url;
+ urls.push(base64Decode(qualityName[i]), durl);
+ }
+
+ return JSON.stringify({
+ parse: 0,
+ url: urls,
+ danmaku: dan,
+ header: playHeaders,
+ });
+ } else {
+ // 音频外挂
+ let urls = [];
+ let audios = [];
+ for (let i = 0; i < qualityIds.length; i++) {
+ const url = `https://api.bilibili.com/x/player/playurl?avid=${aid}&cid=${cid}&qn=${qualityIds[i]}&fnval=4048&fourk=1`;
+ let resp = JSON.parse(await request(url, getHeaders()));
+ const dash = resp.data.dash;
+ const video = dash.video;
+ const audio = dash.audio;
+ for (let j = 0; j < video.length; j++) {
+ const dashjson = video[j];
+ if (dashjson.id == qualityIds[i]) {
+ for (const key in vod_codec) {
+ if (dashjson.codecid == key) {
+ urls.push(base64Decode(qualityName[i]) + ' ' + vod_codec[key], dashjson.baseUrl);
+ }
+ }
+ }
+ }
+ if (audios.length == 0) {
+ for (let j = 0; j < audio.length; j++) {
+ const dashjson = audio[j];
+ for (const key in vod_audio_id) {
+ if (dashjson.id == key) {
+ audios.push({
+ title: _.floor(parseInt(vod_audio_id[key]) / 1024) + 'Kbps',
+ bit: vod_audio_id[key],
+ url: dashjson.baseUrl,
+ });
+ }
+ }
+ }
+ audios = _.sortBy(audios, 'bit');
+ }
+ }
+
+ return JSON.stringify({
+ parse: 0,
+ url: urls,
+ extra: {
+ audio: audios,
+ },
+ header: playHeaders,
+ });
+ }
+ } catch (e) { }
+ return null;
+}
+
+async function search(key, quick, pg) {
+ let page = pg || 1;
+ if (page == 0) page = 1;
+ try {
+ const ext = {
+ duration: '0',
+ };
+ let resp = JSON.parse(await category(key, page, true, ext));
+ const catVideos = resp.list;
+ const pageCount = resp.pagecount;
+ const videos = [];
+ for (let i = 0; i < catVideos.length; ++i) {
+ videos.push(catVideos[i]);
+ }
+ const result = {
+ page: page,
+ pagecount: pageCount,
+ land: 1,
+ ratio: 1.33,
+ list: videos,
+ };
+ return JSON.stringify(result);
+ } catch (e) { }
+ return null;
+}
+
+async function proxy(segments, headers) {
+ let what = segments[0];
+ let url = base64Decode(segments[1]);
+ if (what == 'dash') {
+ const ids = url.split('+');
+ const aid = ids[0];
+ const cid = ids[1];
+ const str5 = ids[2];
+ const urls = `https://api.bilibili.com/x/player/playurl?avid=${aid}&cid=${cid}&qn=${str5}&fnval=4048&fourk=1`;
+ let videoList = '';
+ let audioList = '';
+
+ let resp = JSON.parse(await request(urls, getHeaders()));
+ const dash = resp.data.dash;
+ const video = dash.video;
+ const audio = dash.audio;
+
+ for (let i = 0; i < video.length; i++) {
+ // if (i > 0) continue; // 只取一个
+ const dashjson = video[i];
+ if (dashjson.id == str5) {
+ videoList += getDashMedia(dashjson);
+ }
+ }
+
+ for (let i = 0; i < audio.length; i++) {
+ // if (i > 0) continue;
+ const ajson = audio[i];
+ for (const key in vod_audio_id) {
+ if (ajson.id == key) {
+ audioList += getDashMedia(ajson);
+ }
+ }
+ }
+
+ let mpd = getDash(resp, videoList, audioList);
+
+ return JSON.stringify({
+ code: 200,
+ content: mpd,
+ headers: {
+ 'Content-Type': 'application/dash+xml',
+ },
+ });
+ }
+ return JSON.stringify({
+ code: 500,
+ content: '',
+ });
+}
+
+function getDashMedia(dash) {
+ try {
+ let qnid = dash.id;
+ const codecid = dash.codecid;
+ const media_codecs = dash.codecs;
+ const media_bandwidth = dash.bandwidth;
+ const media_startWithSAP = dash.startWithSap;
+ const media_mimeType = dash.mimeType;
+ const media_BaseURL = dash.baseUrl.replace(/&/g, '&');
+ const media_SegmentBase_indexRange = dash.SegmentBase.indexRange;
+ const media_SegmentBase_Initialization = dash.SegmentBase.Initialization;
+ const mediaType = media_mimeType.split('/')[0];
+ let media_type_params = '';
+
+ if (mediaType == 'video') {
+ const media_frameRate = dash.frameRate;
+ const media_sar = dash.sar;
+ const media_width = dash.width;
+ const media_height = dash.height;
+ media_type_params = `height='${media_height}' width='${media_width}' frameRate='${media_frameRate}' sar='${media_sar}'`;
+ } else if (mediaType == 'audio') {
+ for (const key in vod_audio_id) {
+ if (qnid == key) {
+ const audioSamplingRate = vod_audio_id[key];
+ media_type_params = `numChannels='2' sampleRate='${audioSamplingRate}'`;
+ }
+ }
+ }
+ qnid += '_' + codecid;
+
+ return `
+
+
+ ${media_BaseURL}
+
+
+
+
+ `;
+ } catch (e) {
+ // Handle exceptions here
+ }
+}
+
+function getDash(ja, videoList, audioList) {
+ const duration = ja.data.dash.duration;
+ const minBufferTime = ja.data.dash.minBufferTime;
+ return `
+
+ ${videoList}
+ ${audioList}
+
+ `;
+}
+
+
+function base64Encode(text) {
+ return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text));
+}
+
+function base64Decode(text) {
+ return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
+}
+
+
+
+function removeTags(input) {
+ return input.replace(/<[^>]*>/g, '');
+}
+
+function getFullTime(numberSec) {
+ let totalSeconds = '';
+ try {
+ var timeParts = numberSec.split(":");
+ var min = parseInt(timeParts[0]);
+ var sec = parseInt(timeParts[1]);
+ totalSeconds = min * 60 + sec;
+ } catch (e) {
+ totalSeconds = parseInt(numberSec);
+ }
+ if (isNaN(totalSeconds)) {
+ return '无效输入';
+ }
+ if (totalSeconds >= 3600) {
+ const hours = Math.floor(totalSeconds / 3600);
+ const remainingSecondsAfterHours = totalSeconds % 3600;
+ const minutes = Math.floor(remainingSecondsAfterHours / 60);
+ const seconds = remainingSecondsAfterHours % 60;
+ return `${hours}小时 ${minutes}分钟 ${seconds}秒`;
+ } else {
+ const minutes = Math.floor(totalSeconds / 60);
+ const seconds = totalSeconds % 60;
+ return `${minutes}分钟 ${seconds}秒`;
+ }
+}
+
+export function __jsEvalReturn() {
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ proxy: proxy,
+ search: search,
+ };
+}
+
diff --git a/js/jp.js b/js/jp.js
new file mode 100644
index 0000000..3be9ddc
--- /dev/null
+++ b/js/jp.js
@@ -0,0 +1,90 @@
+var rule = {
+ title:'荐片',
+ host:'http://api2.rinhome.com',
+ // homeUrl:'https://yjpapipxblwdohpakljwg.hxhzs.com/api/tag/hand?code=unknown601193cf375db73d&channel=wandoujia',//网站的首页链接,用于分类获取和推荐获取
+ homeUrl:'/api/tag/hand?code=unknown601193cf375db73d&channel=wandoujia',//网站的首页链接,用于分类获取和推荐获取
+ // url:'/api/crumb/list?area=0&category_id=fyclass&page=fypage&type=0&limit=24&fyfilter',
+ url:'/api/crumb/list?area=0&page=fypage&type=0&limit=24&fyfilter',
+ class_name:'全部&电影&电视剧&动漫&综艺', // 筛选 /api/term/ad_fenlei?limit=10&page=1
+ class_url:'0&1&2&3&4',
+ detailUrl:'/api/node/detail?channel=wandoujia&token=&id=fyid',//二级详情拼接链接(json格式用)
+ searchUrl:'/api/video/search?key=**&page=fypage',
+ searchable:2,
+ quickSearch:0,
+ filterable:1,
+ filter:{
+ "0":[{"key":"year","name":"年代","value":[{"n":"全部","v":"0"},{"n":"2023","v":"153"},{"n":"2022","v":"101"},{"n":"2021","v":"118"},{"n":"2020","v":"16"},{"n":"2019","v":"7"},{"n":"2018","v":"2"},{"n":"2017","v":"3"},{"n":"2016","v":"22"}]},{"key":"sort","name":"排序","value":[{"n":"热门","v":"hot"},{"n":"评分","v":"rating"},{"n":"更新","v":"update"}]}],
+ "1":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"1"},{"n":"首推","v":"5"},{"n":"动作","v":"6"},{"n":"喜剧","v":"7"},{"n":"战争","v":"8"},{"n":"恐怖","v":"9"},{"n":"剧情","v":"10"},{"n":"爱情","v":"11"},{"n":"科幻","v":"12"},{"n":"动画","v":"13"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":"0"},{"n":"2023","v":"153"},{"n":"2022","v":"101"},{"n":"2021","v":"118"},{"n":"2020","v":"16"},{"n":"2019","v":"7"},{"n":"2018","v":"2"},{"n":"2017","v":"3"},{"n":"2016","v":"22"}]},{"key":"sort","name":"排序","value":[{"n":"热门","v":"hot"},{"n":"评分","v":"rating"},{"n":"更新","v":"update"}]}],
+ "2":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"2"},{"n":"首推","v":"14"},{"n":"国产","v":"15"},{"n":"港台","v":"16"},{"n":"日韩","v":"17"},{"n":"海外","v":"18"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":"0"},{"n":"2023","v":"153"},{"n":"2022","v":"101"},{"n":"2021","v":"118"},{"n":"2020","v":"16"},{"n":"2019","v":"7"},{"n":"2018","v":"2"},{"n":"2017","v":"3"},{"n":"2016","v":"22"}]},{"key":"sort","name":"排序","value":[{"n":"热门","v":"hot"},{"n":"评分","v":"rating"},{"n":"更新","v":"update"}]}],
+ "3":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"3"},{"n":"首推","v":"19"},{"n":"海外","v":"20"},{"n":"日本","v":"21"},{"n":"国产","v":"22"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":"0"},{"n":"2023","v":"153"},{"n":"2022","v":"101"},{"n":"2021","v":"118"},{"n":"2020","v":"16"},{"n":"2019","v":"7"},{"n":"2018","v":"2"},{"n":"2017","v":"3"},{"n":"2016","v":"22"}]},{"key":"sort","name":"排序","value":[{"n":"热门","v":"hot"},{"n":"评分","v":"rating"},{"n":"更新","v":"update"}]}],
+ "4":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"4"},{"n":"首推","v":"23"},{"n":"国产","v":"24"},{"n":"海外","v":"25"},{"n":"港台","v":"26"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":"0"},{"n":"2023","v":"153"},{"n":"2022","v":"101"},{"n":"2021","v":"118"},{"n":"2020","v":"16"},{"n":"2019","v":"7"},{"n":"2018","v":"2"},{"n":"2017","v":"3"},{"n":"2016","v":"22"}]},{"key":"sort","name":"排序","value":[{"n":"热门","v":"hot"},{"n":"评分","v":"rating"},{"n":"更新","v":"update"}]}]
+ },
+ // filter_url:'sort={{fl.sort or "hot"}}&year={{fl.year or "0"}}',
+ filter_url:'sort={{fl.sort or "update"}}&year={{fl.year or "0"}}&category_id={{fl.cateId}}',
+ filter_def:{
+ 0:{cateId:'0'},
+ 1:{cateId:'1'},
+ 2:{cateId:'2'},
+ 3:{cateId:'3'},
+ 4:{cateId:'4'}
+ },
+ headers:{
+ 'User-Agent':'jianpian-android/350',
+ 'JPAUTH':'y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv'
+ },
+ timeout:5000,
+ limit:8,
+ play_parse:true,
+ play_json:[{
+ re:'*',
+ json:{
+ parse:0,
+ jx:0
+ }
+ }],
+ lazy:'',
+ // double:true,
+ 图片来源:'@Referer=www.jianpianapp.com@User-Agent=jianpian-version353',
+ // 推荐:'json:data;room;*;cover;*;*',
+ 推荐:'json:.video;*;*;*;*',
+ 一级:'json:data;title;path;playlist.title;id',
+ 二级:{
+ // title:'data.title',
+ title:'data.title;data.types[0].name',
+ // desc:';data.description;data.id',
+ desc:'data.score;data.year.title;data.area.title;data.actors[0].name;data.directors[0].name',
+ img:'data.thumbnail',
+ // content:'data.thumbnail',
+ content:'data.description',
+ is_json:1,
+ tabs:`js:
+ TABS = [];
+ if (html.data.have_ftp_ur == 1) {
+ TABS.push("边下边播超清版")
+ }
+ if (html.data.have_m3u8_ur == 1) {
+ TABS.push("在线点播普清版")
+ }
+ `,
+ lists:`js:
+ log(TABS);
+ LISTS = [];
+ TABS.forEach(function(tab) {
+ if (/边下边播/.test(tab)) {
+ let ftp = html.data.new_ftp_list;
+ let d = ftp.map(function(it) {
+ return it.title + "$" + (/m3u8/.test(it.url) ? play_url + it.url : "tvbox-xg:" + it.url)
+ });
+ LISTS.push(d)
+ } else if (/在线点播/.test(tab)) {
+ let m3u = html.data.new_m3u8_list;
+ let d = m3u.map(function(it) {
+ return it.title + "$" + (/m3u8/.test(it.url) ? play_url + it.url : "tvbox-xg:" + it.url)
+ });
+ LISTS.push(d)
+ }
+ });
+ `,
+ },
+ 搜索:'json:data;*;thumbnail;mask;*',
+}
\ No newline at end of file