mirror of
https://github.com/develop202/migu_video.git
synced 2025-12-17 15:25:03 +08:00
画质提到高清
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import axios from "axios";
|
||||
import { getStringMD5 } from "./EncryUtils.js";
|
||||
import { getddCalcuURL, getEncryptURL } from "./ddCalcuURL.js";
|
||||
import { getddCalcuURL, getddCalcuURL720p, getEncryptURL } from "./ddCalcuURL.js";
|
||||
import { changedDdCalcu } from "./datas.js";
|
||||
|
||||
function getSaltAndSign(md5) {
|
||||
@@ -192,4 +192,61 @@ async function getAndroidURL(userId, token, pid, rateType) {
|
||||
|
||||
}
|
||||
|
||||
export { getAndroidVideoURL, getAndroidURL }
|
||||
|
||||
/**
|
||||
* 旧版高清画质
|
||||
* @param {string} pid - 节目ID
|
||||
* @returns {} - url: 链接 rateType: 清晰度
|
||||
*/
|
||||
async function getAndroidURL720p(pid) {
|
||||
// 获取url
|
||||
const timestramp = Date.now()
|
||||
const appVersion = "26000009"
|
||||
let headers = {
|
||||
AppVersion: 2600000900,
|
||||
TerminalId: "android",
|
||||
"X-UP-CLIENT-CHANNEL-ID": "2600000900-99000-201600010010027"
|
||||
}
|
||||
// console.log(headers)
|
||||
const str = timestramp + pid + appVersion
|
||||
const md5 = getStringMD5(str)
|
||||
|
||||
const salt = 66666601
|
||||
const suffix = "770fafdf5ba04d279a59ef1600baae98migu6666"
|
||||
const sign = getStringMD5(md5 + suffix)
|
||||
|
||||
let rateType = 3
|
||||
// 广东卫视有些特殊
|
||||
if (pid == "608831231") {
|
||||
rateType = 2
|
||||
}
|
||||
// 请求
|
||||
const baseURL = "https://play.miguvideo.com/playurl/v1/play/playurl"
|
||||
const params = "?sign=" + sign + "&rateType=" + rateType
|
||||
+ "&contId=" + pid + "×tamp=" + timestramp + "&salt=" + salt
|
||||
const respData = await axios.get(baseURL + params, {
|
||||
headers: headers
|
||||
}).then(r => r.data)
|
||||
|
||||
// console.log(respData)
|
||||
const url = respData.body.urlInfo?.url
|
||||
// console.log(rateType)
|
||||
// console.log(url)
|
||||
if (!url) {
|
||||
return {
|
||||
url: "",
|
||||
rateType: 0
|
||||
}
|
||||
}
|
||||
|
||||
// 将URL加密
|
||||
const resURL = getddCalcuURL720p(url, pid)
|
||||
|
||||
return {
|
||||
url: resURL,
|
||||
rateType: 3
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { getAndroidVideoURL, getAndroidURL, getAndroidURL720p }
|
||||
|
||||
@@ -188,4 +188,74 @@ function getddCalcuURL(puDataURL, programId, clientType, rateType) {
|
||||
return `${puDataURL}&ddCalcu=${ddCalcu}${suffix}`
|
||||
}
|
||||
|
||||
export { initWasm, getEncryptURL, getddCalcuURL }
|
||||
|
||||
/**
|
||||
* 旧版720p ddcalcu
|
||||
* @param {string} puData - 服务器返回的那个东东
|
||||
* @param {string} programId - 节目ID
|
||||
* @returns {string} - ddCalcu
|
||||
*/
|
||||
function getddCalcu720p(puData, programId) {
|
||||
|
||||
if (puData == null || puData == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (programId == null || programId == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
const words = ["e","1","","0"]
|
||||
const thirdReplaceIndex = 2
|
||||
|
||||
puData = puData.split("");
|
||||
const keys = "0123456789".split("")
|
||||
const puDataLength = puData.length
|
||||
|
||||
programId = programId.split("")
|
||||
let ddCalcu = []
|
||||
for (let i = 0; i < puDataLength / 2; i++) {
|
||||
|
||||
ddCalcu.push(puData[puDataLength - i - 1])
|
||||
ddCalcu.push(puData[i])
|
||||
switch (i) {
|
||||
case 1:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
case 2:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
case 3:
|
||||
ddCalcu.push(keys[programId[thirdReplaceIndex]])
|
||||
break;
|
||||
case 4:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ddCalcu.join("")
|
||||
}
|
||||
|
||||
/**
|
||||
* 旧版720p加密链接
|
||||
* @param {string} puDataURL - 加密前链接
|
||||
* @param {string} programId - 节目ID
|
||||
* @returns {string} - 加密链接
|
||||
*/
|
||||
function getddCalcuURL720p(puDataURL, programId) {
|
||||
|
||||
if (puDataURL == null || puDataURL == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (programId == null || programId == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
const puData = puDataURL.split("&puData=")[1]
|
||||
const ddCalcu = getddCalcu720p(puData, programId)
|
||||
|
||||
return `${puDataURL}&ddCalcu=${ddCalcu}`
|
||||
}
|
||||
|
||||
export { initWasm, getEncryptURL, getddCalcuURL, getddCalcuURL720p }
|
||||
|
||||
@@ -1,189 +0,0 @@
|
||||
const list = {
|
||||
"h5": {
|
||||
// 第11位字母
|
||||
"keys": "yzwxcdabgh",
|
||||
// 第5 8 14位字母对应下标0 1 3
|
||||
"words": ['z', 'y', '0', 'w'],
|
||||
// 第11位字母替换位置
|
||||
"thirdReplaceIndex": 1,
|
||||
// 加密后链接后缀
|
||||
"suffix": "&sv=10000&ct=www"
|
||||
},
|
||||
"android": {
|
||||
"keys": "cdabyzwxkl",
|
||||
"words": ['x', 'a', '0', 'a'],
|
||||
"thirdReplaceIndex": 6,
|
||||
"suffix": "&sv=10004&ct=android"
|
||||
}
|
||||
}
|
||||
|
||||
const importObj = {
|
||||
a: {
|
||||
a: (a, b, c) => { },
|
||||
b: (a) => { return 0 },
|
||||
c: () => { },
|
||||
d: (a, b, c, d) => { return 0 },
|
||||
e: (a) => { return 0 },
|
||||
f: (a, b, c, d, e) => { return 0 },
|
||||
g: (a, b) => { return 0 },
|
||||
h: (a, b) => { return 0 },
|
||||
i: (a) => { return 0 },
|
||||
j: (a, b, c, d, e) => { return 0 }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密url
|
||||
* @param {string} videoURL - 视频url
|
||||
* @param {Uint8Array} memoryView - 内存
|
||||
* @param {Function} getEncrypt - 加密方法
|
||||
* @returns {string} - 加密地址
|
||||
*/
|
||||
function encrypt(videoURL, memoryView, getEncrypt) {
|
||||
// 将地址写入内存
|
||||
let i;
|
||||
for (i = 0; i < videoURL.length; ++i) {
|
||||
memoryView[i] = videoURL.charCodeAt(i)
|
||||
}
|
||||
memoryView[i] = 0
|
||||
|
||||
// 加密内存中的url
|
||||
let start = getEncrypt(0)
|
||||
|
||||
// 从内存中读取加密后的url
|
||||
let encryptedURL = ""
|
||||
for (let i = start; memoryView[i] != 0; ++i) {
|
||||
encryptedURL += String.fromCharCode(memoryView[i])
|
||||
}
|
||||
return encryptedURL
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化wasm
|
||||
* @param {string} masmURL - wasm地址
|
||||
* @returns {object} - wasm导出的内容
|
||||
*/
|
||||
async function initWasm(masmURL) {
|
||||
// 获取wasm文件
|
||||
let resp = await fetch(masmURL);
|
||||
// 初始化
|
||||
let { instance } = await WebAssembly.instantiateStreaming(resp, importObj)
|
||||
return instance.exports;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取加密url
|
||||
* @param {object} exports - wasm导出的内容
|
||||
* @param {string} videoURL - 视频地址
|
||||
* @returns {string} - 播放地址
|
||||
*/
|
||||
function getEncryptURL(exports, videoURL) {
|
||||
// 获得内存
|
||||
const memory = exports.k
|
||||
const memoryView = new Uint8Array(memory.buffer)
|
||||
|
||||
// 获取加密方法
|
||||
const getEncrypt = exports.m
|
||||
return encrypt(videoURL, memoryView, getEncrypt)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取ddCalcu
|
||||
* 大致思路:把puData最后一个字符和第一个字符拼接,然后拼接倒数第二个跟第二个,一直循环,当第1 2 3 4次(从0开始)循环时需要插入特殊标识字符
|
||||
* 特殊字符:四个特殊字符位置是第5 8 11 14,第5 8 14是根据平台确定的,且各个节目都一样。第11位在h5上是根据节目ID第1位(从0开始,android是第6位)数字为下标的某字符串的值
|
||||
* 在android,标清画质还有区分,第5位字符需要修改,其他不变
|
||||
* @param {string} puData - 服务器返回的那个东东
|
||||
* @param {string} programId - 节目ID
|
||||
* @param {string} clientType - 平台类型 h5 android
|
||||
* @param {string} rateType - 清晰度 2:标清 3:高清 4:蓝光
|
||||
* @returns {string} - ddCalcu
|
||||
*/
|
||||
function getddCalcu(puData, programId, clientType, rateType) {
|
||||
|
||||
if (puData == null || puData == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (programId == null || programId == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (clientType != "android" && clientType != "h5") {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (rateType == null || rateType == undefined) {
|
||||
return ""
|
||||
}
|
||||
let keys = list[clientType].keys
|
||||
let words = list[clientType].words
|
||||
const thirdReplaceIndex = list[clientType].thirdReplaceIndex
|
||||
// android平台标清
|
||||
if (clientType == "android" && rateType == "2") {
|
||||
words[0] = "v"
|
||||
}
|
||||
puData = puData.split("");
|
||||
keys = keys.split("")
|
||||
const puDataLength = puData.length
|
||||
programId = programId.split("")
|
||||
let ddCalcu = []
|
||||
for (let i = 0; i < puDataLength / 2; i++) {
|
||||
|
||||
ddCalcu.push(puData[puDataLength - i - 1])
|
||||
ddCalcu.push(puData[i])
|
||||
switch (i) {
|
||||
case 1:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
case 2:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
case 3:
|
||||
ddCalcu.push(keys[programId[thirdReplaceIndex]])
|
||||
break;
|
||||
case 4:
|
||||
ddCalcu.push(words[i - 1])
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ddCalcu.join("")
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密链接
|
||||
* @param {string} puDataURL - 加密前链接
|
||||
* @param {string} programId - 节目ID
|
||||
* @param {string} clientType - 客户端类型 h5 android
|
||||
* @param {string} rateType - 清晰度 2:标清 3:高清 4:蓝光
|
||||
* @returns {string} - 加密链接
|
||||
*/
|
||||
function getddCalcuURL(puDataURL, programId, clientType, rateType) {
|
||||
|
||||
if (puDataURL == null || puDataURL == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (programId == null || programId == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (clientType != "android" && clientType != "h5") {
|
||||
return ""
|
||||
}
|
||||
|
||||
if (rateType == null || rateType == undefined) {
|
||||
return ""
|
||||
}
|
||||
|
||||
const puData = puDataURL.split("&puData=")[1]
|
||||
const ddCalcu = getddCalcu(puData, programId, clientType, rateType)
|
||||
const suffix = list[clientType].suffix
|
||||
|
||||
return `${puDataURL}&ddCalcu=${ddCalcu}${suffix}`
|
||||
}
|
||||
|
||||
export { initWasm, getEncryptURL, getddCalcuURL }
|
||||
Reference in New Issue
Block a user