You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
type searchParams struct {
|
|
Grp int `json:"grp"`
|
|
NumPerPage int `json:"num_per_page"`
|
|
PageNum int `json:"page_num"`
|
|
Query string `json:"query"`
|
|
RemotePlace string `json:"remoteplace"`
|
|
SearchType int `json:"search_type"`
|
|
//SearchID string `json:"searchid"` // todo: it seems generated randomly
|
|
}
|
|
|
|
type searchResponse struct {
|
|
Body struct {
|
|
Song struct {
|
|
List []*TrackInfo `json:"list"`
|
|
} `json:"song"`
|
|
} `json:"body"`
|
|
Code int `json:"code"`
|
|
}
|
|
|
|
func (c *QQMusic) Search(ctx context.Context, keyword string) ([]*TrackInfo, error) {
|
|
|
|
resp, err := c.rpcCall(ctx,
|
|
"music.search.SearchCgiService",
|
|
"DoSearchForQQMusicDesktop",
|
|
"music.search.SearchCgiService",
|
|
&searchParams{
|
|
SearchType: 0, Query: keyword,
|
|
PageNum: 1, NumPerPage: 40,
|
|
|
|
// static values
|
|
Grp: 1, RemotePlace: "sizer.newclient.song",
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("qqMusicClient[Search] rpc call: %w", err)
|
|
}
|
|
|
|
respData := searchResponse{}
|
|
if err := json.Unmarshal(resp, &respData); err != nil {
|
|
return nil, fmt.Errorf("qqMusicClient[Search] unmarshal response: %w", err)
|
|
}
|
|
|
|
return respData.Body.Song.List, nil
|
|
|
|
}
|