]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Add 配置添加 指定弹幕重启录制
authorqydysky <32743305+qydysky@users.noreply.github.com>
Wed, 15 Mar 2023 17:15:17 +0000 (01:15 +0800)
committerqydysky <32743305+qydysky@users.noreply.github.com>
Wed, 15 Mar 2023 17:15:17 +0000 (01:15 +0800)
README.md
Reply/F.go
Reply/Reply.go
demo/config/config_K_v.json

index 50832c8375f9c952dd212a2c6ec96321a6f3f1fd..ed7c631637da213075b8314389fe7e001e2f3aa7 100644 (file)
--- 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]
 ```
 
 #### 注意事项
index 32a2bcc889a87ed422c5662421fbd888720a38cd..96663898656b3de520b7bbd447b155b90436addd 100644 (file)
@@ -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)
+                       }()
+               }
+       }
+}
index 3a5223c7e92dc22c34c1f73c3c8035271d111a33..50f307068da750cbc1b0b391a6572c25ed87e1b1 100644 (file)
@@ -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)
 }
index 3d272088b17383adef2176f2eaa27a2705c8b293..417ab27132cc62d4e5bb1b422e30a6183d28f084 100644 (file)
     "仅保存当前直播间流-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/",