From a355342ae218981441b0b0e99459f3b7d9751a24 Mon Sep 17 00:00:00 2001 From: qydysky Date: Tue, 15 Jun 2021 03:55:19 +0800 Subject: [PATCH] =?utf8?q?tts=E6=94=AF=E6=8C=81=E8=AE=AF=E9=A3=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- README.md | 23 ++- Reply/tts.go | 281 ++++++++++++++++++++++++++++++++---- demo/config/config_K_v.json | 7 +- demo/go.mod | 6 +- demo/go.sum | 6 + go.mod | 6 +- go.sum | 6 + 7 files changed, 295 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 25bfb92..24b98fa 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,10 @@ I: 2021/04/13 20:07:45 命令行操作 [直播Web服务: http://192.168.31.245:3 - [mpv](https://mpv.io/) - [MXPlayer](https://sites.google.com/site/mxvpen/home) +**特殊的** + +由于hls流使用浏览器支持的编码格式,故可以使用浏览器直接打开mp4直播流链接,即上述带`?type=mp4`的链接。 + #### 命令行操作 在准备动作完成(`T: 2021/03/06 16:22:39 命令行操作 [回车查看帮助]`)后,输入回车将显示帮助 @@ -309,7 +313,24 @@ release默认编译tts "TTS_服务器_youdaoId": "", "TTS_服务器_youdaoKey": "", ``` -支持baidu和[有道](https://ai.youdao.com/gw.s#/),如使用有道则需要Id和Key。 +支持baidu、[有道](https://ai.youdao.com/gw.s#/)、[讯飞](https://www.xfyun.cn/)。 + +使用有道则需要Id和Key。 +``` + "TTS_服务器_youdaoId": "7xxxxxxxxxxxxxxa", + "TTS_服务器_youdaoKey": "yxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxP", + +``` + +使用讯飞则需要应用Id、Key、Secret。可设置发音人。 +``` + "TTS_服务器_xfId": "6xxxxxxb", + "TTS_服务器_xfKey": "4xxxxxxxx9", + "TTS_服务器_xfSecret": "YxxxxxxxBh", + "TTS_服务器_xfVoice-help": "讯飞发音人 xiaoyan:小燕甜美女声 aisjiuxu:许久亲切男声 aisxping:小萍知性女声 aisjinger:小婧亲切女声 aisbabyxu:许小宝可爱童声 random:随机", + "TTS_服务器_xfVoice": "random", + +``` #### 弹幕窗 构建gtk需要gtk3,先行安装[gtk](https://www.gtk.org/) diff --git a/Reply/tts.go b/Reply/tts.go index 899907e..5d8781a 100644 --- a/Reply/tts.go +++ b/Reply/tts.go @@ -1,16 +1,25 @@ package reply import ( + "fmt" + "time" + "errors" + "crypto/sha256" "os/exec" "net/url" "strings" + "encoding/base64" + "encoding/json" + "crypto/hmac" c "github.com/qydysky/bili_danmu/CV" p "github.com/qydysky/part" msgq "github.com/qydysky/part/msgq" + ws "github.com/qydysky/part/websocket" s "github.com/qydysky/part/buf" reqf "github.com/qydysky/part/reqf" limit "github.com/qydysky/part/limit" + funcCtrl "github.com/qydysky/part/funcCtrl" ) var ( @@ -31,9 +40,10 @@ var tts_log = c.Log.Base_add(`TTS`) var ( tts_ser = "baidu" - tts_ser_map = map[string]func(string)reqf.Rval{ + tts_ser_map = map[string]func(string)error{ `baidu`:baidu, `youdao`:youdao, + `xf`:xf, } tts_prog = "ffplay" tts_prog_set = "-autoexit -nodisp" @@ -86,7 +96,7 @@ func init(){ for len(tts_List) > 0 && len(s) < 100 { s += " " + <- tts_List } - TTS(<- tts_List) + TTS(s) } }() @@ -135,65 +145,63 @@ func init(){ func TTS(msg string) { if tts_limit.TO() {return} - var ( - req = reqf.New() - rval reqf.Rval - ) + var err error if f,ok := tts_ser_map[tts_ser];ok{ - rval = f(msg) + err = f(msg) } else { - rval = baidu(msg) - } - if rval.Url == `` { - tts_log.L(`E: `, `rval.Url`) - return + err = baidu(msg) } - - if err := req.Reqf(rval);err != nil { - tts_log.L(`E: `,err) - return - } - if req.Response.Header.Get(`Content-type`) == `application/json` { - tts_log.L(`W: `, `错误`, req.Response.StatusCode, string(req.Respon)) + + if err != nil { + tts_log.L(`E: `, err) return } + return +} + +func play(){ var prog = []string{} prog = append(prog, p.Sys().Cdir()+"/tts.mp3") prog = append(prog, strings.Split(tts_prog_set," ")...) p.Exec().Run(false, tts_prog, prog...) - return + } -func baidu(msg string) reqf.Rval { - return reqf.Rval{ +func baidu(msg string) error { + req := reqf.New() + if err := req.Reqf(reqf.Rval{ Url:`https://fanyi.baidu.com/gettts?lan=zh&text=`+ url.PathEscape(msg) +`&spd=5&source=web`, SaveToPath:p.Sys().Cdir()+`/tts.mp3`, Timeout:3*1000, Retry:1, SleepTime:5000, Proxy:c.Proxy, + });err != nil { + return err } + play() + return nil } var ( - appId string - appKey string + youdaoId string + youdaoappKey string ) func init(){ if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoId`).(string);ok && v != ``{ - appId = v + youdaoId = v } if v, ok := c.K_v.LoadV(`TTS_服务器_youdaoKey`).(string);ok && v != ``{ - appKey = v + youdaoappKey = v } - if tts_ser == `youdao` && (appId == `` || appKey == ``) { + if tts_ser == `youdao` && (youdaoId == `` || youdaoappKey == ``) { tts_log.L(`W: `, `未提供youdaoId、Key,使用baidu`) tts_ser = `baidu` } } -func youdao(msg string) reqf.Rval { - if appId == "" || appKey == "" { +func youdao(msg string) error { + if youdaoId == "" || youdaoappKey == "" { return baidu(msg) } @@ -202,17 +210,19 @@ func youdao(msg string) reqf.Rval { api = map[string]string{ `q`:msg, `langType`:"zh-CHS", - `appKey`:appId, + `youdaoappKey`:youdaoId, `salt`:p.Stringf().Rand(1, 8), } postS string ) - api[`sign`] = strings.ToUpper(p.Md5().Md5String(api[`appKey`]+api[`q`]+api[`salt`]+appKey)) + api[`sign`] = strings.ToUpper(p.Md5().Md5String(api[`youdaoappKey`]+api[`q`]+api[`salt`]+youdaoappKey)) for k,v := range api { if postS != "" {postS += "&"} postS += k+`=`+v } - return reqf.Rval{ + + req := reqf.New() + if err := req.Reqf(reqf.Rval{ Url:`https://openapi.youdao.com/ttsapi`, PostStr:url.PathEscape(postS), SaveToPath:p.Sys().Cdir()+`/tts.mp3`, @@ -220,5 +230,212 @@ func youdao(msg string) reqf.Rval { Retry:1, SleepTime:5000, Proxy:c.Proxy, + });err != nil { + return err + } + if req.Response.Header.Get(`Content-type`) == `application/json` { + return errors.New(`错误 ` + req.Response.Status + string(req.Respon)) + } + play() + return nil +} + +var ( + xfId string + xfKey string + xfSecret string + xfVoice = "random" + xfVmap = map[string]bool{ + `xiaoyan`:true, + `aisjiuxu`:true, + `aisxping`:true, + `aisjinger`:true, + `aisbabyxu`:true, + } + xfwsClient *ws.Client + xf_req func() + xf_req_block funcCtrl.BlockFunc +) +func init(){ + if v, ok := c.K_v.LoadV(`TTS_服务器_xfId`).(string);ok && v != ``{ + xfId = v + } + if v, ok := c.K_v.LoadV(`TTS_服务器_xfKey`).(string);ok && v != ``{ + xfKey = v + } + if v, ok := c.K_v.LoadV(`TTS_服务器_xfSecret`).(string);ok && v != ``{ + xfSecret = v + } + if v, ok := c.K_v.LoadV(`TTS_服务器_xfVoice`).(string);ok && v != ``{ + if _,ok := xfVmap[v];ok || v == `random` { + xfVoice = v + } else { + tts_log.L(`I: `,`未支持设定发音,使用随机`) + } + } + if tts_ser == `xf` && (xfId == `` || xfKey == `` || xfSecret == ``) { + tts_log.L(`W: `, `未提供讯飞Id、Key、Secret,使用baidu`) + tts_ser = `baidu` + } + + //@hosturl : like wss://tts-api.xfyun.cn/v2/tts + //@apikey : apiKey + //@apiSecret : apiSecret + assembleAuthUrl := func (hosturl string, apiKey, apiSecret string) (string,error) { + ul, err := url.Parse(hosturl) + if err != nil { + return "",err + } + //签名时间 + date := time.Now().UTC().Format(time.RFC1123) + //参与签名的字段 host ,date, request-line + signString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"} + //拼接签名字符串 + sgin := strings.Join(signString, "\n") + //签名 + mac := hmac.New(sha256.New, []byte(apiSecret)) + mac.Write([]byte(sgin)) + sha := base64.StdEncoding.EncodeToString(mac.Sum(nil)) + //构建请求参数 此时不需要urlencoding + authUrl := fmt.Sprintf("api_key=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha) + //将请求参数使用base64编码 + authorization:= base64.StdEncoding.EncodeToString([]byte(authUrl)) + v := url.Values{} + v.Add("host", ul.Host) + v.Add("date", date) + v.Add("authorization", authorization) + //将编码后的字符串url encode后添加到url后面 + callurl := hosturl + "?" + v.Encode() + return callurl,nil + } + + wsUrl,err := assembleAuthUrl("wss://tts-api.xfyun.cn/v2/tts", xfKey, xfSecret) + + if err != nil { + tts_log.L(`E: `, `错误,使用百度`, err) + tts_ser = `baidu` + return + } + + xf_req = func(){ + xf_req_block.Block()//cant call in same time + defer xf_req_block.UnBlock() + + xfwsClient = ws.New_client(ws.Client{ + Url:wsUrl, + Proxy:c.Proxy, + Header: map[string]string{ + `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0`, + `Accept`: `*/*`, + `Accept-Language`: `zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2`, + `Pragma`: `no-cache`, + `Cache-Control`: `no-cache`, + }, + }).Handle() + if xfwsClient.Isclose() { + tts_log.L(`E: `,"连接错误,使用百度", xfwsClient.Error()) + tts_ser = `baidu` + } else { + go func(){ + var buf []byte + for !xfwsClient.Isclose() { + data := <- xfwsClient.RecvChan + if len(data) == 0 {break} + + var partS struct { + Code int `json:"code"` + Message string `json:"message"` + Sid string `json:"sid"` + Data struct { + Audio string `json:"audio"` + Ced string `json:"ced"` + Status int `json:"status"` + } `json:"data"` + } + if e := json.Unmarshal(data, &partS);e != nil { + tts_log.L(`E: `,"错误", e, data) + xfwsClient.Close() + return + } else { + if partS.Code != 0 { + tts_log.L(`W: `,fmt.Sprintf("code:%d msg:%s", partS.Code, partS.Message)) + break + } + if partS.Data.Audio != "" { + if part,e := base64.StdEncoding.DecodeString(partS.Data.Audio);e != nil { + tts_log.L(`E: `,"错误", e) + break + } else { + buf = append(buf, part...) + } + } + if partS.Data.Status == 2 { + break + } + } + } + if len(buf) != 0 { + p.File().FileWR(p.Filel{ + File:p.Sys().Cdir()+`/tts.mp3`, + Context:[]interface{}{buf}, + }) + play() + } + xfwsClient.Close() + }() + } + + } + xf_req() +} +func xf(msg string) error { + if xfId == `` || xfKey == `` || xfSecret == `` { + tts_log.L(`T: `,"参数不足,使用百度") + return baidu(msg) + } + + voice := xfVoice + if voice == `random` { + for k,_ := range xfVmap { + voice = k + break + } + } + + type rec struct { + Common struct { + AppID string `json:"app_id"` + } `json:"common"` + Business struct { + Aue string `json:"aue"` + Vcn string `json:"vcn"` + Tte string `json:"tte"` + Sfl int `json:"sfl"` + } `json:"business"` + Data struct { + Status int `json:"status"` + Text string `json:"text"` + } `json:"data"` + } + + {//msg + var postS = rec{} + postS.Common.AppID = xfId + postS.Business.Aue = "lame" + postS.Business.Sfl = 1 + postS.Business.Tte = "UTF8" + postS.Business.Vcn = voice + postS.Data.Status = 2 + postS.Data.Text = base64.StdEncoding.EncodeToString([]byte(msg)) + + if b,e := json.Marshal(postS);e != nil { + return e + } else { + if xfwsClient.Isclose() { + xf_req() + } + xfwsClient.SendChan <- b + } } + return nil } \ No newline at end of file diff --git a/demo/config/config_K_v.json b/demo/config/config_K_v.json index e1bfb84..51a4cfd 100644 --- a/demo/config/config_K_v.json +++ b/demo/config/config_K_v.json @@ -7,10 +7,15 @@ "弹幕私信(额外)": "[弹幕机测试 额外]:弹幕", "TTS_配置-help": "将会运行[TTS_使用程序路径 获取的音频路径 TTS_使用程序参数]", "TTS_总开关": true, - "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS", + "TTS_服务器-help": "baidu:百度翻译合成 youdao:有道TTS xf:讯飞TTS", "TTS_服务器": "baidu", "TTS_服务器_youdaoId": "", "TTS_服务器_youdaoKey": "", + "TTS_服务器_xfId": "", + "TTS_服务器_xfKey": "", + "TTS_服务器_xfSecret": "", + "TTS_服务器_xfVoice-help": "讯飞发音人 xiaoyan:小燕甜美女声 aisjiuxu:许久亲切男声 aisxping:小萍知性女声 aisjinger:小婧亲切女声 aisbabyxu:许小宝可爱童声 random:随机", + "TTS_服务器_xfVoice": "aisjinger", "TTS_使用程序路径": "ffplay", "TTS_使用程序参数": "-autoexit -nodisp -volume 60", "弹幕-help": "弹幕相关", diff --git a/demo/go.mod b/demo/go.mod index a098100..2c16db5 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -9,17 +9,17 @@ require ( github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/gotk3/gotk3 v0.6.0 // indirect - github.com/klauspost/compress v1.13.0 // indirect + github.com/klauspost/compress v1.13.1 // indirect github.com/mdp/qrterminal/v3 v3.0.0 // indirect github.com/miekg/dns v1.1.42 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/qydysky/bili_danmu v0.5.9 - github.com/qydysky/part v0.5.25 // indirect + github.com/qydysky/part v0.5.26 // indirect github.com/shirou/gopsutil v3.21.5+incompatible // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect github.com/tklauser/go-sysconf v0.3.6 // indirect - golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 // indirect ) diff --git a/demo/go.sum b/demo/go.sum index 433354c..3e22fe3 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -113,6 +113,8 @@ github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/Vq github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs= github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -312,6 +314,8 @@ github.com/qydysky/part v0.5.24 h1:hnHI5SPpm6I61/q7s83D3NlHgIMHjsvukw6xAbZeanc= github.com/qydysky/part v0.5.24/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part v0.5.25 h1:jDxxwml175gc9pcyuMGdlAX1ErLk5CWKv58Jr1UWdy4= github.com/qydysky/part v0.5.25/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.5.26 h1:h2rwwgE4o0CgkPKNHxWVFqFIzDcv+tj4vp3o97YmjLs= +github.com/qydysky/part v0.5.26/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad h1:Jtzf509lQrkUMGTV0Sc6IDCAiR1VrBcHrIban7hpye4= github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8= @@ -428,6 +432,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6O golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/go.mod b/go.mod index b2c2e35..f218f48 100644 --- a/go.mod +++ b/go.mod @@ -8,17 +8,17 @@ require ( github.com/christopher-dG/go-obs-websocket v0.0.0-20200720193653-c4fed10356a5 github.com/gofrs/uuid v4.0.0+incompatible github.com/gotk3/gotk3 v0.6.0 - github.com/klauspost/compress v1.13.0 // indirect + github.com/klauspost/compress v1.13.1 // indirect github.com/mdp/qrterminal/v3 v3.0.0 github.com/miekg/dns v1.1.42 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/qydysky/part v0.5.25 + github.com/qydysky/part v0.5.26 github.com/shirou/gopsutil v3.21.5+incompatible // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/tklauser/go-sysconf v0.3.6 // indirect golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect - golang.org/x/net v0.0.0-20210610132358-84b48f89b13b // indirect + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 // indirect golang.org/x/text v0.3.6 ) diff --git a/go.sum b/go.sum index 62a7966..8a9602c 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/Vq github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs= github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -86,6 +88,8 @@ github.com/qydysky/part v0.5.24 h1:hnHI5SPpm6I61/q7s83D3NlHgIMHjsvukw6xAbZeanc= github.com/qydysky/part v0.5.24/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part v0.5.25 h1:jDxxwml175gc9pcyuMGdlAX1ErLk5CWKv58Jr1UWdy4= github.com/qydysky/part v0.5.25/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.5.26 h1:h2rwwgE4o0CgkPKNHxWVFqFIzDcv+tj4vp3o97YmjLs= +github.com/qydysky/part v0.5.26/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8= github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg= github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -139,6 +143,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6O golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -- 2.39.2