package kw import ( "io" "lx-source/src/env" "lx-source/src/sources" "lx-source/src/sources/custom/utils" "net/http" "strconv" "sync" "github.com/ZxwyWebSite/ztool" ) var ( kw_pool *sync.Pool Url func(string, string) (string, string) parsemod bool convtype string // desParse func([]byte, *playInfo) error // desParse func(any) ztool.Net_ResHandlerFunc ) func init() { env.Inits.Add(func() { loger := env.Loger.NewGroup(`KwInit`) switch env.Config.Custom.Kw_Mode { case `0`, `bdapi`: loger.Debug(`use bdapi`) if ztool.Chk_IsNilStr( env.Config.Custom.Kw_Bd_Uid, env.Config.Custom.Kw_Bd_Token, env.Config.Custom.Kw_Bd_DevId, ) { loger.Fatal(`使用bdapi且验证参数为空`) } bdheader[`uid`] = env.Config.Custom.Kw_Bd_Uid bdheader[`devId`] = env.Config.Custom.Kw_Bd_DevId kw_pool = &sync.Pool{New: func() any { return new(kwApi_Song) }} Url = bdapi case `1`, `kwdes`: switch env.Config.Custom.Kw_Des_Type { case `0`, `text`: loger.Debug(`use kwdes text`) convtype = `convert_url2` // desParse = txtParse case `1`, `json`: loger.Debug(`use kwdes json`) convtype = `convert_url_with_sign` // desParse = ztool.Net_ResToStruct parsemod = true default: loger.Fatal(`未定义的返回格式,请检查配置 [Custom].Kw_Des_Type`) } desheader[`User-Agent`] = env.Config.Custom.Kw_Des_Header kw_pool = &sync.Pool{New: func() any { return new(playInfo) }} Url = kwdes default: loger.Fatal(`未定义的接口模式,请检查配置 [Custom].Kw_Mode`) } loger.Free() }) } func bdapi(songMid, quality string) (ourl, msg string) { loger := env.Loger.NewGroup(`Kw`) defer loger.Free() info, ok := fileInfo[quality] if !ok { msg = sources.E_QNotSupport return } resp := kw_pool.Get().(*kwApi_Song) defer kw_pool.Put(resp) url := ztool.Str_FastConcat( `https://bd-api.kuwo.cn/api/service/music/downloadInfo/`, songMid, `?isMv=0&format=`, info.E, `&br=`, info.H, info.E, //`&level=`, `&uid=`, env.Config.Custom.Kw_Bd_Uid, `&token=`, env.Config.Custom.Kw_Bd_Token, ) // jx.Debug(`Kw, Url: %s`, url) _, err := ztool.Net_HttpReq(http.MethodGet, url, nil, bdheader, &resp) if err != nil { loger.Error(`HttpReq: %s`, err) msg = sources.ErrHttpReq return } loger.Debug(`Resp: %+v`, resp) if resp.Code != 200 || resp.Data.AudioInfo.Bitrate == `1` { // jx.Debug(`Kw, Err: %#v`, resp) msg = ztool.Str_FastConcat(`failed: `, resp.Msg) return } ourl = utils.DelQuery(resp.Data.URL) //strings.Split(resp.Data.URL, `?`)[0] return } func kwdes(songMid, quality string) (ourl, msg string) { loger := env.Loger.NewGroup(`Kw`) defer loger.Free() infoFile, ok := fileInfo[quality] if !ok { msg = sources.E_QNotSupport return } target_url := ztool.Str_FastConcat( `https://mobi.kuwo.cn/mobi.s?f=kuwo&q=`, base64_encrypt(ztool.Str_FastConcat( `user=0&android_id=0&prod=kwplayer_ar_8.5.5.0&corp=kuwo&newver=3&vipver=8.5.5.0&source=kwplayer_ar_8.5.5.0_apk_keluze.apk&p2p=1¬race=0`, `&type=`, convtype, `&br=`, infoFile.H, infoFile.E, `&format=`, infoFile.E, `&rid=`, songMid, `&priority=bitrate&loginUid=0&network=WIFI&loginSid=0&mode=down`, )), ) if parsemod { resp := kw_pool.Get().(*playInfo) defer kw_pool.Put(resp) err := ztool.Net_Request(http.MethodGet, target_url, nil, []ztool.Net_ReqHandlerFunc{ztool.Net_ReqAddHeader(desheader)}, []ztool.Net_ResHandlerFunc{ztool.Net_ResToStruct(&resp)}, ) if err != nil { loger.Error(`Request: %s`, err) msg = sources.ErrHttpReq return } loger.Debug(`Resp: %+v`, resp) if resp.Code != http.StatusOK { msg = ztool.Str_FastConcat(`failed: `, resp.Msg) loger.Debug(msg) return } realQuality := strconv.Itoa(resp.Data.Bitrate) if realQuality != infoFile.H[:len(infoFile.H)-1] { msg = sources.E_QNotMatch return } ourl = utils.DelQuery(resp.Data.URL) //resp.Data.URL[:strings.Index(resp.Data.URL, `?`)] return } ztool.Net_Request(http.MethodGet, target_url, nil, []ztool.Net_ReqHandlerFunc{ ztool.Net_ReqAddHeader(desheader), }, []ztool.Net_ResHandlerFunc{ func(res *http.Response) (err error) { data, err := io.ReadAll(res.Body) if err != nil { msg = err.Error() return } if res.StatusCode != http.StatusOK { msg = ztool.Str_FastConcat(`failed: `, res.Status) loger.Debug(msg) return } infoData := mkMap(data) loger.Debug(`infoData: %+v`, infoData) realQuality := infoData[`bitrate`] if realQuality != infoFile.H[:len(infoFile.H)-1] { msg = sources.E_QNotMatch return } ourl = utils.DelQuery(infoData[`url`]) //infoData[`url`][:strings.Index(infoData[`url`], `?`)] return }, }, ) return }