From af2055a13bb3976a0bff6daade54b42b4a20a706 Mon Sep 17 00:00:00 2001 From: qydysky Date: Fri, 2 Feb 2024 00:35:11 +0800 Subject: [PATCH] Fix panic #101 --- F/api.go | 4 ++-- Reply/stream.go | 40 ++++++++++++++++++++++++++++------------ go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/F/api.go b/F/api.go index 6daec9c..b399656 100644 --- a/F/api.go +++ b/F/api.go @@ -644,7 +644,7 @@ func (t *GetFunc) getRoomPlayInfo() (missKey []string) { req := t.Common.ReqPool.Get() defer t.Common.ReqPool.Put(req) if err := req.Reqf(reqf.Rval{ - Url: "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?no_playurl=0&mask=1&qn=0&platform=web&protocol=0,1&format=0,2&codec=0,1&room_id=" + Roomid, + Url: "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?protocol=0,1&format=0,1,2&codec=0,1,2&qn=0&platform=web&ptype=8&dolby=5&panorama=1&room_id=" + Roomid, Header: map[string]string{ `Referer`: "https://live.bilibili.com/" + Roomid, `Cookie`: reqf.Map_2_Cookies_String(Cookie), @@ -739,7 +739,7 @@ func (t *GetFunc) getRoomPlayInfoByQn() (missKey []string) { req := t.Common.ReqPool.Get() defer t.Common.ReqPool.Put(req) if err := req.Reqf(reqf.Rval{ - Url: "https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?no_playurl=0&mask=1&qn=" + strconv.Itoa(t.Live_qn) + "&platform=web&protocol=0,1&format=0,2&codec=0,1&room_id=" + Roomid, + Url: fmt.Sprintf("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=%s&protocol=0,1&format=0,1,2&codec=0,1,2&qn=%d&platform=web&ptype=8&dolby=5&panorama=1", Roomid, t.Live_qn), Header: map[string]string{ `Referer`: "https://live.bilibili.com/" + Roomid, `Cookie`: reqf.Map_2_Cookies_String(Cookie), diff --git a/Reply/stream.go b/Reply/stream.go index 219c7b3..f398206 100644 --- a/Reply/stream.go +++ b/Reply/stream.go @@ -17,6 +17,7 @@ import ( "path/filepath" "strconv" "strings" + "sync" "sync/atomic" "time" @@ -50,7 +51,7 @@ type M4SStream struct { first_buf []byte //m4s起始块 or flv起始块 frameCount uint //关键帧数量 boot_buf []byte //快速启动缓冲 - boot_buf_locker funcCtrl.BlockFunc + boot_buf_locker sync.RWMutex last_m4s *m4s_link_item //最后一个切片 m4s_pool *pool.Buf[m4s_link_item] //切片pool common *c.Common //通用配置副本 @@ -237,10 +238,8 @@ func (t *M4SStream) fetchCheckStream() bool { } if e := r.Reqf(reqf.Rval{ - Url: v.Url, - Retry: 10, - SleepTime: 1000, - Proxy: t.common.Proxy, + Url: v.Url, + Proxy: t.common.Proxy, Header: map[string]string{ `User-Agent`: c.UA, `Accept`: `*/*`, @@ -764,7 +763,10 @@ func (t *M4SStream) saveStreamFlv() (e error) { } t.bootBufPush(keyframe.GetPureBuf()) keyframe.Reset() - t.Stream_msg.PushLock_tag(`data`, t.boot_buf) + _ = t.bootBufRead(func(data []byte) error { + t.Stream_msg.PushLock_tag(`data`, data) + return nil + }) t.frameCount += 1 t.msg.Push_tag(`keyFrame`, t) } @@ -1021,7 +1023,10 @@ func (t *M4SStream) saveStreamM4s() (e error) { if !keyframe.IsEmpty() { t.bootBufPush(keyframe.GetPureBuf()) keyframe.Reset() - t.Stream_msg.PushLock_tag(`data`, t.boot_buf) + _ = t.bootBufRead(func(data []byte) error { + t.Stream_msg.PushLock_tag(`data`, data) + return nil + }) t.frameCount += 1 t.msg.Push_tag(`keyFrame`, t) } @@ -1435,10 +1440,15 @@ func (t *M4SStream) PusherToHttp(conn net.Conn, w http.ResponseWriter, r *http.R } //写入快速启动缓冲 - if len(t.boot_buf) != 0 { - if _, err := w.Write(t.boot_buf); err != nil { - return err + if err := t.bootBufRead(func(data []byte) error { + if len(data) != 0 { + if _, err := w.Write(data); err != nil { + return err + } } + return nil + }); err != nil { + return err } var cancelRec = t.Stream_msg.Pull_tag_async(map[string]func([]byte) bool{ @@ -1474,10 +1484,16 @@ func (t *M4SStream) PusherToHttp(conn net.Conn, w http.ResponseWriter, r *http.R } func (t *M4SStream) bootBufPush(buf []byte) { - t.boot_buf_locker.Block() - defer t.boot_buf_locker.UnBlock() + t.boot_buf_locker.Lock() + defer t.boot_buf_locker.Unlock() if len(t.boot_buf) < len(buf) { t.boot_buf = append(t.boot_buf, make([]byte, len(buf)-len(t.boot_buf))...) } t.boot_buf = t.boot_buf[:copy(t.boot_buf, buf)] } + +func (t *M4SStream) bootBufRead(r func(data []byte) error) error { + t.boot_buf_locker.RLock() + defer t.boot_buf_locker.RUnlock() + return r(t.boot_buf) +} diff --git a/go.mod b/go.mod index a6a8c31..7faad9d 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( ) require ( - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 golang.org/x/exp v0.0.0-20240119083558-1b970713d09a ) @@ -24,7 +24,7 @@ require ( lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.41.0 // indirect modernc.org/ccgo/v3 v3.16.15 // indirect - modernc.org/libc v1.40.6 // indirect + modernc.org/libc v1.40.10 // indirect modernc.org/mathutil v1.6.0 // indirect modernc.org/memory v1.7.2 // indirect modernc.org/opt v0.1.3 // indirect @@ -39,14 +39,14 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.7.1 github.com/gorilla/websocket v1.5.1 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.5 // indirect github.com/lib/pq v1.10.9 github.com/miekg/dns v1.1.58 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/thedevsaddam/gojsonq/v2 v2.5.2 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/sys v0.16.0 // indirect diff --git a/go.sum b/go.sum index 370ea9c..88981e8 100644 --- a/go.sum +++ b/go.sum @@ -13,16 +13,16 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gotk3/gotk3 v0.6.2 h1:sx/PjaKfKULJPTPq8p2kn2ZbcNFxpOJqi4VLzMbEOO8= github.com/gotk3/gotk3 v0.6.2/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E= +github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -53,8 +53,8 @@ github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08 github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= @@ -87,8 +87,8 @@ modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.40.6 h1:141JHq3SjhOOCjECBgD4K8VgTFOy19CnHwroC08DAig= -modernc.org/libc v1.40.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/libc v1.40.10 h1:oCWzNF5k6gedzmiqtOQACV07U4RxWy2qPBTyVWwObjw= +modernc.org/libc v1.40.10/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -- 2.39.2