From 22be8d94115f19dbb1eda881425460c14f9f2acd Mon Sep 17 00:00:00 2001 From: qydysky Date: Thu, 13 May 2021 21:20:25 +0800 Subject: [PATCH] =?utf8?q?=E6=9B=B4=E6=94=B9=E5=B8=A7=E5=8C=B9=E9=85=8D?= =?utf8?q?=E8=A7=84=E5=88=99=20=E4=BA=BA=E6=B0=94=E6=98=BE=E7=A4=BA?= =?utf8?q?=E4=BC=98=E5=8C=96=20flv=E6=B5=81=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- F/api.go | 52 ++++----- F/xinxin.go | 2 +- Reply/F.go | 279 +++++++++++++++++---------------------------- Reply/Reply.go | 16 ++- Reply/flvDecode.go | 2 +- Reply/gtk.go | 2 +- Reply/tts.go | 4 +- Send/Send.go | 2 +- Send/Send_gift.go | 2 +- Send/Send_pm.go | 2 +- 10 files changed, 151 insertions(+), 212 deletions(-) diff --git a/F/api.go b/F/api.go index a3e32d4..af6b75c 100644 --- a/F/api.go +++ b/F/api.go @@ -242,7 +242,7 @@ func Info(UpUid int) (info J.Info) { if err := req.Reqf(reqf.Rval{ Url:`https://api.bilibili.com/x/space/acc/info?mid=`+strconv.Itoa(UpUid)+`&jsonp=jsonp`, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -448,7 +448,7 @@ func getInfoByRoom() (missKey []string) { `Referer`:"https://live.bilibili.com/" + Roomid, }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -534,7 +534,7 @@ func getRoomPlayInfo() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -695,7 +695,7 @@ func getRoomPlayInfoByQn() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -847,7 +847,7 @@ func getDanmuInfo() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, });err != nil { apilog.L(`E: `,err) return @@ -892,7 +892,7 @@ func Get_face_src(uid string) (string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -956,7 +956,7 @@ func Get_HotRank() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -1026,7 +1026,7 @@ func Get_guardNum() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -1147,7 +1147,7 @@ func Get_cookie() (missKey []string) { if e := r.Reqf(reqf.Rval{ Url:`https://passport.bilibili.com/qrcode/getLoginUrl`, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });e != nil { apilog.L(`E: `,e) @@ -1250,7 +1250,7 @@ func Get_cookie() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });e != nil { apilog.L(`E: `,e) @@ -1371,7 +1371,7 @@ func Get_list_in_room() (array []TGet_list_in_room) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });e != nil { apilog.L(`E: `,e) @@ -1451,7 +1451,7 @@ func Get_weared_medal() (item TGet_weared_medal) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });e != nil { apilog.L(`E: `,e) @@ -1560,7 +1560,7 @@ func CheckSwitch_FansMedal() (missKey []string) { `Referer`: `https://passport.bilibili.com/login`, }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });e != nil { apilog.L(`E: `,e) @@ -1619,7 +1619,7 @@ func Dosign() { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -1666,7 +1666,7 @@ func Dosign() { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -1722,7 +1722,7 @@ func Get_LIVE_BUVID() (missKey []string) { `Upgrade-Insecure-Requests`: `1`, }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -1877,7 +1877,7 @@ func F_x25Kn() { }, PostStr:url.PathEscape(PostStr), Proxy:c.Proxy, - Timeout:5, + Timeout:5*1000, Retry:2, });err != nil { if !reqf.IsTimeout(err) { @@ -1986,7 +1986,7 @@ func F_x25Kn() { }, PostStr:url.PathEscape(PostStr), Proxy:c.Proxy, - Timeout:5, + Timeout:5*1000, Retry:2, });err != nil { if !reqf.IsTimeout(err) { @@ -2068,7 +2068,7 @@ func Gift_list() (list []Gift_list_type_Data_List) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2135,7 +2135,7 @@ func Silver_2_coin() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2195,7 +2195,7 @@ func Silver_2_coin() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2258,7 +2258,7 @@ func Silver_2_coin() (missKey []string) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2328,7 +2328,7 @@ func Feed_list() (Uplist []UpItem) { req := reqf.New() for pageNum:=1; true; pageNum+=1 { if err := req.Reqf(reqf.Rval{ - Url:`https://api.live.bilibili.com/relation/v1/feed/feed_list?page=`+strconv.Itoa(pageNum)+`&pagesize=10`, + Url:`https://api.live.bilibili.com/xlive/web-ucenter/v1/xfetter/FeedList?page=`+strconv.Itoa(pageNum)+`&pagesize=10`, Header:map[string]string{ `Host`: `api.live.bilibili.com`, `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`, @@ -2343,7 +2343,7 @@ func Feed_list() (Uplist []UpItem) { `Cookie`:reqf.Map_2_Cookies_String(Cookie), }, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2393,7 +2393,7 @@ func GetHistory(Roomid_int int) (j J.GetHistory) { `Referer`:"https://live.bilibili.com/" + Roomid, }, Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, Retry:2, });err != nil { apilog.L(`E: `,err) @@ -2432,7 +2432,7 @@ func IsConnected() bool { if err := req.Reqf(reqf.Rval{ Url:"https://www.bilibili.com", Proxy:c.Proxy, - Timeout:10, + Timeout:10*1000, JustResponseCode:true, });err != nil { apilog.L(`W: `,`网络中断`,err) diff --git a/F/xinxin.go b/F/xinxin.go index a483dd6..b4aa197 100644 --- a/F/xinxin.go +++ b/F/xinxin.go @@ -148,7 +148,7 @@ func Wasm(uid uintptr,s RT) (o string) {//maxloop 超时重试 Url:nodeJsUrl, PostStr:toNodeJsString(s), Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, });err != nil { wslog.L(`E: `,err) o = Wasm(uid, s) diff --git a/Reply/F.go b/Reply/F.go index b5ed4b9..c48bcca 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -290,9 +290,9 @@ func Savestreamf(){ if e := r.Reqf(reqf.Rval{ Url:m3u8_url, Retry:4, - SleepTime:1, + SleepTime:1000, Proxy:c.Proxy, - Timeout:3, + Timeout:3*1000, Header:map[string]string{ `Host`: url_struct.Host, `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`, @@ -429,26 +429,32 @@ func Savestreamf(){ }) {//重试 - rr := reqf.New() + r := reqf.New() go func(){ savestream.cancel.Wait() - rr.Close() + r.Close() }() l.L(`I: `,"尝试连接live") - if e := rr.Reqf(reqf.Rval{ + if e := r.Reqf(reqf.Rval{ Url:c.Live[0], Retry:10, - SleepTime:5, + SleepTime:1000, Proxy:c.Proxy, Header:map[string]string{ `Cookie`:reqf.Map_2_Cookies_String(CookieM), }, - Timeout:5, + Timeout:5*1000, JustResponseCode:true, }); e != nil{l.L(`W: `,e)} - if rr.Response == nil || - rr.Response.StatusCode != 200 { + if r.Response == nil { + l.L(`W: `,`live响应错误`) + savestream.wait.Done() + savestream.cancel.Done() + time.Sleep(time.Second*5) + continue + } else if r.Response.StatusCode != 200 { + l.L(`W: `,`live响应错误`,r.Response.Status,string(r.Respon)) savestream.wait.Done() savestream.cancel.Done() time.Sleep(time.Second*5) @@ -461,62 +467,11 @@ func Savestreamf(){ Ass_f(savestream.path, time.Now()) // no expect qn - exit_chan := make(chan struct{}) - { - // go func(){//flv stream - // byteC := make(chan []byte,1<<17) - - // go func(){ - // for !p.Checkfile().IsExist(savestream.path + ".flv.dtmp") { - // select { - // case <-exit_chan:return; - // case <-time.After(time.Second):; - // } - // } - // for { - // if err := Stream(savestream.path + ".flv.dtmp",&savestream.flv_front,byteC,exit_chan);err != nil { - // flog.L(`T: `,err); - // return - // } - // select { - // case <-exit_chan:return; - // default:; - // } - // } - // }() - - // var buf []byte - // for { - // select{ - // case res :=<- byteC: - // buf = append(buf, res...) - // if len(byteC) != 0 {break} - // savestream.flv_stream.Push_tag("stream",buf) - // buf = []byte{} - // case <- exit_chan: - // savestream.flv_stream.Push_tag("close",nil) - // return; - // } - // } - // }() - } - - // go func(){ - // var count int = 5 - // for count > 0 && c.Live_want_qn < c.Live_qn { - // count -= 1 - // select{ - // case <- time.After(time.Minute*2):; - // case <- exit_chan:return; - // } - // F.Get(`Liveing`) - // if !c.Liveing {break} - - // F.Get(`Live`) - // if len(c.Live)==0 {break} - // } - // Savestream_wait() - // }() + exit_chan := s.Init() + go func(){ + savestream.cancel.Wait() + exit_chan.Done() + }() type link_stream struct { id *idpool.Id @@ -579,15 +534,15 @@ func Savestreamf(){ defer reqs_func_block.UnBlock() for i:=0;i 3 { - l.L(`T: `,"flv强行拼合") - // fmt.Println(`强行merge`) - // reqs_remove_id = append(reqs_remove_id, reqs_used_id[0]) - // last_time_stamp = int(F.Btoi32([]byte{reqs_keyframe[0][0][7], reqs_keyframe[0][0][4], reqs_keyframe[0][0][5], reqs_keyframe[0][0][6]},0)) - - reqs_keyframe = [][][]byte{} + } else if size > 4 { + if reqs_keyframe_index == len(reqs_used_id)-1 { + l.L(`T: `,"flv强行拼合") - for i:=0;i 1 { - // fmt.Println(`merge 旧连接退出`) - // for k,v := range reqs_used_id { - // fmt.Println(k,v.id) - // } - reqs_used_id[0].close() - // reqs_used_id = reqs_used_id[1:] - // last_time_stamp = int(F.Btoi32([]byte{reqs_keyframe[0][0][7], reqs_keyframe[0][0][4], reqs_keyframe[0][0][5], reqs_keyframe[0][0][6]},0)) - - // reqs_keyframe = [][][]byte{} - - // for i:=0;i 5 {reqs_remove_id = reqs_remove_id[1:]} - for i:=0;i 0 { + live_index = int(p.Rand().MixRandom(0,int64(len(c.Live)-1))) + } + link,exp,e := flv_get_link(c.Live[live_index]) if e != nil { l.L(`W: `,`流链接获取错误`,e) break @@ -740,6 +681,7 @@ func Savestreamf(){ var ( bc = make(chan []byte,1<<17) req = reqf.New() + req_exit = s.Init() ) l.L(`T: `,`新建请求`,req.Id()) @@ -747,13 +689,20 @@ func Savestreamf(){ //新建请求 go func(r *reqf.Req,rval reqf.Rval){ go func(){ - savestream.cancel.Wait() - req.Close() + select { + case <-exit_chan.WaitC():; + case <-req_exit.WaitC():; + } + r.Close() }() - - if e := r.Reqf(rval);e != nil { + defer req_exit.Done() + e := r.Reqf(rval) + if r.Response == nil { l.L(`W: `,`请求退出`,r.Id(),e) - return + } else if r.Response.StatusCode != 200 { + l.L(`W: `,`请求退出`,r.Id(),e,r.Response.Status,string(r.Respon)) + } else { + l.L(`W: `,`请求退出`,r.Id(),e,r.Response.Status) } }(req,reqf.Rval{ Url:link, @@ -763,103 +712,79 @@ func Savestreamf(){ }, //SaveToPath:savestream.path + ".flv", SaveToChan:bc, - Timeout:int(int64(exp) - p.Sys().GetSTime()), - ReadTimeout:5, + Timeout:int(int64(exp) - p.Sys().GetSTime())*1000, + ReadTimeout:5*1000, + ConnectTimeout:10*1000, }) //返回通道 - var ( - item = link_stream{ + var item = link_stream{ close:req.Close, id:id_pool.Get(), } - http_error = make(chan error) - ) l.L(`T: `,`新建连接`,item.id.Id) //解析 - go func(http_error chan error,bc chan[]byte,item *link_stream){ - // defer l.L(`I: `,"解析退出") + go func(bc chan[]byte,item *link_stream,exit_chan *s.Signal){ var ( buf []byte skip_buf_size int ) - for { + defer req_exit.Done() + defer l.L(`W: `,`连接退出`,item.id.Id) + for exit_chan.Islive() && req_exit.Islive() { select { - case <-exit_chan:return; + case <-exit_chan.WaitC():return; + case <-req_exit.WaitC():return; case b :=<- bc: if len(b) == 0 { // fmt.Println(`req退出`,item.id.Id) id_pool.Put(item.id) - http_error <- errors.New(`EOF`) // reqs.Push_tag(`closereq`,*item) return } - + buf = append(buf, b...) - - // var tmp_buf []byte - // { - // tmp_buf = make([]byte,len(buf)) - // copy(tmp_buf, buf) - // } - // fmt.Println(buf[:11]) - + if len(buf) < skip_buf_size {break} - + front,list,_ := Seach_stream_tag(buf) - + if len(front) != 0 && len(item.front) == 0 { // fmt.Println(item.id.Id,`获取到header`,len(front)) item.front = make([]byte,len(front)) copy(item.front, front) } - + if len(list) == 0 || len(item.front) == 0 { // fmt.Println(`再次查询bufsize`,skip_buf_size) skip_buf_size = 2*len(buf) break } - - // total := 0 - // var tmp_buf []byte - // { - // tmp_buf = make([]byte,len(buf)) - // copy(tmp_buf, buf) - // } + item.keyframe = list - // item.keyframe = make([][]byte,len(list)) - // for i:=0;i%d 下一header %b\n",len(buf),len(buf)-cut_offset,buf[:11]) buf = buf[cut_offset:] } - + skip_buf_size = len(buf)+len(list[0]) - reqs.Push_tag(`req`,*item) } } - }(http_error,bc,&item) + }(bc,&item,exit_chan) //等待过期/退出 { var exit_sign bool select { - case <- savestream.cancel.Chan: - exit_sign = true - case <- time.After(time.Second*time.Duration(int(int64(exp) - p.Sys().GetSTime())-60)):; - case e :=<- http_error: - l.L(`W: `,`连接退出`,item.id.Id,e) + case <- req_exit.Chan:;//本次连接错误,退出重试 + case <- exit_chan.Chan://要求退出 + exit_sign = true// + case <- time.After(time.Second*time.Duration(int(int64(exp) - p.Sys().GetSTime())-120)):; } if exit_sign { //退出 @@ -877,7 +802,7 @@ func Savestreamf(){ if len(c.Live)==0 {break} } - close(exit_chan) + exit_chan.Done() reqs.Push_tag(`close`,nil) out.Close() @@ -1061,9 +986,9 @@ func Savestreamf(){ if e := r.Reqf(reqf.Rval{ Url:(*link).Url, Retry:3, - SleepTime:1, + SleepTime:1000, SaveToPath:path+(*link).Base, - Timeout:3, + Timeout:3*1000, Proxy:c.Proxy, }); e != nil{ l.L(`I: `,e,`将重试!`) @@ -1890,7 +1815,7 @@ func init() { //最新直播流 if savestream.path == `` { - flog.L(`I: `,`还没有下载直播流`) + flog.L(`T: `,`还没有下载直播流`) w.WriteHeader(http.StatusNotFound) return } @@ -1903,7 +1828,7 @@ func init() { } if !p.Checkfile().IsExist(base_dir+path) { - flog.L(`I: `,`还没有下载直播流`) + flog.L(`T: `,`还没有下载直播流`) w.WriteHeader(http.StatusNotFound) } else { u, e := url.Parse("../"+path) diff --git a/Reply/Reply.go b/Reply/Reply.go index 339de48..67a85d9 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -254,10 +254,24 @@ func (replyF) user_toast_msg(s string){ } //HeartBeat-心跳用来传递人气值 +var renqi_old int func (replyF) heartbeat(s int){ c.Danmu_Main_mq.Push_tag(`c.Renqi`,s)//使用连续付费的新舰长无法区分,刷新舰长数 if s == 1 {return}//人气为1,不输出 - reply_log.Base_add(`人气`).L(`I: `,"当前人气", s) + var ( + tmp string + ) + if renqi_old != 0 { + if s > renqi_old { + tmp += `+` + } + tmp += fmt.Sprintf("%.1f%%",100*float64(s - renqi_old)/float64(renqi_old)) + tmp = `(`+tmp+`)` + } + + fmt.Printf("\t人气:%d %s\n", s, tmp) + reply_log.Base_add(`人气`).Log_show_control(false).L(`I: `,"当前人气", s) + renqi_old = s } //Msg-房间特殊活动 diff --git a/Reply/flvDecode.go b/Reply/flvDecode.go index 34a93ba..b4c9324 100644 --- a/Reply/flvDecode.go +++ b/Reply/flvDecode.go @@ -692,7 +692,7 @@ func Merge_stream(keyframe_lists [][][]byte,last_keyframe_timestramp int)(keyfra // fmt.Println(keyframe_lists[o]) // keyframe_list_i_header := fmt.Sprintf("%x",keyframe_lists[i][o][:tag_header_size-3]) // old_buf_o := buf_o - if bytes.Index(buf[n][tag_header_size:],keyframe_lists[i][o][tag_header_size:]) != -1 { + if bytes.Index(buf[n][1:4],keyframe_lists[i][o][1:4]) != -1 { // last_time_stamp := int(F.Btoi32([]byte{buf[n][7], buf[n][4], buf[n][5], buf[n][6]},0)) diff --git a/Reply/gtk.go b/Reply/gtk.go index 6d6cb61..1c404d6 100644 --- a/Reply/gtk.go +++ b/Reply/gtk.go @@ -475,7 +475,7 @@ func Gtk_danmu() { if e := req.Reqf(reqf.Rval{ Url:src, SaveToPath:Gtk_img_path + `/` + uid, - Timeout:3, + Timeout:3*1000, Proxy:c.Proxy, }); e != nil{log.Println(e);} }() diff --git a/Reply/tts.go b/Reply/tts.go index 1a60ce2..5d299e9 100644 --- a/Reply/tts.go +++ b/Reply/tts.go @@ -90,9 +90,9 @@ func TTS(uid,msg string) { if err := req.Reqf(reqf.Rval{ Url:`https://fanyi.baidu.com/gettts?lan=zh&text=`+ url.QueryEscape(msg) +`&spd=5&source=web`, SaveToPath:p.Sys().Cdir()+`/tts.mp3`, - Timeout:3, + Timeout:3*1000, Retry:1, - SleepTime:500, + SleepTime:5000, Proxy:c.Proxy, });err != nil { tts_log.L(`E: `,err) diff --git a/Send/Send.go b/Send/Send.go index 7993677..8299aca 100644 --- a/Send/Send.go +++ b/Send/Send.go @@ -43,7 +43,7 @@ func Danmu_s(msg string, roomid int) { Url:"https://api.live.bilibili.com/msg/send", PostStr:url.PathEscape(PostStr), Retry:2, - Timeout:5, + Timeout:5*1000, Proxy:c.Proxy, Header:map[string]string{ `Host`: `api.live.bilibili.com`, diff --git a/Send/Send_gift.go b/Send/Send_gift.go index 8839043..733e242 100644 --- a/Send/Send_gift.go +++ b/Send/Send_gift.go @@ -54,7 +54,7 @@ func Send_gift(gift_id,bag_id,gift_num int) { if e:= req.Reqf(reqf.Rval{ Url:`https://api.live.bilibili.com/gift/v2/live/bag_send`, PostStr:url.PathEscape(sendStr), - Timeout:10, + Timeout:10*1000, Proxy:c.Proxy, Header:map[string]string{ `Host`: `api.vc.bilibili.com`, diff --git a/Send/Send_pm.go b/Send/Send_pm.go index b45f76d..0728be6 100644 --- a/Send/Send_pm.go +++ b/Send/Send_pm.go @@ -64,7 +64,7 @@ func Send_pm(uid int, msg string) error { if e:= req.Reqf(reqf.Rval{ Url:`https://api.vc.bilibili.com/web_im/v1/web_im/send_msg`, PostStr:url.PathEscape(send_str), - Timeout:10, + Timeout:10*1000, Proxy:c.Proxy, Header:map[string]string{ `Host`: `api.vc.bilibili.com`, -- 2.39.2