mirror of
https://github.com/alantang1977/X.git
synced 2024-12-24 18:03:10 +02:00
Add files via upload
This commit is contained in:
parent
0f53450128
commit
4a513f7b7a
27 changed files with 3265 additions and 0 deletions
1
IOS/js/18av_open.js
Normal file
1
IOS/js/18av_open.js
Normal file
File diff suppressed because one or more lines are too long
253
IOS/js/230ts_open.js
Normal file
253
IOS/js/230ts_open.js
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
// 网站搜索异常
|
||||||
|
import { load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = '爱上你听书网';
|
||||||
|
let HOST = 'https://wap.230ts.net';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || MOBILE_UA,
|
||||||
|
'Referer': HOST
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(HOST + '/sort/');
|
||||||
|
const $ = load(html);
|
||||||
|
let filterObj = {};
|
||||||
|
const class_parse = $('dl.pd-class:first > dd > a[href*=sort]');
|
||||||
|
let classes = [];
|
||||||
|
classes = _.map(class_parse, (cls) => {
|
||||||
|
let typeId = cls.attribs['href'];
|
||||||
|
typeId = typeId.replace(/.*?\/sort\/(.*).html/g, '$1');
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: cls.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const sortName = ['玄幻有声', '灵异有声', '综艺娱乐', '长篇评书', '都市有声', '军事有声', '职场有声', '其他有声'];
|
||||||
|
classes = _.sortBy(classes, (c) => {
|
||||||
|
const index = sortName.indexOf(c.type_name);
|
||||||
|
return index === -1 ? sortName.length : index;
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const link = HOST + '/top/lastupdate/1.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('ul.list-ul > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const remarks = $($(item).find('p.module-slide-author')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
|
||||||
|
vod_name: it.attribs.title.replace('有声小说',''),
|
||||||
|
vod_pic: HOST + img.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
const link = HOST + '/sort/' + tid +'/' + (`${pg}`) + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('ul.book-ol > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const remarks = $($(item).find('div.book-meta')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
|
||||||
|
vod_name: it.attribs.title.replace('有声小说',''),
|
||||||
|
vod_pic: HOST + img.attribs['data-original'],
|
||||||
|
vod_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('div.paging > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(HOST + '/tingshu/' + id);
|
||||||
|
const $ = load(html);
|
||||||
|
const detail = $('div.book-cell:first > div');
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: $('h1:first').text().trim().replace('有声小说',''),
|
||||||
|
vod_pic: HOST + $('div.myui-content__thumb img:first').attr('data-original'),
|
||||||
|
vod_content: $('div.ellipsis').text().trim(),
|
||||||
|
};
|
||||||
|
for (const info of detail) {
|
||||||
|
const i = $(info).text().trim();
|
||||||
|
if (i.startsWith('类型:')) {
|
||||||
|
vod.vod_type = _.map($(info).find('a'), (a) => {
|
||||||
|
return a.children[0].data;
|
||||||
|
}).join('/');
|
||||||
|
} else if (i.startsWith('作者:')) {
|
||||||
|
vod.vod_director = _.map($(info).find('a'), (a) => {
|
||||||
|
return a.children[0].data;
|
||||||
|
}).join('/');
|
||||||
|
} else if (i.startsWith('演播:')) {
|
||||||
|
vod.vod_actor = _.map($(info).find('a'), (a) => {
|
||||||
|
return a.children[0].data;
|
||||||
|
}).join('/');
|
||||||
|
} else if (i.startsWith('连载中')) {
|
||||||
|
vod.vod_remarks = i.substring(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const playlist = _.map($('#playlist > ul > li > a'), (it) => {
|
||||||
|
return it.children[0].data + '$' + it.attribs.href.replace(/\/mp3\/(.*).html/g, '$1');
|
||||||
|
});
|
||||||
|
vod.vod_play_from = '道长在线';
|
||||||
|
vod.vod_play_url = playlist.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
const link = HOST + '/mp3/' + id + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const iframe = $('body iframe[src*=player]');
|
||||||
|
const iframeHtml = (
|
||||||
|
await req(HOST + iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
'Referer': link,
|
||||||
|
'User-Agent': MOBILE_UA,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).content;
|
||||||
|
const playUrl = iframeHtml.match(/mp3:'(.*?)'/)[1];
|
||||||
|
if (playUrl.indexOf('m4a') >= 0 || playUrl.indexOf('mp3') >= 0 ) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
const iframeHtml = (
|
||||||
|
await req(HOST + iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
'Referer': link,
|
||||||
|
'User-Agent': MOBILE_UA,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).content;
|
||||||
|
const playUrl = playUrl + '.m4a' + iframeHtml.match(/(\?.*?)'/)[1];
|
||||||
|
if (playUrl.indexOf('http') >= 0) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const iframeHtml = (
|
||||||
|
await req(HOST + iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
'Referer': link,
|
||||||
|
'User-Agent': MOBILE_UA,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).content;
|
||||||
|
const playUrl2 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
|
||||||
|
if (playUrl2.indexOf('\?') >= 0) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl2,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const playUrl3 = playUrl2 + playUrl
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl3,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
if (playUrl.indexOf('http') >= 0) {
|
||||||
|
const playUrl = playUrl + '.m4a';
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const iframeHtml = (
|
||||||
|
await req(HOST + iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
'Referer': link,
|
||||||
|
'User-Agent': MOBILE_UA,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).content;
|
||||||
|
const playUrl4 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl4 + '.m4a',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
const link = HOST + '/search.html?searchtype=name&searchword=' + wd +'&page=1';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('ul.book-ol > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const remarks = $($(item).find('div.book-meta')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
|
||||||
|
vod_name: it.attribs.title.replace('有声小说',''),
|
||||||
|
vod_pic: img.attribs['data-original'],
|
||||||
|
vod_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
275
IOS/js/alist_open.js
Normal file
275
IOS/js/alist_open.js
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
import { _ } from './lib/cat.js';
|
||||||
|
import { findBestLCS } from './lib/similarity.js';
|
||||||
|
|
||||||
|
const http = async function (url, options = {}) {
|
||||||
|
if (options.method == 'POST' && options.data) {
|
||||||
|
options.body = JSON.stringify(options.data);
|
||||||
|
options.headers = Object.assign({ 'content-type': 'application/json' }, options.headers);
|
||||||
|
}
|
||||||
|
const res = await req(url, options);
|
||||||
|
res.json = () => (res.content ? JSON.parse(res.content) : null);
|
||||||
|
res.text = () => res.content;
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
['get', 'post'].forEach((method) => {
|
||||||
|
http[method] = function (url, options = {}) {
|
||||||
|
return http(url, Object.assign(options, { method: method.toUpperCase() }));
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const __drives = {};
|
||||||
|
const __subtitle_cache = {};
|
||||||
|
|
||||||
|
async function get_drives_path(tid) {
|
||||||
|
const index = tid.indexOf('/', 1);
|
||||||
|
const name = tid.substring(1, index);
|
||||||
|
const path = tid.substring(index);
|
||||||
|
return { drives: await get_drives(name), path };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function get_drives(name) {
|
||||||
|
const { settings, api, server } = __drives[name];
|
||||||
|
if (settings.v3 == null) {
|
||||||
|
//获取 设置
|
||||||
|
settings.v3 = false;
|
||||||
|
const data = (await http.get(server + '/api/public/settings')).json().data;
|
||||||
|
if (_.isArray(data)) {
|
||||||
|
settings.title = data.find((x) => x.key == 'title')?.value;
|
||||||
|
settings.v3 = false;
|
||||||
|
settings.version = data.find((x) => x.key == 'version')?.value;
|
||||||
|
settings.enableSearch = data.find((x) => x.key == 'enable search')?.value == 'true';
|
||||||
|
} else {
|
||||||
|
settings.title = data.title;
|
||||||
|
settings.v3 = true;
|
||||||
|
settings.version = data.version;
|
||||||
|
settings.enableSearch = false; //v3 没有找到 搜索配置
|
||||||
|
}
|
||||||
|
//不同版本 接口不一样
|
||||||
|
api.path = settings.v3 ? '/api/fs/list' : '/api/public/path';
|
||||||
|
api.file = settings.v3 ? '/api/fs/get' : '/api/public/path';
|
||||||
|
api.search = settings.v3 ? '/api/public/search' : '/api/public/search';
|
||||||
|
api.other = settings.v3 ? '/api/fs/other' : null;
|
||||||
|
}
|
||||||
|
return __drives[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
cfg.ext.forEach(
|
||||||
|
(item) =>
|
||||||
|
(__drives[item.name] = {
|
||||||
|
name: item.name,
|
||||||
|
server: item.server.endsWith('/') ? item.server.substring(0, item.server.length - 1) : item.server,
|
||||||
|
startPage: item.startPage || '/', //首页
|
||||||
|
showAll: item.showAll === true, //默认只显示 视频和文件夹,如果想显示全部 showAll 设置true
|
||||||
|
params: item.params || {},
|
||||||
|
_path_param: item.params
|
||||||
|
? _.sortBy(Object.keys(item.params), function (x) {
|
||||||
|
return -x.length;
|
||||||
|
})
|
||||||
|
: [],
|
||||||
|
settings: {},
|
||||||
|
api: {},
|
||||||
|
getParams(path) {
|
||||||
|
const key = this._path_param.find((x) => path.startsWith(x));
|
||||||
|
return Object.assign({}, this.params[key], { path });
|
||||||
|
},
|
||||||
|
async getPath(path) {
|
||||||
|
const res = (await http.post(this.server + this.api.path, { data: this.getParams(path) })).json();
|
||||||
|
return this.settings.v3 ? res.data.content : res.data.files;
|
||||||
|
},
|
||||||
|
async getFile(path) {
|
||||||
|
const res = (await http.post(this.server + this.api.file, { data: this.getParams(path) })).json();
|
||||||
|
const data = this.settings.v3 ? res.data : res.data.files[0];
|
||||||
|
if (!this.settings.v3) data.raw_url = data.url; //v2 的url和v3不一样
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
async getOther(method, path) {
|
||||||
|
const data = this.getParams(path);
|
||||||
|
data.method = method;
|
||||||
|
const res = (await http.post(this.server + this.api.other, { data: data })).json();
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
isFolder(data) {
|
||||||
|
return data.type == 1;
|
||||||
|
},
|
||||||
|
isVideo(data) {
|
||||||
|
//判断是否是 视频文件
|
||||||
|
return this.settings.v3 ? data.type == 2 : data.type == 3;
|
||||||
|
},
|
||||||
|
isSubtitle(data) {
|
||||||
|
if (data.type == 1) return false;
|
||||||
|
const ext = ['.srt', '.ass', '.scc', '.stl', '.ttml'];
|
||||||
|
return ext.some((x) => data.name.endsWith(x));
|
||||||
|
},
|
||||||
|
getType(data) {
|
||||||
|
const isVideo = this.isVideo(data);
|
||||||
|
return this.isFolder(data) ? 0 : isVideo ? 10 : 1;
|
||||||
|
},
|
||||||
|
getPic(data) {
|
||||||
|
let pic = this.settings.v3 ? data.thumb : data.thumbnail;
|
||||||
|
return pic || (this.isFolder(data) ? 'http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png' : '');
|
||||||
|
},
|
||||||
|
getSize(data) {
|
||||||
|
let sz = data.size || 0;
|
||||||
|
if (sz <= 0) return '';
|
||||||
|
let filesize = '';
|
||||||
|
if (sz > 1024 * 1024 * 1024 * 1024.0) {
|
||||||
|
sz /= 1024 * 1024 * 1024 * 1024.0;
|
||||||
|
filesize = 'TB';
|
||||||
|
} else if (sz > 1024 * 1024 * 1024.0) {
|
||||||
|
sz /= 1024 * 1024 * 1024.0;
|
||||||
|
filesize = 'GB';
|
||||||
|
} else if (sz > 1024 * 1024.0) {
|
||||||
|
sz /= 1024 * 1024.0;
|
||||||
|
filesize = 'MB';
|
||||||
|
} else {
|
||||||
|
sz /= 1024.0;
|
||||||
|
filesize = 'KB';
|
||||||
|
}
|
||||||
|
return sz.toFixed(2) + filesize;
|
||||||
|
},
|
||||||
|
getRemark(data) {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function dir(dir, pg) {
|
||||||
|
for (const k in __subtitle_cache) {
|
||||||
|
delete __subtitle_cache[k];
|
||||||
|
}
|
||||||
|
pg = pg || 1;
|
||||||
|
if (pg == 0) pg == 1;
|
||||||
|
if (dir === '/' || dir === '') {
|
||||||
|
const result = _.map(__drives, function (d) {
|
||||||
|
return { name: d.name, path: '/' + d.name + d.startPage, type: 0, thumb: '' };
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
parent: '',
|
||||||
|
page: pg,
|
||||||
|
pagecount: pg,
|
||||||
|
list: result,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let { drives, path } = await get_drives_path(dir);
|
||||||
|
const id = dir.endsWith('/') ? dir : dir + '/';
|
||||||
|
const list = await drives.getPath(path);
|
||||||
|
let subtList = [];
|
||||||
|
let videos = [];
|
||||||
|
let allList = [];
|
||||||
|
list.forEach((item) => {
|
||||||
|
if (drives.isSubtitle(item)) subtList.push(item.name);
|
||||||
|
const isVideo = drives.isVideo(item);
|
||||||
|
if (!drives.showAll && !drives.isFolder(item) && !isVideo) return;
|
||||||
|
const file = {
|
||||||
|
name: item.name.replaceAll('$', '_').replaceAll('#', '_'),
|
||||||
|
path: id + item.name + (drives.isFolder(item) ? '/' : ''),
|
||||||
|
thumb: drives.getPic(item),
|
||||||
|
type: drives.getType(item),
|
||||||
|
size: drives.getSize(item),
|
||||||
|
remark: drives.getRemark(item),
|
||||||
|
};
|
||||||
|
if (drives.isVideo(item)) videos.push(file);
|
||||||
|
allList.push(file);
|
||||||
|
});
|
||||||
|
if (subtList.length > 0) {
|
||||||
|
videos.forEach((item) => {
|
||||||
|
var sbust = findBestLCS(item.name, subtList);
|
||||||
|
if (sbust.bestMatch) __subtitle_cache[item.path] = [id + sbust.bestMatch.target];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
parent: id,
|
||||||
|
page: pg,
|
||||||
|
pagecount: pg,
|
||||||
|
list: allList,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function file(file) {
|
||||||
|
let { drives, path } = await get_drives_path(file);
|
||||||
|
const item = await drives.getFile(path);
|
||||||
|
const subs = [];
|
||||||
|
if (__subtitle_cache[file]) {
|
||||||
|
for (const sub of __subtitle_cache[file]) {
|
||||||
|
try {
|
||||||
|
let subP = await get_drives_path(sub);
|
||||||
|
const subItem = await drives.getFile(subP.path);
|
||||||
|
subs.push(subItem.raw_url);
|
||||||
|
} catch (error) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.provider === 'AliyundriveShare2Open' && drives.api.other) {
|
||||||
|
const urls = ['原画', item.raw_url];
|
||||||
|
try {
|
||||||
|
const res = await drives.getOther('video_preview', path);
|
||||||
|
for (const live of res.data.video_preview_play_info.live_transcoding_task_list) {
|
||||||
|
if (live.status === 'finished') {
|
||||||
|
urls.push(live.template_id);
|
||||||
|
urls.push(live.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {}
|
||||||
|
const result = {
|
||||||
|
name: item.name,
|
||||||
|
url: urls,
|
||||||
|
size: drives.getSize(item),
|
||||||
|
remark: drives.getRemark(item),
|
||||||
|
header: {},
|
||||||
|
extra: {
|
||||||
|
subt: subs,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} else if (item.provider === '123Pan') {
|
||||||
|
let url = item.raw_url;
|
||||||
|
try {
|
||||||
|
url = (await http.get(url)).json().data.redirect_url;
|
||||||
|
} catch (error) {}
|
||||||
|
const result = {
|
||||||
|
name: item.name,
|
||||||
|
url: url,
|
||||||
|
size: drives.getSize(item),
|
||||||
|
remark: drives.getRemark(item),
|
||||||
|
header: {},
|
||||||
|
extra: {
|
||||||
|
subt: subs,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} else {
|
||||||
|
const result = {
|
||||||
|
name: item.name,
|
||||||
|
url: item.raw_url,
|
||||||
|
size: drives.getSize(item),
|
||||||
|
remark: drives.getRemark(item),
|
||||||
|
header: {},
|
||||||
|
extra: {
|
||||||
|
subt: subs,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function search(wd) {
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
dir: dir,
|
||||||
|
file: file,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
8
IOS/js/app.js
Normal file
8
IOS/js/app.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
isVideoFormat: function (url) {
|
||||||
|
return !0;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export { __jsEvalReturn };
|
508
IOS/js/bili_open.js
Normal file
508
IOS/js/bili_open.js
Normal file
|
@ -0,0 +1,508 @@
|
||||||
|
import { Crypto, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
let cookie = '';
|
||||||
|
let login = '';
|
||||||
|
let vip = '';
|
||||||
|
let extendObj = {};
|
||||||
|
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) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: ua ? ua : { 'User-Agent': UA },
|
||||||
|
timeout: 60000,
|
||||||
|
});
|
||||||
|
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;
|
||||||
|
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.hasOwnProperty('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 = {};
|
||||||
|
for (const kk of ext) {
|
||||||
|
const c = {
|
||||||
|
type_name: kk,
|
||||||
|
type_id: kk,
|
||||||
|
land: 1,
|
||||||
|
ratio: 1.78,
|
||||||
|
};
|
||||||
|
newarr.push(c);
|
||||||
|
d[kk] = jsonData;
|
||||||
|
}
|
||||||
|
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 type_id = extendObj.classes[0].type_id;
|
||||||
|
const url = `https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=${type_id}&duration=4`;
|
||||||
|
|
||||||
|
const response = await request(url, getHeaders());
|
||||||
|
const responseData = JSON.parse(response);
|
||||||
|
const vods = responseData.data.result;
|
||||||
|
|
||||||
|
for (const item of vods) {
|
||||||
|
const vod = {};
|
||||||
|
let imageUrl = item.pic;
|
||||||
|
if (imageUrl.startsWith('//')) {
|
||||||
|
imageUrl = 'https:' + imageUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
vod.vod_id = item.bvid;
|
||||||
|
vod.vod_name = removeTags(item.title);
|
||||||
|
vod.vod_pic = imageUrl;
|
||||||
|
vod.vod_remarks = item.duration.split(':')[0] + '分钟';
|
||||||
|
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 = `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)}`;
|
||||||
|
|
||||||
|
const response = await request(url, getHeaders());
|
||||||
|
|
||||||
|
const resp = JSON.parse(response);
|
||||||
|
const data = resp.data;
|
||||||
|
|
||||||
|
const videos = [];
|
||||||
|
const items = data.result;
|
||||||
|
|
||||||
|
for (const item of items) {
|
||||||
|
const video = {};
|
||||||
|
let pic = item.pic;
|
||||||
|
if (pic.startsWith('//')) {
|
||||||
|
pic = 'https:' + pic;
|
||||||
|
}
|
||||||
|
|
||||||
|
video.vod_id = item.bvid;
|
||||||
|
video.vod_name = removeTags(item.title);
|
||||||
|
video.vod_pic = pic;
|
||||||
|
video.vod_remarks = item.duration.split(':')[0] + '分钟';
|
||||||
|
videos.push(video);
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
page: page,
|
||||||
|
pagecount: data.numPages,
|
||||||
|
limit: data.pagesize,
|
||||||
|
total: data.numResults,
|
||||||
|
list: videos,
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(ids) {
|
||||||
|
try {
|
||||||
|
const bvid = ids;
|
||||||
|
const bvid2aidUrl = `https://api.bilibili.com/x/web-interface/archive/stat?bvid=${bvid}`;
|
||||||
|
|
||||||
|
const bvid2aidResp = JSON.parse(await request(bvid2aidUrl, getHeaders()));
|
||||||
|
|
||||||
|
const aid = bvid2aidResp.data.aid + '';
|
||||||
|
const detailUrl = `https://api.bilibili.com/x/web-interface/view?aid=${aid}`;
|
||||||
|
const detailData = JSON.parse(await request(detailUrl, getHeaders())).data;
|
||||||
|
|
||||||
|
const video = {
|
||||||
|
vod_id: bvid,
|
||||||
|
vod_name: detailData.title,
|
||||||
|
vod_pic: detailData.pic,
|
||||||
|
type_name: detailData.tname,
|
||||||
|
vod_year: '',
|
||||||
|
vod_area: '',
|
||||||
|
vod_remarks: `${Math.floor(detailData.duration / 60)}分钟`,
|
||||||
|
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 a = playurldatalist.accept_description;
|
||||||
|
const accept_quality = playurldatalist.accept_quality;
|
||||||
|
const Aq = [];
|
||||||
|
const pFrom = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < accept_quality.length; i++) {
|
||||||
|
if (!login) {
|
||||||
|
if (accept_quality[i] > 32) continue;
|
||||||
|
} else if (!vip && login) {
|
||||||
|
if (accept_quality[i] > 80) continue;
|
||||||
|
} else {
|
||||||
|
if (accept_quality[i] > 32) continue;
|
||||||
|
}
|
||||||
|
pFrom.push(a[i]);
|
||||||
|
Aq.push(accept_quality[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const jSONArray = detailData.pages;
|
||||||
|
const playList = [];
|
||||||
|
for (let j = 0; j < jSONArray.length; j++) {
|
||||||
|
const jSONObject6 = jSONArray[j];
|
||||||
|
const j2 = jSONObject6.cid;
|
||||||
|
const playUrl = j + '$' + aid + '+' + j2 + '+' + Aq.join(':') + '+' + pFrom.join(':');
|
||||||
|
playList.push(playUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
video.vod_play_from = 'external$$$dash$$$mp4';
|
||||||
|
video.vod_play_url = playList.join('#');
|
||||||
|
video.vod_play_url = [video.vod_play_url, video.vod_play_url, video.vod_play_url].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(':');
|
||||||
|
if (flag == 'dash') {
|
||||||
|
// dash mpd 代理
|
||||||
|
const js2Base = await js2Proxy(true, siteType, siteKey, 'dash/', {});
|
||||||
|
let urls = [];
|
||||||
|
for (let i = 0; i < qualityIds.length; i++) {
|
||||||
|
urls.push(qualityName[i], js2Base + base64Encode(aid + '+' + cid + '+' + qualityIds[i]));
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: urls,
|
||||||
|
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(qualityName[i], durl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: urls,
|
||||||
|
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(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: '4',
|
||||||
|
};
|
||||||
|
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.78,
|
||||||
|
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 `<AdaptationSet lang="chi">
|
||||||
|
<ContentComponent contentType="${mediaType}"/>
|
||||||
|
<Representation id="${qnid}" bandwidth="${media_bandwidth}" codecs="${media_codecs}" mimeType="${media_mimeType}" ${media_type_params} startWithSAP="${media_startWithSAP}">
|
||||||
|
<BaseURL>${media_BaseURL}</BaseURL>
|
||||||
|
<SegmentBase indexRange="${media_SegmentBase_indexRange}">
|
||||||
|
<Initialization range="${media_SegmentBase_Initialization}"/>
|
||||||
|
</SegmentBase>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>`;
|
||||||
|
} catch (e) {
|
||||||
|
// Handle exceptions here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDash(ja, videoList, audioList) {
|
||||||
|
const duration = ja.data.dash.duration;
|
||||||
|
const minBufferTime = ja.data.dash.minBufferTime;
|
||||||
|
return `<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="static" mediaPresentationDuration="PT${duration}S" minBufferTime="PT${minBufferTime}S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
|
||||||
|
<Period duration="PT${duration}S" start="PT0S">
|
||||||
|
${videoList}
|
||||||
|
${audioList}
|
||||||
|
</Period>
|
||||||
|
</MPD>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
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, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
IOS/js/bilibili.js
Normal file
1
IOS/js/bilibili.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import{Crypto,load,_}from"assets://js/lib/cat.js";let key="bilibili",url="",siteKey="",siteType=0;const UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",cookie={};async function request(reqUrl,referer,mth,data,hd){var headers={"User-Agent":UA,Cookie:_.map(cookie,(value,key)=>key+"="+value).join(";")},referer=(referer&&(headers.referer=encodeURIComponent(referer)),await req(reqUrl,{method:mth||"get",headers:headers,data:data,postType:"post"===mth?"form":""}));return referer.content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype,url=cfg.ext}async function home(filter){return(await request(url)).replaceAll("1$/$1","1$/$0")}async function homeVod(){return"{}"}async function category(tid,pg,filter,extend){pg<=0&&(pg=1);let api=url+"?t="+tid+"&pg="+pg;return extend&&(tid=Object.entries(extend).map(([key,val]=entry)=>"&"+key+"="+val),api=(api+=tid)+("&f="+encodeURIComponent(JSON.stringify(extend)))),request(api)}async function detail(id){return request(url+"?ids="+id)}async function play(flag,id,flags){return request(url.replace("/bilibili","/play")+"?bvid="+id+"&from=open")}async function search(wd,quick){return request(url+"?wd="+wd)}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export{__jsEvalReturn};
|
182
IOS/js/config_open.json
Normal file
182
IOS/js/config_open.json
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
{
|
||||||
|
"video": {
|
||||||
|
"sites": [
|
||||||
|
{
|
||||||
|
"key": "kunyu77",
|
||||||
|
"name": "🤖超人丨七七",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/kunyu77_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "wogg",
|
||||||
|
"name": "🤖超人丨玩偶",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/wogg_open.js",
|
||||||
|
"ext": "dc8f85303c1b444d8666c849082b3c68"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "nanguatv",
|
||||||
|
"name": "🤖超人丨南瓜影视",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/ng_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "libvio",
|
||||||
|
"name": "🤖超人丨libvio",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/libvio_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "czzy",
|
||||||
|
"name": "🤖超人丨🅰️厂长",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/czzy_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "czzy",
|
||||||
|
"name": "🤖超人丨🅱️厂长",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/czzy2_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "czzy",
|
||||||
|
"name": "🤖超人丨🔢厂长",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/czzy3_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ikanbot",
|
||||||
|
"name": "🤖超人丨爱看",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/ikanbot_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "kkys",
|
||||||
|
"name": "🤖超人丨快看",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/kkys_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "subaibai",
|
||||||
|
"name": "🤖超人丨素白白",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/subaibai_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "kuqimv",
|
||||||
|
"name": "🤖超人丨酷奇",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/kuqimv_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "mybl",
|
||||||
|
"name": "🤖超人丨哔哩",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/mybili_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "mtsp_open.",
|
||||||
|
"name": "🤖超人丨蜜桃",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/mtsp_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "nivod",
|
||||||
|
"name": "🤖超人丨泥巴✈",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/nivod_open.js",
|
||||||
|
"ext":"888解忧愁"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "duboku",
|
||||||
|
"name": "🤖超人丨独播✈",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/duboku_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "230ts",
|
||||||
|
"name": "🤖超人丨听书",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/230ts_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "18av",
|
||||||
|
"name": "🤖超人丨仙女",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/18a_open.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "xiaoya-tv",
|
||||||
|
"name": "🤖超人丨小雅",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/xiaoya_open.js",
|
||||||
|
"ext": "部署alist-tvobx小雅,ip+端口或网址/vod1/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "bilibili",
|
||||||
|
"name": "🤖超人丨BiliBili",
|
||||||
|
"type": 3,
|
||||||
|
"api": "assets://js/bilibili.js",
|
||||||
|
"ext": "部署alist-tvobx小雅,ip+端口或网址/bilibili/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pan": {
|
||||||
|
"sites": [
|
||||||
|
{
|
||||||
|
"key": "alist",
|
||||||
|
"name": "🤖超人丨Alist",
|
||||||
|
"type": 40,
|
||||||
|
"api": "assets://js/alist_open.js",
|
||||||
|
"ext": [
|
||||||
|
{
|
||||||
|
"name": "小雅",
|
||||||
|
"server": "部署alist-tvobx小雅,ip+端口/",
|
||||||
|
"startPage": "/",
|
||||||
|
"showAll": false,
|
||||||
|
"search": true,
|
||||||
|
"headers": {
|
||||||
|
"Authorization": ""
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"/abc": {
|
||||||
|
"password": "123"
|
||||||
|
},
|
||||||
|
"/abc/abc": {
|
||||||
|
"password": "123"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "罗汉果",
|
||||||
|
"server": "https://lala-ofbip.run.goorm.site/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "七米蓝",
|
||||||
|
"server": "https://al.chirmyram.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "神族九帝",
|
||||||
|
"server": "https://alist.shenzjd.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "姬路白雪",
|
||||||
|
"server": "https://pan.jlbx.xyz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "星梦",
|
||||||
|
"server": "https://pan.bashroot.top"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "repl",
|
||||||
|
"server": "https://ali.liucn.repl.co"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "讯维云盘",
|
||||||
|
"server": "https://pan.xwbeta.com"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
244
IOS/js/czzy_open.js
Normal file
244
IOS/js/czzy_open.js
Normal file
|
@ -0,0 +1,244 @@
|
||||||
|
// 自动从 地址发布页 获取&跳转url地址
|
||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'czzy';
|
||||||
|
let host = 'https://www.czzy.site'; // 厂长地址发布页
|
||||||
|
// let url = 'https://cz01.cc';
|
||||||
|
let url = '';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1';
|
||||||
|
const cookie = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, referer, mth, data, hd) {
|
||||||
|
const headers = {
|
||||||
|
'User-Agent': UA,
|
||||||
|
Cookie: _.map(cookie, (value, key) => {
|
||||||
|
return `${key}=${value}`;
|
||||||
|
}).join(';'),
|
||||||
|
};
|
||||||
|
if (referer) headers.referer = encodeURIComponent(referer);
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: mth || 'get',
|
||||||
|
headers: headers,
|
||||||
|
data: data,
|
||||||
|
postType: mth === 'post' ? 'form' : '',
|
||||||
|
});
|
||||||
|
if (res.headers['set-cookie']) {
|
||||||
|
const set_cookie = _.isArray(res.headers['set-cookie']) ? res.headers['set-cookie'].join(';') : res.headers['set-cookie'];
|
||||||
|
const cks = set_cookie.split(';');
|
||||||
|
for (const c of cks) {
|
||||||
|
const tmp = c.trim();
|
||||||
|
if (tmp.startsWith('result=')) {
|
||||||
|
cookie.result = tmp.substring(7);
|
||||||
|
return await request(reqUrl, reqUrl, 'post', {
|
||||||
|
result: cookie.result,
|
||||||
|
});
|
||||||
|
} else if (tmp.startsWith('esc_search_captcha=1')) {
|
||||||
|
cookie.esc_search_captcha = 1;
|
||||||
|
delete cookie.result;
|
||||||
|
return await request(reqUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log(res.headers['set-cookie']);
|
||||||
|
}
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
let html = await request(host);
|
||||||
|
url = html.match(/推荐访问<a href="(.*)"/)[1];
|
||||||
|
console.debug('厂长跳转地址 =====>' + url); // js_debug.log
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let filterObj = {};
|
||||||
|
const html = await request(url + '/movie_bt');
|
||||||
|
const $ = load(html);
|
||||||
|
const tags = $('div#beautiful-taxonomy-filters-tax-movie_bt_tags > a');
|
||||||
|
let tag = {
|
||||||
|
key: 'tag',
|
||||||
|
name: '类型',
|
||||||
|
value: _.map(tags, (n) => {
|
||||||
|
let v = n.attribs['cat-url'] || '';
|
||||||
|
v = v.substring(v.lastIndexOf('/') + 1);
|
||||||
|
return { n: n.children[0].data, v: v };
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
tag['init'] = tag.value[0].v;
|
||||||
|
const series = $('div#beautiful-taxonomy-filters-tax-movie_bt_series > a[cat-url*=movie_bt_series]');
|
||||||
|
let classes = _.map(series, (s) => {
|
||||||
|
let typeId = s.attribs['cat-url'];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf('/') + 1);
|
||||||
|
filterObj[typeId] = [tag];
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: s.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const sortName = ['电影', '电视剧', '国产剧', '美剧', '韩剧', '日剧', '海外剧(其他)', '华语电影', '印度电影', '日本电影', '欧美电影', '韩国电影', '动画', '俄罗斯电影', '加拿大电影'];
|
||||||
|
classes = _.sortBy(classes, (c) => {
|
||||||
|
const index = sortName.indexOf(c.type_name);
|
||||||
|
return index === -1 ? sortName.length : index;
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return '{}';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
const tag = extend.tag || '';
|
||||||
|
const link = url + '/movie_bt' + (tag.length > 0 ? `/movie_bt_tags/${tag}` : '') + '/movie_bt_series/' + tid + (pg > 1 ? `/page/${pg}` : '');
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.mrb > ul > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const a = $(item).find('a:first')[0];
|
||||||
|
const hdinfo = $($(item).find('div.hdinfo')[0]).text().trim();
|
||||||
|
const jidi = $($(item).find('div.jidi')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/movie\/(.*).html/g, '$1'),
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: img.attribs['data-original'],
|
||||||
|
vod_remarks: jidi || hdinfo || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('div.mrb > div.pagenavi_txt > a:contains(>)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 20,
|
||||||
|
total: 20 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function stripHtmlTag(src) {
|
||||||
|
return src
|
||||||
|
.replace(/<\/?[^>]+(>|$)/g, '')
|
||||||
|
.replace(/&.{1,5};/g, '')
|
||||||
|
.replace(/\s{2,}/g, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(url + '/movie/' + id + '.html');
|
||||||
|
const $ = load(html);
|
||||||
|
const detail = $('ul.moviedteail_list > li');
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_pic: $('div.dyimg img:first').attr('src'),
|
||||||
|
vod_remarks: '',
|
||||||
|
vod_content: stripHtmlTag($('div.yp_context').html()).trim(),
|
||||||
|
};
|
||||||
|
for (const info of detail) {
|
||||||
|
const i = $(info).text().trim();
|
||||||
|
if (i.startsWith('地区:')) {
|
||||||
|
vod.vod_area = i.substring(3);
|
||||||
|
} else if (i.startsWith('年份:')) {
|
||||||
|
vod.vod_year = i.substring(3);
|
||||||
|
} else if (i.startsWith('导演:')) {
|
||||||
|
vod.vod_director = _.map($(info).find('a'), (a) => {
|
||||||
|
return a.children[0].data;
|
||||||
|
}).join('/');
|
||||||
|
} else if (i.startsWith('主演:')) {
|
||||||
|
vod.vod_actor = _.map($(info).find('a'), (a) => {
|
||||||
|
return a.children[0].data;
|
||||||
|
}).join('/');
|
||||||
|
} else if (i.startsWith('语言:')) {
|
||||||
|
vod.vod_lang = i.substring(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const playlist = _.map($('div.paly_list_btn > a'), (a) => {
|
||||||
|
return a.children[0].data + '$' + a.attribs.href.replace(/.*?\/v_play\/(.*).html/g, '$1');
|
||||||
|
});
|
||||||
|
vod.vod_play_from = key;
|
||||||
|
vod.vod_play_url = playlist.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
const link = url + '/v_play/' + id + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const iframe = $('body iframe[src*=Cloud]');
|
||||||
|
if (iframe.length > 0) {
|
||||||
|
const iframeHtml = (
|
||||||
|
await req(iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
Referer: link,
|
||||||
|
'User-Agent': UA,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).content;
|
||||||
|
let code = iframeHtml
|
||||||
|
.match(/var url = '(.*?)'/)[1]
|
||||||
|
.split('')
|
||||||
|
.reverse()
|
||||||
|
.join('');
|
||||||
|
let temp = '';
|
||||||
|
for (let i = 0x0; i < code.length; i = i + 0x2) {
|
||||||
|
temp += String.fromCharCode(parseInt(code[i] + code[i + 0x1], 0x10));
|
||||||
|
}
|
||||||
|
const playUrl = temp.substring(0x0, (temp.length - 0x7) / 0x2) + temp.substring((temp.length - 0x7) / 0x2 + 0x7);
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const js = $('script:contains(window.wp_nonce)').html();
|
||||||
|
const group = js.match(/(var.*)eval\((\w*\(\w*\))\)/);
|
||||||
|
const md5 = Crypto;
|
||||||
|
const result = eval(group[1] + group[2]);
|
||||||
|
const playUrl = result.match(/url:.*?['"](.*?)['"]/)[1];
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
const html = await request(url + '/?s=' + wd);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.search_list > ul > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const a = $(item).find('a:first')[0];
|
||||||
|
const hdinfo = $($(item).find('div.hdinfo')[0]).text().trim();
|
||||||
|
const jidi = $($(item).find('div.jidi')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/movie\/(.*).html/g, '$1'),
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: img.attribs['data-original'],
|
||||||
|
vod_remarks: jidi || hdinfo || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
166
IOS/js/duboku2_open.js
Normal file
166
IOS/js/duboku2_open.js
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
import { Crypto, load, _, jinja2 } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'duboku';
|
||||||
|
let url = 'https://u.duboku.io';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1';
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || UA,
|
||||||
|
'Referer': url
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const class_parse = $('ul.nav-list > li > a[href*=vodtype]');
|
||||||
|
let classes = [];
|
||||||
|
classes = _.map(class_parse, (cls) => {
|
||||||
|
let typeId = cls.attribs['href'];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf('/') + 1).replace('.html','');
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: cls.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
let filterObj = {
|
||||||
|
"2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"陆剧","v":"13"},{"n":"日韩剧","v":"15"},{"n":"短剧","v":"21"},{"n":"台泰剧","v":"14"},{"n":"港剧","v":"20"}]},{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"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":"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"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"韩语","v":"韩语"},{"n":"泰语","v":"泰语"},{"n":"法语","v":"法语"},{"n":"日语","v":"日语"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"3":[{"key":"class","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":"曲艺"},{"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":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"4":[{"key":"class","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":"动作"},{"n":"机战","v":"机战"},{"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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"13":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"15":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"21":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"14":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"台湾","v":"台湾"},{"n":"泰国","v":"泰国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"20":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const link = url + '/vodshow/2--hits---------.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.myui-panel_bd > ul.myui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: it.attribs.title,
|
||||||
|
vod_pic: it.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
|
||||||
|
const link = url + '/vodshow/' + (extend.CateId || tid) + '-'+(extend.area || '')+'-'+(extend.by || 'time')+'-'+(extend.class || '')+'-'+(extend.lang || '')+'-'+(extend.letter || '')+'---' + (`${pg}`) + '---'+(extend.year || '')+'.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.myui-panel_bd > ul.myui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: it.attribs.title,
|
||||||
|
vod_pic: it.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('ul.myui-page > li > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(url + '/voddetail/' + id + '.html');
|
||||||
|
const $ = load(html);
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: $('h1:first').text().trim(),
|
||||||
|
vod_type: $('.myui-content__detail p:first a').text(),
|
||||||
|
vod_actor: $('.myui-content__detail p:nth-child(5)').text().replace('主演:',''),
|
||||||
|
vod_director: $('.myui-content__detail p:nth-child(6)').text().replace('导演:',''),
|
||||||
|
vod_pic: $('div.myui-content__thumb img:first').attr('data-original'),
|
||||||
|
vod_remarks :$('#rating:first span').text().replace(/\s{2,}/g, ' '),
|
||||||
|
vod_content: $('span.data').text().trim(),
|
||||||
|
};
|
||||||
|
const playlist = _.map($('ul.sort-list > li > a'), (it) => {
|
||||||
|
return it.children[0].data + '$' + it.attribs.href.replace(/\/vodplay\/(.*).html/g, '$1');
|
||||||
|
});
|
||||||
|
vod.vod_play_from = key;
|
||||||
|
vod.vod_play_url = playlist.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
const link = url + '/vodplay/' + id + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const js = JSON.parse($('script:contains(player_)').html().replace('var player_data=',''));
|
||||||
|
const playUrl = js.url.replace('index.m3u8','hls\/index.m3u8');
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
let data = JSON.parse(await request(url + '/index.php/ajax/suggest?mid=1&wd=' + wd)).list;
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.pic,
|
||||||
|
vod_remarks: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
173
IOS/js/duboku_open.js
Normal file
173
IOS/js/duboku_open.js
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
// 修复 Windows版 播放转圈圈
|
||||||
|
import { load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'duboku';
|
||||||
|
let HOST = 'https://www.duboku.tv';
|
||||||
|
// let HOST = 'https://u.duboku.io';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || MOBILE_UA,
|
||||||
|
'Referer': HOST
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(HOST);
|
||||||
|
const $ = load(html);
|
||||||
|
const class_parse = $('ul.nav-list > li > a[href*=vodtype]');
|
||||||
|
let classes = [];
|
||||||
|
classes = _.map(class_parse, (cls) => {
|
||||||
|
let typeId = cls.attribs['href'];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf('/') + 1).replace('.html','');
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: cls.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
let filterObj = {
|
||||||
|
"2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"陆剧","v":"13"},{"n":"日韩剧","v":"15"},{"n":"短剧","v":"21"},{"n":"台泰剧","v":"14"},{"n":"港剧","v":"20"}]},{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"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":"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"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"韩语","v":"韩语"},{"n":"泰语","v":"泰语"},{"n":"法语","v":"法语"},{"n":"日语","v":"日语"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"3":[{"key":"class","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":"曲艺"},{"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":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"4":[{"key":"class","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":"动作"},{"n":"机战","v":"机战"},{"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":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"13":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"15":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"21":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"14":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"台湾","v":"台湾"},{"n":"泰国","v":"泰国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||||
|
"20":[{"key":"class","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":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"乡村","v":"乡村"},{"n":"年代","v":"年代"},{"n":"警匪","v":"警匪"},{"n":"谍战","v":"谍战"},{"n":"冒险","v":"冒险"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"BL","v":"BL"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"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"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const link = HOST + '/vodshow/2--hits---------.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.myui-panel_bd > ul.myui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: it.attribs.title,
|
||||||
|
vod_pic: it.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
const link = HOST + '/vodshow/' + (extend.CateId || tid) + '-'+(extend.area || '')+'-'+(extend.by || 'time')+'-'+(extend.class || '')+'-'+(extend.lang || '')+'-'+(extend.letter || '')+'---' + (`${pg}`) + '---'+(extend.year || '')+'.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.myui-panel_bd > ul.myui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const it = $(item).find('a:first')[0];
|
||||||
|
const remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: it.attribs.title,
|
||||||
|
vod_pic: it.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('ul.myui-page > li > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(HOST + '/voddetail/' + id + '.html');
|
||||||
|
const $ = load(html);
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: $('h1:first').text().trim(),
|
||||||
|
vod_type: $('.myui-content__detail p:first a').text(),
|
||||||
|
vod_actor: $('.myui-content__detail p:nth-child(5)').text().replace('主演:',''),
|
||||||
|
vod_director: $('.myui-content__detail p:nth-child(6)').text().replace('导演:',''),
|
||||||
|
vod_pic: $('div.myui-content__thumb img:first').attr('data-original'),
|
||||||
|
vod_remarks :$('#rating:first span').text().replace(/\s{2,}/g, ' '),
|
||||||
|
vod_content: $('span.data').text().trim(),
|
||||||
|
};
|
||||||
|
const playlist = _.map($('ul.sort-list > li > a'), (it) => {
|
||||||
|
return it.children[0].data + '$' + it.attribs.href.replace(/\/vodplay\/(.*).html/g, '$1');
|
||||||
|
});
|
||||||
|
// vod.vod_play_from = key;
|
||||||
|
vod.vod_play_from = '道长在线';
|
||||||
|
vod.vod_play_url = playlist.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
const link = HOST + '/vodplay/' + id + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const js = JSON.parse($('script:contains(player_)').html().replace(/var player_.*=/,''));
|
||||||
|
const playUrl = js.url;
|
||||||
|
let headers = {
|
||||||
|
"referer": HOST+"/static/player/vidjs.html",
|
||||||
|
};
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
header: headers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
let data = JSON.parse(await request(HOST + '/index.php/ajax/suggest?mid=1&wd=' + wd + '&limit=50')).list;
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.pic,
|
||||||
|
vod_remarks: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
limit: 50,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
IOS/js/ikanbot_open.js
Normal file
1
IOS/js/ikanbot_open.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import{Crypto,load,_}from"assets://js/lib/cat.js";let key="ikanbot",url="https://www.ikanbot.com",siteKey="",siteType=0;const UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";async function request(reqUrl,agentSp){return(await req(reqUrl,{method:"get",headers:{"User-Agent":agentSp||UA}})).content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype}function getClass($){var nav=$("ul.nav-pills:eq(1) > li > a"),nav={key:"tag",name:"标签",value:_.map(nav,n=>({n:n.children[0].data,v:n.attribs.href}))},$=(nav.init=nav.value[0].v,$("title:first").text().split("-")[0].substring(2));return{cls:{type_id:nav.value[0].v,type_name:$},tags:[nav]}}async function home(filter){var classes=[],filterObj={};for(const cate of["/hot/index-movie-热门.html","/hot/index-tv-热门.html"]){var html=await request(url+cate),{cls:html,tags}=getClass(load(html));classes.push(html),filterObj[html.type_id]=tags}return JSON.stringify({class:classes,filters:filterObj})}async function homeVod(){return"{}"}async function category(tid,pg,filter,extend){pg<=0&&(pg=1);extend=await request(url+(extend.tag||tid).replace(".html",1<pg?`-p-${pg}.html`:".html"));const $=load(extend);var tid=$("div.v-list a.item"),jsBase=await js2Proxy(!0,siteType,siteKey,"img/",{}),extend=_.map(tid,item=>{var img=$(item).find("img:first")[0];return{vod_id:item.attribs.href,vod_name:img.attribs.alt,vod_pic:jsBase+base64Encode(img.attribs["data-src"]),vod_remarks:""}}),tid=0<$("div.page-more > a:contains(下一页)").length?parseInt(pg)+1:parseInt(pg);return JSON.stringify({page:parseInt(pg),pagecount:tid,limit:24,total:24*tid,list:extend})}async function detail(id){var html=await request(url+id),$=load(html),html=await js2Proxy(!0,siteType,siteKey,"img/",{}),detail=$("div.detail > .meta"),vod={vod_id:id,vod_pic:html+base64Encode($("div.item-root > img")[0].attribs["data-src"]),vod_remarks:""};for(const info of detail)$(info).hasClass("title")?vod.vod_name=info.children[0].data:$(info).hasClass("year")||$(info).hasClass("country")?vod.vod_area=info.children[0].data:$(info).hasClass("celebrity")&&(vod.vod_actor=info.children[0].data);var html=await req(url+"/api/getResN?videoId="+id.substring(id.lastIndexOf("/")+1)+"&mtype=2",{headers:{Referer:url,"User-Agent":UA}}),playlist={};for(const l of JSON.parse(html.content).data.list)for(const f of JSON.parse(l.resData)){var from=f.flag,urls=f.url;from&&urls&&(playlist[from]||(playlist[from]=urls))}return vod.vod_play_from=_.keys(playlist).join("$$$"),vod.vod_play_url=_.values(playlist).join("$$$"),JSON.stringify({list:[vod]})}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))}async function proxy(segments,headers){var what=segments[0],segments=base64Decode(segments[1]);return"img"==what?(what=await req(segments,{buffer:2,headers:{Referer:segments,"User-Agent":UA}}),JSON.stringify({code:what.code,buffer:2,content:what.content,headers:what.headers})):JSON.stringify({code:500,content:""})}async function play(flag,id,flags){return JSON.stringify({parse:0,url:id})}async function search(wd,quick){wd=await request(url+"/search?q="+wd);const $=load(wd);var wd=$("div.media > div.media-left > a"),jsBase=await js2Proxy(!0,siteType,siteKey,"img/",{}),wd=_.map(wd,item=>{var img=$(item).find("img:first")[0];return{vod_id:item.attribs.href,vod_name:img.attribs.alt,vod_pic:jsBase+base64Encode(img.attribs["data-src"]),vod_remarks:""}});return JSON.stringify({list:wd})}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,proxy:proxy,search:search}}export{__jsEvalReturn};
|
8
IOS/js/kkys_open.js
Normal file
8
IOS/js/kkys_open.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import{Crypto,dayjs,jinja2,_}from"assets://js/lib/cat.js";let key="kkys",url="https://api1.baibaipei.com:8899",device={},siteKey="",siteType=0;async function request(reqUrl,postData,agentSp,get){var ts=dayjs().valueOf().toString(),rand=randStr(32),sign=Crypto.MD5("abcdexxxdd2daklmn25129_"+ts+"_"+rand).toString().toLowerCase(),agentSp={"user-agent":agentSp||device.ua},sign=(reqUrl.includes("baibaipei")&&(agentSp["device-id"]=device.id,agentSp["push-token"]="",agentSp.sign=sign,agentSp.time=ts,agentSp.md5=rand,agentSp.version="2.1.0",agentSp["system-model"]=device.model,agentSp["system-brand"]=device.brand,agentSp["system-version"]=device.release),await req(reqUrl,{method:get?"get":"post",headers:agentSp,data:postData||{},postType:get?"":"form"}));return sign.content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype;cfg=await local.get(key,"device");if(0<cfg.length)try{device=JSON.parse(cfg)}catch(error){}_.isEmpty(device)&&((device=randDevice()).id=randStr(33).toLowerCase(),device.ua="okhttp/4.1.0",await local.set(key,"device",JSON.stringify(device)))}async function home(filter){var classes=[],filterObj={};for(const type of JSON.parse(await request(url+"/api.php/Index/getTopVideoCategory")).data){var typeName=type.nav_name;if("推荐"!=typeName){var typeId=type.nav_type_id.toString();if(classes.push({type_id:typeId,type_name:typeName}),filter)try{var key,filterAll=[],filterData=JSON.parse(await request(url+"/api.php/Video/getFilterType",{type:typeId})).data;for(key of Object.keys(filterData)){var itemValues=filterData[key];"plot"===key&&(key="class");let typeExtendName="";switch(key){case"class":typeExtendName="类型";break;case"area":typeExtendName="地区";break;case"lang":typeExtendName="语言";break;case"year":typeExtendName="年代";break;case"sort":typeExtendName="排序"}if(0!==typeExtendName.length){var newTypeExtend={key:key,name:typeExtendName},newTypeExtendKV=[];for(let j=0;j<itemValues.length;j++){var name=itemValues[j],value="sort"===key?j+"":"全部"===name?"0":name;newTypeExtendKV.push({n:name,v:value})}newTypeExtend.init="sort"===key?"1":newTypeExtendKV[0].v,newTypeExtend.value=newTypeExtendKV,filterAll.push(newTypeExtend)}}_.isEmpty(filterAll)||(filterObj[typeId]=filterAll)}catch(e){console.log(e)}}}return JSON.stringify({class:classes,filters:filterObj})}async function homeVod(){var videos=[];for(const item of JSON.parse(await request(url+"/api.php/Index/getHomePage",{type:1,p:1})).data.video)if(0===item.title.styleType)for(const vObj of item.list)videos.push({vod_id:vObj.vod_id,vod_name:vObj.vod_name,vod_pic:vObj.vod_pic,vod_remarks:vObj.vod_remarks||vObj.vod_score||""});return JSON.stringify({list:videos})}async function category(tid,pg,filter,extend){0==pg&&(pg=1);var reqUrl=url+"/api.php/Video/getFilterVideoList",extend=JSON.parse(jinja2(`{
|
||||||
|
"type": "{{tid}}",
|
||||||
|
"p": "{{pg}}",
|
||||||
|
"area": "{{ext.area|default(0)}}",
|
||||||
|
"year": "{{ext.year|default(0)}}",
|
||||||
|
"sort": "{{ext.sort|default(0)}}",
|
||||||
|
"class": "{{ext.class|default(0)}}"
|
||||||
|
}`,{ext:extend,tid:tid,pg:pg})),tid=(console.log(extend),JSON.parse(await request(reqUrl,extend)).data),videos=[];for(const vod of tid.data)videos.push({vod_id:vod.vod_id,vod_name:vod.vod_name,vod_pic:vod.vod_pic,vod_remarks:vod.vod_remarks||vod.vod_score||""});return JSON.stringify({page:parseInt(tid.current_page),pagecount:parseInt(tid.last_page),limit:parseInt(tid.per_page),total:parseInt(tid.total),list:videos})}async function detail(id){var id=JSON.parse(await request(url+"/api.php/Video/getVideoInfo",{video_id:id})).data.video,vod={vod_id:id.vod_id,vod_name:id.vod_name,vod_pic:id.vod_pic,type_name:id.vod_class,vod_year:id.vod_year,vod_area:id.vod_area,vod_remarks:id.vod_remarks||"",vod_actor:id.vod_actor,vod_director:id.vod_director,vod_content:id.vod_content.trim()},playlist={};for(const item of id.vod_play){var from=item.playerForm;if("jp"!==from&&"xg"!==from){let urls=[];for(const u of item.url)urls.push(formatPlayUrl(vod.vod_name,u.title)+"$"+u.play_url);!playlist.hasOwnProperty(from)&&0<urls.length&&(playlist[from]=urls)}}parse=id.parse||[],vod.vod_play_from=_.keys(playlist).join("$$$");var vod_play_url=[];for(const urlist of _.values(playlist))vod_play_url.push(urlist.join("#"));return vod.vod_play_url=vod_play_url.join("$$$"),JSON.stringify({list:[vod]})}var parse=[];async function play(flag,id,flags){try{if((0<=id.indexOf("youku")||0<=id.indexOf("iqiyi")||0<=id.indexOf("v.qq.com")||0<=id.indexOf("pptv")||0<=id.indexOf("le.com")||0<=id.indexOf("1905.com")||0<=id.indexOf("mgtv"))&&0<parse.length)for(let index=0;index<parse.length;index++)try{var p=parse[index];let res=await req(p+id,{headers:{"user-agent":"okhttp/4.1.0"}});if((result=jsonParse(id,JSON.parse(res.content))).url)return result.parse=0,JSON.stringify(result)}catch(error){}if(0<=id.indexOf("jqq-")){var jqqHeader=await request(url+"/jqqheader.json",null,null,!0),jqqHeaders=JSON.parse(jqqHeader),ids=id.split("-"),jxJqq=await req("https://api.juquanquanapp.com/app/drama/detail?dramaId="+ids[1]+"&episodeSid="+ids[2]+"&quality=LD",{headers:jqqHeaders}),jqqInfo=JSON.parse(jxJqq.content);if(jqqInfo.data.playInfo.url)return JSON.stringify({parse:0,playUrl:"",url:jqqInfo.data.playInfo.url})}var result,res=await request(url+"/video.php",{url:id});return(result=jsonParse(id,JSON.parse(res).data)).url?(result.parse=0,JSON.stringify(result)):JSON.stringify({parse:0,playUrl:"",url:id})}catch(e){return console.log(e),JSON.stringify({parse:0,url:id})}}async function search(wd,quick){var videos=[];for(const vod of JSON.parse(await request(url+"/api.php/Search/getSearch",{key:wd,type_id:0,p:1})).data.data)videos.push({vod_id:vod.vod_id,vod_name:vod.vod_name,vod_pic:vod.vod_pic,vod_remarks:vod.vod_remarks||vod.vod_score||""});return JSON.stringify({list:videos})}const charStr="abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";function randStr(len,withNum){for(var _str="",containsNum=void 0===withNum||withNum,i=0;i<len;i++){var idx=_.random(0,containsNum?charStr.length-1:charStr.length-11);_str+=charStr[idx]}return _str}function randDevice(){return{brand:"Huawei",model:"HUAWEI Mate 20",release:"10",buildId:randStr(3,!1).toUpperCase()+_.random(11,99)+randStr(1,!1).toUpperCase()}}function formatPlayUrl(src,name){return name.trim().replaceAll(src,"").replace(/<|>|《|》/g,"").replace(/\$|#/g," ").trim()}function jsonParse(input,json){try{let url=json.url??"";if(!(url=url.startsWith("//")?"https:"+url:url).startsWith("http"))return{};let headers=json.headers||{};var ua=(json["user-agent"]||"").trim(),referer=(0<ua.length&&(headers["User-Agent"]=ua),(json.referer||"").trim());return 0<referer.length&&(headers.Referer=referer),_.keys(headers).forEach(hk=>{headers[hk]||delete headers[hk]}),{header:headers,url:url}}catch(error){console.log(error)}return{}}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export{__jsEvalReturn};
|
1
IOS/js/kunyu77_open.js
Normal file
1
IOS/js/kunyu77_open.js
Normal file
File diff suppressed because one or more lines are too long
171
IOS/js/kuqimv_open.js
Normal file
171
IOS/js/kuqimv_open.js
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
import { load, _ } from "assets://js/lib/cat.js";
|
||||||
|
|
||||||
|
let key = "酷奇MV";
|
||||||
|
let HOST = "https://www.kuqimv.com";
|
||||||
|
let siteKey = "";
|
||||||
|
let siteType = 0;
|
||||||
|
const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";
|
||||||
|
|
||||||
|
async function request(reqUrl, referer, mth, data, hd) {
|
||||||
|
const headers = {
|
||||||
|
"User-Agent": PC_UA,
|
||||||
|
};
|
||||||
|
if (referer) headers.referer = encodeURIComponent(referer);
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: mth || "get",
|
||||||
|
headers: headers,
|
||||||
|
data: data,
|
||||||
|
postType: mth === "post" ? "form" : "",
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
var html = await request(HOST);
|
||||||
|
var $ = load(html);
|
||||||
|
var class_parse = $(".main > li > a[href*=play]");
|
||||||
|
var classes = [];
|
||||||
|
classes = _.map(class_parse, (cls) => {
|
||||||
|
var typeId = cls.attribs["href"];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf("/") + 1).replace(".html", "");
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: cls.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var filterObj = {};
|
||||||
|
return JSON.stringify({
|
||||||
|
class: _.map(classes, (cls) => {
|
||||||
|
cls.land = 1;
|
||||||
|
cls.ratio = 1.78;
|
||||||
|
return cls;
|
||||||
|
}),
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
var link = HOST + "/play/9_1.html";
|
||||||
|
var html = await request(link);
|
||||||
|
var $ = load(html);
|
||||||
|
var items = $("div.mv_list > li");
|
||||||
|
var videos = _.map(items, (it) => {
|
||||||
|
var a = $(it).find("a:first")[0];
|
||||||
|
var img = $(it).find("img:first")[0];
|
||||||
|
var singer = $($(it).find("div.singer")[0]).text().trim();
|
||||||
|
var remarks = $($(it).find("span.lei_03")[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"),
|
||||||
|
vod_name: a.attribs.title,
|
||||||
|
vod_pic: img.attribs["src"],
|
||||||
|
vod_remarks: "🎤" + singer + "|" + remarks || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0 || typeof pg == "undefined") pg = 1;
|
||||||
|
var link = HOST + "/play/" + tid + "_" + pg + ".html";
|
||||||
|
var html = await request(link);
|
||||||
|
var $ = load(html);
|
||||||
|
var items = $("div.mv_list > li");
|
||||||
|
var videos = _.map(items, (it) => {
|
||||||
|
var a = $(it).find("a:first")[0];
|
||||||
|
var img = $(it).find("img:first")[0];
|
||||||
|
var singer = $($(it).find("div.singer")[0]).text().trim();
|
||||||
|
var remarks = $($(it).find("span.lei_03")[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"),
|
||||||
|
vod_name: a.attribs.title,
|
||||||
|
vod_pic: img.attribs["src"],
|
||||||
|
vod_remarks: "🎤" + singer + "|" + remarks || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var hasMore = $("div.lei_page > a:contains(下一页)").length > 0;
|
||||||
|
var pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
var vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_remarks: "",
|
||||||
|
};
|
||||||
|
var playlist = ["观看视频" + "$" + id];
|
||||||
|
vod.vod_play_from = "道长在线";
|
||||||
|
vod.vod_play_url = playlist.join("#");
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
var link = HOST + "/skin/kuqimv/play.php";
|
||||||
|
var ref = HOST + "/play/" + id + ".html";
|
||||||
|
var pdata = { id: id };
|
||||||
|
var playUrl = JSON.parse(await request(link, ref, "post", pdata)).url;
|
||||||
|
var headers = {
|
||||||
|
Referer: HOST,
|
||||||
|
};
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
header: headers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
if (pg <= 0 || typeof pg == "undefined") pg = 1;
|
||||||
|
let link = HOST + "/search.php?key=" + wd + "&pages=" + pg;
|
||||||
|
var html = await request(link);
|
||||||
|
var $ = load(html);
|
||||||
|
var items = $("div.video_list > li");
|
||||||
|
var videos = _.map(items, (it) => {
|
||||||
|
var a = $(it).find("a:first")[0];
|
||||||
|
var singer = $($(it).find("div.singer")[0]).text().trim();
|
||||||
|
var remarks = $($(it).find("span.lei_04")[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"),
|
||||||
|
vod_name: a.attribs.title,
|
||||||
|
vod_pic: "https://www.kuqimv.com/static/images/cover/singer.jpg",
|
||||||
|
vod_remarks: "🎤" + singer + "|" + remarks || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var hasMore = $("div.lei_page > a:contains(>)").length > 0;
|
||||||
|
var pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 20,
|
||||||
|
total: 20 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
land: 1,
|
||||||
|
ratio: 1.78,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
IOS/js/lib/ali.js
Normal file
1
IOS/js/lib/ali.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
(function(_0x24a2d2,_0x5e8b9c){const _0x5df84b=_0x8314,_0x37f89b=_0x24a2d2();while(!![]){try{const _0x2c4d4a=-parseInt(_0x5df84b(0x1f5))/0x1*(-parseInt(_0x5df84b(0x1f6))/0x2)+parseInt(_0x5df84b(0x200))/0x3+-parseInt(_0x5df84b(0x1eb))/0x4*(parseInt(_0x5df84b(0x1ea))/0x5)+parseInt(_0x5df84b(0x1ed))/0x6*(-parseInt(_0x5df84b(0x1e2))/0x7)+-parseInt(_0x5df84b(0x1fc))/0x8*(-parseInt(_0x5df84b(0x1f3))/0x9)+-parseInt(_0x5df84b(0x1ec))/0xa*(parseInt(_0x5df84b(0x1e4))/0xb)+-parseInt(_0x5df84b(0x1e8))/0xc;if(_0x2c4d4a===_0x5e8b9c)break;else _0x37f89b['push'](_0x37f89b['shift']());}catch(_0x42d019){_0x37f89b['push'](_0x37f89b['shift']());}}}(_0x3662,0xc4f19));const _0x5403fe=(function(){let _0x33197a=!![];return function(_0x25661f,_0x19ca25){const _0x33a295=_0x33197a?function(){const _0x229372=_0x8314;if(_0x19ca25){const _0x236c2e=_0x19ca25[_0x229372(0x1ee)](_0x25661f,arguments);return _0x19ca25=null,_0x236c2e;}}:function(){};return _0x33197a=![],_0x33a295;};}()),_0x1a5007=_0x5403fe(this,function(){const _0x516ca0=_0x8314;let _0x4c830a;try{const _0x1d20d6=Function(_0x516ca0(0x1e3)+_0x516ca0(0x1f0)+');');_0x4c830a=_0x1d20d6();}catch(_0x4bf3f9){_0x4c830a=window;}const _0x1f4472=_0x4c830a[_0x516ca0(0x1e6)]=_0x4c830a['console']||{},_0x2283f3=[_0x516ca0(0x1f2),_0x516ca0(0x1f1),_0x516ca0(0x1fe),'error',_0x516ca0(0x1f7),'table','trace'];for(let _0x3cf6e9=0x0;_0x3cf6e9<_0x2283f3[_0x516ca0(0x1fa)];_0x3cf6e9++){const _0x1e114f=_0x5403fe['constructor'][_0x516ca0(0x1f9)]['bind'](_0x5403fe),_0x1a6a55=_0x2283f3[_0x3cf6e9],_0xde1b62=_0x1f4472[_0x1a6a55]||_0x1e114f;_0x1e114f['__proto__']=_0x5403fe['bind'](_0x5403fe),_0x1e114f['toString']=_0xde1b62[_0x516ca0(0x1ef)][_0x516ca0(0x1f8)](_0xde1b62),_0x1f4472[_0x1a6a55]=_0x1e114f;}});_0x1a5007();import{_}from'./cat.js';import{initSome,setToken,setShareId,getVod,playerContent,playerContentByFlag}from'./ali_api.js';async function initAli(_0x3f10ce){await initSome(),await setToken(_0x3f10ce);}function _0x3662(){const _0x323ddf=['match','info','debug','4684176HcWJTq','1211idbeaQ','return\x20(function()\x20','99lEeIGW','-----playContent-------','console','split','19834608jNlQAs','isEmpty','100qLvEjd','123404oxGYjD','132210InTKLS','1722UonmUS','apply','toString','{}.constructor(\x22return\x20this\x22)(\x20)','warn','log','261ILDdxF','stringify','3049bfdvKa','206pnNeHh','exception','bind','prototype','length','trim','377872dYbZkZ'];_0x3662=function(){return _0x323ddf;};return _0x3662();}async function detailContent(_0x1094f1){const _0x55be27=_0x8314,_0x5c056c=/www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?/;let _0x4cb453=_0x1094f1[_0x55be27(0x1fb)](),_0x49069b=_0x4cb453[_0x55be27(0x1fd)](_0x5c056c);if(_[_0x55be27(0x1e9)](_0x49069b))return'';let _0x1e8a67=_0x49069b[0x1],_0x1943ab=_0x49069b['length']==0x3?_0x49069b[0x3]:'';await setShareId(_0x1e8a67);let _0x5cddd0=await getVod(_0x4cb453,_0x1943ab),_0x538833=JSON[_0x55be27(0x1f4)]({'list':[_0x5cddd0]});return console[_0x55be27(0x1ff)](_0x538833),_0x538833;}function _0x8314(_0x1e522d,_0x76b569){const _0x4e0a8c=_0x3662();return _0x8314=function(_0x1a5007,_0x5403fe){_0x1a5007=_0x1a5007-0x1e2;let _0x6a32f1=_0x4e0a8c[_0x1a5007];return _0x6a32f1;},_0x8314(_0x1e522d,_0x76b569);}async function playContent(_0x292f90,_0xb9135b,_0x254b54){const _0x1a1dc4=_0x8314;let _0x356b9e=_0xb9135b[_0x1a1dc4(0x1e7)]('+'),_0x241b39=_0x292f90=='原画'?await playerContent(_0x356b9e):await playerContentByFlag(_0x356b9e,_0x292f90);return console[_0x1a1dc4(0x1ff)](_0x1a1dc4(0x1e5)),console[_0x1a1dc4(0x1ff)](_0x241b39),_0x241b39;}export{initAli,detailContent,playContent};
|
1
IOS/js/lib/ali_api.js
Normal file
1
IOS/js/lib/ali_api.js
Normal file
File diff suppressed because one or more lines are too long
1
IOS/js/lib/cat.js
Normal file
1
IOS/js/lib/cat.js
Normal file
File diff suppressed because one or more lines are too long
1
IOS/js/lib/similarity.js
Normal file
1
IOS/js/lib/similarity.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
function compareTwoStrings(first,second){if((first=first.replace(/\s+/g,""))===(second=second.replace(/\s+/g,"")))return 1;if(first.length<2||second.length<2)return 0;var firstBigrams=new Map;for(let i=0;i<first.length-1;i++){var bigram=first.substring(i,i+2),count=firstBigrams.has(bigram)?firstBigrams.get(bigram)+1:1;firstBigrams.set(bigram,count)}let intersectionSize=0;for(let i=0;i<second.length-1;i++){const bigram=second.substring(i,i+2),count=firstBigrams.has(bigram)?firstBigrams.get(bigram):0;0<count&&(firstBigrams.set(bigram,count-1),intersectionSize++)}return 2*intersectionSize/(first.length+second.length-2)}function findBestMatch(mainString,targetStrings){var ratings=[];let bestMatchIndex=0;for(let i=0;i<targetStrings.length;i++){var currentTargetString=targetStrings[i],currentRating=compareTwoStrings(mainString,currentTargetString);ratings.push({target:currentTargetString,rating:currentRating}),currentRating>ratings[bestMatchIndex].rating&&(bestMatchIndex=i)}return{ratings:ratings,bestMatch:ratings[bestMatchIndex],bestMatchIndex:bestMatchIndex}}function lcs(str1,str2){if(!str1||!str2)return{length:0,sequence:"",offset:0};for(var sequence="",str1Length=str1.length,str2Length=str2.length,num=new Array(str1Length),maxlen=0,lastSubsBegin=0,i=0;i<str1Length;i++){for(var subArray=new Array(str2Length),j=0;j<str2Length;j++)subArray[j]=0;num[i]=subArray}for(var thisSubsBegin=null,i=0;i<str1Length;i++)for(j=0;j<str2Length;j++)str1[i]!==str2[j]?num[i][j]=0:(num[i][j]=0===i||0===j?1:1+num[i-1][j-1],num[i][j]>maxlen&&(maxlen=num[i][j],lastSubsBegin===(thisSubsBegin=i-num[i][j]+1)?sequence+=str1[i]:(lastSubsBegin=thisSubsBegin,sequence="",sequence+=str1.substr(lastSubsBegin,i+1-lastSubsBegin))));return{length:maxlen,sequence:sequence,offset:thisSubsBegin}}function findBestLCS(mainString,targetStrings){var results=[];let bestMatchIndex=0;for(let i=0;i<targetStrings.length;i++){var currentTargetString=targetStrings[i],currentLCS=lcs(mainString,currentTargetString);results.push({target:currentTargetString,lcs:currentLCS}),currentLCS.length>results[bestMatchIndex].lcs.length&&(bestMatchIndex=i)}return{allLCS:results,bestMatch:results[bestMatchIndex],bestMatchIndex:bestMatchIndex}}export{compareTwoStrings,findBestMatch,findBestLCS};
|
80
IOS/js/lib/utils.js
Normal file
80
IOS/js/lib/utils.js
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
|
||||||
|
function isSub(ext) {
|
||||||
|
return ext == "srt" || ext == "ass" || ext == "ssa";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSize(size) {
|
||||||
|
if (size <= 0) return "";
|
||||||
|
if (size > 1024 * 1024 * 1024 * 1024.0) {
|
||||||
|
size /= (1024 * 1024 * 1024 * 1024.0);
|
||||||
|
return size.toFixed(2) + "TB";
|
||||||
|
} else if (size > 1024 * 1024 * 1024.0) {
|
||||||
|
size /= (1024 * 1024 * 1024.0);
|
||||||
|
return size.toFixed(2) + "GB";
|
||||||
|
} else if (size > 1024 * 1024.0) {
|
||||||
|
size /= (1024 * 1024.0);
|
||||||
|
return size.toFixed(2) + "MB";
|
||||||
|
} else {
|
||||||
|
size /= 1024.0;
|
||||||
|
return size.toFixed(2) + "KB";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeExt(text) {
|
||||||
|
return text.indexOf('.') > -1 ? text.substring(0, text.lastIndexOf(".")) : text;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function log(str) {
|
||||||
|
console.debug(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isVideoFormat(url) {
|
||||||
|
var RULE = /http((?!http).){12,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\?.*|http((?!http).){12,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video\/tos*/;
|
||||||
|
if (url.indexOf("url=http") > -1 || url.indexOf(".js") > -1 || url.indexOf(".css") > -1 || url.indexOf(".html") > -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return RULE.test(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonParse(input, json) {
|
||||||
|
var jsonPlayData = JSON.parse(json);
|
||||||
|
var url = jsonPlayData.url;
|
||||||
|
if (url.startsWith("//")) {
|
||||||
|
url = "https:" + url;
|
||||||
|
}
|
||||||
|
if (!url.startsWith("http")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (url === input) {
|
||||||
|
if (!isVideoFormat(url)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var headers = {};
|
||||||
|
var ua = jsonPlayData["user-agent"] || "";
|
||||||
|
if (ua.trim().length > 0) {
|
||||||
|
headers["User-Agent"] = " " + ua;
|
||||||
|
}
|
||||||
|
var referer = jsonPlayData.referer || "";
|
||||||
|
if (referer.trim().length > 0) {
|
||||||
|
headers["Referer"] = " " + referer;
|
||||||
|
}
|
||||||
|
var taskResult = {
|
||||||
|
header: headers,
|
||||||
|
url: url
|
||||||
|
};
|
||||||
|
return taskResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug(obj) {
|
||||||
|
for (var a in obj) {
|
||||||
|
if (typeof(obj[a]) == "object") {
|
||||||
|
debug(obj[a]); //递归遍历
|
||||||
|
} else {
|
||||||
|
console.debug(a + "=" + obj[a]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { isSub, getSize, removeExt, log, isVideoFormat, jsonParse, debug};
|
195
IOS/js/libvio_open.js
Normal file
195
IOS/js/libvio_open.js
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
// 自动从 地址发布页 获取&跳转url地址
|
||||||
|
import { load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
var key = 'libvio';
|
||||||
|
var HOST = 'https://libvio.app'; // 地址发布页
|
||||||
|
var host = '';
|
||||||
|
var siteKey = '';
|
||||||
|
var siteType = 0;
|
||||||
|
|
||||||
|
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
var res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || MOBILE_UA,
|
||||||
|
'Referer': host
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
var html = await request(HOST);
|
||||||
|
var $ = load(html);
|
||||||
|
host = $('div.content-top > ul > li').find('a:first')[0].attribs.href;
|
||||||
|
// console.debug('libvio跳转地址 =====>' + urls); // js_debug.log
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
var html = await request(host);
|
||||||
|
var $ = load(html);
|
||||||
|
var class_parse = $('ul.stui-header__menu > li > a[href*=type]');
|
||||||
|
var classes = [];
|
||||||
|
classes = _.map(class_parse, (cls) => {
|
||||||
|
var typeId = cls.attribs['href'];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf('/') + 1).replace('.html','');
|
||||||
|
return {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: cls.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var filterObj = {
|
||||||
|
1:[{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:'印度'},{n:'意大利',v:'意大利'},{n:'西班牙',v:'西班牙'},{n:'加拿大',v:'加拿大'},{n:'其他',v:'其他'}]},{key:'year',name:'年份',value:[{n:'全部',v:''},{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:'2014',v:'2014'},{n:'2013',v:'2013'},{n:'2012',v:'2012'},{n:'2011',v:'2011'},{n:'2010',v:'2010'}]},{key:'lang',name:'语言',value:[{n:'全部',v:''},{n:'国语',v:'国语'},{n:'英语',v:'英语'},{n:'粤语',v:'粤语'},{n:'闽南语',v:'闽南语'},{n:'韩语',v:'韩语'},{n:'日语',v:'日语'},{n:'法语',v:'法语'},{n:'德语',v:'德语'},{n:'其它',v:'其它'}]},{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}],
|
||||||
|
2:[{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:'其他'}]},{key:'year',name:'年份',value:[{n:'全部',v:''},{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:'2014',v:'2014'},{n:'2013',v:'2013'},{n:'2012',v:'2012'},{n:'2011',v:'2011'},{n:'2010',v:'2010'}]},{key:'lang',name:'语言',value:[{n:'全部',v:''},{n:'国语',v:'国语'},{n:'英语',v:'英语'},{n:'粤语',v:'粤语'},{n:'闽南语',v:'闽南语'},{n:'韩语',v:'韩语'},{n:'日语',v:'日语'},{n:'其它',v:'其它'}]},{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}],
|
||||||
|
4:[{key:'area',name:'地区',value:[{n:'全部',v:''},{n:'中国',v:'中国'},{n:'日本',v:'日本'},{n:'欧美',v:'欧美'},{n:'其他',v:'其他'}]},{key:'year',name:'年份',value:[{n:'全部',v:''},{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:'2014',v:'2014'},{n:'2013',v:'2013'},{n:'2012',v:'2012'},{n:'2011',v:'2011'},{n:'2010',v:'2010'},{n:'2009',v:'2009'},{n:'2008',v:'2008'},{n:'2007',v:'2007'},{n:'2006',v:'2006'},{n:'2005',v:'2005'},{n:'2004',v:'2004'}]},{key:'lang',name:'语言',value:[{n:'全部',v:''},{n:'国语',v:'国语'},{n:'英语',v:'英语'},{n:'粤语',v:'粤语'},{n:'闽南语',v:'闽南语'},{n:'韩语',v:'韩语'},{n:'日语',v:'日语'},{n:'其它',v:'其它'}]},{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}],
|
||||||
|
27:[{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}],
|
||||||
|
15:[{key:'area',name:'地区',value:[{n:'全部',v:''},{n:'日本',v:'日本'},{n:'韩国',v:'韩国'}]},{key:'year',name:'年份',value:[{n:'全部',v:''},{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:'2014',v:'2014'},{n:'2013',v:'2013'},{n:'2012',v:'2012'},{n:'2011',v:'2011'},{n:'2010',v:'2010'}]},{key:'lang',name:'语言',value:[{n:'全部',v:''},{n:'国语',v:'国语'},{n:'英语',v:'英语'},{n:'粤语',v:'粤语'},{n:'闽南语',v:'闽南语'},{n:'韩语',v:'韩语'},{n:'日语',v:'日语'},{n:'其它',v:'其它'}]},{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}],
|
||||||
|
16:[{key:'area',name:'地区',value:[{n:'全部',v:''},{n:'美国',v:'美国'},{n:'英国',v:'英国'},{n:'德国',v:'德国'},{n:'加拿大',v:'加拿大'},{n:'其他',v:'其他'}]},{key:'year',name:'年份',value:[{n:'全部',v:''},{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:'2014',v:'2014'},{n:'2013',v:'2013'},{n:'2012',v:'2012'},{n:'2011',v:'2011'},{n:'2010',v:'2010'}]},{key:'lang',name:'语言',value:[{n:'全部',v:''},{n:'国语',v:'国语'},{n:'英语',v:'英语'},{n:'粤语',v:'粤语'},{n:'闽南语',v:'闽南语'},{n:'韩语',v:'韩语'},{n:'日语',v:'日语'},{n:'其它',v:'其它'}]},{key:'by',name:'排序',value:[{n:'时间',v:'time'},{n:'人气',v:'hits'},{n:'评分',v:'score'}]}]
|
||||||
|
};
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
var link = host + '/show/1--hits---------.html';
|
||||||
|
var html = await request(link);
|
||||||
|
var $ = load(html);
|
||||||
|
var items = $('ul.stui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
var a = $(item).find('a:first')[0];
|
||||||
|
var remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: a.attribs.title,
|
||||||
|
vod_pic: a.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0 || typeof(pg) == 'undefined') pg = 1;
|
||||||
|
var link = host + '/show/' + tid + '-' + (extend.area || '') + '-' + (extend.by || 'time') + '--' + (extend.lang || '') + '----' + pg + '---' + (extend.year || '') + '.html';
|
||||||
|
var html = await request(link);
|
||||||
|
var $ = load(html);
|
||||||
|
var items = $('ul.stui-vodlist > li');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
var a = $(item).find('a:first')[0];
|
||||||
|
var remarks = $($(item).find('span.pic-text')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'),
|
||||||
|
vod_name: a.attribs.title,
|
||||||
|
vod_pic: a.attribs['data-original'],
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
var hasMore = $('ul.stui-page__item > li > a:contains(下一页)').length > 0;
|
||||||
|
var pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
var html = await request(host + '/detail/' + id + '.html');
|
||||||
|
var $ = load(html);
|
||||||
|
var vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: $('h1:first').text().trim(),
|
||||||
|
vod_type: $('.stui-content__detail p:first a').text(),
|
||||||
|
vod_actor: $('.stui-content__detail p:nth-child(3)').text().replace('主演:',''),
|
||||||
|
vod_pic: $('.stui-content__thumb img:first').attr('data-original'),
|
||||||
|
vod_remarks : $('.stui-content__detail p:nth-child(5)').text() || '',
|
||||||
|
vod_content: $('span.detail-content').text().trim(),
|
||||||
|
};
|
||||||
|
var playMap = {};
|
||||||
|
var tabs = $('div.stui-pannel__head > h3[class*=iconfont]');
|
||||||
|
var playlists = $('ul.stui-content__playlist');
|
||||||
|
_.each(tabs, (tab, i) => {
|
||||||
|
var from = tab.children[0].data;
|
||||||
|
var list = playlists[i];
|
||||||
|
list = $(list).find('a');
|
||||||
|
_.each(list, (it) => {
|
||||||
|
var title = it.children[0].data;
|
||||||
|
var playUrl = it.attribs.href;
|
||||||
|
if (title.length == 0) title = it.children[0].data.trim();
|
||||||
|
if (!playMap.hasOwnProperty(from)) {
|
||||||
|
playMap[from] = [];
|
||||||
|
}
|
||||||
|
playMap[from].push( title + '$' + playUrl);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||||
|
var urls = _.values(playMap);
|
||||||
|
var vod_play_url = _.map(urls, (urlist) => {
|
||||||
|
return urlist.join('#');
|
||||||
|
});
|
||||||
|
vod.vod_play_url = vod_play_url.join('$$$');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
var html = await request(host + id);
|
||||||
|
html = html.match(/r player_.*?=(.*?)</)[1];
|
||||||
|
var js = JSON.parse(html);
|
||||||
|
var url = js.url;
|
||||||
|
var from = js.from;
|
||||||
|
var next = js.link_next;
|
||||||
|
var id = js.id;
|
||||||
|
var nid = js.nid;
|
||||||
|
var paurl = await request(host +'/static/player/' + from + '.js');
|
||||||
|
paurl = paurl.match(/ src="(.*?)'/)[1];
|
||||||
|
var purl = paurl + url + '&next=' + next + '&id=' + id + '&nid=' + nid;
|
||||||
|
var playUrl = await request(purl);
|
||||||
|
playUrl = playUrl.match(/var .* = '(.*?)'/)[1];
|
||||||
|
// console.debug('libvio playUrl =====>' + playUrl); // js_debug.log
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
var data = JSON.parse(await request(host + '/index.php/ajax/suggest?mid=1&wd=' + wd + '&limit=50')).list;
|
||||||
|
var videos = [];
|
||||||
|
for (const vod of data) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.pic,
|
||||||
|
vod_remarks: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
limit: 50,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
200
IOS/js/mtsp_open.js
Normal file
200
IOS/js/mtsp_open.js
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
import { Crypto, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'mtsp';
|
||||||
|
let main = 'http://mt77.pw';
|
||||||
|
let url = '';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
let searchKeys = [];
|
||||||
|
|
||||||
|
let tags = 'JTVCJTIyJUU2JUI1JTkzJUU1JUFGJTg2JUU2JUJGJTgwJUU2JTgzJTg1JTIyJTJDJTIyJUU2JTkwJTlDJUU2JTlGJUE1JUU1JUFFJTk4JTIyJTJDJTIyJUU1JUE1JUIzJUU0JUJCJTg2JTIyJTJDJTIyJUU1JTkwJThFJUU1JTg1JUE1JTIyJTJDJTIyJUU3JUJFJThFJUU0JUI5JUIzJUU1JUI3JUE4JUU4JTgzJUI4JTIyJTJDJTIyJUU1JThGJUEzJUU0JUJBJUE0JUU1JThGJUEzJUU3JTg4JTg2JTIyJTJDJTIyJUU1JTg2JTg1JUU1JUIwJTg0JTIyJTJDJTIyJUU1JUE1JUIzJUU0JUI4JThBJTIyJTJDJTIyJUU3JUJFJThFJUU4JTg1JUJGJTIyJTJDJTIyJUU3JUIyJUJFJUU1JTkzJTgxJTIyJTJDJTIyJUU0JUI4JTlEJUU4JUEyJTlDJTIyJTJDJTIyJUU1JUIwJTkxJUU1JUE1JUIzJTIyJTJDJTIyJUU1JTg4JUI2JUU2JTlDJThEJTIyJTJDJTIyJUU3JUJFJUE0UCUyMiUyQyUyMiVFNyU5OSVCRCVFOCU5OSU4RSUyMiUyQyUyMiVFNiU4MyU4NSVFOCVCNiVBMyVFOCVBRiVCMSVFNiU4MyU5MSUyMiUyQyUyMiVFOSU4MSU5MyVFNSU4NSVCNyUyMiUyQyUyMiVFNSVBNSVCMyVFNyVBNSU5RSUyMiUyQyUyMiVFOSVCQSVCQiVFOCVCMSU4NiVFNCVCQyVBMCVFNSVBQSU5MiUyMiUyQyUyMiVFOSVBMiU5QyVFNSVCMCU4NCUyMiUyQyUyMiVFNSVBRCVBNiVFNyU5NCU5RiUyMiUyQyUyMiVFNCVCQSVCQSVFNSVBNiVCQiUyMiUyQyUyMiVFNyVCNCVBMCVFNCVCQSVCQSUyMiUyQyUyMiVFNiVCNSVCNCVFNSVBRSVBNCUyMiUyQyUyMiVFOSU4NSU5MiVFNSVCQSU5NyUyMiUyQyUyMiVFNyU4NiU5RiVFNSVBNSVCMyUyMiUyQyUyMiVFOCU4NyVBQSVFNiU4QiU4RCUyMiUyQyUyMiVFNSVCMCU5MSVFNSVBNiU4NyUyMiUyQyUyMiVFNSU4OSVBNyVFNiU4MyU4NSUyMiUyQyUyMiVFNCVCOSVCMyVFNCVCQSVBNCUyMiUyQyUyMiVFNiU4OCVCNyVFNSVBNCU5NiUyMiUyQyUyMlNXQUclMjIlMkMlMjIlRTUlQTUlQjMlRTQlQjglQkIlRTYlOTIlQUQlMjIlMkMlMjIlRTQlQjglQUQlRTYlOTYlODclRTUlQUQlOTclRTUlQjklOTUlMjIlMkMlMjIlRTQlQjklQjElRTQlQkMlQTYlMjIlMkMlMjIlRTglQjAlODMlRTYlOTUlOTklMjIlMkMlMjIlRTYlOEQlODYlRTclQkIlOTElMjIlMkMlMjIlRTYlQTglQTElRTclODklQjklMjIlMkMlMjIlRTclOUIlQjQlRTYlOTIlQUQlMjIlMkMlMjI5MSVFNSU4OCVCNiVFNyU4OSU4NyVFNSU4RSU4MiUyMiUyQyUyMiVFOSU4NyU4RSVFNiU4OCU5OCUyMiUyQyUyMiVFNSU4MSVCNyVFNiU4QiU4RCUyMiUyQyUyMiVFNSU4QiVCRSVFNiU5MCVBRCUyMiUyQyUyMiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCUyMiUyQyUyMiVFNSU4NyVCQSVFOCVCRCVBOCUyMiUyQyUyMiVFNyVCRCU5MSVFNyVCQSVBMiUyMiUyQyUyMiVFNSVCNyVBOCVFNiVBMCVCOSUyMiUyQyUyMiVFNiVBQyVBNyVFNyVCRSU4RSUyMiUyQyUyMmNvc3BsYXklMjIlMkMlMjIlRTUlQkMlQkElRTUlQTUlQjglMjIlMkMlMjIlRTUlQTQlQTklRTclQkUlOEUlRTQlQkMlQTAlRTUlQUElOTIlMjIlMkMlMjIlRTYlOEMlODklRTYlOTElQTklMjIlMkMlMjIzRCVFNSU4QSVBOCVFNiVCQyVBQiUyMiUyQyUyMiVFOCU5MCU5RCVFOCU4RSU4OSUyMiUyQyUyMiVFNSVBNyU5MCVFNSVBNiVCOSVFOCU4QSVCMSUyMiUyQyUyMiVFNSU4QSU5RSVFNSU4NSVBQyVFNSVBRSVBNCUyMiUyQyUyMiVFOCVCRCVBNiVFOSU5QyU4NyUyMiUyQyUyMiVFNSU4MSVCNyVFNiU4MyU4NSUyMiUyQyUyMiVFNiU5RSU5QyVFNSU4NiVCQiVFNCVCQyVBMCVFNSVBQSU5MiUyMiUyQyUyMiVFOCU4MiU5QiVFNCVCQSVBNCUyMiUyQyUyMlNNJTIyJTJDJTIyJUU5JTg3JThEJUU1JThGJUEzJTIyJTJDJTIyJUU2JUIzJUIzJUU4JUExJUEzJTIyJTJDJTIyU1BBJTIyJTJDJTIyJUU2JThFJUEyJUU4JThBJUIxJTIyJTJDJTIyJUU4JUI2JUIzJUU0JUJBJUE0JTIyJTJDJTIyJUU3JUE5JUJBJUU1JUE3JTkwJTIyJTJDJTIyJUU4JTlDJTlDJUU2JUExJTgzJUU0JUJDJUEwJUU1JUFBJTkyJTIyJTJDJTIyJUU2JTk1JTk5JUU1JUI4JTg4JTIyJTJDJTIyJUU2JUJEJUFFJUU1JTkwJUI5JTIyJTJDJTIyJUU5JTk3JUE4JUU0JUJBJThCJUU0JUJCJUI2JTIyJTJDJTIyJUU1JUE1JUIzJUU1JTkwJThDJTIyJTJDJTIyJUU2JThBJTgwJUU1JUI4JTg4JTIyJTJDJTIyJUU3JUIyJUJFJUU0JUI4JTlDJUU0JUJDJUEwJUU1JUFBJTkyJTIyJTJDJTIyJUU2JTk1JTk5JUU1JUFFJUE0JTIyJTJDJTIyJUU4JUJGJUI3JUU1JUE1JUI4JTIyJTJDJTIyJUU2JThEJUEyJUU1JUE2JUJCJTIyJTJDJTIyS1RWJTIyJTJDJTIyJUU2JTk4JTlGJUU3JUE5JUJBJUU0JUJDJUEwJUU1JUFBJTkyJTIyJTJDJTIyJUU2JThBJUE0JUU1JUEzJUFCJTIyJTJDJTIyJUU2JUFGJThEJUU1JUE1JUIzJTIyJTVE';
|
||||||
|
const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36';
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
const res = await req(reqUrl, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || UA,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
// 获取url
|
||||||
|
let html = await request(main);
|
||||||
|
url = html.match(/location\.href="(.*)"/)[1].replace('https', 'http');
|
||||||
|
tags = JSON.parse(decodeURIComponent(base64Decode(tags)));
|
||||||
|
searchKeys = cfg.tags || [];
|
||||||
|
let mainJs = await request(url + '/main.js');
|
||||||
|
url = mainJs.match(/apiurl = '(.*)'/)[1].replace('https', 'http');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [];
|
||||||
|
let filterObj = {};
|
||||||
|
let tagIdx = 1;
|
||||||
|
_.each(_.chunk(tags, 24), (array) => {
|
||||||
|
const subs = _.chunk(array, 8);
|
||||||
|
let tid = '';
|
||||||
|
let init = '';
|
||||||
|
for (let i = 0; i < subs.length; i++) {
|
||||||
|
let tt = {
|
||||||
|
key: 'tag',
|
||||||
|
name: '',
|
||||||
|
init: '',
|
||||||
|
value: _.map(subs[i], (e) => {
|
||||||
|
return { n: e, v: e };
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
if (i == 0) {
|
||||||
|
init = tt.value[0].v;
|
||||||
|
tt['init'] = init;
|
||||||
|
tid = tt.value[0].v;
|
||||||
|
filterObj[tid] = [tt];
|
||||||
|
} else {
|
||||||
|
tt['init'] = init;
|
||||||
|
filterObj[tid].push(tt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
classes.push({
|
||||||
|
type_id: tid,
|
||||||
|
type_name: '综合' + tagIdx,
|
||||||
|
land: 1,
|
||||||
|
});
|
||||||
|
tagIdx++;
|
||||||
|
});
|
||||||
|
|
||||||
|
_.each(searchKeys, (s) => {
|
||||||
|
classes.push({
|
||||||
|
type_id: 'sc_' + s,
|
||||||
|
type_name: s,
|
||||||
|
land: 1,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return '{}';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
let link = url;
|
||||||
|
if (tid.startsWith('sc_')) {
|
||||||
|
link = link + '/search?q=' + encodeURIComponent(tid.substr(3)) + '&page=' + pg + '&size=16';
|
||||||
|
} else {
|
||||||
|
link = link + '/vodList?&tag=' + (extend.tag || tid) + '&page=' + pg + '&size=16';
|
||||||
|
}
|
||||||
|
const data = decrypt(JSON.parse(await request(link)).data);
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data.movies) {
|
||||||
|
if (!vod.id) continue;
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.thumb,
|
||||||
|
vod_remarks: vod.views,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(data.page),
|
||||||
|
pagecount: _.ceil(data.totals / 16),
|
||||||
|
limit: 16,
|
||||||
|
total: data.totals,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const link = url + '/vodDetail?id=' + id;
|
||||||
|
const data = decrypt(JSON.parse(await request(link)).data).info;
|
||||||
|
let desc = data.name + '\n';
|
||||||
|
if (data.views) {
|
||||||
|
desc += '观看次数:' + data.views + '\n';
|
||||||
|
}
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: data.name,
|
||||||
|
vod_pic: data.thumb,
|
||||||
|
type_name: (data.tag || []).join(','),
|
||||||
|
vod_year: data.date,
|
||||||
|
vod_content: desc,
|
||||||
|
};
|
||||||
|
vod.vod_play_from = 'm3u8';
|
||||||
|
let urls = [];
|
||||||
|
if (data.m3u8) {
|
||||||
|
urls.push('主力$' + data.m3u8);
|
||||||
|
}
|
||||||
|
if (data.m3u8bak) {
|
||||||
|
urls.push('备用$' + data.m3u8bak);
|
||||||
|
}
|
||||||
|
vod.vod_play_url = urls.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let page = pg || 1;
|
||||||
|
if (page == 0) page = 1;
|
||||||
|
let videos = [];
|
||||||
|
let link = url + '/search?q=' + encodeURIComponent(wd) + '&page=' + page + '&size=16';
|
||||||
|
const data = decrypt(JSON.parse(await request(link)).data);
|
||||||
|
for (const vod of data.movies) {
|
||||||
|
if (!vod.id) continue;
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.thumb,
|
||||||
|
vod_remarks: vod.views,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(data.page),
|
||||||
|
pagecount: _.ceil(data.totals / 16),
|
||||||
|
land: 1,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrypt(content) {
|
||||||
|
return JSON.parse(aesX('AES/CBC/PKCS7', false, content, true, 'F31F2A75FBF94099', '12345BCA901ER456', false));
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
250
IOS/js/mybili_open.js
Normal file
250
IOS/js/mybili_open.js
Normal file
File diff suppressed because one or more lines are too long
213
IOS/js/ng_open.js
Normal file
213
IOS/js/ng_open.js
Normal file
|
@ -0,0 +1,213 @@
|
||||||
|
import { Crypto, jinja2, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = '南瓜影视';
|
||||||
|
let HOST = 'http://ys.changmengyun.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let MOBILE_UA = 'okhttp/4.6.0'
|
||||||
|
|
||||||
|
async function request(reqUrl) {
|
||||||
|
let t = new Date().getTime().toString();
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'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': MOBILE_UA
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let data = JSON.parse(await request(HOST + '/api.php/provide/home_nav'));
|
||||||
|
let classes = [];
|
||||||
|
for (const key in data) {
|
||||||
|
if (data[key].name != '精选')
|
||||||
|
classes.push({
|
||||||
|
type_id: data[key].id,
|
||||||
|
type_name: data[key].name,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let 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":"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":"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":"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":"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":"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":"新上线"}]}]
|
||||||
|
};
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
let data = JSON.parse(await request(HOST + '/api.php/provide/vod_rank?app=ylys&sort_type=month&imei=c431ea542cee9679&id=2&page=1'));
|
||||||
|
let videos = [];
|
||||||
|
data.forEach(function(it) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: it.id,
|
||||||
|
vod_name: it.name,
|
||||||
|
vod_pic: it.img,
|
||||||
|
vod_remarks: it.remarks,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0 || typeof(pg) == 'undefined') pg = 1;
|
||||||
|
let reqUrl = HOST + '/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 request(reqUrl));
|
||||||
|
let data = JSON.parse(await request(reqUrl)).list;
|
||||||
|
let videos = [];
|
||||||
|
data.forEach(function(it) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: it.id,
|
||||||
|
vod_name: it.name,
|
||||||
|
vod_pic: it.img,
|
||||||
|
vod_remarks: it.remarks,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
let pgChk = JSON.parse(await request(HOST + '/api.php/provide/vod_list?app=ylys&id=' + tid + '&page=' + (parseInt(pg) + 1) + '&imei=c431ea542cee9679&')).msg;
|
||||||
|
const pgCount = (pgChk == 'ok') ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 20,
|
||||||
|
total: 20 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
let data = JSON.parse(await request(HOST + '/api.php/provide/vod_detail?app=ylys&imei=c431ea542cee9679&id=' + id)).data;
|
||||||
|
let vod = {
|
||||||
|
vod_id: data.id,
|
||||||
|
vod_name: data.name,
|
||||||
|
vod_pic: data.img,
|
||||||
|
type_name: data.type,
|
||||||
|
vod_year: data.year,
|
||||||
|
vod_remarks: '更新至: ' + data.msg + ' / 评分: ' + data.score,
|
||||||
|
vod_content: stripHtmlTag(data.info),
|
||||||
|
};
|
||||||
|
let episodes = data.player_info;
|
||||||
|
let playlist = {};
|
||||||
|
episodes.forEach(function(it) {
|
||||||
|
let playurls = it.video_info;
|
||||||
|
playurls.forEach(function(playurl) {
|
||||||
|
let source = it.show;
|
||||||
|
let t = formatPlayUrl(vod.vod_name, playurl.name);
|
||||||
|
if (t.length == 0) t = playurl.name.trim();
|
||||||
|
if (!playlist.hasOwnProperty(source)) {
|
||||||
|
playlist[source] = [];
|
||||||
|
}
|
||||||
|
playlist[source].push(t + '$' + playurl.url);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
vod.vod_play_from = _.keys(playlist).join('$$$');
|
||||||
|
let urls = _.values(playlist);
|
||||||
|
let vod_play_url = [];
|
||||||
|
urls.forEach(function(it) {
|
||||||
|
vod_play_url.push(it.join('#'));
|
||||||
|
});
|
||||||
|
vod.vod_play_url = vod_play_url.join('$$$');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
try {
|
||||||
|
if (id.indexOf('m3u8') != -1) {
|
||||||
|
let mjurl = id.split('url=')[1]
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: mjurl,
|
||||||
|
});
|
||||||
|
} else if (id.indexOf(',') != -1) {
|
||||||
|
let mjurl = id.split(',')[1]
|
||||||
|
let jData = JSON.parse(await request(mjurl));
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: jData.data.url,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let mjurl = 'http://43.154.104.152:1234/jhapi/cs.php?url=' + id.split('url=')[1]
|
||||||
|
let jData = JSON.parse(await request(mjurl));
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: jData.data.url,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
if (pg <= 0 || typeof(pg) == 'undefined') pg = 1;
|
||||||
|
let data = JSON.parse(await request(HOST + '/api.php/provide/search_result_more?app=ylys&video_name=' + wd + '&pageSize=20&tid=0&imei=c431ea542cee9679&page=' + pg, 'okhttp/4.6.0')).data;
|
||||||
|
let videos = [];
|
||||||
|
data.forEach(function(it) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: it.id,
|
||||||
|
vod_name: it.video_name,
|
||||||
|
vod_pic: it.img,
|
||||||
|
vod_remarks: it.qingxidu + '/' + it.category,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
let pgChk = JSON.parse(await request(HOST + '/api.php/provide/search_result_more?app=ylys&video_name=' + wd + '&pageSize=20&tid=0&imei=c431ea542cee9679&page=' + (parseInt(pg) + 1), 'okhttp/4.6.0')).msg;
|
||||||
|
const pgCount = (pgChk == 'ok') ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 20,
|
||||||
|
total: 20 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
IOS/js/nivod_op.js
Normal file
1
IOS/js/nivod_op.js
Normal file
File diff suppressed because one or more lines are too long
182
IOS/js/subaibai_open.js
Normal file
182
IOS/js/subaibai_open.js
Normal file
File diff suppressed because one or more lines are too long
147
IOS/js/wogg.js
Normal file
147
IOS/js/wogg.js
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
import {load, _, Uri} from './lib/cat.js';
|
||||||
|
import {log} from './lib/utils.js';
|
||||||
|
import {initAli, detailContent, playContent} from './lib/ali.js';
|
||||||
|
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let siteUrl = 'https://wogg.xyz';
|
||||||
|
let UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
|
||||||
|
let patternAli = /(https:\/\/www\.aliyundrive\.com\/s\/[^"]+)/
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
let ext = '';
|
||||||
|
if (typeof cfg == 'object') {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
ext = cfg.ext;
|
||||||
|
} else {
|
||||||
|
ext = cfg; //适配影视
|
||||||
|
}
|
||||||
|
await initAli(ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let header = {
|
||||||
|
'user-agent': agentSp || 'okhttp/3.12.0',
|
||||||
|
};
|
||||||
|
let uri = new Uri(reqUrl);
|
||||||
|
let res = await req(uri.toString(), {
|
||||||
|
headers: header,
|
||||||
|
timeout: 10000
|
||||||
|
});
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHeader() {
|
||||||
|
let header = {};
|
||||||
|
header['User-Agent'] = UA;
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getString(url) {
|
||||||
|
let res = await req(url, {
|
||||||
|
headers: getHeader()
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
let classes = [{'type_id': 1, 'type_name' : '电影'},{'type_id': 20, 'type_name' : '电视剧'},{'type_id': 28, 'type_name' : '综艺'},{'type_id': 24, 'type_name' : '动漫'},{'type_id': 32, 'type_name' : '音乐'}];
|
||||||
|
let filterObj = {};
|
||||||
|
async function home(filter) {
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return '{}';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
let reqUrl = siteUrl + '/index.php/vodshow/'+tid+'--------'+pg+'---.html';
|
||||||
|
let con = await request(reqUrl, UA);
|
||||||
|
const $ = load(con);
|
||||||
|
let items = $('.module:eq(0) > .module-list > .module-items > .module-item');
|
||||||
|
let videos = [];
|
||||||
|
for(var item of items) {
|
||||||
|
let oneA = $(item).find('.module-item-cover .module-item-pic a').first();
|
||||||
|
let href = oneA.attr('href');
|
||||||
|
let name = oneA.attr('title');
|
||||||
|
let oneImg = $(item).find('.module-item-cover .module-item-pic img').first();
|
||||||
|
let pic = oneImg.attr('data-src');
|
||||||
|
let remark = $(item).find('.module-item-text').first().text();
|
||||||
|
videos.push({
|
||||||
|
vod_id: href,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasMore = $('#page > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 72,
|
||||||
|
total: 72 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
let preMatches = id.match(patternAli);
|
||||||
|
if (!_.isEmpty(preMatches)) return await detailContent(preMatches[1]);
|
||||||
|
let url = siteUrl + id;
|
||||||
|
let aliUrl = await getString(url);
|
||||||
|
let matches = aliUrl.match(patternAli);
|
||||||
|
if (!_.isEmpty(matches)) return await detailContent(matches[1]);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await playContent(flag, id, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
await log('search---' + wd);
|
||||||
|
let searchUrl = siteUrl + '/index.php/vodsearch/-------------.html?wd=' + wd;
|
||||||
|
let html = await getString(searchUrl);
|
||||||
|
let $ = load(html);
|
||||||
|
let items = $('.module-search-item');
|
||||||
|
let videos = [];
|
||||||
|
for(var item of items) {
|
||||||
|
let vodId = $(item).find(".video-serial")[0].attribs.href;
|
||||||
|
let name = $(item).find(".video-serial")[0].attribs.title;
|
||||||
|
let pic = $(item).find(".module-item-pic > img")[0].attribs['data-src'];
|
||||||
|
let remark = '';
|
||||||
|
videos.push({
|
||||||
|
vod_id: vodId,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
IOS/js/xiaoya.js
Normal file
1
IOS/js/xiaoya.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import{Crypto,load,_}from"assets://js/lib/cat.js";let key="xiaoya-tv",url="",siteKey="",siteType=0;const UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",cookie={};async function request(reqUrl,referer,mth,data,hd){var headers={"User-Agent":UA,Cookie:_.map(cookie,(value,key)=>key+"="+value).join(";")},referer=(referer&&(headers.referer=encodeURIComponent(referer)),await req(reqUrl,{method:mth||"get",headers:headers,data:data,postType:"post"===mth?"form":""}));return referer.content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype,url=cfg.ext}async function home(filter){return(await request(url)).replaceAll("1$/$1","1$/$0")}async function homeVod(){return"{}"}async function category(tid,pg,filter,extend){pg<=0&&(pg=1);let api=url+"?t="+tid+"&pg="+pg;return extend&&(tid=Object.entries(extend).map(([key,val]=entry)=>"&"+key+"="+val),api=(api+=tid)+("&f="+encodeURIComponent(JSON.stringify(extend)))),request(api)}async function detail(id){id=id.split("$");return request(url+"?ids="+id[0]+"$"+id[1])}async function play(flag,id,flags){return request(url.replace("/vod1","/play")+"?id="+id+"&from=open")}async function search(wd,quick){return request(url+"?wd="+wd)}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export{__jsEvalReturn};
|
Loading…
Reference in a new issue