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流。