diff --git a/config/wanpan.js b/config/wanpan.js deleted file mode 100644 index 8382351..0000000 --- a/config/wanpan.js +++ /dev/null @@ -1,853 +0,0 @@ -import '../lib/htmlParser.js'; -import { Quark, Baidu, UC } from "../lib/pans.js"; - -// 分类排除关键词 -const class_exclude = ['115', '123', '天移', '留言', '关于', '原盘']; - -/** - * 网盘站点域名配置 - * 每个站点对应一组可用域名,用于并发检测 - */ -const DOM_CFG = { - "玩偶": [ - "https://wogg.xxooo.cf", - "https://woggpan.333232.xyz", - "https://wogg.heshiheng.top", - "https://www.wogg.one", - "https://www.wogg.lol" - ], - "至臻": [ - "https://mihdr.top", - "https://xiaomi666.fun", - "https://zhizhen8.click", - "https://www.zhizhen8.click" - ], - "蜡笔": [ - "http://xiaocge.fun", - "http://feimo.fun", - "https://feimao666.fun", - "http://feimao888.fun", - "http://www.labi88.sbs", - "http://fmao.site", - "http://fmao.shop", - "http://xiaocgege.shop" - ], - "木偶": [ - "http://123.666291.xyz", - "https://mogg.5568.eu.org", - "https://mo.666291.xyz", - "http://666.666291.xyz", - "https://mo.muouso.fun" - ], - "二小": [ - "https://www.2xiaozhan.top", - "https://erxiaofn.click", - "https://www.xhww.net" - ], - "多多": [ - "https://tv.yydsys.top", - "https://tv.yydsys.cc" - ], - "虎斑": [ - "http://103.45.162.207:20720", - "http://xsayang.fun:12512" - ], - "欧歌": [ - "https://woog.xn--dkw.xn--6qq986b3xl", - "https://woog.nxog.eu.org" - ], - "闪电": [ - "https://sd.sduc.site" - ], - "快映": [ - "http://xsayang.fun:12512" - ] -}; - -// 全局变量 -let host = ''; // 当前可用域名 -let ext = ''; // 扩展配置 -let apitype = ''; // API类型: vodshow 或 index.php -let siteName = '网盘'; // 站点名称 -let UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Chrome/120.0.0.0 Safari/537.36"; -let line_order = ['百度', '夸克', '优汐']; // 线路排序 -let downThreads = '32'; // 下载线程数 - -let cachedClasses = []; -let cachedFilters = {}; - -// 站点配置存储对象 -const siteConfigs = {}; - -// ==================== 开关配置 (1=开启,0=关闭)==================== -let quarkInfinite = 0; // 夸克网盘无限画质开关 (1=开启无限画质, 0=关闭) -let quarkOrig = 1; // 夸克网盘原画开关 (1=开启原画, 0=关闭) -let quarkTransfer = 1; // 夸克网盘转存开关 (1=开启转存获取画质, 0=关闭) -let enableProxy = 0; // 全局代理开关 (1=开启代理, 0=关闭) -// ================================================ - -// 代理配置 -let enable_image = 1; // 图片代理开关 -let proxyimg = 'https://wsrv.nl/?url='; // 图片代理 -let proxyurl = 'http://127.0.0.1:2525/proxy?url='; // 播放代理 - -const CACHE_NS = 'wanpan_cache'; -const CLASS_CACHE_KEY = 'class_data'; - -// 请求头配置 -const headers = { - 'User-Agent': UA, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8' -}; - -/** - * 安全JSON解析 - */ -function safeJSONParse(str, defaultValue = {}) { - if (!str || typeof str === 'object') return str || defaultValue; - try { - return JSON.parse(str); - } catch { - return defaultValue; - } -} - -/** - * 统一请求函数 - * @param {string} url - 请求地址 - * @param {object} options - 请求选项 - * @returns {Promise} 响应内容 - */ -async function request(url, options = {}) { - const reqHeaders = { ...headers, ...options.headers }; - let postType = reqHeaders['Content-Type']?.includes('json') ? 'json' : - reqHeaders['Content-Type']?.includes('form') ? 'form' : ''; - - try { - const response = await req(url, { - method: options.method || 'GET', - headers: reqHeaders, - data: options.data, - postType: postType, - timeout: options.timeout || 15000 - }); - return response?.content || response?.data || response; - } catch (error) { - console.error(`Request failed: ${url}`, error); - return null; - } -} - -/** - * 映射分辨率名称 - * @param {string} res - 原始分辨率标识 - * @returns {string} 中文分辨率名称 - */ -function mapResolution(res) { - const map = { - 'low': '流畅', 'normal': '标清', 'high': '高清', 'super': '超清', - '4k': '4K', '2k': '2K', 'hdr': 'HDR', 'dolby_vision': 'HDR', - 'M3U8_AUTO_480': '480P', 'M3U8_AUTO_720': '720P', 'M3U8_AUTO_1080': '1080P', - 'M3U8_AUTO_2K': '2K', 'M3U8_AUTO_4K': '4K' - }; - return map[res] || res; -} - -/** - * 判断分类是否被排除 - * @param {string} className - 分类名称 - * @returns {boolean} 是否被排除 - */ -function isClassExcluded(className) { - if (!className) return false; - return class_exclude.some(keyword => className.toLowerCase().includes(keyword)); -} - -/** - * 初始化函数 - * 加载配置、检测可用域名、获取分类和筛选器 - */ -async function init(cfg) { - ext = cfg.ext || cfg; - - // 获取站点名称 - siteName = (cfg.skey?.split('_')[1] || cfg.skey) || (cfg.key?.split('_')[1] || cfg.key) || '网盘'; - - let quarkCookie = ""; - let baiduCookie = ""; - let ucCookie = ""; - let ucToken = ""; - let selectedConfig = "至臻"; - let siteOrder = ""; - let customLineOrder = null; - let customThreads = null; - let customQuarkOriginal = null; - let customQuarkInfinite = null; - let customQuarkTransfer = null; - let customEnableProxy = null; - let customEnableImage = null; - let customProxyUrl = null; - let customProxyImg = null; - - // 解析配置参数 - if (cfg) { - if (typeof ext === 'object') { - quarkCookie = cfg.quark_cookie || ""; - baiduCookie = cfg.baidu_cookie || ""; - ucCookie = cfg.uc_cookie || ""; - ucToken = cfg.uc_token || ""; - customLineOrder = cfg.line_order || null; - customThreads = cfg.threads || null; - customQuarkOriginal = cfg.quark_original !== undefined ? cfg.quark_original : null; - customQuarkInfinite = cfg.quark_infinite !== undefined ? cfg.quark_infinite : null; - customQuarkTransfer = cfg.quark_transfer !== undefined ? cfg.quark_transfer : null; - customEnableProxy = cfg.enable_proxy !== undefined ? cfg.enable_proxy : null; - customEnableImage = cfg.enable_image !== undefined ? cfg.enable_image : null; - customProxyUrl = cfg.proxy_url || null; - customProxyImg = cfg.proxy_img || null; - } else if (typeof ext === 'string') { - const [url, order] = ext.split('$'); - - const html = await request(url); - const json = safeJSONParse(html); - - quarkCookie = json.quark_cookie || ""; - baiduCookie = json.baidu_cookie || ""; - ucCookie = json.uc_cookie || ""; - ucToken = json.uc_token || ""; - siteOrder = order?.trim() || ""; - customLineOrder = json.line_order || null; - customThreads = json.threads || null; - customQuarkOriginal = json.quark_original !== undefined ? json.quark_original : null; - customQuarkInfinite = json.quark_infinite !== undefined ? json.quark_infinite : null; - customQuarkTransfer = json.quark_transfer !== undefined ? json.quark_transfer : null; - customEnableProxy = json.enable_proxy !== undefined ? json.enable_proxy : null; - customEnableImage = json.enable_image !== undefined ? json.enable_image : null; - customProxyUrl = json.proxy_url || null; - customProxyImg = json.proxy_img || null; - } - } - - // 应用配置 - line_order = customLineOrder?.length ? customLineOrder : line_order; - downThreads = customThreads || downThreads; - quarkOrig = customQuarkOriginal !== null ? customQuarkOriginal : quarkOrig; - quarkInfinite = customQuarkInfinite !== null ? customQuarkInfinite : quarkInfinite; - quarkTransfer = customQuarkTransfer !== null ? customQuarkTransfer : quarkTransfer; - enableProxy = customEnableProxy !== null ? customEnableProxy : enableProxy; - enable_image = customEnableImage !== null ? customEnableImage : enable_image; - proxyurl = customProxyUrl || proxyurl; - proxyimg = customProxyImg || proxyimg; - - // 设置网盘Cookie - if (quarkCookie?.length > 10) Quark.cookie = quarkCookie; - if (baiduCookie?.length > 10) Baidu.cookie = baiduCookie; - if (ucCookie?.length > 10) UC.cookie = ucCookie; - if (ucToken?.length > 10) UC.token = ucToken; - - // 匹配站点配置 - if (siteOrder) { - for (const [key] of Object.entries(DOM_CFG)) { - if (siteOrder.includes(key)) { - selectedConfig = key; - break; - } - } - } - - const domains = DOM_CFG[selectedConfig]; - const configId = selectedConfig; - - // 初始化主机 - 使用local缓存 - try { - const cached = await local.get(CACHE_NS, 'domain_' + configId); - if (cached && domains.includes(cached)) { - host = cached; - headers.Referer = host + "/"; - } - } catch {} - - if (!host) { - try { - const results = await Promise.any( - domains.map(async (domain) => { - const content = await request(domain, { timeout: 8000 }); - if (content && content.includes('href')) { - return domain; - } - throw new Error('无效域名'); - }) - ); - - if (results) { - host = results; - headers.Referer = host + "/"; - await local.set(CACHE_NS, 'domain_' + configId, host).catch(() => {}); - } - } catch (error) { - host = domains[0]; - } - } - - apitype = await getApiType(); - - if (host) { - // 尝试从缓存读取分类和筛选器数据 - const cacheKey = `${CLASS_CACHE_KEY}_${configId}`; - let needUpdate = true; - - try { - const cached = await local.get(CACHE_NS, cacheKey); - if (cached) { - const parsed = safeJSONParse(cached); - const cacheTime = parsed.timestamp || 0; - const now = Date.now(); - - // 缓存7天内有效 - if (now - cacheTime < 7 * 24 * 60 * 60 * 1000) { - cachedClasses = parsed.classes || []; - cachedFilters = parsed.filters || {}; - - // 保存到siteConfigs - siteConfigs[siteName] = { - classes: cachedClasses, - filters: cachedFilters - }; - - needUpdate = false; - } - } - } catch {} - - if (needUpdate && host) { - try { - // 请求首页获取分类 - const html = await request(host); - const classes = []; - const seenTypeIds = new Set(); - - const navItems = pdfa(html, '.nav-menu-items&&li'); - - navItems.forEach((item) => { - const href = pd(item, 'a&&href', host).trim(); - const typeName = pdfh(item, 'a&&Text').trim(); - const match = href.match(/\/([^\/]+)\.html$/); - - // 检查是否在排除列表中 - if (match && typeName && !seenTypeIds.has(match[1]) && /^\d+$/.test(match[1]) && !isClassExcluded(typeName)) { - classes.push({"type_name": typeName, "type_id": match[1]}); - seenTypeIds.add(match[1]); - } - }); - - cachedClasses = classes; - - if (classes.length > 0) { - // 使用 Promise.all 并发获取筛选器 - const filterPromises = classes.map(async (cls) => { - const type_id = cls.type_id; - const url = apitype === "vodshow" ? - `${host}/vodshow/${type_id}-----------.html` : - `${host}/index.php/vod/show/id/${type_id}.html`; - - const html = await request(url); - const filters = await getFilters(type_id, html); - return { type_id, filters }; - }); - - const filterResults = await Promise.all(filterPromises); - - const filters = {}; - filterResults.forEach(result => { - filters[result.type_id] = result.filters; - }); - - cachedFilters = filters; - - // 保存到siteConfigs - siteConfigs[siteName] = { - classes: cachedClasses, - filters: cachedFilters - }; - - // 存储到缓存 - const cacheData = { - timestamp: Date.now(), - classes: cachedClasses, - filters: cachedFilters - }; - await local.set(CACHE_NS, cacheKey, JSON.stringify(cacheData)).catch(() => {}); - } - } catch (error) {} - } - } - - return JSON.stringify({}); -} - -/** - * 获取筛选条件 - * @param {string} type_id - 分类ID - * @param {string} pageHtml - 页面HTML - * @returns {Array} 筛选条件列表 - */ -async function getFilters(type_id, pageHtml) { - if (!pageHtml || pageHtml.length < 300) return []; - const cats = [ - { key: 'cateId', name: '类型', reg: /\/id\/(\d+)/ }, - { key: 'class', name: '剧情' }, { key: 'lang', name: '语言' }, - { key: 'area', name: '地区' }, { key: 'year', name: '时间' }, { key: 'letter', name: '字母' } - ]; - const sortOpts = { "时间": "time", "人气": "hits", "评分": "score" }; - let filters = []; - - try { - cats.forEach(cat => { - const libraryBoxes = pdfa(pageHtml, '.library-box'); - const box = libraryBoxes.find(b => (pdfh(b, 'a&&Text') || '').includes(cat.name)); - if (!box) return; - - const linkItems = pdfa(box, 'div a'); - let values = linkItems.map(a => { - const n = pdfh(a, "a&&Text") || "全部"; - let v = n; - if (cat.key === 'cateId') { - const href = pd(a, 'a&&href', host); - const m = href?.match(cat.reg); - v = m?.[1] || n; - } - if (/全部|字母/.test(n)) return { n: "全部", v: "" }; - return { n, v }; - }).filter(x => x?.n) - .filter((item, idx, self) => self.findIndex(i => i.n === item.n) === idx); - - if (values.length > 3) filters.push({ key: cat.key, name: cat.name, value: values }); - }); - - const sortVals = Object.entries(sortOpts).map(([n, v]) => ({ n, v })); - if (sortVals.length) filters.push({ key: "by", name: "排序", value: sortVals }); - } catch {} - return filters; -} - -/** - * 首页 - 返回分类和筛选器 - */ -async function home(filter) { - let info = getSite(siteName); - - if (!info.classes || info.classes.length === 0) { - info.classes = cachedClasses || []; - } - - return JSON.stringify({ - class: info.classes, - filters: info.filters - }); -} - -/** - * 获取视频列表 - * @param {string} html - 页面HTML - * @returns {Array} 视频列表 - */ -function getList(html) { - const videos = []; - const items = pdfa(html, ".module-items .module-item"); - - items.forEach((it) => { - const name = pdfh(it, "a&&title"); - const pic = pd(it, "img&&data-src", host); - const desc = pdfh(it, ".module-item-text&&Text"); - const url = pd(it, "a&&href", host); - - if (name && url) { - videos.push({ - "vod_id": url, - "vod_name": name, - "vod_pic": proxyImage(pic), - "vod_remarks": desc || "" - }); - } - }); - - return videos; -} - -/** - * 首页推荐 - */ -async function homeVod() { - const html = await request(host); - return JSON.stringify({ list: getList(html) }); -} - -/** - * 分类页 - */ -async function category(tid, pg, filter, extend) { - const p = pg || 1; - const fl = extend || {}; - let url = ''; - - if (apitype === "vodshow") { - url = `${host}/vodshow/${tid}-${fl.area || ''}-${fl.by || 'time'}-${fl.class || ''}--${fl.letter || ''}---${p}---${fl.year || ''}.html`; - } else { - const parts = [ - fl.area ? `area/${fl.area}` : '', - fl.by ? `by/${fl.by}` : '', - fl.class ? `class/${fl.class}` : '', - fl.cateId ? `id/${fl.cateId}` : `id/${tid}`, - fl.lang ? `lang/${fl.lang}` : '', - fl.letter ? `letter/${fl.letter}` : '', - fl.year ? `year/${fl.year}` : '' - ].filter(Boolean); - - url = `${host}/index.php/vod/show/${parts.join('/')}/page/${p}.html`; - } - - const html = await request(url); - const videos = getList(html); - return JSON.stringify({list: videos, page: p, pagecount: 999, limit: 20, total: 999}); -} - -/** - * 详情页 - 解析视频信息和播放线路 - */ -async function detail(id) { - let html = await request(id); - - let vod_name = pdfh(html, '.video-info h1&&Text') || pdfh(html, 'h1&&Text') || '未知名称'; - let type_name = pdfh(html, '.tag-link&&Text') || '未知类型'; - let vod_pic = pd(html, '.lazyload&&data-src', host) || ''; - vod_pic = proxyImage(vod_pic); - let vod_content = pdfh(html, '.sqjj_a--span&&Text') || pdfh(html, '.video-info-content&&Text') || '暂无简介'; - let vod_remarks = pdfh(html, '.video-info-items:eq(3)&&Text') || '未知'; - let vod_year = pdfh(html, '.tag-link:eq(2)&&Text') || '未知年份'; - let vod_area = pdfh(html, '.tag-link:eq(3)&&Text') || '未知地区'; - let vod_actor = pdfh(html, '.video-info-actor:eq(1)&&Text') || '未知演员'; - let vod_director = pdfh(html, '.video-info-actor:eq(0)&&Text') || '未知导演'; - - let playFrom = [], playUrl = [], playPic = []; - let data = pdfa(html, '.module-row-title'); - - let panCounters = {'夸克': 1, '百度': 1, '优汐': 1}; - let allLines = []; - - data.forEach((item) => { - let text = pdfh(item, 'p&&Text'); - if (text) { - let link = text.trim(); - if (/\.quark/.test(link)) allLines.push({ type: '夸克', link: link }); - else if (/\.baidu/.test(link)) allLines.push({ type: '百度', link: link }); - else if (/\.uc|drive\.uc\.cn/.test(link)) allLines.push({ type: '优汐', link: link }); - } - }); - - for (let item of allLines) { - if (item.type === '夸克') { - let shareData = Quark.getShareData(item.link); - let files = await Quark.getFilesByShareUrl(shareData); - let lineName = '夸克#' + panCounters.夸克; - if (files && files.length > 0) { - let url = files.map(v => { - let size = v.size ? ` 【${formatFileSize(v.size)}】` : ''; - return `${v.file_name}${size}$${[shareData.shareId, v.stoken, v.fid, v.share_fid_token, v.pdir_fid || '', v.subtitle?.fid || '', v.subtitle?.share_fid_token || ''].join('*')}`; - }).join('#'); - let imgs = files.map(v => proxyImage(v.thumbnail || v.thumb || v.pic || '')).join('#'); - playFrom.push(lineName); - playUrl.push(url); - playPic.push(imgs); - panCounters.夸克++; - } - } - else if (item.type === '百度') { - let shareData = Baidu.getShareData(item.link); - if (shareData) { - let files = await Baidu.getFilesByShareUrl(shareData); - if (files && files.length > 0) { - let lineName = '百度#' + panCounters.百度; - let url = files.map(v => { - let size = v.size ? ` 【${formatFileSize(v.size)}】` : ''; - let info = { surl: shareData.surl, pwd: shareData.pwd || '' }; - return `${v.name}${size}$${[v.path, v.uk, v.shareid, v.fsid, JSON.stringify(info)].join('*')}`; - }).join('#'); - let imgs = files.map(v => proxyImage(v.thumbnail || v.thumb || v.pic || '')).join('#'); - playFrom.push(lineName); - playUrl.push(url); - playPic.push(imgs); - panCounters.百度++; - } - } - } - else if (item.type === '优汐') { - let shareData = UC.getShareData(item.link); - if (shareData) { - let files = await UC.getFilesByShareUrl(shareData); - if (files && files.length > 0) { - let lineName = '优汐#' + panCounters.优汐; - let url = files.map(v => { - let size = v.size ? ` 【${formatFileSize(v.size)}】` : ''; - return `${v.file_name}${size}$${[shareData.shareId, v.stoken, v.fid, v.share_fid_token, v.subtitle?.fid || '', v.subtitle?.share_fid_token || ''].join('*')}`; - }).join('#'); - let imgs = files.map(v => proxyImage(v.thumbnail || v.thumb || v.pic || '')).join('#'); - playFrom.push(lineName); - playUrl.push(url); - playPic.push(imgs); - panCounters.优汐++; - } - } - } - } - - // 线路排序和过滤 - if (playFrom.length > 0) { - let sortedLines = playFrom.map((name, index) => ({ - name, - url: playUrl[index], - pic: playPic[index], - type: name.split('#')[0] - })).sort((a, b) => { - let aIndex = line_order.indexOf(a.type); - let bIndex = line_order.indexOf(b.type); - if (aIndex === -1) aIndex = Infinity; - if (bIndex === -1) bIndex = Infinity; - return aIndex - bIndex; - }); - - let sorted = sortedLines.filter(line => !/(无名|失效)/.test(line.url)); - - playFrom = sorted.map(line => line.name); - playUrl = sorted.map(line => line.url); - playPic = sorted.map(line => line.pic); - } - - let vod = { - 'vod_id': id, - 'vod_name': vod_name, - 'vod_pic': vod_pic, - 'vod_content': vod_content, - 'vod_remarks': vod_remarks, - 'vod_year': vod_year, - 'vod_area': vod_area, - 'vod_actor': vod_actor, - 'vod_director': vod_director, - 'type_name': type_name, - 'vod_play_from': playFrom.join('$$$'), - 'vod_play_url': playUrl.join('$$$'), - 'vod_play_pic': playPic.join('$$$'), - 'vod_play_pic_ratio': 1.0 - }; - - return JSON.stringify({ list: [vod] }); -} - -/** - * 搜索 - */ -async function search(wd, quick, pg) { - const p = pg || 1; - let url = apitype === "vodshow" - ? `${host}/vodsearch/${wd}----------${p}---.html` - : `${host}/index.php/vod/search/page/${p}/wd/${encodeURIComponent(wd)}.html`; - - const html = await request(url); - if (!html) return JSON.stringify({ list: [], page: p, pagecount: 0, limit: 20, total: 0 }); - - const data = pdfa(html, '.module-items .module-search-item'); - const videos = []; - - data.forEach((it) => { - const name = pdfh(it, '.video-info&&a&&title'); - if (!name) return; - let pic = pd(it, 'img&&data-src', host) || ''; - pic = proxyImage(pic); - const desc = pdfh(it, '.module-item-text') || ""; - let url = pd(it, '.video-info&&a&&href', host) || ''; - videos.push({ "vod_id": url, "vod_name": name, "vod_pic": pic, "vod_remarks": desc }); - }); - - const filteredResults = videos.filter(item => (item.vod_name || '').toLowerCase().includes(wd.toLowerCase())); - - return JSON.stringify({ list: filteredResults, page: p, pagecount: 10, limit: 20, total: 100 }); -} - -/** - * 播放 - 获取视频播放链接 - */ -async function play(flag, id, flags) { - let ids = id.split('*'); - let urls = []; - - const addUrl = (name, u) => { - if (u) { - let finalUrl = u; - if (enableProxy == 1 && proxyurl) { - finalUrl = proxyurl + encodeURIComponent(u); - } - urls.push(name, finalUrl + `&threads=${downThreads}`); - } - }; - - // 夸克网盘 - if (flag.startsWith('夸克') && ids.length >= 4) { - let [shareId, stoken, fid, share_fid_token] = ids; - let header = { - 'User-Agent': UA, - 'origin': 'https://pan.quark.cn', - 'referer': 'https://pan.quark.cn/', - 'Cookie': Quark.cookie - }; - - // 无限画质(免转存直链) - if (quarkInfinite == 1) { - const tokenUrls = await Quark.getUrl(shareId, stoken, fid, share_fid_token); - tokenUrls?.forEach(item => { if (item?.url) addUrl("无限" + (item.name || ''), item.url); }); - } - - // 转存逻辑(原画和多分辨率) - let shouldTransfer = quarkTransfer; - if (quarkInfinite != 1 && quarkOrig != 1 && quarkTransfer != 1) { - shouldTransfer = 1; - } - - if (shouldTransfer == 1) { - // 原画 - if (quarkOrig == 1) { - let down = await Quark.getDownload(shareId, stoken, fid, share_fid_token, true); - if (down && down.error) { - const errorMsg = down.message || '未知错误'; - return JSON.stringify({ parse: 0, msg: `夸克: ${errorMsg}`, header: header }); - } - if (down?.download_url) addUrl("原画", down.download_url); - } - - // 转码画质 - let transcoding = await Quark.getLiveTranscoding(shareId, stoken, fid, share_fid_token); - if (transcoding?.length) { - transcoding.filter(t => t.accessable).forEach(t => { - if (t?.video_info?.url) { - addUrl(mapResolution(t.resolution), t.video_info.url); - } - }); - } - } - - if (urls.length) { - return JSON.stringify({ parse: 0, url: urls, header: header }); - } - } - - // 百度网盘 - if (flag.startsWith('百度') && ids.length >= 5) { - let [path, uk, shareid, fsid, shareDataStr] = ids; - let shareData = safeJSONParse(shareDataStr); - - let original = await Baidu.getAppShareUrl(path, uk, shareid, fsid, shareData); - if (original && !original.error) { - addUrl("原画", original); - } else { - const errorMsg = original?.message || '获取链接失败,请检查Cookie是否有效'; - return JSON.stringify({ parse: 0, msg: `百度: ${errorMsg}`, header: headers }); - } - - if (urls.length) { - return JSON.stringify({ - parse: 0, - url: urls, - header: { "User-Agent": 'netdisk;P2SP;2.2.91.136;android-android;' } - }); - } - } - - // 优汐网盘 - if (flag.startsWith('优汐') && ids.length >= 4) { - let [shareId, stoken, fid, share_fid_token] = ids; - - let down = await UC.getDownload(shareId, stoken, fid, share_fid_token, true); - if (down && down.error) { - const errorMsg = down.message || '未知错误'; - return JSON.stringify({ parse: 0, msg: `优汐: ${errorMsg}`, header: headers }); - } - if (down?.length) { - down.forEach(item => { if (item?.url) addUrl(mapResolution(item.name), item.url); }); - } - - if (urls.length) { - return JSON.stringify({ parse: 0, url: urls }); - } - } - - return JSON.stringify({ parse: 0, msg: `解析分享链接失败, 分享链接可能已失效`, header: headers }); -} - -/** - * 获取API类型 - */ -async function getApiType() { - if (!host) return "index.php"; - try { - const content = await request(host, { timeout: 3000 }); - return content?.includes('vodshow') ? "vodshow" : "index.php"; - } catch { - return "index.php"; - } -} - -/** - * 格式化文件大小 - */ -function formatFileSize(bytes) { - if (!bytes || bytes === 0) return '0 B'; - const units = ['B', 'KB', 'MB', 'GB', 'TB']; - let i = 0; - while (bytes >= 1024 && i < units.length - 1) { - bytes /= 1024; - i++; - } - return bytes.toFixed(2) + ' ' + units[i]; -} - -/** - * 图片代理 - */ -function proxyImage(url) { - if (!url) return ''; - url = url.replace(/(https?:\/\/[^/]+\/)+/g, '$1'); - if (enable_image != 1) return url; - if (/zy|xinlangtupian/.test(url)) { - return proxyimg + encodeURIComponent(url); - } - return url; -} - -/** - * 获取站点配置 - */ -function getSite(name) { - const config = siteConfigs[name]; - if (config) { - return { - classes: config.classes || [], - filters: config.filters || {} - }; - } - - return { - classes: cachedClasses || [], - filters: cachedFilters || {} - }; -} - -export function __jsEvalReturn() { - return { - init: init, - home: home, - homeVod: homeVod, - category: category, - detail: detail, - play: play, - search: search, - } -} \ No newline at end of file