From 26536021f04da3b93d0fb0daac9f1346a51af8ad Mon Sep 17 00:00:00 2001 From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Thu, 16 Mar 2023 01:15:17 +0800 Subject: [PATCH] =?utf8?q?Add=20=E9=85=8D=E7=BD=AE=E6=B7=BB=E5=8A=A0=20?= =?utf8?q?=E6=8C=87=E5=AE=9A=E5=BC=B9=E5=B9=95=E9=87=8D=E5=90=AF=E5=BD=95?= =?utf8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- Reply/F.go | 42 +++++++++++++++++++++++++++++++++++++ Reply/Reply.go | 3 +++ demo/config/config_K_v.json | 7 +++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 50832c8..ed7c631 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ - [x] cookie加密 - [x] 弹幕自动重连(30s无响应) - [x] 直播流开播自动下载、断流再保存、故障转移、移除历史 -- [x] ~~多房间直播流保存~~ +- [x] 指定弹幕、标题切换重启录制 - [x] 命令行支持房间切换、弹幕发送、表情发送、启停录制、重载弹幕、查看历史记录、查看正在直播的主播 - [x] GTK信息窗支持房间切换、弹幕格式化发送、时长统计 - [x] GTK弹幕窗支持自定义人/事件消息停留 @@ -466,7 +466,8 @@ go build main.go 前往[releases](https://github.com/qydysky/bili_danmu/releases)页下载对应系统版本。解压后进入`demo`目录(文件夹),运行`demo.run`(`demo.exe`)。 ``` -./demo.run [-r 房间ID] +./demo.run [-r 房间ID] [-ckv 自定义config_K_v.json] +./demo.exe [-r 房间ID] [-ckv 自定义config_K_v.json] ``` #### 注意事项 diff --git a/Reply/F.go b/Reply/F.go index 32a2bcc..9666389 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "time" // "runtime" @@ -1462,3 +1463,44 @@ func (t *Communicate) Count() int { func (t *Communicate) Store(k interface{}) { t.Buf.Store(k, nil) } + +// 指定弹幕重启录制 +var danmuReLiveTriger DanmuReLiveTriger + +type DanmuReLiveTriger struct { + l map[string]struct{} + reload atomic.Bool + init sync.Once +} + +func (t *DanmuReLiveTriger) Init(c *c.Common) { + t.init.Do(func() { + t.l = make(map[string]struct{}) + if v, ok := c.K_v.LoadV(`指定弹幕重启录制`).([]any); ok && len(v) > 0 { + for i := 0; i < len(v); i++ { + var item = v[i].(map[string]any) + var uid = strings.TrimSpace(item["uid"].(string)) + var danmu = strings.TrimSpace(item["danmu"].(string)) + if uid != "" && danmu != "" { + t.l[uid+" "+danmu] = struct{}{} + } + } + } + }) +} + +func (t *DanmuReLiveTriger) Check(uid, msg string) { + if _, ok := t.l[uid+" "+msg]; ok { + if t.reload.CompareAndSwap(false, true) { + flog.Base_add("指定弹幕重启录制").L(`I: `, uid, msg, "请求重启录制") + go func() { + if v, ok := c.C.K_v.LoadV(`仅保存当前直播间流`).(bool); ok && v { + StreamOStop(c.C.Roomid) //停止其他房间录制 + } + StreamOStart(c.C.Roomid) + time.Sleep(time.Minute) + t.reload.Store(false) + }() + } + } +} diff --git a/Reply/Reply.go b/Reply/Reply.go index 3a5223c..50f3070 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -1122,6 +1122,9 @@ func (replyF) danmu(s string) { } else { item.msg = _msg } + //对指定弹幕重新录制 + danmuReLiveTriger.Init(&c.C) + danmuReLiveTriger.Check(item.uid, item.msg) } Msg_showdanmu(item) } diff --git a/demo/config/config_K_v.json b/demo/config/config_K_v.json index 3d27208..417ab27 100644 --- a/demo/config/config_K_v.json +++ b/demo/config/config_K_v.json @@ -64,6 +64,13 @@ "仅保存当前直播间流-help": "启用此项,才会保存Ass", "仅保存当前直播间流": true, "修改标题时重新录制": true, + "指定弹幕重启录制-help":"接收到特定uid的danmu将进行重新录制, uid或danmu为空无效,触发后有1分钟冷却", + "指定弹幕重启录制":[ + { + "uid":"", + "danmu":"" + } + ], "Web服务地址-help":"填写本程序各组件所用的服务地址 例0.0.0.0:10000 为空时不启动Web服务", "Web服务地址":"0.0.0.0:10000", "直播Web服务路径":"/web/", -- 2.39.2