-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathproxyPlayer.js
More file actions
116 lines (101 loc) · 4.02 KB
/
proxyPlayer.js
File metadata and controls
116 lines (101 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* 代理播放地址处理工具
*/
import {base64Encode} from "@/api/utils/index.js";
/**
* 获取当前选中的代理播放地址
* @returns {string|null} 返回代理播放地址,如果未启用代理播放则返回null
*/
export function getCurrentProxyPlayAddress() {
try {
// 从addressSettings读取代理播放配置
const savedAddresses = JSON.parse(localStorage.getItem('addressSettings') || '{}')
const proxyPlayEnabled = savedAddresses.proxyPlayEnabled || false
const proxyPlay = savedAddresses.proxyPlay || ''
// 如果代理播放未启用或地址为空,返回null
if (!proxyPlayEnabled || !proxyPlay || proxyPlay.trim() === '') {
return null
}
return proxyPlay.trim()
} catch (error) {
console.error('获取代理播放地址失败:', error)
return null
}
}
/**
* 构建代理播放URL
* @param {string} originalUrl 原始视频地址
* @param {string} proxyAddress 代理播放地址模板
* @param {Object} headers 请求头对象
* @returns {string} 构建后的代理播放URL
*/
export function buildProxyPlayUrl(originalUrl, proxyAddress, headers = {}) {
try {
// 移除代理地址中的 #名称 部分
const cleanProxyAddress = proxyAddress.replace(/#.*$/, '')
// 处理默认 headers:如果 headers 为空或没有有效内容,使用当前页面的 User-Agent
let finalHeaders = headers
if (!headers || Object.keys(headers).length === 0 ||
(Object.keys(headers).length === 1 && !headers['user-agent'] && !headers['User-Agent'])) {
finalHeaders = {
'user-agent': navigator.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
}
// 将headers对象转换为JSON字符串
const headersJson = JSON.stringify(finalHeaders)
// 对 URL 和 headers 进行 URL 安全的 base64 编码
const encodedUrl = base64Encode(originalUrl)
const encodedHeaders = base64Encode(headersJson)
const encodedType = originalUrl.split('/').slice(-1)[0].split('?')[0]
// 替换模板字符串中的${url}和${headers}
let proxyUrl = cleanProxyAddress
.replace(/\$\{url\}/g, encodedUrl)
.replace(/\$\{headers\}/g, encodedHeaders)
.replace(/\$\{type\}/g, encodedType)
console.log('🔄 [代理播放] 构建代理URL:')
console.log('📺 原始地址:', originalUrl)
console.log('📋 原始请求头:', headers)
console.log('📋 最终请求头:', finalHeaders)
console.log('🌐 代理模板:', proxyAddress)
console.log('🧹 清理后模板:', cleanProxyAddress)
console.log('🔐 编码后URL:', encodedUrl)
console.log('🔐 编码后Headers:', encodedHeaders)
console.log('🔗 最终代理URL:', proxyUrl)
return proxyUrl
} catch (error) {
console.error('构建代理播放URL失败:', error)
return originalUrl // 失败时返回原始地址
}
}
/**
* 处理视频地址,如果启用了代理播放则返回代理URL,否则返回原始URL
* @param {string} originalUrl 原始视频地址
* @param {Object} headers 请求头对象
* @returns {string} 处理后的视频地址
*/
export function processVideoUrl(originalUrl, headers = {}) {
// 获取当前代理播放地址
const proxyAddress = getCurrentProxyPlayAddress()
// 如果没有启用代理播放,直接返回原始地址
if (!proxyAddress) {
console.log('🎬 [直接播放] 使用原始地址:', originalUrl)
return originalUrl
}
// 构建并返回代理播放URL
return buildProxyPlayUrl(originalUrl, proxyAddress, headers)
}
/**
* 检查是否启用了代理播放
* @returns {boolean} 是否启用代理播放
*/
export function isProxyPlayEnabled() {
try {
const savedAddresses = JSON.parse(localStorage.getItem('addressSettings') || '{}')
const proxyPlayEnabled = savedAddresses.proxyPlayEnabled || false
const proxyPlay = savedAddresses.proxyPlay || ''
return proxyPlayEnabled && proxyPlay && proxyPlay.trim() !== ''
} catch (error) {
console.error('检查代理播放状态失败:', error)
return false
}
}