From 06464647b86d0574edf5ac075e03dc377769f213 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sat, 19 Dec 2020 06:17:34 +0800 Subject: [PATCH] =?utf8?q?=E7=9B=B4=E6=92=AD=E9=97=B4=E5=85=B3=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- README.md | 138 +++++++++------------------ Reply/Msg.go | 10 +- Reply/Reply.go | 77 ++++++++++++++- Reply/tts.go | 26 +++-- demo/config/config_disable_msg.json | 3 +- demo/config/config_gtk_keep_key.json | 3 +- demo/config/config_tts.json | 3 +- demo/face/0follow | Bin 0 -> 32049 bytes 8 files changed, 150 insertions(+), 110 deletions(-) create mode 100644 demo/face/0follow diff --git a/README.md b/README.md index 393c100..a20ae05 100644 --- a/README.md +++ b/README.md @@ -13,104 +13,57 @@ golang go version go1.15.5 linux/amd64 --- ### 当前支持显示/功能 + +#### 当前支持显示 以下内容可能过时,点击查看[当前支持显示](https://github.com/qydysky/bili_danmu/blob/master/Reply/Msg.go#L13) -``` -显示 -case 后有函数调用的为支持,为nil的为待完善,注释掉的调用为未启用 - -//Msg类型数据处理方法map -var Msg_map = map[string]func(replyF, string) { - "PK_BATTLE_PRE":nil,//人气pk - "PK_BATTLE_START":nil,//人气pk - "PK_BATTLE_PROCESS":nil,//人气pk - "PK_BATTLE_END":nil,//人气pk - "PK_BATTLE_RANK_CHANGE":nil,//人气pk - "PK_BATTLE_SETTLE_USER":nil,//人气pk - "PK_BATTLE_SETTLE_V2":nil,//人气pk - "PK_BATTLE_SETTLE":nil,//人气pk - "SYS_MSG":nil,//系统消息 - "ROOM_SKIN_MSG":nil, - "GUARD_ACHIEVEMENT_ROOM":nil, - "ANCHOR_LOT_START":nil,//天选之人开始 - "ANCHOR_LOT_CHECKSTATUS":nil, - "ANCHOR_LOT_END":nil,//天选之人结束 - "ANCHOR_LOT_AWARD":nil,//天选之人获奖 - "COMBO_SEND":nil, - "INTERACT_WORD":nil, - "ACTIVITY_BANNER_UPDATE_V2":nil, - "NOTICE_MSG":nil, - "ROOM_BANNER":nil, - "ONLINERANK":nil, - "WELCOME":nil, - "HOUR_RANK_AWARDS":nil, - "ROOM_RANK":nil, - "ROOM_SHIELD":nil, - "USER_TOAST_MSG":replyF.user_toast_msg,//大航海购买信息 - "WIN_ACTIVITY":replyF.win_activity,//活动 - "SPECIAL_GIFT":replyF.special_gift,//节奏风暴 - "GUARD_BUY":nil,//replyF.guard_buy,//大航海购买 - "WELCOME_GUARD":replyF.welcome_guard,//大航海进入 - "DANMU_MSG":replyF.danmu,//弹幕 - "ROOM_CHANGE":replyF.room_change,//房间信息分区改变 - "ROOM_SILENT_OFF":replyF.roomsilent,//禁言结束 - "ROOM_SILENT_ON":replyF.roomsilent,//禁言开始 - "SEND_GIFT":replyF.send_gift,//礼物 - "ROOM_BLOCK_MSG":replyF.room_block_msg,//封禁 - "PREPARING":replyF.preparing,//下播 - "LIVE":replyF.live,//开播 - "SUPER_CHAT_MESSAGE":nil,//replyF.super_chat_message,//SC - "SUPER_CHAT_MESSAGE_JPN":replyF.super_chat_message,//SC - "PANEL":replyF.panel,//排行榜 - "ENTRY_EFFECT":nil,//replyF.entry_effect,//进入特效 - "ROOM_REAL_TIME_MESSAGE_UPDATE":nil,//replyF.roominfo,//粉丝数 -} -``` +- [x] 人气 +- [x] 天选之人开始 +- [x] 天选之人获奖 +- [x] 直播间关注提示 +- [x] 大航海购买 +- [x] 节奏风暴 +- [x] 大航海进入 +- [x] 弹幕 +- [x] 房间信息分区改变 +- [x] 禁言 +- [x] 礼物 +- [x] 封禁 +- [x] 下播 +- [x] 开播 +- [x] SC +- [x] 排行榜 + +#### 当前支持功能 以下内容可能过时,点击查看[当前支持功能](https://github.com/qydysky/bili_danmu/blob/master/Reply/F.go#L16) -``` -其他功能 -自动化功能、挑选有价值的弹幕,可在demo/config_F.json覆盖默认控制 -//功能开关 -var AllF = map[string]bool{ - "Saveflv":true,//保存直播流(仅高清) - /* - Saveflv需要外部组件 - ffmpeg http://ffmpeg.org/download.html - */ - "Obs":false,//obs组件(仅录播) - /* - Obs需要外部组件: - obs https://obsproject.com/download - obs-websocket https://github.com/Palakis/obs-websocket/releases - */ - "Ass":true,//Ass弹幕生成,由于时间对应关系,仅开启流保存时生效 - "Autoban":true,//自动封禁(仅提示,未完成) - "Jiezou":true,//带节奏预警,提示弹幕礼仪 - "Danmuji":true,//反射型弹幕机,回应弹幕 - "Danmuji_auto":false,//自动型弹幕机,定时输出 - "Autoskip":true,//刷屏缩减,相同合并 - "Lessdanmu":true,//弹幕缩减,屏蔽与前n条弹幕重复的字数占比度高于阈值的弹幕 - "Moredanmu":false,//弹幕增量 - "Shortdanmu":true,//上下文相同文字缩减 -} -``` -以下内容可能过时,其他小功能 - -弹幕自动重连 - -直播流开播自动下载 - -直播流下载重连 - -gtk弹幕窗自定义人/事件消息停留/房间切换/弹幕格式化发送 - -营收/舰长/时长统计 - -自定义语音提醒 +- [x] 自定义语音提醒 +- [x] GTK弹幕窗 +- [x] GTK信息窗 +- [x] 营收统计 +- [x] 舰长数统计 +- [x] 直播流保存 +- [x] ASS字幕生成 +- [x] OBS调用 +- [x] 节奏提示 +- [x] 反射型弹幕机 +- [x] 自动型弹幕机 +- [x] 相同弹幕合并 +- [x] 重复度高弹幕屏蔽 +- [x] 弹幕开头字符相同缩减 + + +#### 其他特性 + +- [x] 弹幕自动重连(30s) +- [x] 直播流开播自动下载 +- [x] 直播流断流再保存 +- [x] GTK信息窗支持房间切换、弹幕格式化发送、时长统计 +- [x] GTK弹幕窗支持自定义人/事件消息停留 ### 构建 本项目使用github action自动构建,构建过程详见[yml](https://github.com/qydysky/bili_danmu/blob/master/.github/workflows/go.yml) -构建tts需要ffplay,先行安装[ffmpeg](http://ffmpeg.org/download.html) +#### 语音 +调用tts需要ffplay,先行安装[ffmpeg](http://ffmpeg.org/download.html) ``` 编译命令 @@ -118,6 +71,7 @@ cd demo go build -v -tags `tts` -o demo.exe -i main.go ``` +#### 弹幕窗 构建gtk需要gtk3,先行安装[gtk](https://www.gtk.org/) ``` 编译命令 diff --git a/Reply/Msg.go b/Reply/Msg.go index e3d06b6..52b24d3 100644 --- a/Reply/Msg.go +++ b/Reply/Msg.go @@ -41,7 +41,7 @@ var Msg_map = map[string]func(replyF, string) { "ANCHOR_LOT_END":nil,//天选之人结束 "ANCHOR_LOT_AWARD":replyF.anchor_lot_award,//天选之人获奖 "COMBO_SEND":nil, - "INTERACT_WORD":nil, + "INTERACT_WORD":replyF.interact_word,//进入信息,包含直播间关注提示 "ACTIVITY_BANNER_UPDATE_V2":nil, "NOTICE_MSG":nil, "ROOM_BANNER":nil, @@ -78,7 +78,13 @@ func init(){ buf := s.New() buf.Load("config/config_disable_msg.json") for k,v := range buf.B { - if able,ok := v.(bool);ok && !able {Msg_map[k] = nil} + if able,ok := v.(bool);ok {//设置为true时,使用默认显示 + if able { + Msg_map[k] = replyF.defaultMsg + } else { + Msg_map[k] = nil + } + } } } } diff --git a/Reply/Reply.go b/Reply/Reply.go index c59a5bf..b055705 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -60,6 +60,26 @@ func (replyF) defaultMsg(s string){ msglog.Base(1, "Unknow").E(s) } +//msg-直播间进入信息,此处用来提示关注 +func (replyF) interact_word(s string){ + msg_type := p.Json().GetValFromS(s, "data.msg_type"); + if v,ok := msg_type.(float64);!ok || v < 2 {return}//关注时为2,进入时为1 + uname := p.Json().GetValFromS(s, "data.uname"); + if v,ok := uname.(string);ok { + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0follow`, + msg:fmt.Sprintln(v + `关注了直播间`), + }, + }) + } + Gui_show(v + `关注了直播间`,`0follow`) + msglog.Base(1, "房").Fileonly(true).I(v + `关注了直播间`).Fileonly(false) + } +} + //Msg-天选之人开始 func (replyF) anchor_lot_start(s string){ award_name := p.Json().GetValFromS(s, "data.award_name"); @@ -92,7 +112,11 @@ func (replyF) anchor_lot_award(s string){ uname := p.Json().GetValFrom(v, "uname"); uid := p.Json().GetValFrom(v, "uid"); if uname != nil && uid != nil { - sh = append(sh, uname, "(", uid, ")") + if v,ok := uid.(float64);ok {//uid可能为float型 + sh = append(sh, uname, "(", strconv.Itoa(int(v)), ")") + } else { + sh = append(sh, uname, "(", uid, ")") + } } } } @@ -151,6 +175,15 @@ func (replyF) user_toast_msg(s string){ Data:price.(float64) / 1000, }) } + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0guard_update`, + msg:fmt.Sprintln(sh...), + }, + }) + } {//额外 ass Assf(fmt.Sprintln(sh...)) c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//使用连续付费的新舰长无法区分,刷新舰长数 @@ -174,7 +207,7 @@ func (replyF) heartbeat(s int){ Class:`c.Renqi`, Data:s, }) - // if s == "1" {return}//人气为1,不输出 + if s == 1 {return}//人气为1,不输出 heartlog.I("当前人气", s) } @@ -287,7 +320,15 @@ func (replyF) welcome_guard(s string){ if username != nil { sh = append(sh, username, "进入直播间") } - + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:img, + msg:fmt.Sprintln(sh...), + }, + }) + } fmt.Print(">>> ") fmt.Println(sh...) Gui_show(Itos(append([]interface{}{">>> "}, sh...)), img) @@ -336,6 +377,15 @@ func (replyF) send_gift(s string){ //小于3万金瓜子 if allprice < 30 {msglog.T(sh...);return} + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0gift`, + msg:fmt.Sprintln(sh...), + }, + }) + } {//额外 Assf(fmt.Sprintln(sh...)) } @@ -455,6 +505,15 @@ func (replyF) super_chat_message(s string){ sh = append(sh, message) logg = append(logg, message) } + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0superchat`, + msg:fmt.Sprintln(sh...), + }, + }) + } if message_jpn != nil && message.(string) != message_jpn.(string) && message_jpn.(string) != "" { fmt.Println(message_jpn) // Gui_show(message_jpn.(string)) @@ -592,7 +651,17 @@ func Msg_showdanmu(auth interface{}, m ...string) { Gui_show(m...) } } - + {//语言tts + if len(m) > 1 { + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:m[1], + msg:msg, + }, + }) + } + } fmt.Println(msg) if auth != nil {msglog.I(auth, ":", msg)} } diff --git a/Reply/tts.go b/Reply/tts.go index 8f2b34c..f9cf8fc 100644 --- a/Reply/tts.go +++ b/Reply/tts.go @@ -7,6 +7,7 @@ import ( "net/url" "strings" p "github.com/qydysky/part" + c "github.com/qydysky/bili_danmu/CV" s "github.com/qydysky/part/buf" ) @@ -28,21 +29,30 @@ func init(){ } } go func(){ - var ( - sig = Danmu_mq.Sig() - data interface{} - ) go func(){ for{ e := <- tts_List TTS(e.(Danmu_mq_t).uid, e.(Danmu_mq_t).msg) } }() - + + //消息队列接收tts类消息,并传送到TTS朗读 + var ( + sig = c.Danmu_Main_mq.Sig() + data interface{} + ) for { - data,sig = Danmu_mq.Pull(sig) - if _,ok := tts_setting[data.(Danmu_mq_t).uid];!ok {continue} - tts_List <- data + data,sig = c.Danmu_Main_mq.Pull(sig) + if d,ok := data.(c.Danmu_Main_mq_item);!ok { + continue + } else { + switch d.Class { + case `tts`: + if _,ok := tts_setting[d.Data.(Danmu_mq_t).uid];!ok {continue} + tts_List <- d.Data + default: + } + } } }() } diff --git a/demo/config/config_disable_msg.json b/demo/config/config_disable_msg.json index ece8479..bab0479 100644 --- a/demo/config/config_disable_msg.json +++ b/demo/config/config_disable_msg.json @@ -1,5 +1,4 @@ { "help":"禁用指定消息类型", - "PK_BATTLE_PRE":false, - "DANMU_MSG":true + "PK_BATTLE_PRE":false } \ No newline at end of file diff --git a/demo/config/config_gtk_keep_key.json b/demo/config/config_gtk_keep_key.json index 50b9860..8f75f53 100644 --- a/demo/config/config_gtk_keep_key.json +++ b/demo/config/config_gtk_keep_key.json @@ -9,5 +9,6 @@ "face/0level3":1, "face/0superchat":13, "face/0tianxuan":5, - "face/0multi":1 + "face/0multi":1, + "face/0follow":1 } \ No newline at end of file diff --git a/demo/config/config_tts.json b/demo/config/config_tts.json index 52b02c8..67e8235 100644 --- a/demo/config/config_tts.json +++ b/demo/config/config_tts.json @@ -2,5 +2,6 @@ "0buyguide":"感谢{D}", "0gift":"感谢{D}", "0superchat":"感谢{D}", - "0multi":"观众:{D}" + "0multi":"观众:{D}", + "0follow":"感谢{D}" } \ No newline at end of file diff --git a/demo/face/0follow b/demo/face/0follow new file mode 100644 index 0000000000000000000000000000000000000000..0c3ab2ee38419746b4c9aa706832c3e720dd3ba6 GIT binary patch literal 32049 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