From 13fc3a11ab371f7661f3a19da7848e2bb837fd3a Mon Sep 17 00:00:00 2001 From: huangxd- <649924757@qq.com> Date: Tue, 24 Feb 2026 23:30:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9hanjutv=E7=82=B9=E8=B5=9E?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=85=88=E5=8E=BB=E9=87=8D=E5=86=8D?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E7=82=B9=E8=B5=9E=E6=A0=87=E8=AE=B0=EF=BC=8C?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E6=95=B0=E7=BC=A9=E5=86=99=E6=98=BE=E7=A4=BA?= =?UTF-8?q?(1200=20->=201.2k)=EF=BC=8C=E4=BE=8B=E5=A6=82=20=E2=9D=A4?= =?UTF-8?q?=EF=B8=8F=202.9k=E3=80=82=E5=A2=9E=E5=8A=A0=E2=80=9C=E8=B6=85?= =?UTF-8?q?=E9=AB=98=E8=B5=9E=E9=AB=98=E4=BA=AE=E6=A0=B7=E5=BC=8F=E2=80=9D?= =?UTF-8?q?=E8=A7=84=E5=88=99=EF=BC=88hanjutv=20=E4=B8=AD=20>=3D100=20?= =?UTF-8?q?=E7=94=A8=20=F0=9F=94=A5=EF=BC=8C=E6=99=AE=E9=80=9A=E7=82=B9?= =?UTF-8?q?=E8=B5=9E=E4=BB=8D=E7=94=A8=20=E2=9D=A4=EF=B8=8F=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E2=89=A55=20=E6=89=8D=E6=98=BE=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=BD=8E=E8=B5=9E=E5=B9=B2=E6=89=B0=20(#199)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- danmu_api/configs/globals.js | 2 +- danmu_api/sources/hanjutv.js | 5 +-- danmu_api/utils/danmu-util.js | 59 ++++++++++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/danmu_api/configs/globals.js b/danmu_api/configs/globals.js index a08325b..384d89d 100644 --- a/danmu_api/configs/globals.js +++ b/danmu_api/configs/globals.js @@ -13,7 +13,7 @@ export const Globals = { accessedEnvVars: {}, // 静态常量 - VERSION: '1.15.0', + VERSION: '1.15.1', MAX_LOGS: 1000, // 日志存储,最多保存 1000 行 MAX_ANIMES: 100, MAX_RECORDS: 100, // 请求记录最大数量 diff --git a/danmu_api/sources/hanjutv.js b/danmu_api/sources/hanjutv.js index 55f9516..f5272ce 100644 --- a/danmu_api/sources/hanjutv.js +++ b/danmu_api/sources/hanjutv.js @@ -253,8 +253,9 @@ export default class HanjutvSource extends BaseSource { return comments.map(c => ({ cid: Number(c.did), p: `${(c.t / 1000).toFixed(2)},${c.tp === 2 ? 5 : c.tp},${Number(c.sc)},[hanjutv]`, - m: c.lc ? `${c.con} 👍${c.lc}` : c.con, - t: Math.round(c.t / 1000) + m: c.con, + t: Math.round(c.t / 1000), + like: c.lc })); } } \ No newline at end of file diff --git a/danmu_api/utils/danmu-util.js b/danmu_api/utils/danmu-util.js index f2a616c..bba4afc 100644 --- a/danmu_api/utils/danmu-util.js +++ b/danmu_api/utils/danmu-util.js @@ -70,12 +70,15 @@ export function groupDanmusByMinute(filteredDanmus, n) { count: 0, earliestT: danmu.t, cid: danmu.cid, - p: danmu.p + p: danmu.p, + like: 0 // 初始化like字段 }; } acc[message].count += 1; // 更新最早时间 acc[message].earliestT = Math.min(acc[message].earliestT, danmu.t); + // 合并like字段,如果是undefined则视为0 + acc[message].like += (danmu.like !== undefined ? danmu.like : 0); return acc; }, {}); @@ -93,7 +96,8 @@ export function groupDanmusByMinute(filteredDanmus, n) { p: data.p, // 仅当计算后的逻辑计数大于1时才显示 "x N" m: displayCount > 1 ? `${message} x ${displayCount}` : message, - t: data.earliestT + t: data.earliestT, + like: data.like // 包含合并后的like字段 }; }); }); @@ -102,6 +106,50 @@ export function groupDanmusByMinute(filteredDanmus, n) { return result.flat().sort((a, b) => a.t - b.t); } +/** + * 处理弹幕的点赞数显示 + * @param {Array} groupedDanmus 弹幕列表 + * @returns {Array} 处理后的弹幕列表 + */ +export function handleDanmusLike(groupedDanmus) { + return groupedDanmus.map(item => { + // 如果item没有like字段或者like值小于5,则不处理 + if (!item.like || item.like < 5) { + return item; + } + + // 获取弹幕来源信息,判断是否为hanjutv + const isHanjutv = item.p.includes('[hanjutv]'); + + // 确定阈值:hanjutv中>=100用🔥,其他>=1000用🔥 + const threshold = isHanjutv ? 100 : 1000; + const icon = item.like >= threshold ? '🔥' : '❤️'; + + // 格式化点赞数,缩写显示 + let formattedLike; + if (item.like >= 10000) { + // 万级别,如 1.2w + formattedLike = (item.like / 10000).toFixed(1) + 'w'; + } else if (item.like >= 1000) { + // 千级别,如 1.2k + formattedLike = (item.like / 1000).toFixed(1) + 'k'; + } else { + // 百级别及以下,直接显示数字 + formattedLike = item.like.toString(); + } + + // 在弹幕内容m字段后面添加点赞信息 + const likeText = ` ${icon} ${formattedLike}`; + const newM = item.m + likeText; + + // 创建新对象,复制原属性,更新m字段,并删除like字段 + const { like, ...rest } = item; + return { + ...rest, + m: newM + }; + }); +} export function limitDanmusByCount(filteredDanmus, danmuLimit) { // 如果 danmuLimit 为 0,直接返回原始数据 @@ -215,7 +263,7 @@ export function convertToDanmakuJson(contents, platform) { `[${platform}]` ].join(","); - danmus.push({ p: attributes, m, cid: cidCounter++ }); + danmus.push({ p: attributes, m, cid: cidCounter++, like: item?.like }); } // 切割字符串成正则表达式数组 @@ -247,8 +295,11 @@ export function convertToDanmakuJson(contents, platform) { log("info", `去重分钟数: ${globals.groupMinute}`); const groupedDanmus = groupDanmusByMinute(filteredDanmus, globals.groupMinute); + // 处理点赞数 + const likeDanmus = handleDanmusLike(groupedDanmus); + // 应用弹幕转换规则(在去重和限制弹幕数之后) - let convertedDanmus = limitDanmusByCount(groupedDanmus, globals.danmuLimit); + let convertedDanmus = limitDanmusByCount(likeDanmus, globals.danmuLimit); if (globals.convertTopBottomToScroll || globals.convertColor === 'white' || globals.convertColor === 'color') { let topBottomCount = 0; let colorCount = 0;