From 7ed66c21c5ac79cd05c7204067b7dc068cedc74a Mon Sep 17 00:00:00 2001 From: huangxd- <649924757@qq.com> Date: Tue, 6 Jan 2026 22:30:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8A=92=E6=9E=9Ctv=E6=97=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=BC=BA=E5=A4=B1=E5=AF=BC=E8=87=B4=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E5=89=A7=E9=9B=86=E8=AF=B7=E6=B1=82=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E5=BC=B9=E5=B9=95=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- danmu_api/sources/mango.js | 42 ++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/danmu_api/sources/mango.js b/danmu_api/sources/mango.js index bd02c24..7cb086d 100644 --- a/danmu_api/sources/mango.js +++ b/danmu_api/sources/mango.js @@ -568,6 +568,7 @@ export default class MangoSource extends BaseSource { // 弹幕和视频信息 API 基础地址 const api_video_info = "https://pcweb.api.mgtv.com/video/info"; const api_ctl_barrage = "https://galaxy.bz.mgtv.com/getctlbarrage"; + const api_rd_barrage = "https://galaxy.bz.mgtv.com/rdbarrage"; // 解析 URL 获取 cid 和 vid const regex = /^(https?:\/\/[^\/]+)(\/[^?#]*)/; @@ -615,8 +616,9 @@ export default class MangoSource extends BaseSource { const data = typeof res.data === "string" ? JSON.parse(res.data) : res.data; const time = data.data.info.time; - // 尝试使用新API(支持彩色弹幕)获取分段列表 + let useNewApi = true; try { + // 尝试使用新API(支持彩色弹幕)获取分段列表 const ctlBarrageUrl = `${api_ctl_barrage}?version=8.1.39&abroad=0&uuid=&os=10.15.7&platform=0&mac=&vid=${vid}&pid=&cid=${cid}&ticket=`; const res = await httpGet(ctlBarrageUrl, { headers: { @@ -629,25 +631,35 @@ export default class MangoSource extends BaseSource { // 检查数据结构 if (!ctlBarrage.data || !ctlBarrage.data.cdn_list || !ctlBarrage.data.cdn_version) { log("warn", `新API缺少必要字段,返回空分段列表`); - return new SegmentListResponse({ - "type": "imgo", - "segmentList": [] - }); + useNewApi = false; } // 构建分段列表 const segmentList = []; - const totalSegments = Math.ceil(time_to_second(time) / 60); // 每1分钟一个分段 - const cdnList = ctlBarrage.data.cdn_list.split(',')[0]; - const cdnVersion = ctlBarrage.data.cdn_version; + if (!useNewApi) { + const step = 60; // 每60秒一个分段 + const end_time = time_to_second(time); + for (let i = 0; i < end_time; i += step) { + segmentList.push({ + "type": "imgo", + "segment_start": i, // 每段开始时间(秒) + "segment_end": Math.min((i + step), time_to_second(time)), // 每段结束时间(秒) + "url": `${api_rd_barrage}?vid=${vid}&cid=${cid}&time=${i * 1000}` // 每段弹幕URL + }); + } + } else { + const totalSegments = Math.ceil(time_to_second(time) / 60); // 每1分钟一个分段 + const cdnList = ctlBarrage.data.cdn_list.split(',')[0]; + const cdnVersion = ctlBarrage.data.cdn_version; - for (let i = 0; i < totalSegments; i++) { - segmentList.push({ - "type": "imgo", - "segment_start": i * 60, // 每段开始时间(秒) - "segment_end": Math.min((i + 1) * 60, time_to_second(time)), // 每段结束时间(秒) - "url": `https://${cdnList}/${cdnVersion}/${i}.json` // 每段弹幕URL - }); + for (let i = 0; i < totalSegments; i++) { + segmentList.push({ + "type": "imgo", + "segment_start": i * 60, // 每段开始时间(秒) + "segment_end": Math.min((i + 1) * 60, time_to_second(time)), // 每段结束时间(秒) + "url": `https://${cdnList}/${cdnVersion}/${i}.json` // 每段弹幕URL + }); + } } return new SegmentListResponse({