mirror of
				https://github.com/qist/tvbox.git
				synced 2025-10-30 03:32:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			277 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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,
 | |
|     };
 | |
| } |