You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

187 lines
4.4 KiB

package music
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func newSys(options Options) (sys *Music, err error) {
sys = &Music{
options: options,
}
return
}
type Music struct {
options Options
}
// 搜索歌曲
func (this *Music) SearchMusic(keywords string, limit, offset int) (result *SearchResultResponse, err error) {
var (
req *http.Request
resp *http.Response
body []byte
)
keywords = url.QueryEscape(keywords)
url := fmt.Sprintf("%s/cloudsearch?keywords=%s&limit=%d&offset=%d", this.options.ApiBaseUrl, keywords, limit, offset)
req, err = http.NewRequest("GET", url, nil)
if err != nil {
return
}
// 执行请求
client := &http.Client{}
resp, err = client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("StatusCode:%d", resp.StatusCode)
}
// 读取响应内容
body, err = io.ReadAll(resp.Body)
if err != nil {
return
}
// 输出响应内容
// fmt.Println(string(body))
result = &SearchResultResponse{}
err = json.Unmarshal(body, result)
return
}
// 搜索歌单
func (this *Music) SearchMusicList(keywords string, limit, offset int) (result *PlaylistSearchResponse, err error) {
var (
req *http.Request
resp *http.Response
body []byte
)
keywords = url.QueryEscape(keywords)
url := fmt.Sprintf("%s/search?type=1000&keywords=%s&limit=%d&offset=%d", this.options.ApiBaseUrl, keywords, limit, offset)
req, err = http.NewRequest("GET", url, nil)
if err != nil {
return
}
// 设置请求头
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
req.Header.Set("Cache-Control", "no-cache")
req.Header.Set("Connection", "keep-alive")
req.Header.Set("Pragma", "no-cache")
req.Header.Set("Sec-Fetch-Dest", "document")
req.Header.Set("Sec-Fetch-Mode", "navigate")
req.Header.Set("Sec-Fetch-Site", "none")
req.Header.Set("Sec-Fetch-User", "?1")
req.Header.Set("Upgrade-Insecure-Requests", "1")
req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36")
req.Header.Set("sec-ch-ua", `"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"macOS"`)
// 设置 Cookie
req.Header.Set("Cookie", this.options.Cookie)
// 执行请求
client := &http.Client{}
resp, err = client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("StatusCode:%d", resp.StatusCode)
}
// 读取响应内容
body, err = io.ReadAll(resp.Body)
if err != nil {
return
}
// 输出响应内容
// fmt.Println(string(body))
result = &PlaylistSearchResponse{}
err = json.Unmarshal(body, result)
return
}
// 歌单详情
func (this *Music) MusicListDetail(id int64, limit, offset int) (result *MusicListDetailResponse, err error) {
var (
req *http.Request
resp *http.Response
body []byte
)
url := fmt.Sprintf("%s/playlist/track/all?id=%d&limit=%d&offset=%d", this.options.ApiBaseUrl, id, limit, offset)
req, err = http.NewRequest("GET", url, nil)
if err != nil {
return
}
// 发起请求
client := &http.Client{}
resp, err = client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
// 读取响应内容
body, err = io.ReadAll(resp.Body)
if err != nil {
return
}
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("StatusCode:%d", resp.StatusCode)
}
// 打印结果
fmt.Println(string(body))
result = &MusicListDetailResponse{}
err = json.Unmarshal(body, result)
return
}
// 音乐连接获取
func (this *Music) MusicUrl(id int64) (result *UrlResult, err error) {
var (
req *http.Request
resp *http.Response
body []byte
)
url := fmt.Sprintf("%s/song/url/unblock?id=%d", this.options.ApiBaseUrl, id)
req, err = http.NewRequest("GET", url, nil)
if err != nil {
return
}
// 发起请求
client := &http.Client{}
resp, err = client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
// 读取响应内容
body, err = io.ReadAll(resp.Body)
if err != nil {
return
}
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("StatusCode:%d", resp.StatusCode)
return
}
// 打印结果
// fmt.Println(string(body))
result = &UrlResult{}
err = json.Unmarshal(body, result)
return
}