mirror of
				https://github.com/qist/tvbox.git
				synced 2025-10-30 03:32:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			255 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| * @File     : nivid_object.js
 | |
| * @Author   : jade
 | |
| * @Date     : 2023/12/20 9:50
 | |
| * @Email    : jadehh@1ive.com
 | |
| * @Software : Samples
 | |
| * @Desc     :
 | |
| */
 | |
| import {Crypto} from "./cat.js";
 | |
| 
 | |
| let DesKey = "diao.com"
 | |
| 
 | |
| class ChannelResponse {
 | |
|     // classes
 | |
|     constructor() {
 | |
|         this.channelMsg = ""
 | |
|         this.channelStatus = 0
 | |
|         this.channelList = []
 | |
|         this.channelFilters = {}
 | |
|     }
 | |
| 
 | |
|     fromJsonString(json_str, remove18ChannelCode = 0) {
 | |
|         let json_dic = JSON.parse(json_str)
 | |
|         this.channelMsg = json_dic.msg
 | |
|         this.channelStatus = json_dic.status
 | |
|         let channel_list = []
 | |
|         for (const channel_info of json_dic.list) {
 | |
|             let new_channel_info = new ChannelInfo()
 | |
|             switch (remove18ChannelCode) {
 | |
|                 case 0:
 | |
|                     new_channel_info.fromJson(channel_info)
 | |
|                     channel_list.push(new_channel_info)
 | |
|                     break
 | |
|                 case 1:
 | |
|                     if (channel_info.channelName !== "午夜场" && channel_info.channelName !== "午夜直播") {
 | |
|                         new_channel_info.fromJson(channel_info)
 | |
|                         channel_list.push(new_channel_info)
 | |
|                     }
 | |
|                     break
 | |
|                 case 2:
 | |
|                     if (channel_info.channelName === "午夜场" || channel_info.channelName === "午夜直播") {
 | |
|                         new_channel_info.fromJson(channel_info)
 | |
|                         channel_list.push(new_channel_info)
 | |
|                     }
 | |
|                     break
 | |
|             }
 | |
|         }
 | |
|         this.channelList = channel_list
 | |
|         this.channelFilters = json_dic.filter
 | |
|     }
 | |
| 
 | |
|     setChannelFilters(filter_str) {
 | |
|         this.channelFilters = JSON.parse(filter_str)
 | |
|     }
 | |
| 
 | |
|     getValues(typeList, name_key, id_key) {
 | |
|         let values = []
 | |
|         values.push({"n": "全部", "v": "0"})
 | |
|         for (const obj of typeList) {
 | |
|             values.push({"n": obj[name_key], "v": obj[id_key].toString()})
 | |
|         }
 | |
|         return values
 | |
|     }
 | |
| 
 | |
|     getFilters() {
 | |
|         let filters = {}
 | |
|         for (const channel_info of this.channelList) {
 | |
|             filters[channel_info.channelId] = []
 | |
|             let sortMapList = this.channelFilters["sortsMap"][parseInt(channel_info.channelId)]
 | |
|             let sortValues = this.getValues(sortMapList, "title", "id")
 | |
|             filters[channel_info.channelId].push({"key": "1", "name": "排序", "value": sortValues})
 | |
|             let typeMapList = this.channelFilters["typesMap"][parseInt(channel_info.channelId)]
 | |
|             let typeValues = this.getValues(typeMapList, "showTypeName", "showTypeId")
 | |
|             filters[channel_info.channelId].push({"key": "2", "name": "类型", "value": typeValues})
 | |
|             let areaValues = this.getValues(this.channelFilters["regions"], "regionName", "regionId")
 | |
|             filters[channel_info.channelId].push({"key": "3", "name": "地区", "value": areaValues})
 | |
|             let langValues = this.getValues(this.channelFilters["langs"], "langName", "langId")
 | |
|             filters[channel_info.channelId].push({"key": "4", "name": "语言", "value": langValues})
 | |
|             let yearValues = this.getValues(this.channelFilters["yearRanges"], "name", "code")
 | |
|             filters[channel_info.channelId].push({"key": "5", "name": "年份", "value": yearValues})
 | |
|         }
 | |
|         return filters
 | |
|     }
 | |
| 
 | |
|     getChannelFilters() {
 | |
|         return this.channelFilters
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
|     getChannelMsg() {
 | |
|         return this.channelMsg
 | |
|     }
 | |
| 
 | |
|     getChannelStatus() {
 | |
|         return this.channelStatus
 | |
|     }
 | |
| 
 | |
|     getChannelList() {
 | |
|         return this.channelList
 | |
|     }
 | |
| 
 | |
|     getClassList() {
 | |
|         let classes = []
 | |
|         for (const channel_info of this.channelList) {
 | |
|             classes.push({"type_id": channel_info.channelId, "type_name": channel_info.channelName})
 | |
|         }
 | |
|         return classes
 | |
|     }
 | |
| 
 | |
| 
 | |
|     async save() {
 | |
|         await local.set("niba", "niba_channel", this.toString());
 | |
|         return this;
 | |
|     }
 | |
| 
 | |
|     clear() {
 | |
|         this.channelMsg = ""
 | |
|         this.channelStatus = 0
 | |
|         this.channelList = []
 | |
|     }
 | |
| 
 | |
|     async clearCache() {
 | |
|         this.clear()
 | |
|         await local.set("niba", "niba_channel", "{}");
 | |
|     }
 | |
| 
 | |
|     toString() {
 | |
|         const params = {
 | |
|             msg: this.getChannelMsg(),
 | |
|             status: this.getChannelStatus(),
 | |
|             list: this.getChannelList(),
 | |
|             filter: this.getChannelFilters()
 | |
|         };
 | |
|         return JSON.stringify(params);
 | |
|     }
 | |
| }
 | |
| 
 | |
| async function getChannelCache() {
 | |
|     return await local.get("niba", "niba_channel");
 | |
| }
 | |
| 
 | |
| class ChannelInfo {
 | |
|     constructor() {
 | |
|         this.channelId = 0
 | |
|         this.channelName = ""
 | |
|     }
 | |
| 
 | |
|     fromJsonString(json_str) {
 | |
|         let json_dic = JSON.parse(json_str)
 | |
|         this.channelId = json_dic.channelId
 | |
|         this.channelName = json_dic.channelName
 | |
|     }
 | |
| 
 | |
|     fromJson(json) {
 | |
|         this.channelId = json.channelId
 | |
|         this.channelName = json.channelName
 | |
|     }
 | |
| 
 | |
|     getChannelName() {
 | |
|         return this.channelName
 | |
|     }
 | |
| 
 | |
|     getChannelId() {
 | |
|         return this.channelId
 | |
|     }
 | |
| }
 | |
| 
 | |
| function isNumeric(str) {
 | |
|     return !isNaN(parseInt(str));
 | |
| }
 | |
| 
 | |
| function getVod(video_dic_list, play_foramt_list, showIdCode) {
 | |
|     let episode_list = [], episode_str_list = [];
 | |
|     for (const video_dic of video_dic_list) {
 | |
|         let video_name = ""
 | |
|         if (isNumeric((video_dic['episodeName']))) {
 | |
|             video_name = "第" + video_dic["episodeName"] + "集"
 | |
|         } else {
 | |
|             video_name = video_dic["episodeName"]
 | |
|         }
 | |
|         episode_list.push(video_name + "$" + video_dic["playIdCode"] + "@" + showIdCode);
 | |
|     }
 | |
| 
 | |
|     for (let index = 0; index < play_foramt_list.length; index++) {
 | |
|         episode_str_list.push(episode_list.join("#"));
 | |
|     }
 | |
|     return {
 | |
|         vod_play_url: episode_str_list.join("$$$"),
 | |
|         vod_play_from: play_foramt_list.map(item => item).join("$$$"),
 | |
|     };
 | |
| }
 | |
| 
 | |
| function getHeader() {
 | |
|     return {
 | |
|         "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
 | |
|         "Referer": "https://m.nivod.tv/",
 | |
|         "Content-Type": "application/x-www-form-urlencoded"
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| function md5(text) {
 | |
|     return Crypto.MD5(text).toString()
 | |
| }
 | |
| 
 | |
| //加密
 | |
| async function createSign(body = null) {
 | |
|     let params = {
 | |
|         "_ts": Date.now(), "app_version": "1.0",
 | |
|         "platform": "3", "market_id": "web_nivod",
 | |
|         "device_code": "web", "versioncode": 1,
 | |
|         "oid": "8ca275aa5e12ba504b266d4c70d95d77a0c2eac5726198ea"
 | |
|     }
 | |
|     /**
 | |
|      * __QUERY::_ts=1702973558399&app_version=1.0&device_code=web&market_id=web_nivod&oid=8ca275aa5e12ba504b266d4c70d95d77a0c2eac5726198ea&platform=3&versioncode=1&__BODY::__KEY::2x_Give_it_a_shot
 | |
|      */
 | |
|     let params_list = []
 | |
|     for (const key of Object.keys(params).sort()) {
 | |
|         params_list.push(`${key}=${params[key]}`)
 | |
|     }
 | |
|     let body_str = "&__BODY::"
 | |
|     if (body !== null) {
 | |
|         let body_list = []
 | |
|         for (const key of Object.keys(body).sort()) {
 | |
|             body_list.push(`${key}=${body[key]}`)
 | |
|         }
 | |
|         body_str = body_str + body_list.join("&") + "&"
 | |
|     }
 | |
| 
 | |
| 
 | |
|     let params_str = "__QUERY::" + params_list.join("&") + body_str + "__KEY::2x_Give_it_a_shot"
 | |
|     let sign_code = md5(params_str)
 | |
|     params_list.push(`sign=${sign_code}`)
 | |
|     return "?" + params_list.join("&")
 | |
| 
 | |
| }
 | |
| 
 | |
| //解密
 | |
| function desDecrypt(content) {
 | |
|     // 定义密钥
 | |
|     const key = Crypto.enc.Utf8.parse(DesKey); // 密钥需要进行字节数转换
 | |
|     /*
 | |
|     const encrypted = Crypto.DES.encrypt(content, key, {
 | |
|         mode: Crypto.mode.ECB, // 使用ECB模式
 | |
|         padding: Crypto.pad.Pkcs7, // 使用Pkcs7填充
 | |
|     }).ciphertext.toString();
 | |
|      */
 | |
|     return Crypto.DES.decrypt({ciphertext: Crypto.enc.Hex.parse(content)}, key, {
 | |
|         mode: Crypto.mode.ECB,
 | |
|         padding: Crypto.pad.Pkcs7,
 | |
|     }).toString(Crypto.enc.Utf8);
 | |
| }
 | |
| 
 | |
| export {getChannelCache, desDecrypt, createSign, ChannelResponse, getHeader, getVod}; |