Add files via upload
This commit is contained in:
parent
d711dd627e
commit
81130ed06a
cat/js
MyCatBookan.jsREADME.mdmissav.jsmkz_open.jsmtsp_open.jsmybili_open.jsmysp_open.jsnangua_open.jsng_open.jsng_open2.jsnivod_op.jsnivod_open.jsnkvod_open.jsnm_open.jsnmddd_open.jspan99_open.jspanghu_open.jspansearch_open.jspansou_open.jspush_open.jsqfys_open.jsqiao2_open.jsrbk_open.jsrbzj_open.jsrttks_open.jssc1080_open.jssharenice_open.jsshuyinfm_book_open.jssssp_open.jsstar_open.jssubaibai_open.jstestVideo.jstiantian_open.jsting13_book_open.jstutu_open.jstuxiaobei_open.jsubestkid_open.jsufc_open.jsupyun_open.jsvoflix_open.jsvsdj_open.jswf_open.jswobg_open.jswogg.jswogg_open.jswpian_open.jsxiaoya.jsxiaoya_open.jsxiaozhitiao_open.jsxinshijue_open.jsyiso_open.jsyjys_open.jsym_open.jsyqktv_open.jsyqktv_open2.jsyrzj.jsyrzj_open.jsys996_open.jsyt.jsyunpan4k_open.jsyzys.jsyzys_open.jsyzz_open.jszhaozy_open.jszjdr_open.jszjm_open.jszxzj_open.jszz123_book_open.jszzmusic_book_open.jszzmusic_open.js
144
cat/js/MyCatBookan.js
Normal file
144
cat/js/MyCatBookan.js
Normal file
@ -0,0 +1,144 @@
|
||||
import { _ } from './lib/cat.js';
|
||||
|
||||
let key = 'bookan';
|
||||
let url = 'https://api.bookan.com.cn';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
|
||||
async function request(reqUrl, agentSp) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return JSON.stringify({
|
||||
class: [
|
||||
{ type_id: '1305', type_name: '少年读物' },
|
||||
{ type_id: '1304', type_name: '儿童文学' },
|
||||
{ type_id: '1320', type_name: '国学经典' },
|
||||
{ type_id: '1306', type_name: '文艺少年' },
|
||||
{ type_id: '1309', type_name: '育儿心经' },
|
||||
{ type_id: '1310', type_name: '心理哲学' },
|
||||
{ type_id: '1307', type_name: '青春励志' },
|
||||
{ type_id: '1312', type_name: '历史小说' },
|
||||
{ type_id: '1303', type_name: '故事会' },
|
||||
{ type_id: '1317', type_name: '音乐戏剧' },
|
||||
{ type_id: '1319', type_name: '相声评书' },
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
return JSON.stringify({
|
||||
list: [],
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
pg = pg || 1;
|
||||
if (pg == 0) pg = 1;
|
||||
let content = await request(`${url}/voice/book/list?instance_id=25304&page=${pg}&category_id=${tid}&num=24`);
|
||||
let data = JSON.parse(content).data;
|
||||
let books = [];
|
||||
for (const book of data.list) {
|
||||
books.push({
|
||||
vod_id: book.id,
|
||||
vod_name: book.name,
|
||||
vod_pic: book.cover,
|
||||
vod_remarks: book.extra.author,
|
||||
});
|
||||
}
|
||||
return JSON.stringify({
|
||||
page: data.current_page,
|
||||
pagecount: data.last_page,
|
||||
limit: 24,
|
||||
total: data.total,
|
||||
list: books,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
let content = await request(`${url}/voice/album/units?album_id=${id}&page=1&num=200&order=1`);
|
||||
let data = JSON.parse(content).data;
|
||||
console.log(JSON.stringify(data));
|
||||
|
||||
let book = {
|
||||
vod_id: id,
|
||||
type_name: '',
|
||||
vod_year: '',
|
||||
vod_area: '',
|
||||
vod_remarks: '',
|
||||
vod_actor: '',
|
||||
vod_director: '',
|
||||
vod_content: '',
|
||||
};
|
||||
let us = _.map(data.list, function (b) {
|
||||
return formatPlayUrl(b.title) + '$' + b.file;
|
||||
}).join('#');
|
||||
book.vod_play_from = '书卷';
|
||||
book.vod_play_url = us;
|
||||
|
||||
return JSON.stringify({
|
||||
list: [book],
|
||||
});
|
||||
}
|
||||
|
||||
function formatPlayUrl(name) {
|
||||
return name
|
||||
.trim()
|
||||
.replace(/<|>|\.《.*?》/g, '. ')
|
||||
.replace(/\$|#/g, ' ')
|
||||
.trim();
|
||||
}
|
||||
|
||||
async function proxy(segments, headers) {}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: id,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
pg = pg || 1;
|
||||
if (pg == 0) pg = 1;
|
||||
let content = await request(`https://es.bookan.com.cn/api/v3/voice/book?instanceId=25304&keyword=${wd}&pageNum=${pg}&limitNum=20`);
|
||||
let data = JSON.parse(content).data;
|
||||
let books = [];
|
||||
for (const book of data.list) {
|
||||
books.push({
|
||||
vod_id: book.id,
|
||||
vod_name: book.name,
|
||||
vod_pic: book.cover,
|
||||
vod_remarks: book.extra.author,
|
||||
});
|
||||
}
|
||||
return JSON.stringify({
|
||||
page: data.current_page,
|
||||
pagecount: data.last_page,
|
||||
limit: 20,
|
||||
total: data.total,
|
||||
list: books,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
50
cat/js/README.md
Normal file
50
cat/js/README.md
Normal file
@ -0,0 +1,50 @@
|
||||
## Support using private Gitee or GitHub repositories as remote config.
|
||||
* github://<your personal access token>@github.com/<owner>/<repo>/<ref>/<file path>
|
||||
* gitee://<your access token>@gitee.com/<owner>/<repo>/<ref>/<file path>
|
||||
* github://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/omii/catvod/main/config_open.json
|
||||
* gitee://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@gitee.com/omii/catvod/master/config_open.json
|
||||
* https://omii%40qq.com:88888888@dav.jianguoyun.com/dav/cat/js/config_open.json
|
||||
|
||||
|
||||
## personal access token
|
||||
* Settings > Developer settings > Personal access tokens > Token (classic) > Generate new token
|
||||
* Settings > Developer settings > Personal access tokens > Fine-grained tokens > Generate new token
|
||||
|
||||
|
||||
## 远端配置:
|
||||
* github://ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/omiitop/CatVod/main/js/config_open.json
|
||||
* github://github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/omiitop/CatVod/main/js/config_open.json
|
||||
|
||||
|
||||
## 本地配置:
|
||||
* assets://js/config_open.json
|
||||
|
||||
## 远程配置教程:
|
||||
* https://omii.top/1296.html
|
||||
|
||||
## iOS签名教程
|
||||
* https://omii.top/826.html
|
||||
* https://omii.top/1498.html 推荐
|
||||
|
||||
## 自定义背景
|
||||
"color": [
|
||||
{
|
||||
"light": { "bg": "https://i2.100024.xyz/2024/01/13/qrnuwt.webp", "bgMask": "0x50ffffff", "primary": "0xFF2B6C00", "onPrimary": "0xFFFFFFFF", "primaryContainer": "0xFFA6F779", "onPrimaryContainer": "0xFF082100", "secondary": "0xFF55624C", "onSecondary": "0xFFFFFFFF", "secondaryContainer": "0xFFD9E7CA", "onSecondaryContainer": "0xFF131F0D", "tertiary": "0xFF386666", "onTertiary": "0xFFFFFFFF", "tertiaryContainer": "0xFFBBEBEB", "onTertiaryContainer": "0xFF002020", "error": "0xFFBA1A1A", "onError": "0xFFFFFFFF", "errorContainer": "0xFFFFDAD6", "onErrorContainer": "0xFF410002", "background": "0xFFFDFDF5", "onBackground": "0xFF1A1C18", "surface": "0xFFFDFDF5", "onSurface": "0xFF1A1C18", "surfaceVariant": "0xFFE0E4D6", "onSurfaceVariant": "0xFF1A1C18", "inverseSurface": "0xFF2F312C", "onInverseSurface": "0xFFF1F1EA", "outline": "0xFF74796D", "outlineVariant": "0xFFC3C8BB", "shadow": "0xFF000000", "scrim": "0xFF000000", "inversePrimary": "0xFF8CDA60", "surfaceTint": "0xFF2B6C00" },
|
||||
"dark": { "bg": "https://i2.100024.xyz/2024/01/13/qrc37o.webp", "bgMask": "0x50000000", "primary": "0xFF8CDA60", "onPrimary": "0xFF133800", "primaryContainer": "0xFF1F5100", "onPrimaryContainer": "0xFFA6F779", "secondary": "0xFFBDCBAF", "onSecondary": "0xFF283420", "secondaryContainer": "0xFF3E4A35", "onSecondaryContainer": "0xFFD9E7CA", "tertiary": "0xFFA0CFCF", "onTertiary": "0xFF003737", "tertiaryContainer": "0xFF1E4E4E", "onTertiaryContainer": "0xFFBBEBEB", "error": "0xFFFFB4AB", "errorContainer": "0xFF93000A", "onError": "0xFF690005", "onErrorContainer": "0xFFFFDAD6", "background": "0xFF1A1C18", "onBackground": "0xFFE3E3DC", "outline": "0xFF8D9286", "onInverseSurface": "0xFF1A1C18", "inverseSurface": "0xFFE3E3DC", "inversePrimary": "0xFF2B6C00", "shadow": "0xFF000000", "surfaceTint": "0xFF8CDA60", "outlineVariant": "0xFF43483E", "scrim": "0xFF000000", "surface": "0xFF1A1C18", "onSurface": "0xFFC7C7C0", "surfaceVariant": "0xFF43483E", "onSurfaceVariant": "0xFFC7C7C0" }
|
||||
}
|
||||
],
|
||||
|
||||
|
||||
## 自助添加接口格式:
|
||||
{
|
||||
"key": "wogg",
|
||||
"name": "🟢 玩偶",
|
||||
"type": 3,
|
||||
"api": "./wogg_open.js",
|
||||
"ext": "填入阿里token"
|
||||
},
|
||||
|
||||
"key"、"name" 内:与其他不重复的名称均可。
|
||||
"type" 3为影视,10为有声读物
|
||||
"api" 填写js路径,"ext" 填写扩展内容,例如玩偶的token。
|
||||
以上由omii.top提供
|
403
cat/js/missav.js
Normal file
403
cat/js/missav.js
Normal file
@ -0,0 +1,403 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
|
||||
let key = 'misaav';
|
||||
let url = 'https://missav789.com';
|
||||
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 = {};
|
||||
const default_filter=[
|
||||
{
|
||||
key:'filters',
|
||||
name:'过滤',
|
||||
init:'',
|
||||
value:[
|
||||
{n:'所有',v:''},
|
||||
{n:'单人作品',v:'individual'},
|
||||
{n:'中文字幕',v:'chinese-subtitle'},
|
||||
]
|
||||
},
|
||||
{
|
||||
key:'sort',
|
||||
name:'排序',
|
||||
init:'',
|
||||
value:[
|
||||
{n:'發行日期',v:'released_at'},
|
||||
{n:'最近更新',v:'published_at'},
|
||||
{n:'收藏數',v:'saved'},
|
||||
{n:'今日瀏覽數',v:'today_views'},
|
||||
{n:'本週瀏覽數',v:'weekly_views'},
|
||||
{n:'本月瀏覽數',v:'monthly_views'},
|
||||
{n:'瀏覽數',v:'views'},
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
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(url)
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
|
||||
let type_list="最近更新=new+新作上市=release+今日热门=today-hot+本周热门=weekly-hot+本月热门=monthly-hot+专题=tags+女优大全=actresses+女优排行榜=actresses/ranking+类型=genres+发行商=makers".split('+')
|
||||
let filter_list="无码流出=uncensored-leak+中文字幕=chinese-subtitle+素人SIRO=siro+LUXU=luxu+GANA=gana+PrestigePremium=maan+S-CUTE=scute+ARA=ara+无码FC2=fc2+HEYZO=heyzo+东京热=tokyohot+一本道=1pondo+Caribbeancom=caribbeancom+Caribbeancompr=caribbeancompr+10musume=10musume+pacopacomama=pacopacomama+Gachinco=gachinco+XXX-AV=xxxav+人妻斩=marriedslash+顽皮4610=naughty4610+顽皮0930=naughty0930+麻豆传媒=madou+TWAV=twav+Furuke=furuke".split('+')
|
||||
let classes = _.map(type_list, (s) => {
|
||||
let typeId = s.split('=')
|
||||
return {
|
||||
type_id: typeId[1],
|
||||
type_name: typeId[0],
|
||||
};
|
||||
|
||||
});
|
||||
let filterss = _.map(filter_list, (s) => {
|
||||
let fobj = s.split('=')
|
||||
return {
|
||||
v: fobj[1],
|
||||
n: fobj[0],
|
||||
};
|
||||
});
|
||||
let filterObj = {
|
||||
"tags":[
|
||||
{
|
||||
key:'tag',
|
||||
name:'主題',
|
||||
init:'uncensored-leak',
|
||||
value:filterss
|
||||
}
|
||||
],
|
||||
"actresses":default_filter,
|
||||
"genres":default_filter,
|
||||
"makers":default_filter,
|
||||
"actresses/ranking":default_filter,
|
||||
|
||||
};
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const min=1
|
||||
const max=100
|
||||
const range =max-min
|
||||
const random= Math.random()
|
||||
const result=min + Math.round(range*random)
|
||||
|
||||
const html=await request(url+'/random/'+result)
|
||||
const $ =load(html)
|
||||
const items = $('div.thumbnail')
|
||||
let videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')[0]
|
||||
const aa=$($(item).find('a')[1]).text()
|
||||
// console.log(a)
|
||||
const vid= a.attribs.href
|
||||
const img =$(a).find('img')[0].attribs.src
|
||||
const title=$(a).find('img')[0].attribs.alt
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_pic:img,
|
||||
vod_remarks:aa
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let html=null,$=null,items=null,videos=null
|
||||
switch(tid){
|
||||
case 'makers':
|
||||
html = await request(url+'/'+ tid+'?page='+pg)
|
||||
$=load(html)
|
||||
items = $('div.grid.grid-cols-2.gap-4 > div')
|
||||
videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')
|
||||
console.log(a)
|
||||
const vid= a[0].attribs.href
|
||||
const rem =$(a[1]).text().replaceAll('\n','')
|
||||
const title=$(a[0]).text().replaceAll('\n','')
|
||||
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_remarks:rem,
|
||||
vod_tag:'folder'
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
})
|
||||
break
|
||||
case 'genres':
|
||||
html = await request(url+'/'+ tid+'?page='+pg)
|
||||
$=load(html)
|
||||
items = $('div.grid.grid-cols-2.gap-4 > div')
|
||||
videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')
|
||||
console.log(a)
|
||||
const vid= a[0].attribs.href
|
||||
const rem =$(a[1]).text().replaceAll('\n','')
|
||||
const title=$(a[0]).text().replaceAll('\n','')
|
||||
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_remarks:rem,
|
||||
vod_tag:'folder'
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
})
|
||||
break
|
||||
case 'actresses/ranking':
|
||||
html = await request(url+'/'+ tid+'?page='+pg)
|
||||
$=load(html)
|
||||
items = $('ul.grid.grid-cols-2.gap-4 > li')
|
||||
videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')
|
||||
const vid= a[0].attribs.href
|
||||
const imgs=$(a[0]).find('img')[0]
|
||||
const img=imgs?imgs.attribs.src:''
|
||||
const rem =$($(item).find('span')[0]).text().replaceAll('\n','')
|
||||
const title=$($(item).find('h4')[0]).text().replaceAll('\n','')
|
||||
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_remarks: rem,
|
||||
vod_pic:img,
|
||||
vod_tag:'folder'
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
style: {
|
||||
type: "list",
|
||||
"ratio": 0.68
|
||||
}
|
||||
})
|
||||
break
|
||||
case 'actresses':
|
||||
html = await request(url+'/'+ tid+'?page='+pg)
|
||||
$=load(html)
|
||||
items = $('ul.grid.grid-cols-2.gap-4 > li')
|
||||
videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')
|
||||
const vid= a[0].attribs.href
|
||||
const imgs=$(a[0]).find('img')[0]
|
||||
const img=imgs?imgs.attribs.src:''
|
||||
const rem =$($(item).find('p')[0]).text().replaceAll('\n','')
|
||||
const title=$($(item).find('h4')[0]).text().replaceAll('\n','')
|
||||
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_remarks: rem,
|
||||
vod_pic:img,
|
||||
vod_tag:'folder'
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
})
|
||||
break
|
||||
default:
|
||||
let ttid=''
|
||||
if(tid=='tags')
|
||||
{
|
||||
ttid=extend.tag
|
||||
}else{
|
||||
ttid=tid
|
||||
}
|
||||
let urls=''
|
||||
if(tid.startsWith('http')){
|
||||
urls=tid+'?page='+pg+'&filters='+extend.filters+'&sort='+extend.sort
|
||||
|
||||
}else{
|
||||
urls=url+'/'+ ttid+'?page='+pg
|
||||
}
|
||||
|
||||
html = await request(urls)
|
||||
$=load(html)
|
||||
items = $('div.thumbnail')
|
||||
videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')[0]
|
||||
const aa=$($(item).find('a')[1]).text()
|
||||
// console.log(a)
|
||||
const vid= a.attribs.href
|
||||
const img =$(a).find('img')[0].attribs['data-src']
|
||||
const title=$(a).find('img')[0].attribs.alt
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_pic:img,
|
||||
vod_remarks:aa
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
})
|
||||
break
|
||||
|
||||
}
|
||||
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(id);
|
||||
const $ = load(html);
|
||||
let script=html.match(/let source[\s\S]+?eval.+/)[0];
|
||||
let sourceFhd=""
|
||||
let source842=''
|
||||
let source1280=''
|
||||
let source=''
|
||||
eval(script);
|
||||
let list=[];
|
||||
let items=[];
|
||||
list.push({name:"默认",url:sourceFhd||source||""})
|
||||
list.push({name:"720p",url:source1280||""})
|
||||
list.push({name:"480p",url:source842||""})
|
||||
let vod = {
|
||||
vod_id: id,
|
||||
vod_pic: '',
|
||||
vod_remarks: '',
|
||||
vod_content: '',
|
||||
};
|
||||
|
||||
const playlist = []
|
||||
_.map(list, (a) => {
|
||||
if (a.url!=''){
|
||||
playlist.push(a.name +'$' + a.url);
|
||||
|
||||
}
|
||||
});
|
||||
vod.vod_play_from = 'missav';
|
||||
vod.vod_play_url = playlist.join('#');
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: id,
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
async function search(wd, quick,pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const html = await request(url + '/search/' + wd+"?page="+pg);
|
||||
const $=load(html)
|
||||
const items = $('div.thumbnail')
|
||||
let videos=_.map(items,(item)=>{
|
||||
const a = $(item).find('a')[0]
|
||||
// console.log(a)
|
||||
const vid= a.attribs.href
|
||||
const img =$(a).find('img')[0].attribs['data-src']
|
||||
const title=$(a).find('img')[0].attribs.alt
|
||||
return {
|
||||
vod_id: vid,
|
||||
vod_name: title,
|
||||
vod_pic:img
|
||||
}
|
||||
} )
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: 9999,
|
||||
limit: 20,
|
||||
total: 99999,
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/mkz_open.js
Normal file
1
cat/js/mkz_open.js
Normal file
File diff suppressed because one or more lines are too long
200
cat/js/mtsp_open.js
Normal file
200
cat/js/mtsp_open.js
Normal file
@ -0,0 +1,200 @@
|
||||
import { Crypto, _ } from './lib/cat.js';
|
||||
|
||||
let key = 'mtsp';
|
||||
let main = 'https://mt7886.sbs/';
|
||||
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,
|
||||
};
|
||||
}
|
265
cat/js/mybili_open.js
Normal file
265
cat/js/mybili_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/mysp_open.js
Normal file
1
cat/js/mysp_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/nangua_open.js
Normal file
1
cat/js/nangua_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/ng_open.js
Normal file
1
cat/js/ng_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/ng_open2.js
Normal file
1
cat/js/ng_open2.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/nivod_op.js
Normal file
1
cat/js/nivod_op.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/nivod_open.js
Normal file
1
cat/js/nivod_open.js
Normal file
File diff suppressed because one or more lines are too long
207
cat/js/nkvod_open.js
Normal file
207
cat/js/nkvod_open.js
Normal file
@ -0,0 +1,207 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'nkvod';
|
||||
let HOST = 'https://nkvod.pro';
|
||||
let parseMap = {};
|
||||
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) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': HOST
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
await initParseMap();
|
||||
}
|
||||
|
||||
async function initParseMap() {
|
||||
const date = new Date();
|
||||
const t = '' + date.getFullYear() + (date.getMonth() + 1) + date.getDate();
|
||||
const js = await request(HOST + '/static/js/playerconfig.js?t=' + t);
|
||||
try {
|
||||
const jsEval = js + '\nMacPlayerConfig';
|
||||
const playerList = eval(jsEval).player_list;
|
||||
const players = _.values(playerList);
|
||||
_.each(players, (item) => {
|
||||
if (!item.ps || item.ps == '0') return;
|
||||
if (_.isEmpty(item.parse)) return;
|
||||
parseMap[item.show] = item.parse;
|
||||
});
|
||||
} catch(e) {
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const classes = [{'type_id':'1','type_name':'电影'},{'type_id':'2','type_name':'电视剧'},{'type_id':'3','type_name':'综艺'},{'type_id':'4','type_name':'动漫'}];
|
||||
const filterObj = {
|
||||
'1':[{'key':'cateId','name':'类型','init':'1','value':[{'n':'全部','v':'1'},{'n':'动作片','v':'6'},{'n':'喜剧片','v':'7'},{'n':'爱情片','v':'8'},{'n':'科幻片','v':'9'},{'n':'恐怖片','v':'10'},{'n':'剧情片','v':'11'},{'n':'战争片','v':'12'}]},{'key':'year','name':'年代','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'2':[{'key':'cateId','name':'类型','init':'2','value':[{'n':'全部','v':'2'},{'n':'国产剧','v':'13'},{'n':'港台剧','v':'14'},{'n':'日韩剧','v':'15'},{'n':'欧美剧','v':'16'},{'n':'其他剧','v':'20'}]},{'key':'year','name':'年代','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'3':[{'key':'year','name':'年代','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'4':[{'key':'year','name':'年代','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}]
|
||||
};
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const link = HOST + '/show/' + (extend.cateId || tid) + '--' + (extend.by || '') + '-' + (extend.class || '') + '--' + (extend.letter || '') + '---' + pg + '---' + (extend.year || '') + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('a.module-item');
|
||||
const videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const a = $item;
|
||||
const img = $item.find('img:first');
|
||||
const remarks = $item.find('div.module-item-note').text().trim();
|
||||
return {
|
||||
vod_id: a.attr('href').replace(/.*?\/detail\/(.*).html/g, '$1'),
|
||||
vod_name: a.attr('title'),
|
||||
vod_pic: img.attr('data-original'),
|
||||
vod_remarks: remarks,
|
||||
};
|
||||
});
|
||||
const limit = 72;
|
||||
const hasMore = $('div#page > a:contains(下一页)').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(HOST + '/detail/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('h1:first').text().trim(),
|
||||
vod_type: $('.module-info-tag a:eq(2)').text().trim(),
|
||||
vod_year: $('.module-info-tag a:eq(0)').text().trim(),
|
||||
vod_area: $('.module-info-tag a:eq(1)').text().trim(),
|
||||
vod_actor: $('.module-info-item:contains(主演:)').text().trim().substring(3).replace(/\/$/, ''),
|
||||
vod_director: $('.module-info-item:contains(导演:)').text().trim().substring(3).replace(/\/$/, ''),
|
||||
vod_pic: $('.module-info-poster img:first').attr('data-original'),
|
||||
vod_remarks : $('.module-info-item:contains(备注:)').text(),
|
||||
vod_content: $('.module-info-introduction-content').text().trim(),
|
||||
};
|
||||
const playMap = {};
|
||||
const tabs = $('.module-tab .module-tab-item span');
|
||||
const playlists = $('.module-play-list');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const $tab = $(tab);
|
||||
const from = $tab.text().trim();
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const $it = $(it);
|
||||
let title = $it.find('span').text();
|
||||
const playUrl = $it.attr('href');
|
||||
if (_.isEmpty(title)) title = $it.text();
|
||||
if (!playMap.hasOwnProperty(from)) {
|
||||
playMap[from] = [];
|
||||
}
|
||||
playMap[from].push(title + '$' + playUrl);
|
||||
});
|
||||
});
|
||||
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||
const urls = _.values(playMap);
|
||||
const 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) {
|
||||
const link = HOST + id;
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
let playUrl = js.url;
|
||||
if (js.encrypt == 1) {
|
||||
playUrl = unescape(playUrl);
|
||||
} else if (js.encrypt == 2) {
|
||||
playUrl = unescape(base64Decode(playUrl));
|
||||
}
|
||||
const parseUrl = parseMap[flag];
|
||||
if (parseUrl) {
|
||||
const reqUrl = parseUrl + playUrl;
|
||||
const parseHtml = await request(reqUrl);
|
||||
const matches = parseHtml.match(/let ConFig = {([\w\W]*)},box/);
|
||||
if (!_.isEmpty(matches)) {
|
||||
const configJson = '{' + matches[1].trim() + '}';
|
||||
const config = JSON.parse(configJson);
|
||||
playUrl = decryptUrl(config);
|
||||
}
|
||||
}
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
header: {
|
||||
'User-Agent': UA,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function decryptUrl(jsConfig) {
|
||||
const key = Crypto.enc.Utf8.parse('2890' + jsConfig.config.uid + 'tB959C');
|
||||
const iv = Crypto.enc.Utf8.parse('GZ4JgN2BdSqVWJ1z');
|
||||
const mode = Crypto.mode.CBC;
|
||||
const padding = Crypto.pad.Pkcs7;
|
||||
const decrypted = Crypto.AES.decrypt(jsConfig.url, key, {
|
||||
iv: iv,
|
||||
mode: mode,
|
||||
padding: padding
|
||||
});
|
||||
const decryptedUrl = Crypto.enc.Utf8.stringify(decrypted);
|
||||
return decryptedUrl;
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
const data = JSON.parse(await request(HOST + '/index.php/ajax/suggest?mid=1&limit=50&wd=' + wd)).list;
|
||||
const videos = _.map(data, (vod) => {
|
||||
return {
|
||||
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,
|
||||
};
|
||||
}
|
1
cat/js/nm_open.js
Normal file
1
cat/js/nm_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/nmddd_open.js
Normal file
1
cat/js/nmddd_open.js
Normal file
File diff suppressed because one or more lines are too long
204
cat/js/pan99_open.js
Normal file
204
cat/js/pan99_open.js
Normal file
@ -0,0 +1,204 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContentVodPlayFrom, detailContentVodPlayUrl, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'pan99';
|
||||
let siteType = 0;
|
||||
const siteUrl = 'https://pan99.xyz';
|
||||
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) {
|
||||
const res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
await initAli(cfg.ext);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const classes = [{'type_id':'dy','type_name':'电影'},{'type_id':'tv','type_name':'完结剧集'},{'type_id':'tv/geng','type_name':'追更剧集'},{'type_id':'tv/netflix','type_name':'Netflix'}];
|
||||
const filterObj = {};
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = 'page/' + pg + '/';
|
||||
}
|
||||
const cateUrl = siteUrl + '/category/' + tid + '/' + page;
|
||||
const html = await request(cateUrl);
|
||||
const $ = load(html);
|
||||
const list = $('.post-item');
|
||||
const jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const videos = _.map(list, (vid) => {
|
||||
const $vid = $(vid);
|
||||
const $link = $vid.find('.media-img');
|
||||
const $entry = $vid.find('.entry-cat-dot');
|
||||
return {
|
||||
vod_id: decodeURIComponent($link.attr('href').replace(/.*\/\/.*\/(.*\/.*)\//g, '$1')),
|
||||
vod_name: $link.attr('title'),
|
||||
vod_pic: jsBase + base64Encode($link.attr("data-bg")),
|
||||
vod_remarks: $entry.text().trim(),
|
||||
};
|
||||
});
|
||||
const limit = 50;
|
||||
const curPage = parseInt(pg);
|
||||
const hasMore = videos.length == limit;
|
||||
const pgCount = hasMore ? curPage + 1 : curPage;
|
||||
return JSON.stringify({
|
||||
page: curPage,
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const detailUrl = siteUrl + '/' + id;
|
||||
const html = await request(detailUrl);
|
||||
const $ = load(html);
|
||||
const $cards = $('.card p a:not([href*=quark])');
|
||||
const shareLinks = _.map($cards, (card) => {
|
||||
return $(card).attr('href').trim();
|
||||
});
|
||||
const content = $('.post-content').text();
|
||||
const jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('.post-title.mb-2.mb-lg-3').text().trim(),
|
||||
vod_director: matchDetailContent(content, /◎导 演([\w\W]*?)◎/),
|
||||
vod_actor: matchDetailContent(content, /◎演 员([\w\W]*?)◎/),
|
||||
vod_year: matchDetailContent(content, /◎年 代(.*)/),
|
||||
vod_area: matchDetailContent(content, /◎产 地(.*)/),
|
||||
vod_type: matchDetailContent(content, /◎类 别(.*)/),
|
||||
vod_pic: jsBase + base64Encode($('img.alignnone.size-medium').attr('src')),
|
||||
vod_content: matchDetailContent(content, /◎简 介([\w\W]*)资源失效/),
|
||||
vod_remarks: $('.meta-cat-dot').text().trim(),
|
||||
};
|
||||
try {
|
||||
vod.vod_play_from = detailContentVodPlayFrom(shareLinks);
|
||||
vod.vod_play_url = await detailContentVodPlayUrl(shareLinks);
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
function matchDetailContent(contentText, regex) {
|
||||
const matches = contentText.match(regex);
|
||||
if (!_.isEmpty(matches)) {
|
||||
const index = matches.length - 1;
|
||||
return matches[index].trim();
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
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) {
|
||||
const what = segments[0];
|
||||
const url = base64Decode(segments[1]);
|
||||
if (what == 'img') {
|
||||
const resp = await req(url, {
|
||||
buffer: 2,
|
||||
headers: {
|
||||
'Referer': 'https://api.douban.com/',
|
||||
'User-Agent': UA,
|
||||
},
|
||||
});
|
||||
return JSON.stringify({
|
||||
code: resp.code,
|
||||
buffer: 2,
|
||||
content: resp.content,
|
||||
headers: resp.headers,
|
||||
});
|
||||
}
|
||||
return JSON.stringify({
|
||||
code: 500,
|
||||
content: '',
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = 'page/' + pg + '/';
|
||||
}
|
||||
const searchUrl = siteUrl + '/' + page + '?cat=&s=' + encodeURIComponent(wd);
|
||||
const html = await request(searchUrl);
|
||||
const $ = load(html);
|
||||
const list = $('.post-item');
|
||||
const jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const videos = _.map(list, (vid) => {
|
||||
const $vid = $(vid);
|
||||
const $link = $vid.find('.media-img');
|
||||
const $entry = $vid.find('.entry-cat-dot');
|
||||
return {
|
||||
vod_id: decodeURIComponent($link.attr('href').replace(/.*\/\/.*\/(.*\/.*)\//g, '$1')),
|
||||
vod_name: $link.attr('title'),
|
||||
vod_pic: jsBase + base64Encode($link.attr("data-bg")),
|
||||
vod_remarks: $entry.text().trim(),
|
||||
};
|
||||
});
|
||||
const limit = 50;
|
||||
const curPage = parseInt(pg);
|
||||
const hasMore = videos.length == limit;
|
||||
const pgCount = hasMore ? curPage + 1 : curPage;
|
||||
return JSON.stringify({
|
||||
page: curPage,
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
proxy: proxy,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/panghu_open.js
Normal file
1
cat/js/panghu_open.js
Normal file
File diff suppressed because one or more lines are too long
150
cat/js/pansearch_open.js
Normal file
150
cat/js/pansearch_open.js
Normal file
@ -0,0 +1,150 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'pansearch';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://www.pansearch.me';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/
|
||||
|
||||
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 requestRaw(reqUrl, headers) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: headers || {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
},
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
async function request(reqUrl) {
|
||||
let resRaw = await requestRaw(reqUrl)
|
||||
return resRaw.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let matches = id.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[0]);
|
||||
return '';
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 10;
|
||||
let offsetParam = '';
|
||||
const offset = (pg - 1) * limit;
|
||||
if (offset > 0) {
|
||||
offsetParam = '&offset=' + offset;
|
||||
}
|
||||
const html = await request(siteUrl);
|
||||
const $ = load(html);
|
||||
const script = $('script#__NEXT_DATA__')[0];
|
||||
const data = script.children[0].data;
|
||||
const buildId = JSON.parse(data).buildId;
|
||||
const url = siteUrl + "/_next/data/" + buildId + "/search.json?keyword=" + encodeURIComponent(wd) + offsetParam + "&pan=aliyundrive";
|
||||
const result = await requestRaw(url, getSearchHeader());
|
||||
const json = JSON.parse(result.content).pageProps.data;
|
||||
const total = json.total;
|
||||
const videoIdSet = new Set();
|
||||
const videos = [];
|
||||
for (const item of json.data) {
|
||||
const content = item.content;
|
||||
const img = item.image || siteUrl + "/favicon.png";
|
||||
const splits = content.split('\n');
|
||||
if (_.isEmpty(splits)) continue;
|
||||
if (content.includes('1、')) {
|
||||
for (const line of splits) {
|
||||
if (_.isEmpty(line)) continue;
|
||||
const vodId = parseVideo(line, videoIdSet);
|
||||
if (!vodId) continue;
|
||||
videos.push({
|
||||
vod_id: vodId,
|
||||
vod_name: line.replaceAll(/<\/?[^>]+>/g, "").replace(/[0-9]*、/g, '').replace(/:http.*/g, ''),
|
||||
vod_pic: img,
|
||||
vod_remarks: item.time
|
||||
});
|
||||
}
|
||||
} else {
|
||||
const vodId = parseVideo(content, videoIdSet);
|
||||
if (!vodId) continue;
|
||||
videos.push({
|
||||
vod_id: vodId,
|
||||
vod_name: splits[0].replaceAll(/<\/?[^>]+>/g, "").replace('名称:', ''),
|
||||
vod_pic: img,
|
||||
vod_remarks: item.time
|
||||
});
|
||||
}
|
||||
}
|
||||
const pgCount = parseInt(total / limit) + 1;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: total,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
function parseVideo(content, videoIdSet) {
|
||||
const matches = content.match(patternAli);
|
||||
if (_.isEmpty(matches)) return;
|
||||
const vodId = matches[1];
|
||||
if (videoIdSet.has(vodId)) return;
|
||||
videoIdSet.add(vodId);
|
||||
return vodId;
|
||||
}
|
||||
|
||||
function getSearchHeader() {
|
||||
return {
|
||||
"x-nextjs-data": "1",
|
||||
"Referer": siteUrl,
|
||||
};
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
123
cat/js/pansou_open.js
Normal file
123
cat/js/pansou_open.js
Normal file
@ -0,0 +1,123 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'pansou';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://www.alipansou.com';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/
|
||||
|
||||
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 requestRaw(reqUrl, headers, redirect) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: headers || {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
},
|
||||
redirect: redirect,
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
async function request(reqUrl) {
|
||||
let resRaw = await requestRaw(reqUrl);
|
||||
return resRaw.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let matches = id.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[0]);
|
||||
let url = siteUrl + id.replace("/s/", "/cv/");
|
||||
const data = await requestRaw(url, getHeaders(id), 0);
|
||||
const headers = data.headers;
|
||||
const resp = data.content;
|
||||
if (headers.hasOwnProperty('location')) {
|
||||
url = headers['location'].replace('/redirect?visit=', 'https://www.aliyundrive.com/s/');
|
||||
return await detailContent(url);
|
||||
} else if (!_.isEmpty(resp)) {
|
||||
const $ = load(resp);
|
||||
url = $('a:first').attr('href').replace('/redirect?visit=', 'https://www.aliyundrive.com/s/');
|
||||
return await detailContent(url);
|
||||
}
|
||||
return '';
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
function getHeaders(id) {
|
||||
return {
|
||||
"User-Agent": UA,
|
||||
"Referer": siteUrl + id,
|
||||
"_bid": "6d14a5dd6c07980d9dc089a693805ad8",
|
||||
};
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 10;
|
||||
const html = await request(siteUrl + "/search?k=" + encodeURIComponent(wd) + "&page=" + pg + "&s=0&t=-1");
|
||||
const $ = load(html);
|
||||
const items = $('van-row > a');
|
||||
const videos = _.map(items, (item) => {
|
||||
let title = $(item).find('template:first').text().trim();
|
||||
return {
|
||||
vod_id: item.attribs.href,
|
||||
vod_name: title,
|
||||
vod_pic: 'https://inews.gtimg.com/newsapp_bt/0/13263837859/1000',
|
||||
};
|
||||
});
|
||||
const pageCount = $('van-pagination').attr('page-count') || pg;
|
||||
const pgCount = parseInt(pageCount);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/push_open.js
Normal file
1
cat/js/push_open.js
Normal file
@ -0,0 +1 @@
|
||||
(function(_0x5502de,_0x28ce57){const _0x3d8968=_0x1d20,_0x3846a8=_0x5502de();while(!![]){try{const _0x6da132=-parseInt(_0x3d8968(0xff))/0x1+-parseInt(_0x3d8968(0xec))/0x2+-parseInt(_0x3d8968(0xf2))/0x3+parseInt(_0x3d8968(0xea))/0x4*(-parseInt(_0x3d8968(0xf9))/0x5)+-parseInt(_0x3d8968(0xf6))/0x6+parseInt(_0x3d8968(0xf5))/0x7+parseInt(_0x3d8968(0xe4))/0x8;if(_0x6da132===_0x28ce57)break;else _0x3846a8['push'](_0x3846a8['shift']());}catch(_0x3bf5ae){_0x3846a8['push'](_0x3846a8['shift']());}}}(_0x23d9,0x242d0));const _0x989826=(function(){let _0x48deae=!![];return function(_0x299763,_0x2277f6){const _0x5f5716=_0x48deae?function(){if(_0x2277f6){const _0x217adc=_0x2277f6['apply'](_0x299763,arguments);return _0x2277f6=null,_0x217adc;}}:function(){};return _0x48deae=![],_0x5f5716;};}()),_0x17f8da=_0x989826(this,function(){const _0x34e035=_0x1d20;let _0x313e96;try{const _0x1ace3f=Function(_0x34e035(0xf4)+_0x34e035(0xeb)+(_0x34e035(0x100)+'ctor(\x22retu'+_0x34e035(0xef)+'\x20)')+');');_0x313e96=_0x1ace3f();}catch(_0x45e725){_0x313e96=window;}const _0x3fb422=_0x313e96[_0x34e035(0xf8)]=_0x313e96[_0x34e035(0xf8)]||{},_0xece77b=['log',_0x34e035(0xe6),_0x34e035(0xf1),_0x34e035(0xfc),_0x34e035(0x108),'table',_0x34e035(0xf3)];for(let _0x33f9b0=0x0;_0x33f9b0<_0xece77b['length'];_0x33f9b0++){const _0x55a52a=_0x989826[_0x34e035(0x103)+'r'][_0x34e035(0xed)][_0x34e035(0xe5)](_0x989826),_0x49eb74=_0xece77b[_0x33f9b0],_0x1e3c4b=_0x3fb422[_0x49eb74]||_0x55a52a;_0x55a52a[_0x34e035(0xf7)]=_0x989826[_0x34e035(0xe5)](_0x989826),_0x55a52a[_0x34e035(0xf0)]=_0x1e3c4b[_0x34e035(0xf0)][_0x34e035(0xe5)](_0x1e3c4b),_0x3fb422[_0x49eb74]=_0x55a52a;}});_0x17f8da();import{_}from'assets://js/lib/cat.js';import*as _0x210159 from'./lib/ali.js';import*as _0x432f53 from'./lib/quark.js';let siteKey='push_agent',siteType=0x0;async function init(_0x19d74a){const _0x523839=_0x1d20;try{siteKey=_0x19d74a[_0x523839(0xe3)],siteType=_0x19d74a['stype'];let _0x1aff0a=_0x19d74a['ext'];typeof _0x1aff0a==_0x523839(0xfa)&&_0x1aff0a[_0x523839(0xee)]('{')&&(_0x1aff0a=JSON['parse'](_0x1aff0a));let _0x13aacd=_0x1aff0a[_0x523839(0x102)],_0x4e1794=_0x1aff0a[_0x523839(0xfd)];await _0x210159['initAli'](_0x13aacd),await _0x432f53[_0x523839(0xe9)](_0x4e1794);}catch(_0x333994){console['debug'](_0x333994);}}async function support(_0x348c76){const _0x300331=_0x1d20;if(!_['isEmpty'](_0x348c76[_0x300331(0x101)](_0x210159[_0x300331(0x107)]))||!_[_0x300331(0xe8)](_0x348c76[_0x300331(0x101)](_0x432f53[_0x300331(0xe7)+'rn'])))return!![];return![];}async function detail(_0x3af4de){const _0x2bf575=_0x1d20;if(!_['isEmpty'](_0x3af4de[_0x2bf575(0x101)](_0x210159[_0x2bf575(0x107)])))return await _0x210159[_0x2bf575(0xe1)+_0x2bf575(0xe2)](_0x3af4de);if(!_[_0x2bf575(0xe8)](_0x3af4de[_0x2bf575(0x101)](_0x432f53[_0x2bf575(0xe7)+'rn'])))return await _0x432f53['detailCont'+_0x2bf575(0xe2)](_0x3af4de);return'{}';}function _0x23d9(){const _0x32888f=['265VXRnLB','string','detail','error','cookie','init','196130ZNashF','{}.constru','match','token','constructo','search','play','support','aliPattern','exception','detailCont','ent','skey','5549256yMZltv','bind','warn','quarkPatte','isEmpty','initQuark','20164Diufks','nction()\x20','122892uhCkuX','prototype','startsWith','rn\x20this\x22)(','toString','info','212574VZCmlY','trace','return\x20(fu','1147909UjKeSz','683166hmvbbu','__proto__','console'];_0x23d9=function(){return _0x32888f;};return _0x23d9();}function _0x1d20(_0x4c5477,_0x30049e){const _0x392059=_0x23d9();return _0x1d20=function(_0x17f8da,_0x989826){_0x17f8da=_0x17f8da-0xe1;let _0x14831b=_0x392059[_0x17f8da];return _0x14831b;},_0x1d20(_0x4c5477,_0x30049e);}async function play(_0x30754e,_0x35a4ec,_0x31bae4){if(_0x30754e['indexOf']('夸克')>-0x1)return await _0x432f53['playConten'+'t'](_0x30754e,_0x35a4ec,_0x31bae4);return await _0x210159['playConten'+'t'](_0x30754e,_0x35a4ec,_0x31bae4);}async function search(_0x3bf45f,_0x17ece4){return'{}';}export function __jsEvalReturn(){const _0x5514bd=_0x1d20,_0x8f8cb={};return _0x8f8cb[_0x5514bd(0xfe)]=init,_0x8f8cb[_0x5514bd(0x106)]=support,_0x8f8cb[_0x5514bd(0xfb)]=detail,_0x8f8cb[_0x5514bd(0x105)]=play,_0x8f8cb[_0x5514bd(0x104)]=search,_0x8f8cb;}
|
160
cat/js/qfys_open.js
Normal file
160
cat/js/qfys_open.js
Normal file
@ -0,0 +1,160 @@
|
||||
import { Crypto, load, _, jinja2 } from './lib/cat.js';
|
||||
|
||||
let key = 'qfys';
|
||||
let HOST = 'https://fun.tvoled.net';
|
||||
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': HOST
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{"type_id":1,"type_name":"电影"},{"type_id":2,"type_name":"追剧"},{"type_id":3,"type_name":"综艺"},{"type_id":4,"type_name":"动漫"}];
|
||||
let filterObj = {
|
||||
"1":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"1"},{"n":"灾难片","v":"20"},{"n":"冒险片","v":"21"},{"n":"同性片","v":"22"},{"n":"惊悚片","v":"23"},{"n":"悬疑片","v":"25"},{"n":"经典片","v":"26"},{"n":"犯罪片","v":"27"},{"n":"动作片","v":"6"},{"n":"喜剧片","v":"7"},{"n":"爱情片","v":"8"},{"n":"科幻片","v":"9"},{"n":"恐怖片","v":"10"},{"n":"剧情片","v":"11"},{"n":"战争片","v":"12"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动画","v":"/class/动画"},{"n":"奇幻","v":"/class/奇幻"},{"n":"武侠","v":"/class/武侠"},{"n":"冒险","v":"/class/冒险"},{"n":"恐怖","v":"/class/恐怖"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"历史","v":"/class/历史"},{"n":"运动","v":"/class/运动"},{"n":"儿童","v":"/class/儿童"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"意大利","v":"/area/意大利"},{"n":"西班牙","v":"/area/西班牙"},{"n":"加拿大","v":"/area/加拿大"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"泰新马","v":"24"},{"n":"国产剧","v":"13"},{"n":"港台剧","v":"14"},{"n":"日韩剧","v":"15"},{"n":"欧美剧","v":"16"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"剧情","v":"/class/剧情"},{"n":"爱情","v":"/class/爱情"},{"n":"古装","v":"/class/古装"},{"n":"悬疑","v":"/class/悬疑"},{"n":"战争","v":"/class/战争"},{"n":"喜剧","v":"/class/喜剧"},{"n":"家庭","v":"/class/家庭"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动作","v":"/class/动作"},{"n":"奇幻","v":"/class/奇幻"},{"n":"历史","v":"/class/历史"},{"n":"短剧","v":"/class/短剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"韩国","v":"/area/韩国"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"泰国","v":"/area/泰国"},{"n":"英国","v":"/area/英国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"选秀","v":"/class/选秀"},{"n":"情感","v":"/class/情感"},{"n":"访谈","v":"/class/访谈"},{"n":"播报","v":"/class/播报"},{"n":"旅游","v":"/class/旅游"},{"n":"音乐","v":"/class/音乐"},{"n":"美食","v":"/class/美食"},{"n":"纪实","v":"/class/纪实"},{"n":"曲艺","v":"/class/曲艺"},{"n":"生活","v":"/class/生活"},{"n":"游戏互动","v":"/class/游戏互动"},{"n":"财经","v":"/class/财经"},{"n":"求职","v":"/class/求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"欧美","v":"/area/欧美"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"情感","v":"/class/情感"},{"n":"科幻","v":"/class/科幻"},{"n":"热血","v":"/class/热血"},{"n":"推理","v":"/class/推理"},{"n":"搞笑","v":"/class/搞笑"},{"n":"冒险","v":"/class/冒险"},{"n":"萝莉","v":"/class/萝莉"},{"n":"校园","v":"/class/校园"},{"n":"动作","v":"/class/动作"},{"n":"机战","v":"/class/机战"},{"n":"运动","v":"/class/运动"},{"n":"战争","v":"/class/战争"},{"n":"少年","v":"/class/少年"},{"n":"少女","v":"/class/少女"},{"n":"社会","v":"/class/社会"},{"n":"原创","v":"/class/原创"},{"n":"亲子","v":"/class/亲子"},{"n":"益智","v":"/class/益智"},{"n":"励志","v":"/class/励志"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"国产","v":"/area/国产"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const link = HOST + '/index.php/vod/show' + (extend.area || '') + (extend.by || '/by/time') + (extend.class || '') + '/id/' + (extend.cateId || tid) + '/page/' + pg + (extend.year || '') + '.html';//https://fun.tvoled.net/index.php/vod/show/area/%E5%A4%A7%E9%99%86/by/hits/class/%E5%8F%A4%E8%A3%85/id/13/year/2022.html
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('div.module a.module-poster-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const it = $(item)[0];
|
||||
const k = $(item).find('img:first')[0];
|
||||
const remarks = $($(item).find('div.module-item-note')[0]).text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/id\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: k.attribs['data-original'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > 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) {
|
||||
var html = await request( HOST + '/index.php/vod/detail/id/' + id + '.html');
|
||||
var $ = load(html);
|
||||
var vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('h1:first').text().trim(),
|
||||
vod_type: $('.module-info-tag a').text(),
|
||||
vod_actor: $('.module-info-items a').text(),
|
||||
vod_pic: $('.video-cover img:first').attr('src'),
|
||||
vod_remarks : $('.stui-content__detail p:nth-child(5)').text() || '',
|
||||
vod_content: $('.show-desc p').text().trim(),
|
||||
};
|
||||
var playMap = {};
|
||||
var tabs = $('div.module-tab-items-box div.module-tab-item');
|
||||
var playlists = $('div.module-play-list-content');
|
||||
_.each(tabs, (tab, i) => {
|
||||
var from = $(tab).text();
|
||||
var list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
var title = $(it).text();
|
||||
var playUrl = it.attribs.href.replace(/.*?\/id\/(.*).html/g, '$1');
|
||||
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) {
|
||||
const link = HOST + '/index.php/vod/play/id/' + id + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
const playUrl = js.url;
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let data = await request(HOST + '/index.php/vod/search/page/' + pg + '/wd/' + wd + '.html');//https://fun.tvoled.net/index.php/vod/search/page/2/wd/%E6%88%91.html
|
||||
const $ = load(data);
|
||||
const items = $('div.module-items div.module-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const it = $(item).find('a:first')[0];
|
||||
const k = $(item).find('img:first')[0];
|
||||
const remarks = $($(item).find('div.module-item-note')[0]).text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/id\/(.*).html/g, '$1'),
|
||||
vod_name: k.attribs.alt,
|
||||
vod_pic: k.attribs['data-original'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > 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,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/qiao2_open.js
Normal file
1
cat/js/qiao2_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/rbk_open.js
Normal file
1
cat/js/rbk_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/rbzj_open.js
Normal file
1
cat/js/rbzj_open.js
Normal file
File diff suppressed because one or more lines are too long
167
cat/js/rttks_open.js
Normal file
167
cat/js/rttks_open.js
Normal file
@ -0,0 +1,167 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
|
||||
let key = 'rttks';
|
||||
let HOST = 'https://www.rttks.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
|
||||
const UA = 'Mozilla/5.0 (Linux; Android 10; HLK-AL00 Build/HONORHLK-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/88.0.4324.93 Mobile Safari/537.36';
|
||||
|
||||
async function request(reqUrl, agentSp) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': agentSp || 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) {
|
||||
let classes = [{"type_id":"dianying","type_name":"电影"},{"type_id":"dianshiju","type_name":"追剧"},{"type_id":"zongyi","type_name":"综艺"},{"type_id":"dongman","type_name":"动漫"},{"type_id":"jilupian","type_name":"动漫"}];
|
||||
let filterObj = {
|
||||
"dianying":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"dianying"},{"n":"剧情","v":"jqp"},{"n":"喜剧","v":"xjp"},{"n":"动作","v":"dzp"},{"n":"爱情","v":"aqp"},{"n":"科幻","v":"khp"},{"n":"恐怖","v":"kbp"},{"n":"战争","v":"zzp"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/大陆"},{"n":"中国香港","v":"/area/香港"},{"n":"中国台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"澳大利亚","v":"/area/澳大利亚"}]},{"key":"year","name":"时间","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"dianshiju":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"dianshiju"},{"n":"国产剧","v":"gcj"},{"n":"港台剧","v":"gtj"},{"n":"日韩剧","v":"rhj"},{"n":"海外剧","v":"hwj"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/大陆"},{"n":"中国香港","v":"/area/香港"},{"n":"中国台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"澳大利亚","v":"/area/澳大利亚"}]},{"key":"year","name":"时间","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"dongman":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/大陆"},{"n":"中国香港","v":"/area/香港"},{"n":"中国台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"澳大利亚","v":"/area/澳大利亚"}]},{"key":"year","name":"时间","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"zongyi":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/大陆"},{"n":"中国香港","v":"/area/香港"},{"n":"中国台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"澳大利亚","v":"/area/澳大利亚"}]},{"key":"year","name":"时间","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"jilupian":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/大陆"},{"n":"中国香港","v":"/area/香港"},{"n":"中国台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"澳大利亚","v":"/area/澳大利亚"}]},{"key":"year","name":"时间","value":[{"n":"全部","v":""},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const link = HOST + '/rrtop/' + (extend.cateId || tid) + (extend.area || '') + (extend.by || '/by/time') + '/page/' + pg + (extend.year || '') + '.html';//https://www.rttks.com/rrtop/dzp/area/%E7%BE%8E%E5%9B%BD/class//page/2/year/2022.html
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('ul.stui-vodlist li');
|
||||
let videos = _.map(items, (item) => {
|
||||
const it = $(item).find('a:first')[0];
|
||||
const remarks = $($(item).find('span.pic-text text-right')[0]).text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/rrtv\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: it.attribs['data-original'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('ul.stui-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 + '/rrtv/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('.col-md-wide-75 h2').text().trim(),
|
||||
vod_type: $('.stui-content__detail p:nth-child(4)').text(),
|
||||
vod_actor: $('.stui-content__detail p:nth-child(2)').text().replace('上映:剧情:', ''),
|
||||
vod_pic: $('.module-item-pic img:first').attr('data-src'),
|
||||
vod_remarks : $('.stui-content__detail p:nth-child(5)').text() || '',
|
||||
vod_content: $('.detail-content').text().trim(),
|
||||
};
|
||||
let playMap = {};
|
||||
const tabs = $('body div.bottom-line h3.title');
|
||||
const playlists = $('ul.stui-content__playlist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const from = tab.children[0].data;
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const title = it.children[0].data;
|
||||
const playUrl = it.attribs.href.replace(/.*?\/rrplay\/(.*).html/g, '$1');
|
||||
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('$$$');
|
||||
const urls = _.values(playMap);
|
||||
let 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) {
|
||||
const link = HOST + '/rrplay/' + id + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
const playUrl = unescape(base64Decode(js.url));
|
||||
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
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 search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let data = await request(HOST + '/rrcz' + wd + '/page/' + pg + '.html');//https://www.rttks.com/rrcz%E6%88%91/page/2.html
|
||||
const $ = load(data);
|
||||
const items = $('ul.stui-vodlist__media li');
|
||||
let videos = _.map(items, (item) => {
|
||||
const it = $(item).find('a:first')[0];
|
||||
const remarks = $($(item).find('span.pic-text text-right')[0]).text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/rrtv\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: it.attribs['data-original'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('ul.stui-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,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
208
cat/js/sc1080_open.js
Normal file
208
cat/js/sc1080_open.js
Normal file
@ -0,0 +1,208 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'sc1080';
|
||||
let HOST = 'https://sc1080.top';
|
||||
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, method, data) {
|
||||
const res = await req(reqUrl, {
|
||||
method: method || 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': HOST,
|
||||
},
|
||||
data: data,
|
||||
postType: method === 'post' ? 'form' : '',
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{'type_id':1,'type_name':'电影'},{'type_id':2,'type_name':'电视剧'},{'type_id':3,'type_name':'综艺'},{'type_id':4,'type_name':'动漫'},{'type_id':5,'type_name':'纪录片'},{'type_id':20,'type_name':'4K片库'},{'type_id':21,'type_name':'短剧片库'}];
|
||||
let filterObj = {
|
||||
'1':[{'key':'class','name':'剧情','init':'','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':'古装','v':'古装'},{'n':'历史','v':'历史'},{'n':'运动','v':'运动'},{'n':'农村','v':'农村'},{'n':'儿童','v':'儿童'},{'n':'网络电影','v':'网络电影'}]},{'key':'area','name':'地区','init':'','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':'lang','name':'类型','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'2':[{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','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':'其他'}]},{'key':'lang','name':'类型','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'3':[{'key':'class','name':'剧情','init':'','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':'地区','init':'','value':[{'n':'全部','v':''},{'n':'内地','v':'内地'},{'n':'港台','v':'港台'},{'n':'日韩','v':'日韩'},{'n':'欧美','v':'欧美'}]},{'key':'lang','name':'类型','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'4':[{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'国产','v':'国产'},{'n':'日本','v':'日本'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'lang','name':'类型','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'5':[{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'20':[{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'21':[{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const area = getFilterUrlPart(extend, 'area');
|
||||
const clazz = getFilterUrlPart(extend, 'class');
|
||||
const by = getFilterUrlPart(extend, 'by');
|
||||
const lang = getFilterUrlPart(extend, 'lang');
|
||||
const year = getFilterUrlPart(extend, 'year');
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = '/page/' + pg;
|
||||
}
|
||||
const link = HOST + '/index.php/vod/show' + area + by + clazz + '/id/' + tid + lang + page + year + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('.module .module-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const it = $item.find('a:first')[0];
|
||||
const img = $item.find('img:first')[0];
|
||||
const remarks = $item.find('.module-item-text').text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/detail\/id\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: img.attribs['data-src'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > a.page-next').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 24;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
function getFilterUrlPart(extend, part) {
|
||||
let result = '';
|
||||
if (extend[part]) {
|
||||
result = '/' + part + '/' + extend[part];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(HOST + '/index.php/vod/detail/id/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('.page-title').text(),
|
||||
vod_area: $('a.tag-link:last').text(),
|
||||
vod_year: $('a.tag-link:first').text(),
|
||||
vod_director: $('.video-info-main .video-info-items:contains(导演:)').text().substring(3).replace(/(^\/|\/$)/g, ''),
|
||||
vod_actor: $('.video-info-main .video-info-items:contains(主演:)').text().substring(3).replace(/(^\/|\/$)/g, ''),
|
||||
vod_pic: $('.video-cover img:first').attr('data-src'),
|
||||
vod_remarks : $('.stui-content__thumb span.pic-text').text(),
|
||||
vod_content: $('.video-info-main .video-info-items:contains(剧情:)').text().substring(3),
|
||||
};
|
||||
const playMap = {};
|
||||
const tabs = $('.module-player-tab .tab-item');
|
||||
const playlists = $('.module-blocklist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const from = $(tab).find('span:first').text();
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const title = it.children[0].children[0].data;
|
||||
const playUrl = it.attribs.href;
|
||||
|
||||
if (!playMap.hasOwnProperty(from)) {
|
||||
playMap[from] = [];
|
||||
}
|
||||
playMap[from].push( title + '$' + playUrl);
|
||||
});
|
||||
});
|
||||
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||
const urls = _.values(playMap);
|
||||
const 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) {
|
||||
const link = HOST + id;
|
||||
const html = await request(link);
|
||||
let $ = load(html);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
const parseHtml = await request('https://jx.sc1080.top/?url=' + js.url);
|
||||
const htmlData = parseHtml.match(/var config = {([\w\W]*)}([\w\W]*)player/)[1];
|
||||
const json = JSON.parse('{' + htmlData.trim().replace(/,$/, '') + '}');
|
||||
const config = {
|
||||
url: json.url,
|
||||
key: json.key,
|
||||
time: json.time,
|
||||
};
|
||||
const parseResp = await request('https://jx.sc1080.top/api_config.php', 'post', config);
|
||||
const result = JSON.parse(parseResp);
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: result.url,
|
||||
header: {
|
||||
'User-Agent': UA,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const keyword = encodeURIComponent(wd);
|
||||
let path = 'search';
|
||||
if (pg == 1) {
|
||||
path += '.html?wd=' + keyword;
|
||||
} else {
|
||||
path += '/page/' + pg + '/wd/' + keyword + '.html';
|
||||
}
|
||||
const html = await request(HOST + '/index.php/vod/' + path);
|
||||
const $ = load(html);
|
||||
const items = $('.module .module-search-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const it = $item.find('.video-info a:first')[0];
|
||||
const img = $item.find('.video-cover img:first')[0];
|
||||
const remarks = $item.find('.video-info-header .video-serial').text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/detail\/id\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: img.attribs['data-src'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > a.page-next').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 24;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
135
cat/js/sharenice_open.js
Normal file
135
cat/js/sharenice_open.js
Normal file
@ -0,0 +1,135 @@
|
||||
// 搜索滑块验证
|
||||
import { load, _ } from './lib/cat.js';
|
||||
|
||||
let key = '短视频';
|
||||
let HOST = 'http://www.sharenice.net';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
let 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, agentSp) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': agentSp || PC_UA,
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
function clsjoin(cls) {
|
||||
_.each(cls, (s) => {
|
||||
let typeId = s.attribs['href'];
|
||||
typeId = typeId.substring(typeId.lastIndexOf('t/') + 2);
|
||||
classes.push({
|
||||
type_id: typeId,
|
||||
type_name: s.children[0].data,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
let classes = [];
|
||||
async function home(filter) {
|
||||
let filterObj = {};
|
||||
let html = await request(HOST);
|
||||
let $ = load(html);
|
||||
let series = $('div.nav > ul > li > a[href*=net/]');
|
||||
let tag = $('div.hot-tags-list > a[href*=net]');
|
||||
clsjoin(series);
|
||||
clsjoin(tag);
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
let link = HOST + '/t-576O5aWz';
|
||||
let html = await request(link);
|
||||
let $ = load(html);
|
||||
let items = $('div.item-box ul li');
|
||||
let videos = _.map(items, (item) => {
|
||||
let a = $(item).find('a:first')[0];
|
||||
let img = $(item).find('img:first')[0];
|
||||
return {
|
||||
vod_id: a.attribs.href,
|
||||
vod_name: a.attribs.title,
|
||||
vod_pic: img.attribs['data-original'],
|
||||
vod_remarks: '',
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0 || typeof(pg) == 'undefined') pg = 1;
|
||||
let link = HOST + '/' + tid + '?page=' + pg;
|
||||
let html = await request(link);
|
||||
let $ = load(html);
|
||||
let items = $('div.item-box ul li');
|
||||
let videos = _.map(items, (item) => {
|
||||
let a = $(item).find('a:first')[0];
|
||||
let img = $(item).find('img:first')[0];
|
||||
return {
|
||||
vod_id: a.attribs.href,
|
||||
vod_name: a.attribs.title,
|
||||
vod_pic: img.attribs['data-original'],
|
||||
vod_remarks: '',
|
||||
};
|
||||
});
|
||||
let hasMore = $('ul.pagination > li > a:contains(»)').length > 0;
|
||||
let pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: 16,
|
||||
total: 16 * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
let vod = {
|
||||
vod_id: id,
|
||||
vod_remarks: '',
|
||||
};
|
||||
let playlist = ['观看视频' + '$' + id];
|
||||
vod.vod_play_from = '道长在线';
|
||||
vod.vod_play_url = playlist.join('#');
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
let html = await request(id);
|
||||
let $ = load(html);
|
||||
let playUrl = $('div.video-play-box').find('video:first')[0].attribs.src + '#.mp4';
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/shuyinfm_book_open.js
Normal file
1
cat/js/shuyinfm_book_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/sssp_open.js
Normal file
1
cat/js/sssp_open.js
Normal file
File diff suppressed because one or more lines are too long
277
cat/js/star_open.js
Normal file
277
cat/js/star_open.js
Normal file
@ -0,0 +1,277 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'star';
|
||||
let host = 'https://www.histar.tv';
|
||||
let apiHost = 'https://aws.ulivetv.net';
|
||||
let types = {};
|
||||
// let ver = '';
|
||||
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, method, data) {
|
||||
const headers = {
|
||||
'User-Agent': UA,
|
||||
};
|
||||
if (method == 'post') {
|
||||
headers['Content-Type'] = 'application/json';
|
||||
} else {
|
||||
headers['Cookie'] = 'userIP=127.0.0.1; aws-waf-token=';
|
||||
headers['Referer'] = host;
|
||||
}
|
||||
const res = await req(reqUrl, {
|
||||
method: method || 'get',
|
||||
headers: headers,
|
||||
data: data,
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
types = {
|
||||
'movie': '电影',
|
||||
'drama': '电视剧',
|
||||
'animation': '动漫',
|
||||
'variety': '综艺',
|
||||
'documentary': '纪录片',
|
||||
};
|
||||
// ver = await getVer();
|
||||
}
|
||||
|
||||
// async function getVer() {
|
||||
// const html = await request(host);
|
||||
// const $ = load(html);
|
||||
// const srcAttr = $('script[src*=\'buildManifest.js\']').attr('src');
|
||||
// return srcAttr.split('/')[3];
|
||||
// }
|
||||
|
||||
async function home(filter) {
|
||||
const typeList = _.keys(types);
|
||||
const classes = _.map(typeList, (item) => {
|
||||
return { type_id: item, type_name: types[item] };
|
||||
});
|
||||
const filterConfig = {};
|
||||
const jsonData = JSON.stringify(typeList);
|
||||
for (const typeId of typeList) {
|
||||
const html = await request(host + '/' + typeId + '/all/all/all');
|
||||
const $ = load(html);
|
||||
const json = $('#__NEXT_DATA__')[0].children[0].data;
|
||||
const obj = JSON.parse(json).props.pageProps.filterCondition;
|
||||
const label = convertTypeData(obj, 'label', '类型');
|
||||
const country = convertTypeData(obj, 'country', '地区');
|
||||
const time = convertTypeData(obj, 'time', '年份');
|
||||
const filterArray = [label, country, time];
|
||||
filterConfig[typeId] = filterArray;
|
||||
};
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterConfig,
|
||||
});
|
||||
}
|
||||
|
||||
function convertTypeData(typeData, key, name) {
|
||||
if (!typeData || !typeData[key] || typeData[key].length <= 2) {
|
||||
return null;
|
||||
}
|
||||
let valueList = typeData[key];
|
||||
if (key == 'time') {
|
||||
valueList = valueList.sort((a, b) => { return b - a;});
|
||||
valueList.pop();
|
||||
}
|
||||
const values = _.map(valueList, (item) => {
|
||||
let name;
|
||||
let value;
|
||||
if (item instanceof Array) {
|
||||
name = item[0];
|
||||
value = item[0];
|
||||
} else {
|
||||
name = item.toString();
|
||||
value = item.toString();
|
||||
}
|
||||
return {
|
||||
n: name,
|
||||
v: value,
|
||||
};
|
||||
});
|
||||
values.unshift({
|
||||
n: '全部',
|
||||
v: '',
|
||||
});
|
||||
const typeClass = {
|
||||
key: key,
|
||||
name: name,
|
||||
init: '',
|
||||
value: values,
|
||||
};
|
||||
return typeClass;
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const html = await request(host);
|
||||
const $ = load(html);
|
||||
const json = $('#__NEXT_DATA__')[0].children[0].data;
|
||||
const obj = JSON.parse(json).props.pageProps.cards;
|
||||
const videos = [];
|
||||
_.each(obj, (cards) => {
|
||||
if (cards.name == '电视直播') return;
|
||||
_.each(cards.cards, (card) => {
|
||||
const v = {
|
||||
vod_id: card.id,
|
||||
vod_name: card.name,
|
||||
vod_pic: card.img,
|
||||
vod_remarks: card.countStr,
|
||||
};
|
||||
videos.push(v);
|
||||
});
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
const limit = 16;
|
||||
const param = {
|
||||
chName: types[tid],
|
||||
page: pg,
|
||||
pageSize: limit,
|
||||
label: extend.label,
|
||||
country: extend.country,
|
||||
};
|
||||
if (extend.time) {
|
||||
const year = parseInt(extend.time);
|
||||
param.startTime = year;
|
||||
param.endTime = year;
|
||||
}
|
||||
const json = await request(apiHost + '/v3/web/api/filter', 'post', JSON.stringify(param));
|
||||
const data = JSON.parse(json).data;
|
||||
const videos = _.map(data.list, (card) => {
|
||||
return {
|
||||
vod_id: card.id,
|
||||
vod_name: card.name,
|
||||
vod_pic: card.img,
|
||||
vod_remarks: card.countStr,
|
||||
};
|
||||
});
|
||||
const page = parseInt(pg);
|
||||
const count = parseInt(data.total / limit);
|
||||
return JSON.stringify({
|
||||
page: page,
|
||||
pagecount: count,
|
||||
limit: limit,
|
||||
total: data.total,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(host + '/vod/detail/' + id);
|
||||
const $ = load(html);
|
||||
const json = $('#__NEXT_DATA__')[0].children[0].data;
|
||||
const obj = JSON.parse(json).props.pageProps;
|
||||
const vObj = obj.pageData;
|
||||
const vodAtom = {
|
||||
vod_id: id,
|
||||
vod_name: vObj.name,
|
||||
vod_type: vObj.chname,
|
||||
vod_pic: vObj.picurl,
|
||||
vod_area: vObj.country,
|
||||
vod_lang: vObj.language,
|
||||
vod_remarks: vObj.countStr,
|
||||
vod_actor: vObj.actor,
|
||||
vod_director: vObj.director,
|
||||
vod_content: vObj.desc,
|
||||
}
|
||||
const playInfo = obj.videosGroup;
|
||||
const playVod = {};
|
||||
_.each(playInfo, (info) => {
|
||||
const sourceName = info.name;
|
||||
let playList = '';
|
||||
const videoInfo = info.videos;
|
||||
const vodItems = _.map(videoInfo, (epObj) => {
|
||||
const epName = epObj.epInfo;
|
||||
const playUrl = epObj.purl
|
||||
return epName + '$' + playUrl;
|
||||
});
|
||||
if (_.isEmpty(vodItems)) return;
|
||||
playList = vodItems.join('#');
|
||||
playVod[sourceName] = playList;
|
||||
});
|
||||
vodAtom.vod_play_from = _.keys(playVod).join('$$$');
|
||||
vodAtom.vod_play_url = _.values(playVod).join('$$$');
|
||||
return JSON.stringify({
|
||||
list: [vodAtom],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
let playUrl = id;
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
// const limit = 10;
|
||||
// const json = await request(host + '/_next/data/' + ver + '/search.json?word=' + encodeURIComponent(wd) + '&page=' + pg);
|
||||
// const data = JSON.parse(json).pageProps;
|
||||
// const videos = _.map(data.initList, (card) => {
|
||||
// return {
|
||||
// vod_id: card.id,
|
||||
// vod_name: card.name,
|
||||
// vod_pic: card.picurl,
|
||||
// vod_remarks: card.countStr,
|
||||
// };
|
||||
// });
|
||||
// const page = parseInt(pg);
|
||||
// const count = parseInt(data.total / limit);
|
||||
// return JSON.stringify({
|
||||
// page: page,
|
||||
// pagecount: count,
|
||||
// limit: limit,
|
||||
// total: data.total,
|
||||
// list: videos,
|
||||
// });
|
||||
const limit = 10;
|
||||
const param = {
|
||||
word: wd,
|
||||
page: pg,
|
||||
pageSize: limit,
|
||||
};
|
||||
const json = await request(apiHost + '/v3/web/api/search', 'post', JSON.stringify(param));
|
||||
const data = JSON.parse(json).data;
|
||||
const videos = _.map(data.list, (card) => {
|
||||
return {
|
||||
vod_id: card.id,
|
||||
vod_name: card.name,
|
||||
vod_pic: card.picurl,
|
||||
vod_remarks: card.countStr,
|
||||
};
|
||||
});
|
||||
const page = parseInt(pg);
|
||||
const count = parseInt(data.total / limit);
|
||||
return JSON.stringify({
|
||||
page: page,
|
||||
pagecount: count,
|
||||
limit: limit,
|
||||
total: data.total,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
182
cat/js/subaibai_open.js
Normal file
182
cat/js/subaibai_open.js
Normal file
File diff suppressed because one or more lines are too long
58
cat/js/testVideo.js
Normal file
58
cat/js/testVideo.js
Normal file
@ -0,0 +1,58 @@
|
||||
import { __jsEvalReturn } from './kunyu77_open.js';
|
||||
|
||||
var spider = __jsEvalReturn();
|
||||
|
||||
function jsonParse(obj) {
|
||||
if (typeof obj === 'string') {
|
||||
return JSON.parse(obj);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
async function test() {
|
||||
var spType = null;
|
||||
var spVid = null;
|
||||
spType = '2';
|
||||
// spVid = '95873';
|
||||
|
||||
await spider.init({ skey: 'siteKey', ext: '' });
|
||||
var classes = jsonParse(await spider.home(true));
|
||||
console.log(classes);
|
||||
var homeVod = jsonParse(await spider.homeVod());
|
||||
console.log(homeVod);
|
||||
if (classes.class && classes.class.length > 0) {
|
||||
var page = jsonParse(await spider.category(spType || classes.class[0].type_id, 0, undefined, {}));
|
||||
console.log(page);
|
||||
if (page.list && page.list.length > 0) {
|
||||
for (const k in page.list) {
|
||||
if (k >= 5) break;
|
||||
var detail = jsonParse(await spider.detail(spVid || page.list[k].vod_id));
|
||||
console.log(detail);
|
||||
if (detail.list && detail.list.length > 0) {
|
||||
var pFlag = detail.list[0].vod_play_from.split('$$$');
|
||||
var pUrls = detail.list[0].vod_play_url.split('$$$');
|
||||
if (pFlag.length > 0 && pUrls.length > 0) {
|
||||
for (const i in pFlag) {
|
||||
var flag = pFlag[i];
|
||||
var urls = pUrls[i].split('#');
|
||||
if (urls.length > 0) {
|
||||
var url = urls[0].split('$')[1];
|
||||
console.log(flag, url);
|
||||
var playUrl = await spider.play(flag, url, []);
|
||||
console.log(playUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (spVid) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var search = jsonParse(await spider.search('奥特曼'));
|
||||
console.log(search);
|
||||
|
||||
search = jsonParse(await spider.search('喜欢'));
|
||||
console.log(search);
|
||||
}
|
||||
|
||||
export { test };
|
1
cat/js/tiantian_open.js
Normal file
1
cat/js/tiantian_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/ting13_book_open.js
Normal file
1
cat/js/ting13_book_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/tutu_open.js
Normal file
1
cat/js/tutu_open.js
Normal file
File diff suppressed because one or more lines are too long
135
cat/js/tuxiaobei_open.js
Normal file
135
cat/js/tuxiaobei_open.js
Normal file
@ -0,0 +1,135 @@
|
||||
import { load, _ } from './lib/cat.js';
|
||||
let key = '🐰兔小贝';
|
||||
let HOST = 'https://www.tuxiaobei.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
const IOS_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 || IOS_UA,
|
||||
},
|
||||
});
|
||||
return res.content
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const classes = [{ type_id: '', type_name: '🐰全部' }, { type_id: 2, type_name: '🐰儿歌' }, { type_id: 3, type_name: '🐰故事' }, { type_id: 27, type_name: '🐰公益' }, { type_id: 9, type_name: '🐰十万个为什么' }, { type_id: 28, type_name: '🐰安全教育' }, { type_id: 29, type_name: '🐰动物奇缘' }, { type_id: 7, type_name: '🐰弟子规' }, { type_id: 5, type_name: '🐰古诗' }, { type_id: 6, type_name: '🐰三字经' }, { type_id: 8, type_name: '🐰千字文' }, { type_id: 11, type_name: '🐰数学' }, { type_id: 25, type_name: '🐰英语' }, { type_id: 24, type_name: '🐰折纸' }];
|
||||
const filterObj = {};
|
||||
return JSON.stringify({
|
||||
class: _.map(classes, (cls) => {
|
||||
cls.land = 1;
|
||||
cls.ratio = 1.78;
|
||||
return cls;
|
||||
}),
|
||||
filters: filterObj,
|
||||
})
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const link = await request(HOST + '/list/mip-data?typeId=9&page=1&callback=');
|
||||
const html = link.match(/\((.*?)\);/)[1];
|
||||
const data = JSON.parse(html).data;
|
||||
let videos = _.map(data.items, (it) => {
|
||||
return {
|
||||
vod_id: it.video_id,
|
||||
vod_name: it.name,
|
||||
vod_pic: it.image,
|
||||
vod_remarks: it.root_category_name + ' | ' + it.duration_string || '',
|
||||
}
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0 || typeof pg == 'undefined') pg = 1;
|
||||
const link = await request(HOST + '/list/mip-data?typeId=' + tid + '&page=' + pg + '&callback=');
|
||||
const html = link.match(/\((.*?)\);/)[1];
|
||||
const data = JSON.parse(html).data;
|
||||
let videos = _.map(data.items, (it) => {
|
||||
return {
|
||||
vod_id: it.video_id,
|
||||
vod_name: it.name,
|
||||
vod_pic: it.image,
|
||||
vod_remarks: it.root_category_name + ' | ' + it.duration_string || '',
|
||||
}
|
||||
});
|
||||
const pgCount = pg * 30 > data.totalCount ? parseInt(pg) : parseInt(pg) + 1;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: 30,
|
||||
total: data.totalCount,
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_remarks: '',
|
||||
};
|
||||
const playlist = ['点击播放' + '$' + HOST + '/play/' + id];
|
||||
vod.vod_play_from = "道长在线";
|
||||
vod.vod_play_url = playlist.join('#');
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
const html = await request(id);
|
||||
const $ = load(html);
|
||||
const pvideo = $("body mip-search-video[video-src*=http]");
|
||||
const purl = pvideo[0].attribs['video-src'];
|
||||
// console.debug('兔小贝 purl =====>' + purl); // js_debug.log
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: purl,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
const link = HOST + "/search/" + wd;
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const list = $("div.list-con > div.items");
|
||||
let videos = _.map(list, (it) => {
|
||||
const a = $(it).find("a:first")[0];
|
||||
const img = $(it).find("mip-img:first")[0];
|
||||
const tt = $(it).find("p:first")[0];
|
||||
const remarks = $(it).find("p")[1];
|
||||
return {
|
||||
vod_id: a.attribs.href.replace(/.*?\/play\/(.*)/g, '$1'),
|
||||
vod_name: tt.children[0].data,
|
||||
vod_pic: img.attribs["src"],
|
||||
vod_remarks: remarks.children[0].data || "",
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
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,
|
||||
}
|
||||
}
|
118
cat/js/ubestkid_open.js
Normal file
118
cat/js/ubestkid_open.js
Normal file
@ -0,0 +1,118 @@
|
||||
// 无搜索功能
|
||||
import { _ } from './lib/cat.js';
|
||||
let key = '🐯贝乐虎';
|
||||
let HOST = 'https://vd.ubestkid.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
const MOBILE_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, referer, mth, data, hd) {
|
||||
const headers = {
|
||||
"User-Agent": MOBILE_UA,
|
||||
};
|
||||
if (referer) headers.referer = encodeURIComponent(referer);
|
||||
let res = await req(reqUrl, {
|
||||
method: mth || "get",
|
||||
headers: headers,
|
||||
data: data,
|
||||
postType: mth === "post" ? "json" : "",
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const classes = [{ type_id: 65, type_name: '🐯最新上架' }, { type_id: 113, type_name: '🐯人气热播' }, { type_id: 56, type_name: '🐯经典童谣' }, { type_id: 137, type_name: '🐯开心贝乐虎' }, { type_id: 53, type_name: '🐯律动儿歌' }, { type_id: 59, type_name: '🐯经典儿歌' }, { type_id: 101, type_name: '🐯超级汽车1' }, { type_id: 119, type_name: '🐯超级汽车第二季' }, { type_id: 136, type_name: '🐯超级汽车第三季' }, { type_id: 95, type_name: '🐯三字经' }, { type_id: 133, type_name: '🐯幼儿手势舞' }, { type_id: 117, type_name: '🐯哄睡儿歌' }, { type_id: 70, type_name: '🐯英文儿歌' }, { type_id: 116, type_name: '🐯节日与节气' }, { type_id: 97, type_name: '🐯恐龙世界' }, { type_id: 55, type_name: '🐯动画片儿歌' }, { type_id: 57, type_name: '🐯流行歌曲' }, { type_id: 118, type_name: '🐯贝乐虎入园记' }, { type_id: 106, type_name: '🐯贝乐虎大百科' }, { type_id: 62, type_name: '🐯经典古诗' }, { type_id: 63, type_name: '🐯经典故事' }, { type_id: 128, type_name: '🐯萌虎学功夫' }, { type_id: 100, type_name: '🐯绘本故事' }, { type_id: 121, type_name: '🐯开心贝乐虎英文版' }, { type_id: 96, type_name: '🐯嗨贝乐虎情商动画' }, { type_id: 108, type_name: '🐯动物音乐派对' }, { type_id: 126, type_name: '🐯动物音乐派对英文版' }, { type_id: 105, type_name: '🐯奇妙的身体' }, { type_id: 124, type_name: '🐯奇妙的身体英文版' }, { type_id: 64, type_name: '🐯认知卡片' }, { type_id: 109, type_name: '🐯趣味简笔画' }, { type_id: 78, type_name: '🐯数字儿歌' }, { type_id: 120, type_name: '🐯识字体验版' }, { type_id: 127, type_name: '🐯启蒙系列体验版' }];
|
||||
const filterObj = {};
|
||||
return JSON.stringify({
|
||||
class: _.map(classes, (cls) => {
|
||||
cls.land = 1;
|
||||
cls.ratio = 1.78;
|
||||
return cls;
|
||||
}),
|
||||
filters: filterObj,
|
||||
})
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const link = HOST + "/api/v1/bv/video";
|
||||
const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: 56, "p": 1 };
|
||||
const jo = JSON.parse(await request(link, "", "post", pdata)).result;
|
||||
const videos = [];
|
||||
_.each(jo.items, (it) => {
|
||||
videos.push({
|
||||
vod_id: it.url,
|
||||
vod_name: it.title,
|
||||
vod_pic: it.image,
|
||||
vod_remarks: '👀' + it.viewcount || '',
|
||||
})
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0 || typeof pg == 'undefined') pg = 1;
|
||||
const link = HOST + "/api/v1/bv/video";
|
||||
const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: tid, "p": pg };
|
||||
const jo = JSON.parse(await request(link, "", "post", pdata)).result;
|
||||
const videos = [];
|
||||
_.each(jo.items, (it) => {
|
||||
videos.push({
|
||||
vod_id: it.url,
|
||||
vod_name: it.title,
|
||||
vod_pic: it.image,
|
||||
vod_remarks: '👀' + it.viewcount || '',
|
||||
})
|
||||
});
|
||||
const pgCount = pg * 60 > jo.total ? parseInt(pg) : parseInt(pg) + 1;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: 60,
|
||||
total: jo.total,
|
||||
list: videos,
|
||||
})
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_remarks: '',
|
||||
};
|
||||
const playlist = ['点击播放' + '$' + id];
|
||||
vod.vod_play_from = "道长在线";
|
||||
vod.vod_play_url = playlist.join('#');
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
// console.debug('贝乐虎 id =====>' + id); // js_debug.log
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: id,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
return '{}'
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
}
|
||||
}
|
1
cat/js/ufc_open.js
Normal file
1
cat/js/ufc_open.js
Normal file
File diff suppressed because one or more lines are too long
114
cat/js/upyun_open.js
Normal file
114
cat/js/upyun_open.js
Normal file
@ -0,0 +1,114 @@
|
||||
import { Crypto, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'upyun';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://zyb.upyunso.com';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/
|
||||
|
||||
async function request(reqUrl) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'Referer': siteUrl,
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
return await detailContent(id);
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 25;
|
||||
const resp = await request(siteUrl + "/v15/search?keyword=" + encodeURIComponent(wd) + '&page=' + pg + '&s_type=2');
|
||||
const data = decrypt(resp);
|
||||
const items = JSON.parse(data).result.items;
|
||||
const videos = [];
|
||||
for(const item of items) {
|
||||
const url = decrypt(item.page_url);
|
||||
const matches = url.match(patternAli);
|
||||
if (_.isEmpty(matches)) continue;
|
||||
const title = _.isEmpty(item.content) ? item.title : item.content[0].title;
|
||||
videos.push({
|
||||
vod_id: url,
|
||||
vod_name: title.replaceAll(/<\/?[^>]+>/g, ""),
|
||||
vod_pic: "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
vod_remarks: item.insert_time,
|
||||
});
|
||||
}
|
||||
const hasMore = !_.isEmpty(items);
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
function decrypt(text) {
|
||||
const data = {
|
||||
ciphertext: Crypto.enc.Hex.parse(text.toUpperCase()),
|
||||
};
|
||||
const key = Crypto.enc.Utf8.parse('qq1920520460qqzz');
|
||||
const iv = Crypto.enc.Utf8.parse('qq1920520460qqzz');
|
||||
const mode = Crypto.mode.CBC;
|
||||
const padding = Crypto.pad.Pkcs7;
|
||||
const decrypted = Crypto.AES.decrypt(data, key, {
|
||||
'iv': iv,
|
||||
'mode': mode,
|
||||
'padding': padding
|
||||
});
|
||||
const decryptedData = Crypto.enc.Utf8.stringify(decrypted);
|
||||
return decryptedData;
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/voflix_open.js
Normal file
1
cat/js/voflix_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/vsdj_open.js
Normal file
1
cat/js/vsdj_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/wf_open.js
Normal file
1
cat/js/wf_open.js
Normal file
File diff suppressed because one or more lines are too long
171
cat/js/wobg_open.js
Normal file
171
cat/js/wobg_open.js
Normal file
@ -0,0 +1,171 @@
|
||||
import {load, _, Uri} from 'assets://js/lib/cat.js';
|
||||
import {log} from './lib/utils.js';
|
||||
import {initAli, detailContent, playContent} from './lib/ali.js';
|
||||
|
||||
let siteKey = 'wobg';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://wobge.run.goorm.io';
|
||||
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|alipan)\.com\/s\/[^"]+)/
|
||||
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg.ext);
|
||||
} catch (e) {
|
||||
console.debug('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{'type_id':'1','type_name':'自营电影'},{'type_id':'2','type_name':'自营剧集'},{'type_id':'3','type_name':'动漫'},{'type_id':'4','type_name':'综艺'},{'type_id':'5','type_name':'音乐'},{'type_id':'44','type_name':'自营短剧'}];
|
||||
let filterObj = {
|
||||
'1':[{'key':'cateId','name':'类型','init':'1','value':[{'n':'全部','v':'1'},{'n':'大陆自营电影','v':'6'},{'n':'香港自营电影','v':'7'},{'n':'台湾自营电影','v':'8'},{'n':'美国自营电影','v':'9'},{'n':'法国自营电影','v':'10'},{'n':'英国自营电影','v':'11'},{'n':'日本自营电影','v':'12'},{'n':'韩国自营电影','v':'20'},{'n':'德国自营电影','v':'21'}]},{'key':'class','name':'剧情','init':'','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':'古装','v':'古装'},{'n':'历史','v':'历史'},{'n':'运动','v':'运动'},{'n':'农村','v':'农村'},{'n':'儿童','v':'儿童'},{'n':'网络电影','v':'网络电影'}]},{'key':'area','name':'地区','init':'','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':'lang','name':'语言','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','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':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'2':[{'key':'cateId','name':'类型','init':'2','value':[{'n':'全部','v':'2'},{'n':'大陆自营剧集','v':'13'},{'n':'香港自营剧集','v':'14'},{'n':'台湾自营剧集','v':'15'},{'n':'美国自营剧集','v':'16'},{'n':'法国自营剧集','v':'22'},{'n':'英国自营剧集','v':'23'},{'n':'日本自营剧集','v':'24'},{'n':'韩国自营剧集','v':'25'},{'n':'德国自营剧集','v':'26'}]},{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'内地','v':'内地'},{'n':'韩国','v':'韩国'},{'n':'香港','v':'香港'},{'n':'台湾','v':'台湾'},{'n':'日本','v':'日本'},{'n':'美国','v':'美国'},{'n':'泰国','v':'泰国'},{'n':'英国','v':'英国'},{'n':'新加坡','v':'新加坡'},{'n':'其他','v':'其他'}]},{'key':'lang','name':'语言','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','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':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'3':[{'key':'cateId','name':'类型','init':'3','value':[{'n':'全部','v':'3'},{'n':'大陆动漫','v':'27'},{'n':'香港动漫','v':'28'},{'n':'台湾动漫','v':'29'},{'n':'美国动漫','v':'30'},{'n':'法国动漫','v':'31'},{'n':'英国动漫','v':'32'},{'n':'日本动漫','v':'33'},{'n':'韩国动漫','v':'34'},{'n':'德国动漫','v':'35'}]},{'key':'class','name':'剧情','init':'','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':'地区','init':'','value':[{'n':'全部','v':''},{'n':'内地','v':'内地'},{'n':'港台','v':'港台'},{'n':'日韩','v':'日韩'},{'n':'欧美','v':'欧美'}]},{'key':'lang','name':'语言','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','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':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'4':[{'key':'cateId','name':'类型','init':'4','value':[{'n':'全部','v':'4'},{'n':'大陆综艺','v':'36'},{'n':'香港综艺','v':'37'},{'n':'台湾综艺','v':'38'},{'n':'美国综艺','v':'39'},{'n':'法国综艺','v':'40'},{'n':'英国综艺','v':'41'},{'n':'日本综艺','v':'42'},{'n':'韩国综艺','v':'43'}]},{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'国产','v':'国产'},{'n':'日本','v':'日本'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'lang','name':'语言','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','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':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'5':[{'key':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'44':[{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'内地','v':'内地'}]},{'key':'lang','name':'语言','init':'','value':[{'n':'全部','v':''},{'n':'国语','v':'国语'},{'n':'英语','v':'英语'},{'n':'粤语','v':'粤语'},{'n':'闽南语','v':'闽南语'},{'n':'韩语','v':'韩语'},{'n':'日语','v':'日语'},{'n':'法语','v':'法语'},{'n':'德语','v':'德语'},{'n':'其它','v':'其它'}]},{'key':'year','name':'年份','init':'','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':'letter','name':'字母','init':'','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'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
};
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const clazz = getFilterUrlPart(extend, 'class');
|
||||
const area = getFilterUrlPart(extend, 'area');
|
||||
const by = getFilterUrlPart(extend, 'by');
|
||||
const lang = getFilterUrlPart(extend, 'lang');
|
||||
const letter = getFilterUrlPart(extend, 'letter');
|
||||
const year = getFilterUrlPart(extend, 'year');
|
||||
let reqUrl = siteUrl + '/index.php/vod/show' + area + by + clazz + '/id/' + (extend.cateId || tid) + lang + '/page/' + pg + letter + year + '.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,
|
||||
});
|
||||
}
|
||||
|
||||
function getFilterUrlPart(extend, part) {
|
||||
let result = '';
|
||||
if (extend[part]) {
|
||||
result = '/' + part + '/' + extend[part];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
await log('detail:id:' + 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 '';
|
||||
} catch (e) {
|
||||
console.debug( 'detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
console.debug( 'play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
await log('search' + wd);
|
||||
let searchUrl = siteUrl + '/index.php/vod/search.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
cat/js/wogg.js
Normal file
1
cat/js/wogg.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/wogg_open.js
Normal file
1
cat/js/wogg_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/wpian_open.js
Normal file
1
cat/js/wpian_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/xiaoya.js
Normal file
1
cat/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};
|
1
cat/js/xiaoya_open.js
Normal file
1
cat/js/xiaoya_open.js
Normal file
File diff suppressed because one or more lines are too long
148
cat/js/xiaozhitiao_open.js
Normal file
148
cat/js/xiaozhitiao_open.js
Normal file
@ -0,0 +1,148 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'xiaozhitiao';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://gitcafe.net/tool/alipaper/';
|
||||
let aliUrl = "https://www.aliyundrive.com/s/";
|
||||
let token = '';
|
||||
let date = new Date();
|
||||
|
||||
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, data) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'post',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
},
|
||||
data: data,
|
||||
postType: 'form',
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg.ext);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const classes = [{'type_id':'1','type_name':'电视'},{'type_id':'2','type_name':'电影'},{'type_id':'3','type_name':'动漫'},{'type_id':'4','type_name':'视频'},{'type_id':'5','type_name':'音乐'}];
|
||||
const filterObj = {
|
||||
'1':[{'key':'class','name':'类型','init':'hyds','value':[{'n':'华语','v':'hyds'},{'n':'日韩','v':'rhds'},{'n':'欧美','v':'omds'},{'n':'其他','v':'qtds'}]}],
|
||||
'2':[{'key':'class','name':'类型','init':'hydy','value':[{'n':'华语','v':'hydy'},{'n':'日韩','v':'rhdy'},{'n':'欧美','v':'omdy'},{'n':'其他','v':'qtdy'}]}],
|
||||
'3':[{'key':'class','name':'类型','init':'hydm','value':[{'n':'国漫','v':'hydm'},{'n':'日本','v':'rhdm'},{'n':'欧美','v':'omdm'}]}],
|
||||
'4':[{'key':'class','name':'类型','init':'jlp','value':[{'n':'纪录','v':'jlp'},{'n':'综艺','v':'zyp'},{'n':'教育','v':'jypx'},{'n':'其他','v':'qtsp'}]}],
|
||||
'5':[{'key':'class','name':'类型','init':'hyyy','value':[{'n':'华语','v':'hyyy'},{'n':'日韩','v':'rhyy'},{'n':'欧美','v':'omyy'},{'n':'其他','v':'qtyy'}]}],
|
||||
};
|
||||
return {
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
};
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const params = {
|
||||
action: "viewcat",
|
||||
cat: extend.class,
|
||||
num: pg,
|
||||
token: await getToken(),
|
||||
};
|
||||
const resp = await request(siteUrl, params);
|
||||
const json = JSON.parse(resp);
|
||||
const videos = _.map(json.data, (item) => {
|
||||
return {
|
||||
vod_id: aliUrl + item.alikey,
|
||||
vod_name: item.title,
|
||||
vod_pic: "https://i2.100024.xyz/2024/01/31/xp4o7o.webp",
|
||||
vod_remarks: item.creatime
|
||||
};
|
||||
});
|
||||
const pgCount = _.isEmpty(videos) ? pg : pg + 1;
|
||||
const limit = 50;
|
||||
return {
|
||||
page: pg,
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
};
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
return await detailContent(id);
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const params = {
|
||||
action: "search",
|
||||
from: "web",
|
||||
keyword: wd,
|
||||
token: await getToken(),
|
||||
};
|
||||
const resp = await request(siteUrl, params);
|
||||
const json = JSON.parse(resp);
|
||||
const videos = _.map(json.data, (item) => {
|
||||
return {
|
||||
vod_id: aliUrl + item.alikey,
|
||||
vod_name: item.title,
|
||||
vod_pic: "https://i2.100024.xyz/2024/01/31/xp4o7o.webp",
|
||||
vod_remarks: item.creatime
|
||||
};
|
||||
});
|
||||
return {
|
||||
list: videos,
|
||||
};
|
||||
}
|
||||
|
||||
async function getToken() {
|
||||
const newDate = new Date();
|
||||
if (_.isEmpty(token) || newDate > date) {
|
||||
const params = {
|
||||
action: "get_token",
|
||||
};
|
||||
const resp = await request(siteUrl, params);
|
||||
const json = JSON.parse(resp);
|
||||
if (json.success) {
|
||||
token = json.data;
|
||||
date = newDate;
|
||||
}
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
195
cat/js/xinshijue_open.js
Normal file
195
cat/js/xinshijue_open.js
Normal file
@ -0,0 +1,195 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'xinshijue';
|
||||
let HOST = 'https://www.hdmyy.com';
|
||||
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, timeout = 20000) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': HOST
|
||||
},
|
||||
timeout: timeout,
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{'type_id':1,'type_name':'电影'},{'type_id':2,'type_name':'电视剧'},{'type_id':3,'type_name':'综艺'},{'type_id':4,'type_name':'动漫'},{'type_id':63,'type_name':'纪录片'}];
|
||||
let filterObj = {
|
||||
'1':[{'key':'class','name':'剧情','init':'','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':'古装','v':'古装'},{'n':'历史','v':'历史'},{'n':'运动','v':'运动'},{'n':'农村','v':'农村'},{'n':'儿童','v':'儿童'},{'n':'网络电影','v':'网络电影'}]},{'key':'area','name':'地区','init':'','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':'年份','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'2':[{'key':'class','name':'剧情','init':'','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':'短剧','v':'短剧'},{'n':'其他','v':'其他'}]},{'key':'area','name':'地区','init':'','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':'其他'}]},{'key':'year','name':'年份','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'3':[{'key':'class','name':'剧情','init':'','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':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'港台','v':'港台'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'4':[{'key':'class','name':'剧情','init':'','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':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'日本','v':'日本'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','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':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'63':[{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = pg;
|
||||
}
|
||||
const link = HOST + '/vodshow/' + tid + '-' + (extend.area || '') + '-' + (extend.by || '') + '-' + (extend.class || '') + '-' + (extend.lang || '') + '-' + (extend.letter || '') + '---' + page + '---' + (extend.year || '') + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('.module-list .module-item');
|
||||
const videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const link = $item.find('.module-item-content a:first').attr('href');
|
||||
const title = $item.find('.video-name').text().trim();
|
||||
const img = $item.find('.module-item-pic img:first').attr('data-src');
|
||||
const remarks = $item.find('.module-item-text').text().trim();
|
||||
return {
|
||||
vod_id: link.replace(/.*?\/video\/(.*).html/g, '$1'),
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('#page a.page-next:contains(下一页)').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 40;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(HOST + '/video/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('h1.page-title').text().trim(),
|
||||
vod_type: $('.video-info-aux a.tag-link:first').text().trim(),
|
||||
vod_area: $('.video-info-aux a.tag-link:eq(2)').text().trim(),
|
||||
vod_year: $('.video-info-aux a.tag-link:eq(1)').text().trim(),
|
||||
vod_director: $('.video-info-main .video-info-items:contains(导演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||
vod_actor: $('.video-info-main .video-info-items:contains(主演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||
vod_pic: $('.video-cover img:first').attr('data-src'),
|
||||
vod_remarks : $('.video-info-main .video-info-items:contains(备注:)').text().substring(3) || '',
|
||||
vod_content: $('.video-info-main .video-info-items:contains(剧情:)').text().substring(3).trim().replace(/收起$/g, ''),
|
||||
};
|
||||
const playMap = {};
|
||||
const tabs = $('.module-player-tab .module-tab-item');
|
||||
const playlists = $('.module-player-list > .module-blocklist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const $tab = $(tab);
|
||||
const from = $tab.find('span:first').text().trim();
|
||||
if (from.includes('夸克')) return;
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const $it = $(it);
|
||||
const title = $it.find('span:first').text().trim();
|
||||
const playUrl = $it.attr('href');
|
||||
if (!playMap.hasOwnProperty(from)) {
|
||||
playMap[from] = [];
|
||||
}
|
||||
playMap[from].push(title + '$' + playUrl);
|
||||
});
|
||||
});
|
||||
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||
const urls = _.values(playMap);
|
||||
const 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) {
|
||||
const link = HOST + id;
|
||||
const html = await request(link);
|
||||
let $ = load(html);
|
||||
let json = $('script:contains(player_aaaa)').text().replace('var player_aaaa=','');
|
||||
let js = JSON.parse(json);
|
||||
let playUrl = js.url;
|
||||
if (js.encrypt == 1) {
|
||||
playUrl = unescape(playUrl);
|
||||
} else if (js.encrypt == 2) {
|
||||
playUrl = unescape(base64Decode(playUrl));
|
||||
}
|
||||
let playHtml = await request('https://jx3.xn--1lq90i13mxk5bolhm8k.xn--fiqs8s/player/ec.php?code=ak&if=1&url=' + playUrl);
|
||||
json = playHtml.match(/let ConFig = {([\w\W]*)},box/)[1];
|
||||
const jsConfig = JSON.parse('{' + json.trim() + '}');
|
||||
playUrl = decryptUrl(jsConfig);
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
header: {
|
||||
'User-Agent': UA,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function decryptUrl(jsConfig) {
|
||||
const key = Crypto.enc.Utf8.parse('2890' + jsConfig.config.uid + 'tB959C');
|
||||
const iv = Crypto.enc.Utf8.parse('2F131BE91247866E');
|
||||
const mode = Crypto.mode.CBC;
|
||||
const padding = Crypto.pad.Pkcs7;
|
||||
const decrypted = Crypto.AES.decrypt(jsConfig.url, key, {
|
||||
'iv': iv,
|
||||
'mode': mode,
|
||||
'padding': padding
|
||||
});
|
||||
const decryptedUrl = Crypto.enc.Utf8.stringify(decrypted);
|
||||
return decryptedUrl;
|
||||
}
|
||||
|
||||
function base64Decode(text) {
|
||||
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let data = JSON.parse(await request(HOST + '/index.php/ajax/suggest?mid=1&limit=50&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,
|
||||
};
|
||||
}
|
127
cat/js/yiso_open.js
Normal file
127
cat/js/yiso_open.js
Normal file
@ -0,0 +1,127 @@
|
||||
import { Crypto, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'yiso';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://yiso.fun';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/;
|
||||
let cookie = '';
|
||||
|
||||
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) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
'Cookie': cookie,
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
const ext = _.isEmpty(cfg.ext) ? '' : cfg.ext;
|
||||
const configs = ext.split('$$$');
|
||||
if (configs.length == 2) {
|
||||
cookie = configs[1];
|
||||
}
|
||||
const token = {
|
||||
ext: configs[0]
|
||||
};
|
||||
await initAli(token);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let matches = id.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[0]);
|
||||
return '';
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 10;
|
||||
const resp = await request(siteUrl + "/api/search?name=" + encodeURIComponent(wd) + '&pageNo=' + pg + '&from=ali');
|
||||
const json = JSON.parse(resp).data;
|
||||
const total = json.total;
|
||||
const videos = _.map(json.list, (item) => {
|
||||
const name = item.fileInfos[0].fileName;
|
||||
const remark = item.gmtCreate;
|
||||
const url = decryptUrl(item.url);
|
||||
return {
|
||||
vod_id: url,
|
||||
vod_name: name,
|
||||
vod_pic: "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
vod_remarks: remark,
|
||||
};
|
||||
});
|
||||
const pgCount = parseInt(total / limit) + 1;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: total,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
function decryptUrl(url) {
|
||||
const data = {
|
||||
ciphertext: Crypto.enc.Base64.parse(url),
|
||||
};
|
||||
const key = Crypto.enc.Utf8.parse('4OToScUFOaeVTrHE');
|
||||
const iv = Crypto.enc.Utf8.parse('9CLGao1vHKqm17Oz');
|
||||
const mode = Crypto.mode.CBC;
|
||||
const padding = Crypto.pad.Pkcs7;
|
||||
const decrypted = Crypto.AES.decrypt(data, key, {
|
||||
'iv': iv,
|
||||
'mode': mode,
|
||||
'padding': padding
|
||||
});
|
||||
const decryptedUrl = Crypto.enc.Utf8.stringify(decrypted);
|
||||
return decryptedUrl;
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
149
cat/js/yjys_open.js
Normal file
149
cat/js/yjys_open.js
Normal file
@ -0,0 +1,149 @@
|
||||
import { Crypto, load, _, jinja2 } from './lib/cat.js';
|
||||
|
||||
let key = 'yjys';
|
||||
let HOST = 'https://m.7caa.com';
|
||||
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': HOST
|
||||
},
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{"type_id":1,"type_name":"电影"},{"type_id":2,"type_name":"追剧"},{"type_id":3,"type_name":"综艺"},{"type_id":4,"type_name":"动漫"}];
|
||||
let filterObj = {
|
||||
"1":[{"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":"悬疑"}]},{"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"}]}],
|
||||
"2":[{"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":"其他"}]},{"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"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]}],
|
||||
"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":"欧美"}]},{"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"}]}],
|
||||
"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":"原创"}]},{"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"}]}]
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const link = HOST + '/vshow/' + tid + '-' + (extend.area || '') + '--' + (extend.class || '') + '-----' + pg + '---' + (extend.year || '') + '.html';//https://m.7caa.com/vshow/1-%E7%BE%8E%E5%9B%BD--%E7%88%B1%E6%83%85-----2---2020.html
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('ul.stui-vodlist > li');
|
||||
let videos = _.map(items, (item) => {
|
||||
const it = $(item).find('a:first')[0];
|
||||
const remarks = $($(item).find('span.pic-text text-right')[0]).text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/vod\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: it.attribs['data-original'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('ul.stui-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) {
|
||||
var html = await request( HOST + '/play/' + id + '-1-1' + '.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 = $('ul.dropdown-menu > li > a');
|
||||
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.replace(/\/play\/(.*).html/g, '$1');
|
||||
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) {
|
||||
const link = HOST + '/play/' + id + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
const playurl = js.url;
|
||||
const playUrl = unescape(playurl);
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
let data = JSON.parse(await request(HOST + '/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,
|
||||
};
|
||||
}
|
1
cat/js/ym_open.js
Normal file
1
cat/js/ym_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yqktv_open.js
Normal file
1
cat/js/yqktv_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yqktv_open2.js
Normal file
1
cat/js/yqktv_open2.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yrzj.js
Normal file
1
cat/js/yrzj.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yrzj_open.js
Normal file
1
cat/js/yrzj_open.js
Normal file
File diff suppressed because one or more lines are too long
272
cat/js/ys996_open.js
Normal file
272
cat/js/ys996_open.js
Normal file
@ -0,0 +1,272 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
|
||||
let siteUrl = 'https://www.cs1369.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
let headers = {};
|
||||
|
||||
async function request(reqUrl, postData, agentSp, get) {
|
||||
|
||||
let res = await req(reqUrl, {
|
||||
method: get ? 'get' : 'post',
|
||||
headers: headers,
|
||||
data: postData || {},
|
||||
postType: get ? '' : 'form',
|
||||
});
|
||||
|
||||
let content = res.content;
|
||||
return content;
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{
|
||||
type_id: '1',
|
||||
type_name: '电影',
|
||||
},{
|
||||
type_id: '2',
|
||||
type_name: '电视',
|
||||
},{
|
||||
type_id: '3',
|
||||
type_name: '动漫',
|
||||
}];
|
||||
|
||||
let filterObj = genFilterObj();
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
let videos = await getVideos(siteUrl);
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
let url = siteUrl;
|
||||
if (filter) {
|
||||
url = url + '/show';
|
||||
let area = extend['area'];
|
||||
if (area && area != '') {
|
||||
url = url + '/area/' + area;
|
||||
}
|
||||
let clazz = extend['class']
|
||||
if (clazz && clazz != '') {
|
||||
url = url + '/class/' + clazz;
|
||||
}
|
||||
let id = extend['id'];
|
||||
if(id && id != '') {
|
||||
url = url + '/id/' + id;
|
||||
} else {
|
||||
url = url + '/id/' + tid;
|
||||
}
|
||||
let year = extend['year'];
|
||||
if (year && year != '') {
|
||||
url = url + '/year/' + year;
|
||||
}
|
||||
if (pg && pg > 1) {
|
||||
url = url + '/page/' + pg;
|
||||
}
|
||||
url = url + '.html';
|
||||
} else {
|
||||
url = url + '/vod/type';
|
||||
url = url + '/id/' + tid;
|
||||
if (pg && pg > 1) {
|
||||
url = url + '/page/' + pg;
|
||||
}
|
||||
url = url + '.html';
|
||||
}
|
||||
//console.log('cate page url:', url);
|
||||
|
||||
let videos = await getVideos(url);
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
page: pg
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let url = siteUrl + id;
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
let actors = _.map($('div.stui-content__detail > p:nth-child(3) > a'), (n) => {
|
||||
return $(n).text();
|
||||
});
|
||||
let actor = actors.join(' ');
|
||||
let director = $('div.stui-content__detail > p:nth-child(4) > a').text();
|
||||
let title = $('div.stui-content__detail > h1.title').text();
|
||||
let content = $('div.stui-pannel_bd > p').text();
|
||||
const cards = $('div.stui-pannel_bd.col-pd.clearfix > ul > li > a');
|
||||
let playUrls = _.map(cards, (n) => {
|
||||
return $(n).text() + '$' + n.attribs['href'];
|
||||
});
|
||||
|
||||
const video = {
|
||||
vod_actor: actor,
|
||||
vod_play_from: 'Leospring',
|
||||
vod_play_url: playUrls.join('#'),
|
||||
vod_director: director,
|
||||
vod_content: content,
|
||||
};
|
||||
const list = [video];
|
||||
const result = { list };
|
||||
return JSON.stringify(result);
|
||||
} catch (e) {
|
||||
//console.log('err', e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let url = siteUrl + '/search/wd/' + wd + '.html';
|
||||
//console.log('search url:', url);
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
const cards = $('div.stui-pannel_bd > ul.stui-vodlist__media.col-pd.clearfix > li');
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = $($(n).find('div.thumb > a')[0]).attr('href');
|
||||
let name = $($(n).find('div.thumb > a')[0]).attr('title');
|
||||
let pic = $($(n).find('div.thumb > a')[0]).attr('data-original');
|
||||
let remark = $($(n).find('div.thumb > a > span:nth-child(2)')[0]).text();
|
||||
|
||||
return {
|
||||
vod_id: id,
|
||||
vod_name: name,
|
||||
vod_pic: pic,
|
||||
vod_remarks: remark,
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
let url = siteUrl + id;
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
let info = '';
|
||||
for(const n of $('script')) {
|
||||
if($(n).text().indexOf('player_aaaa=') > 0) {
|
||||
info = $(n).text().split('player_aaaa=')[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
//console.log('info', info);
|
||||
let obj = JSON.parse(info);
|
||||
let playUrl = obj.url;
|
||||
if(obj.encrypt == 1) {
|
||||
playUrl = unescape(playUrl);
|
||||
} else if (obj.encrypt == 2) {
|
||||
playUrl = unescape(base64Decode(playUrl))
|
||||
}
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function genFilterObj() {
|
||||
return {
|
||||
'1':[
|
||||
{
|
||||
key: 'id',
|
||||
name: '类型',
|
||||
value: [{n:'全部',v:''},{n:'动作片',v:'6'},{n:'喜剧片',v:'7'},{n:'爱情片',v:'8'},{n:'科幻片',v:'9'},{n:'恐怖片',v:'10'},{n:'剧情片',v:'11'},{n:'战争片',v:'12'},{n:'动画片',v:'13'},{n:'纪录片',v:'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:'历史',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:'英国'},{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'},{n:'2003',v:'2003'},{n:'2002',v:'2002'},{n:'2001',v:'2001'},{n:'2000',v:'2000'}]
|
||||
}],
|
||||
'2':[{
|
||||
key: 'id',
|
||||
name: '类型',
|
||||
value: [{n:'全部',v:''},{n:'内地',v:'15'},{n:'美国',v:'16'},{n:'英国',v:'17'},{n:'韩国',v:'18'},{n:'泰国',v:'20'},{n:'日本',v:'21'},{n:'香港',v:'22'},{n:'台湾',v:'23'}]
|
||||
},{
|
||||
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:'网剧'}]
|
||||
},{
|
||||
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'},{n:'2009',v:'2009'},{n:'2008',v:'2008'},{n:'2007',v:'2007'},{n:'2006',v:'2006'},{n:'2005',v:'2005'},{n:'2004',v:'2004'},{n:'2003',v:'2003'},{n:'2002',v:'2002'},{n:'2001',v:'2001'},{n:'2000',v:'2000'}]
|
||||
}],
|
||||
'3':[{
|
||||
key: 'id',
|
||||
name: '类型',
|
||||
value: [{n:'全部',v:''},{n:'内地',v:'25'},{n:'日漫',v:'26'},{n:'欧美',v:'27'},{n:'其他',v:'28'}]
|
||||
},{
|
||||
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:'励志'}]
|
||||
},{
|
||||
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'},{n:'2009',v:'2009'},{n:'2008',v:'2008'},{n:'2007',v:'2007'},{n:'2006',v:'2006'},{n:'2005',v:'2005'},{n:'2004',v:'2004'},{n:'2003',v:'2003'},{n:'2002',v:'2002'},{n:'2001',v:'2001'},{n:'2000',v:'2000'}]
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
async function getVideos(url) {
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
const cards = $('div.stui-vodlist__box > a')
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = n.attribs['href'];
|
||||
let name = n.attribs['title'];
|
||||
let pic = n.attribs['data-original'];
|
||||
let remark = $($(n).find('span:nth-child(2)')[0]).text();
|
||||
return {
|
||||
vod_id: id,
|
||||
vod_name: name,
|
||||
vod_pic: pic,
|
||||
vod_remarks: remark,
|
||||
};
|
||||
});
|
||||
return videos;
|
||||
}
|
||||
|
||||
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,
|
||||
};
|
||||
}
|
1
cat/js/yt.js
Normal file
1
cat/js/yt.js
Normal file
File diff suppressed because one or more lines are too long
133
cat/js/yunpan4k_open.js
Normal file
133
cat/js/yunpan4k_open.js
Normal file
@ -0,0 +1,133 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'yunpan4k';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://www.codelicence.cn';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/;
|
||||
|
||||
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 requestRaw(reqUrl, method, data, redirect) {
|
||||
let res = await req(reqUrl, {
|
||||
method: method || 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
},
|
||||
data: data,
|
||||
postType: method === 'post' ? 'form' : '',
|
||||
redirect: redirect == 0 ? 0 : 1,
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
async function request(reqUrl, method, data) {
|
||||
let resRaw = await requestRaw(reqUrl, method, data);
|
||||
return resRaw.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
await initAli(cfg.ext);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let matches = id.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[1]);
|
||||
const html = await request(siteUrl + id);
|
||||
const $ = load(html);
|
||||
const href = $('div.down a:first').attr('href');
|
||||
const data = await requestRaw(siteUrl + href, 'get', null, 0);
|
||||
const headers = data.headers;
|
||||
let url = '';
|
||||
if (headers.hasOwnProperty('location')) {
|
||||
url = headers['location'];
|
||||
}
|
||||
matches = url.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[1]);
|
||||
return '';
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 20;
|
||||
const param = {
|
||||
keyboard: wd,
|
||||
};
|
||||
const data = await requestRaw(siteUrl + '/search', 'post', param);
|
||||
let html = '';
|
||||
const headers = data.headers;
|
||||
if (headers.hasOwnProperty('location')) {
|
||||
const url = headers['location'] + '?p=' + pg;
|
||||
html = await request(url);
|
||||
}
|
||||
|
||||
const $ = load(html);
|
||||
const elements = $('ul#url');
|
||||
const videos = _.map(elements, (item) => {
|
||||
const element = $(item);
|
||||
const href = element.find('a.l').attr('href');
|
||||
if (!href) return undefined;
|
||||
const name = element.text().trim();
|
||||
const remark = element.find('li.r').attr('data_size');
|
||||
console.debug('vod_id:' + href);
|
||||
return {
|
||||
vod_id: href,
|
||||
vod_name: name,
|
||||
vod_pic: "https://pic.rmb.bdstatic.com/bjh/6a2278365c10139b5b03229c2ecfeea4.jpeg",
|
||||
vod_remarks: remark,
|
||||
};
|
||||
});
|
||||
const nextPage = $('.pages_search .nex:contains(下一页)');
|
||||
const hasMore = !_.isEmpty(nextPage);
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos.filter(item => item !== undefined),
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/yzys.js
Normal file
1
cat/js/yzys.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yzys_open.js
Normal file
1
cat/js/yzys_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yzz_open.js
Normal file
1
cat/js/yzz_open.js
Normal file
File diff suppressed because one or more lines are too long
153
cat/js/zhaozy_open.js
Normal file
153
cat/js/zhaozy_open.js
Normal file
@ -0,0 +1,153 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
import { log } from './lib/utils.js';
|
||||
import { initAli, detailContent, playContent } from './lib/ali.js';
|
||||
|
||||
let siteKey = 'zhaozy';
|
||||
let siteType = 0;
|
||||
let siteUrl = 'https://zhaoziyuan.pw';
|
||||
let patternAli = /(https:\/\/www\.(aliyundrive|alipan)\.com\/s\/[^"]+)/;
|
||||
let patternVid = /(\\S+)/;
|
||||
let username = '';
|
||||
let password = '';
|
||||
let cookie = '';
|
||||
|
||||
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 requestRaw(reqUrl, headers, method, data) {
|
||||
let res = await req(reqUrl, {
|
||||
method: method || 'get',
|
||||
headers: headers,
|
||||
data: data,
|
||||
postType: method === 'post' ? 'form' : '',
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
async function request(reqUrl, headers) {
|
||||
let resRaw = await requestRaw(reqUrl, headers);
|
||||
return resRaw.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
try {
|
||||
siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey;
|
||||
siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype;
|
||||
const ext = _.isEmpty(cfg.ext) ? '' : cfg.ext;
|
||||
const configs = ext.split('$$$');
|
||||
if (configs.length == 3) {
|
||||
username = configs[1];
|
||||
password = configs[2];
|
||||
}
|
||||
await initAli(configs[0]);
|
||||
} catch (e) {
|
||||
await log('init:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
return '{}';
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let matches = id.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[1]);
|
||||
const headers = await getHeaders();
|
||||
const data = await request(siteUrl + '/' + id, headers);
|
||||
matches = data.match(patternAli);
|
||||
if (!_.isEmpty(matches)) return await detailContent(matches[1]);
|
||||
return '';
|
||||
} catch (e) {
|
||||
await log('detail:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
try {
|
||||
return await playContent(flag, id, flags);
|
||||
} catch (e) {
|
||||
await log('play:' + e.message + ' line:' + e.lineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const limit = 15;
|
||||
const headers = await getHeaders();
|
||||
const html = await request(siteUrl + '/so?filename=' + encodeURIComponent(wd) + '&page=' + pg, headers);
|
||||
const $ = load(html);
|
||||
const elements = $('div.li_con div.news_text');
|
||||
const videos = _.map(elements, (item) => {
|
||||
const element = $(item);
|
||||
const href = element.find('div.news_text a').attr('href');
|
||||
if (!href) return undefined;
|
||||
const matches = href.match(patternVid);
|
||||
if (!_.isEmpty(matches)) return undefined;
|
||||
const name = element.find("div.news_text a h3").text();
|
||||
const remark = element.find("div.news_text a p").text().split("|")[1].split(":")[1];
|
||||
return {
|
||||
vod_id: href,
|
||||
vod_name: name,
|
||||
vod_pic: "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
vod_remarks: remark
|
||||
};
|
||||
});
|
||||
const nextPage = $('.page a li:contains(下一页)');
|
||||
const hasMore = _.isEmpty(nextPage) ? false : nextPage.attr('class') != 'disabled';
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos.filter(item => item !== undefined),
|
||||
});
|
||||
}
|
||||
|
||||
async function getHeaders() {
|
||||
if (!cookie) {
|
||||
cookie = await getCookie();
|
||||
}
|
||||
return {
|
||||
'User-Agent': UA,
|
||||
'Referer': siteUrl,
|
||||
'Cookie': cookie,
|
||||
};
|
||||
}
|
||||
|
||||
async function getCookie() {
|
||||
const params = {
|
||||
"username": username,
|
||||
"password": password,
|
||||
};
|
||||
const headers = {
|
||||
"User-Agent": UA,
|
||||
"Referer": siteUrl + "/stop.html",
|
||||
"Origin": siteUrl,
|
||||
};
|
||||
const res = await requestRaw(siteUrl + "/logiu.html", headers, 'post', params);
|
||||
let result = '';
|
||||
for (const cookie of res.headers['set-cookie']) {
|
||||
result += cookie.split(";")[0] + ";";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/zjdr_open.js
Normal file
1
cat/js/zjdr_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/zjm_open.js
Normal file
1
cat/js/zjm_open.js
Normal file
File diff suppressed because one or more lines are too long
267
cat/js/zxzj_open.js
Normal file
267
cat/js/zxzj_open.js
Normal file
@ -0,0 +1,267 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'zxzj';
|
||||
let HOST = 'https://www.zxzj.site'; // 地址发布页
|
||||
let host = 'https://www.zxzja.com';
|
||||
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, extHeader) {
|
||||
let headers = {
|
||||
'User-Agent': MOBILE_UA,
|
||||
'Referer': host,
|
||||
};
|
||||
if (extHeader) {
|
||||
headers = _.merge(headers, extHeader);
|
||||
}
|
||||
const res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: headers,
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
const html = await request(HOST);
|
||||
const $ = load(html);
|
||||
host = $('div.content-top > ul > li').find('a:first')[0].attribs.href;
|
||||
console.debug('在线之家 跳转地址 =====>' + host); // js_debug.log
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const html = await request(host);
|
||||
const $ = load(html);
|
||||
const class_parse = $('ul.stui-header__menu > li > a[href*=list]');
|
||||
let 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,
|
||||
};
|
||||
});
|
||||
const filterObj = {
|
||||
1: [{ key: 'class', name: '剧情', init: '', 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: '冒险' }] }, { key: 'area', name: '地区', init: '', value: [{ n: '全部', v: '' }, { n: '大陆', v: '大陆' }, { n: '香港', v: '香港' }, { n: '台湾', v: '台湾' }, { n: '欧美', v: '欧美' }, { n: '韩国', v: '韩国' }, { n: '日本', v: '日本' }, { n: '泰国', v: '泰国' }, { n: '印度', v: '印度' }, { n: '俄罗斯', v: '俄罗斯' }, { n: '其他', v: '其他' }] }],
|
||||
2: [{ key: 'class', name: '剧情', init: '', 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: '其他' }] }],
|
||||
3: [{ key: 'class', name: '剧情', init: '', 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: '其他' }] }],
|
||||
4: [{ key: 'class', name: '剧情', init: '', 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: '其他' }] }],
|
||||
6: [{ key: 'class', name: '剧情', init: '', 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: '地区', init: '', value: [{ n: '全部', v: '' }, { n: '国产', v: '国产' }, { n: '日本', v: '日本' }, { n: '欧美', v: '欧美' }, { n: '其他', v: '其他' }] }]
|
||||
};
|
||||
let filYer = { key: 'year', name: '年份', init: '', value: [{ n: '全部', v: '' }, { n: '2024', v: '2024' }, { n: '2023', v: '2023' }, { n: '2022', v: '2022' }, { n: '2021', v: '2021' }, { n: '2020', v: '2020' }, { n: '2019', v: '2019' }, { n: '2018', v: '2018' }, { n: '2017', v: '2017' }, { n: '2016', v: '2016' }, { n: '2015', v: '2015' }, { n: '2014', v: '2014' }, { n: '2013', v: '2013' }, { n: '2012', v: '2012' }, { n: '2011', v: '2011' }] };
|
||||
let filBy = { key: 'by', name: '排序', value: [{ n: '时间', v: 'time' }, { n: '人气', v: 'hits' }, { n: '评分', v: 'score' }] };
|
||||
return JSON.stringify({
|
||||
class: _.map(classes, (cls) => {
|
||||
if (filterObj[cls.type_id]) {
|
||||
filterObj[cls.type_id].push(filYer, filBy);
|
||||
filterObj[cls.type_id][0]['init'] = filterObj[cls.type_id][0].value[0].v;
|
||||
} else {
|
||||
filterObj[cls.type_id] = [];
|
||||
filterObj[cls.type_id].push(filYer, filBy)
|
||||
}
|
||||
return cls;
|
||||
}),
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const link = host + '/vodshow/1--hits---------2023.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const items = $('ul.stui-vodlist > li');
|
||||
let videos = _.map(items, (item) => {
|
||||
const a = $(item).find('a:first')[0];
|
||||
const 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: js2Base + base64Encode(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;
|
||||
const link = host + '/vodshow/' + 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 js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const items = $('ul.stui-vodlist > li');
|
||||
let videos = _.map(items, (item) => {
|
||||
const a = $(item).find('a:first')[0];
|
||||
const 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: js2Base + base64Encode(a.attribs['data-original']),
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('ul.stui-page__item > 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 + '/detail/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
const 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_director: $('.stui-content__detail p:nth-child(4)').text().replace('导演:', ''),
|
||||
vod_pic: js2Base + base64Encode($('.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(),
|
||||
};
|
||||
let playMap = {};
|
||||
const tabs = $('div.stui-vodlist__head > h3');
|
||||
const playlists = $('ul.stui-content__playlist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const from = tab.children[0].data;
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const title = it.children[0].data;
|
||||
const 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('$$$');
|
||||
const urls = _.values(playMap);
|
||||
let 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) {
|
||||
const html = await request(host + id);
|
||||
const mhtml = html.match(/r player_.*?=(.*?)</)[1];
|
||||
const json = JSON.parse(mhtml);
|
||||
const url = json.url;
|
||||
const from = json.from;
|
||||
if (json.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (json.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (url.includes('m3u8') || url.includes('mp4')) {
|
||||
// console.debug('在线之家url =====>' + url); // js_debug.log
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: url,
|
||||
});
|
||||
} else if (from.includes('line3') || from.includes('line4') || from.includes('line5')) {
|
||||
const extHeader = {
|
||||
'sec-fetch-mode': 'navigate',
|
||||
'sec-fetch-site': 'cross-site',
|
||||
'sec-fetch-dest': 'iframe',
|
||||
'upgrade-insecure-requests': 1,
|
||||
};
|
||||
const ifrwy = await request(url, extHeader);
|
||||
const resultv2 = ifrwy.match(/var result_v2 = {(.*?)};/)[1];
|
||||
const data = JSON.parse('{' + resultv2 + '}').data;
|
||||
const code = data.split('').reverse();
|
||||
let temp = '';
|
||||
for (let i = 0x0; i < code.length; i = i + 0x2) {
|
||||
temp += String.fromCharCode(parseInt(code[i] + code[i + 0x1], 0x10))
|
||||
}
|
||||
const purl = temp.substring(0x0, (temp.length - 0x7) / 0x2) + temp.substring((temp.length - 0x7) / 0x2 + 0x7);
|
||||
// console.debug('在线之家purl =====>' + purl); // js_debug.log
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: purl,
|
||||
});
|
||||
} else {
|
||||
// console.debug('在线之家url =====>' + '空'); // js_debug.log
|
||||
return '{}';
|
||||
}
|
||||
}
|
||||
|
||||
async function search(wd, quick) {
|
||||
var data = JSON.parse(await request(host + '/index.php/ajax/suggest?mid=1&wd=' + wd + '&limit=50')).list;
|
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||
let videos = _.map(data, (it) => {
|
||||
return {
|
||||
vod_id: it.id,
|
||||
vod_name: it.name,
|
||||
vod_pic: js2Base + base64Encode(it.pic),
|
||||
vod_remarks: '',
|
||||
}
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
limit: 50,
|
||||
});
|
||||
}
|
||||
|
||||
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) {
|
||||
let what = segments[0];
|
||||
let url = base64Decode(segments[1]);
|
||||
if (what == 'img') {
|
||||
var resp = await req(url, {
|
||||
buffer: 2,
|
||||
headers: {
|
||||
Referer: 'https://api.douban.com/',
|
||||
'User-Agent': MOBILE_UA,
|
||||
},
|
||||
});
|
||||
return JSON.stringify({
|
||||
code: resp.code,
|
||||
buffer: 2,
|
||||
content: resp.content,
|
||||
headers: resp.headers,
|
||||
});
|
||||
}
|
||||
return JSON.stringify({
|
||||
code: 500,
|
||||
content: '',
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
proxy: proxy,
|
||||
search: search,
|
||||
};
|
||||
}
|
1
cat/js/zz123_book_open.js
Normal file
1
cat/js/zz123_book_open.js
Normal file
File diff suppressed because one or more lines are too long
162
cat/js/zzmusic_book_open.js
Normal file
162
cat/js/zzmusic_book_open.js
Normal file
@ -0,0 +1,162 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
|
||||
let siteUrl = 'https://gh.7761.cf/https://zz123.com';
|
||||
let imgUrl = 'https://music.jsbaidu.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
let headers = {};
|
||||
|
||||
async function request(reqUrl, postData, agentSp, get) {
|
||||
|
||||
let res = await req(reqUrl, {
|
||||
method: get ? 'get' : 'post',
|
||||
headers: headers,
|
||||
data: postData || {},
|
||||
postType: get ? '' : 'form',
|
||||
});
|
||||
|
||||
let content = res.content;
|
||||
return content;
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
if (cfg.ext) {
|
||||
siteUrl = cfg.ext;
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const html = await request(siteUrl);
|
||||
const $ = load(html);
|
||||
const cates = $('ul.aside-menu-list.channel > li')
|
||||
let classes = _.map(cates, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('a > span')[0]).text();
|
||||
return {
|
||||
type_id: id,
|
||||
type_name: name,
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const html = await request(siteUrl);
|
||||
const $ = load(html);
|
||||
const cards = $('div.page-main-wrap > div > div > div.card-list.d-none.d-md-block > div')
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||
return {
|
||||
book_id: id,
|
||||
book_name: name,
|
||||
book_pic: pic,
|
||||
book_remarks: remark,
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let url = siteUrl + '/ajax/';
|
||||
let res = await req(url, {
|
||||
method: 'post',
|
||||
data: {
|
||||
act: 'tag_music',
|
||||
type: 'tuijian',
|
||||
tid: tid,
|
||||
page: pg,
|
||||
lang: '',
|
||||
},
|
||||
postType: 'form',
|
||||
});
|
||||
//console.log('catedata:', res);
|
||||
let data = JSON.parse(res.content).data;
|
||||
let videos = [];
|
||||
for(let i=0;i<data.length;i++){
|
||||
const item = data[i];
|
||||
videos.push({
|
||||
book_id: item['mp3'],
|
||||
book_name: item['mname'],
|
||||
book_pic: item['pic'].replace('/img', imgUrl),
|
||||
book_remarks: item['play_time'],
|
||||
})
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let playUrl = id;
|
||||
if(!id.startsWith('http')) {
|
||||
playUrl = siteUrl + '/xplay/?act=songplay&id=' + id;
|
||||
}
|
||||
|
||||
const video = {
|
||||
book_id: id,
|
||||
book_actor: 'Leospring',
|
||||
book_play_from: 'Leospring',
|
||||
urls: '播放$' + playUrl,
|
||||
book_director: 'Leospring',
|
||||
book_content: '该音乐由公众号【蚂蚁科技杂谈】用爱发电制作,欢迎收听!',
|
||||
};
|
||||
const list = [video];
|
||||
const result = { list };
|
||||
return JSON.stringify(result);
|
||||
} catch (e) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: id,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let url = siteUrl + '/search/?key=' + wd;
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
const cards = $('div.tab-item.tab-song > div.card-list.d-none.d-md-block > div')
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||
|
||||
return {
|
||||
book_id: id,
|
||||
book_name: name,
|
||||
book_pic: pic,
|
||||
book_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,
|
||||
};
|
||||
}
|
163
cat/js/zzmusic_open.js
Normal file
163
cat/js/zzmusic_open.js
Normal file
@ -0,0 +1,163 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
//代理地址
|
||||
let siteUrl = 'https://gh.7761.cf/https://zz123.com';
|
||||
let imgUrl = 'https://music.jsbaidu.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
let headers = {};
|
||||
|
||||
async function request(reqUrl, postData, agentSp, get) {
|
||||
|
||||
let res = await req(reqUrl, {
|
||||
method: get ? 'get' : 'post',
|
||||
headers: headers,
|
||||
data: postData || {},
|
||||
postType: get ? '' : 'form',
|
||||
});
|
||||
|
||||
let content = res.content;
|
||||
return content;
|
||||
}
|
||||
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
if (cfg.ext) {
|
||||
siteUrl = cfg.ext;
|
||||
}
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
const html = await request(siteUrl);
|
||||
const $ = load(html);
|
||||
const cates = $('ul.aside-menu-list.channel > li')
|
||||
let classes = _.map(cates, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('a > span')[0]).text();
|
||||
return {
|
||||
type_id: id,
|
||||
type_name: name
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
class: classes
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {
|
||||
const html = await request(siteUrl);
|
||||
const $ = load(html);
|
||||
const cards = $('div.page-main-wrap > div > div > div.card-list.d-none.d-md-block > div');
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||
return {
|
||||
vod_id: id,
|
||||
vod_name: name,
|
||||
vod_pic: pic,
|
||||
vod_remarks: remark
|
||||
};
|
||||
});
|
||||
return JSON.stringify({
|
||||
list: videos
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let url = siteUrl + '/ajax/';
|
||||
let res = await req(url, {
|
||||
method: 'post',
|
||||
data: {
|
||||
act: 'tag_music',
|
||||
type: 'tuijian',
|
||||
tid: tid,
|
||||
page: pg,
|
||||
lang: ''
|
||||
},
|
||||
postType: 'form'
|
||||
});
|
||||
//console.log('catedata:', res);
|
||||
let data = JSON.parse(res.content).data;
|
||||
let videos = [];
|
||||
for(let i=0;i<data.length;i++){
|
||||
const item = data[i];
|
||||
videos.push({
|
||||
vod_id: item['mp3'],
|
||||
vod_name: item['mname'],
|
||||
vod_pic: item['pic'].replace('/img', imgUrl),
|
||||
vod_remarks: item['play_time']
|
||||
})
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: videos
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
let playUrl = id;
|
||||
if(!id.startsWith('http')) {
|
||||
playUrl = siteUrl + '/xplay/?act=songplay&id=' + id;
|
||||
}
|
||||
|
||||
const video = {
|
||||
vod_id: id,
|
||||
vod_actor: 'Leospring',
|
||||
vod_play_from: 'Leospring',
|
||||
vod_play_url: '播放$' + playUrl,
|
||||
vod_director: 'Leospring',
|
||||
vod_content: '该音乐由公众号【蚂蚁科技杂谈】用爱发电制作,欢迎收听!',
|
||||
};
|
||||
const list = [video];
|
||||
const result = { list };
|
||||
return JSON.stringify(result);
|
||||
} catch (e) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: id,
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let url = siteUrl + '/search/?key=' + wd;
|
||||
const html = await request(url);
|
||||
const $ = load(html);
|
||||
const cards = $('div.tab-item.tab-song > div.card-list.d-none.d-md-block > div')
|
||||
let videos = _.map(cards, (n) => {
|
||||
let id = n.attribs['data-id'];
|
||||
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||
|
||||
return {
|
||||
vod_id: id,
|
||||
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,
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user