From 257453a70bf11d6363903e11245a1467ef718c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=90=E6=91=86=E7=83=82=E5=92=B8=E9=B1=BC?= <51825113+unknown-o@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:48:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81B=E7=AB=99=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E5=BC=B9=E5=B9=95=E5=BD=95=E5=88=B6=20(#1186)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持B站完整弹幕录制 * feat: 原始弹幕json编码时不编码中文 * mod: 每五分钟保存一次弹幕文件,减少磁盘IO * feat: 默认场景10秒保存一次弹幕,原始弹幕5分钟一次 * mod: 修改录制原始弹幕参数名称 * mod: 更新示例配置文件 * refactor(Danmaku): 提升代码可读性 --------- Co-authored-by: xxxxuanran --- app/ui/plugins/bilibili.tsx | 9 +++ biliup/Danmaku/__init__.py | 156 +++++++++++++++++++++--------------- biliup/Danmaku/bilibili.py | 9 +++ biliup/plugins/bilibili.py | 2 + public/config.toml | 4 + public/config.yaml | 4 + 6 files changed, 119 insertions(+), 65 deletions(-) diff --git a/app/ui/plugins/bilibili.tsx b/app/ui/plugins/bilibili.tsx index e47d583..4fae6d0 100644 --- a/app/ui/plugins/bilibili.tsx +++ b/app/ui/plugins/bilibili.tsx @@ -72,6 +72,15 @@ const Bilibili: React.FC = props => { padding: 0, }} /> + 0 and time_since_last_save >= save_interval: + logger.debug(f'{DanmakuClient.__name__}:{self.__url}: 写入弹幕') write_file(fmt_file_name) + last_save_time = int(msg_time) + msg_i = 0 + # else: # 弹幕未写入原因 + # print(f"time_since_last_save: {time_since_last_save}, msg_i: {msg_i}") finally: # 发生异常(被取消)时写入 避免丢失未写入 + logger.debug(f'{DanmakuClient.__name__}:{self.__url}:弹幕保底写入') write_file(fmt_file_name) def start(self): diff --git a/biliup/Danmaku/bilibili.py b/biliup/Danmaku/bilibili.py index e8314b3..1495a1d 100644 --- a/biliup/Danmaku/bilibili.py +++ b/biliup/Danmaku/bilibili.py @@ -101,6 +101,11 @@ class Bilibili: packet_data = packet_data[packet_len:] return dm_list + def bytes_serializer(obj): + if isinstance(obj, bytes): + return obj.decode('utf-8') + raise TypeError("Type not serializable") + dm_list = decode_packet(data) for dm in dm_list: try: @@ -170,6 +175,10 @@ class Bilibili: msg['content'] = j else: msg = {'name': '', 'content': dm.get('body'), 'msg_type': 'other'} + try: + msg['raw_data'] = json.dumps(dm, default=bytes_serializer, ensure_ascii=False) + except: + msg['raw_data'] = "" msgs.append(msg) except Exception as Error: logger.warning(f"{Bilibili.__name__}: 弹幕接收异常 - {Error}") diff --git a/biliup/plugins/bilibili.py b/biliup/plugins/bilibili.py index a366736..65b57c9 100644 --- a/biliup/plugins/bilibili.py +++ b/biliup/plugins/bilibili.py @@ -21,6 +21,7 @@ class Bililive(DownloadBase): self.live_start_time = 0 self.bilibili_danmaku = config.get('bilibili_danmaku', False) self.bilibili_danmaku_detail = config.get('bilibili_danmaku_detail', False) + self.bilibili_danmaku_raw = config.get('bilibili_danmaku_raw', False) self.__real_room_id = None self.__login_mid = 0 self.bili_cookie = config.get('user', {}).get('bili_cookie') @@ -213,6 +214,7 @@ class Bililive(DownloadBase): 'room_id': self.__real_room_id, 'cookie': self.fake_headers.get('cookie', ''), 'detail': self.bilibili_danmaku_detail, + 'raw': self.bilibili_danmaku_raw, 'uid': self.__login_mid } ) diff --git a/public/config.toml b/public/config.toml index ae6277d..202724a 100644 --- a/public/config.toml +++ b/public/config.toml @@ -88,6 +88,10 @@ check_sourcecode = 15 #------哔哩哔哩------# ### 录制BILIBILI弹幕,目前暂时不支持视频按时长分段下的弹幕文件自动分段,默认关闭 # bilibili_danmaku = false +### 录制的弹幕信息中包含发送者昵称、用户UID,同时保存醒目留言、上舰、礼物信息。仅 bilibili_danmaku 开启时生效,默认关闭(实验性质:可能与弹幕转ass工具不兼容) +# bilibili_danmaku_detail = false +### 录制B站服务器返回的原始弹幕信息,方便有技术能力的用户对主播弹幕数据进行统计。仅 bilibili_danmaku 开启时生效,默认关闭,开启后弹幕文件会每隔5分钟写入一次(实验性质:可能导致弹幕文件巨大) +# bilibili_danmaku_raw = false ### 哔哩哔哩直播流协议.可选 stream(flv流),hls_ts(ts流)与hls_fmp4(fmp4流),默认为stream ### 仅国内IP可以解析到fmp4流。海外IP只能获取到flv流(ov05与ov07)和ts流(ov105) ### 由于fmp4出现需要一定时间,或者某些小主播(大部分只有原画选项的主播)无fmp4流。 diff --git a/public/config.yaml b/public/config.yaml index 9ccbd92..fc29c5e 100644 --- a/public/config.yaml +++ b/public/config.yaml @@ -87,6 +87,10 @@ check_sourcecode: 15 #------哔哩哔哩------# ### 录制BILIBILI弹幕,下载器为ffmpeg,streamlink时效果最优,默认关闭 # bilibili_danmaku: false +### 录制的弹幕信息中包含发送者昵称、用户UID,同时保存醒目留言、上舰、礼物信息。仅 bilibili_danmaku 开启时生效,默认关闭(实验性质:可能与弹幕转ass工具不兼容) +# bilibili_danmaku_detail: false +### 录制B站服务器返回的原始弹幕信息,方便有技术能力的用户对主播弹幕数据进行统计。仅 bilibili_danmaku 开启时生效,默认关闭,开启后弹幕文件会每隔5分钟写入一次(实验性质:可能导致弹幕文件巨大) +# bilibili_danmaku_raw: false ### 哔哩哔哩直播流协议.可选 stream(flv流),hls_ts(ts流)与hls_fmp4(fmp4流),默认为stream ### 仅国内IP可以解析到fmp4流。海外IP只能获取到flv流(ov05与ov07)和ts流(ov105) ### 由于fmp4出现需要一定时间,或者某些小主播(大部分只有原画选项的主播)无fmp4流。