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.
 
 
 
 
 
 

623 lines
25 KiB

package music
type (
// MusicResponse 顶层响应结构
SearchResultResponse struct {
Result struct {
SearchQcReminder interface{} `json:"searchQcReminder"`
Songs []struct {
Name string `json:"name"`
Id int64 `json:"id"`
Pst int `json:"pst"`
T int `json:"t"`
Ar []struct { // 内嵌艺术家结构
Id int64 `json:"id"`
Name string `json:"name"`
Tns []string `json:"tns"`
Alias []string `json:"alias"`
Alia []string `json:"alia"`
} `json:"ar"`
Alia []string `json:"alia"`
Pop int `json:"pop"`
St int `json:"st"`
Rt string `json:"rt"`
Fee int `json:"fee"`
V int `json:"v"`
Crbt interface{} `json:"crbt"`
Cf string `json:"cf"`
Al struct { // 内嵌专辑结构
Id int64 `json:"id"`
Name string `json:"name"`
PicUrl string `json:"picUrl"`
Tns []string `json:"tns"`
PicStr string `json:"pic_str"`
Pic int64 `json:"pic"`
} `json:"al"`
Dt int `json:"dt"`
H struct { // 内嵌高品质音频信息
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
} `json:"h"`
M struct { // 内嵌中品质音频信息
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
} `json:"m"`
L struct { // 内嵌低品质音频信息
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
} `json:"l"`
Sq struct { // 内嵌无损品质音频信息
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
} `json:"sq"`
Hr struct { // 内嵌高清品质音频信息
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
} `json:"hr"`
A interface{} `json:"a"`
Cd string `json:"cd"`
No int `json:"no"`
RtUrl interface{} `json:"rtUrl"`
Ftype int `json:"ftype"`
RtUrls []interface{} `json:"rtUrls"`
DjId int `json:"djId"`
Copyright int `json:"copyright"`
SId int `json:"s_id"`
Mark int64 `json:"mark"`
OriginCoverType int `json:"originCoverType"`
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
TagPicList interface{} `json:"tagPicList"`
ResourceState bool `json:"resourceState"`
Version int `json:"version"`
SongJumpInfo interface{} `json:"songJumpInfo"`
EntertainmentTags interface{} `json:"entertainmentTags"`
Single int `json:"single"`
NoCopyrightRcmd interface{} `json:"noCopyrightRcmd"`
Rtype int `json:"rtype"`
Rurl interface{} `json:"rurl"`
Mst int `json:"mst"`
Cp int `json:"cp"`
Mv int `json:"mv"`
PublishTime int `json:"publishTime"`
Privilege struct { // 内嵌权限信息结构
Id int64 `json:"id"`
Fee int `json:"fee"`
Payed int `json:"payed"`
St int `json:"st"`
Pl int `json:"pl"`
Dl int `json:"dl"`
Sp int `json:"sp"`
Cp int `json:"cp"`
Subp int `json:"subp"`
Cs bool `json:"cs"`
Maxbr int `json:"maxbr"`
Fl int `json:"fl"`
Toast bool `json:"toast"`
Flag int `json:"flag"`
PreSell bool `json:"preSell"`
PlayMaxbr int `json:"playMaxbr"`
DownloadMaxbr int `json:"downloadMaxbr"`
MaxBrLevel string `json:"maxBrLevel"`
PlayMaxBrLevel string `json:"playMaxBrLevel"`
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
PlLevel string `json:"plLevel"`
DlLevel string `json:"dlLevel"`
FlLevel string `json:"flLevel"`
Rscl interface{} `json:"rscl"`
FreeTrialPrivilege struct { // 内嵌免费试用权限
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
ListenType interface{} `json:"listenType"`
CannotListenReason interface{} `json:"cannotListenReason"`
PlayReason interface{} `json:"playReason"`
FreeLimitTagType interface{} `json:"freeLimitTagType"`
} `json:"freeTrialPrivilege"`
RightSource int `json:"rightSource"`
ChargeInfoList []struct { // 内嵌收费信息列表
Rate int `json:"rate"`
ChargeUrl interface{} `json:"chargeUrl"`
ChargeMessage interface{} `json:"chargeMessage"`
ChargeType int `json:"chargeType"`
} `json:"chargeInfoList"`
Code int `json:"code"`
Message interface{} `json:"message"`
PlLevels interface{} `json:"plLevels"`
DlLevels interface{} `json:"dlLevels"`
IgnoreCache interface{} `json:"ignoreCache"`
Bd interface{} `json:"bd"`
} `json:"privilege"`
} `json:"songs"`
SongCount int `json:"songCount"`
} `json:"result"`
Code int `json:"code"`
}
FreeTrialInfo struct {
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
ListenType interface{} `json:"listenType"`
CannotListenReason interface{} `json:"cannotListenReason"`
PlayReason interface{} `json:"playReason"`
FreeLimitTagType interface{} `json:"freeLimitTagType"`
}
FreeTimeTrialPrivilege struct {
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
Type int `json:"type"`
RemainTime int `json:"remainTime"`
}
UrlResult struct {
Data struct {
Size int `json:"size"`
Br int `json:"br"`
URL string `json:"url"`
MD5 string `json:"md5"`
Source string `json:"source"`
} `json:"data"`
Code int `json:"code"`
}
//歌单搜索
PlaylistSearchResponse struct {
Code int `json:"code"` // 响应状态码
Result struct {
PlaylistCount int `json:"playlistCount"` // 歌单总数
HasMore bool `json:"hasMore"` // 是否有更多数据
HlWords []string `json:"hlWords"` // 高亮词(通常为搜索关键词)
SearchQcReminder interface{} `json:"searchQcReminder"` // 提示信息(暂无结构)
Playlists []struct {
ID int64 `json:"id"` // 歌单 ID
Name string `json:"name"` // 歌单名称
CoverImgUrl string `json:"coverImgUrl"` // 歌单封面图
Subscribed bool `json:"subscribed"` // 是否已收藏
TrackCount int `json:"trackCount"` // 歌曲数量
UserId int64 `json:"userId"` // 创建者用户 ID
PlayCount int64 `json:"playCount"` // 播放次数
BookCount int64 `json:"bookCount"` // 收藏次数
SpecialType int `json:"specialType"` // 特殊标记(如官方歌单)
Action string `json:"action"` // 播放链接
ActionType string `json:"actionType"` // 动作类型
RecommendText interface{} `json:"recommendText"` // 推荐文案(可能为空)
Score string `json:"score"` // 推荐分数(字符串)
Description string `json:"description"` // 歌单描述
HighQuality bool `json:"highQuality"` // 是否高品质歌单
OfficialTags []string `json:"officialTags"` // 官方标签
Creator struct {
Nickname string `json:"nickname"` // 创建者昵称
UserId int64 `json:"userId"` // 用户 ID
UserType int `json:"userType"` // 用户类型
AvatarUrl string `json:"avatarUrl"` // 用户头像
AuthStatus int `json:"authStatus"` // 认证状态
ExpertTags interface{} `json:"expertTags"` // 专家标签(空或未知结构)
Experts interface{} `json:"experts"` // 专家信息(空或未知结构)
} `json:"creator"` // 创建者信息
Track struct {
Name string `json:"name"` // 歌曲名称
ID int64 `json:"id"` // 歌曲 ID
Position int `json:"position"` // 歌曲在歌单中的位置
Alias []string `json:"alias"` // 别名
Status int `json:"status"` // 状态
Fee int `json:"fee"` // 费用
CopyrightId int `json:"copyrightId"` // 版权 ID
Disc string `json:"disc"` // 所属碟片
No int `json:"no"` // 曲目编号
Artists []struct {
Name string `json:"name"` // 歌手名
ID int64 `json:"id"` // 歌手 ID
PicId int64 `json:"picId"`
Img1v1Id int64 `json:"img1v1Id"`
BriefDesc string `json:"briefDesc"`
PicUrl string `json:"picUrl"`
Img1v1Url string `json:"img1v1Url"`
AlbumSize int `json:"albumSize"`
Alias []string `json:"alias"`
Trans string `json:"trans"`
MusicSize int `json:"musicSize"`
TopicPerson int `json:"topicPerson"`
} `json:"artists"` // 歌手列表
Album struct {
Name string `json:"name"` // 专辑名称
ID int64 `json:"id"` // 专辑 ID
IdStr *string `json:"idStr"` // ID 字符串
Type string `json:"type"` // 类型
Size int `json:"size"` // 歌曲数
PicId int64 `json:"picId"` // 封面图 ID
BlurPicUrl string `json:"blurPicUrl"` // 模糊封面图
CompanyId int `json:"companyId"`
Pic int64 `json:"pic"`
PicUrl string `json:"picUrl"`
PublishTime int64 `json:"publishTime"` // 发布时间
Description string `json:"description"` // 描述
Tags string `json:"tags"` // 标签
Company string `json:"company"` // 出版公司
BriefDesc string `json:"briefDesc"` // 简要描述
Artist struct {
Name string `json:"name"`
ID int64 `json:"id"`
PicId int64 `json:"picId"`
Img1v1Id int64 `json:"img1v1Id"`
BriefDesc string `json:"briefDesc"`
PicUrl string `json:"picUrl"`
Img1v1Url string `json:"img1v1Url"`
AlbumSize int `json:"albumSize"`
Alias []string `json:"alias"`
Trans string `json:"trans"`
MusicSize int `json:"musicSize"`
TopicPerson int `json:"topicPerson"`
} `json:"artist"`
Songs []interface{} `json:"songs"` // 预留字段
Alias []string `json:"alias"`
Status int `json:"status"`
CopyrightId int `json:"copyrightId"`
CommentThreadId string `json:"commentThreadId"`
Artists []struct {
Name string `json:"name"`
ID int64 `json:"id"`
PicId int64 `json:"picId"`
Img1v1Id int64 `json:"img1v1Id"`
BriefDesc string `json:"briefDesc"`
PicUrl string `json:"picUrl"`
Img1v1Url string `json:"img1v1Url"`
AlbumSize int `json:"albumSize"`
Alias []string `json:"alias"`
Trans string `json:"trans"`
MusicSize int `json:"musicSize"`
TopicPerson int `json:"topicPerson"`
} `json:"artists"`
OnSale bool `json:"onSale"`
PicIdStr string `json:"picId_str"`
} `json:"album"`
Starred bool `json:"starred"`
Popularity int `json:"popularity"`
Score int `json:"score"`
StarredNum int `json:"starredNum"`
Duration int `json:"duration"` // 时长(毫秒)
PlayedNum int `json:"playedNum"`
DayPlays int `json:"dayPlays"`
HearTime int `json:"hearTime"`
Ringtone string `json:"ringtone"`
CRBT interface{} `json:"crbt"`
Audition interface{} `json:"audition"`
CopyFrom string `json:"copyFrom"`
CommentThreadId string `json:"commentThreadId"`
RtUrl interface{} `json:"rtUrl"`
Ftype int `json:"ftype"`
RtUrls []string `json:"rtUrls"`
Copyright int `json:"copyright"`
HMusic struct {
Name *string `json:"name"`
ID int64 `json:"id"`
Size int `json:"size"`
Extension string `json:"extension"`
Sr int `json:"sr"`
DfsId int64 `json:"dfsId"`
Bitrate int `json:"bitrate"`
PlayTime int `json:"playTime"`
VolumeDelta int `json:"volumeDelta"`
} `json:"hMusic"`
MMusic struct {
Name *string `json:"name"`
ID int64 `json:"id"`
Size int `json:"size"`
Extension string `json:"extension"`
Sr int `json:"sr"`
DfsId int64 `json:"dfsId"`
Bitrate int `json:"bitrate"`
PlayTime int `json:"playTime"`
VolumeDelta int `json:"volumeDelta"`
} `json:"mMusic"`
LMusic struct {
Name *string `json:"name"`
ID int64 `json:"id"`
Size int `json:"size"`
Extension string `json:"extension"`
Sr int `json:"sr"`
DfsId int64 `json:"dfsId"`
Bitrate int `json:"bitrate"`
PlayTime int `json:"playTime"`
VolumeDelta int `json:"volumeDelta"`
} `json:"lMusic"`
BMusic struct {
Name *string `json:"name"`
ID int64 `json:"id"`
Size int `json:"size"`
Extension string `json:"extension"`
Sr int `json:"sr"`
DfsId int64 `json:"dfsId"`
Bitrate int `json:"bitrate"`
PlayTime int `json:"playTime"`
VolumeDelta int `json:"volumeDelta"`
} `json:"bMusic"`
Mvid int `json:"mvid"`
Rtype int `json:"rtype"`
Rurl interface{} `json:"rurl"`
Mp3Url interface{} `json:"mp3Url"`
} `json:"track"`
Alg string `json:"alg"` // 推荐算法字段
} `json:"playlists"`
} `json:"result"`
}
SongResponse struct {
Songs []struct {
Name string `json:"name"` // 歌曲名称
MainTitle *string `json:"mainTitle"` // 主标题
AdditionalTitle *string `json:"additionalTitle"` // 附加标题
ID int `json:"id"` // 歌曲 ID
Pst int `json:"pst"` // 排序字段
T int `json:"t"` // 类型字段
Ar []struct {
ID int `json:"id"` // 歌手 ID
Name string `json:"name"` // 歌手名
Tns []string `json:"tns"` // 翻译名
Alias []string `json:"alias "` // 别名
} `json:"ar"`
Alia []string `json:"alia"` // 歌曲别名
Pop int `json:"pop"` // 热度
St int `json:"st"` // 状态码
Rt string `json:"rt"` // 资源标识
Fee int `json:"费用"` // 是否收费
V int `json:"v "` // 版本
Crbt *string `json:"crbt"` // 彩铃信息
Cf string `json:"cf"` // 未知字段
Al struct {
ID int `json:"id"` // 专辑 ID
Name string `json:"name"` // 专辑名
PicURL string `json:"picUrl"` // 专辑封面
Tns []string `json:"tns"` // 翻译名
PicStr string `json:"pic_str"` // 图片字符串 ID
Pic int64 `json:"pic"` // 图片 ID
} `json:"al"`
Dt int `json:"dt"` // 时长(毫秒)
H struct{ Br, Fid, Size, Vd, Sr int } `json:"h"` // 高音质
M struct{ Br, Fid, Size, Vd, Sr int } `json:"m"` // 中音质
L struct{ Br, Fid, Size, Vd, Sr int } `json:"l"` // 低音质
Sq struct{ Br, Fid, Size, Vd, Sr int } `json:"sq"` // 无损音质
Hr interface{} `json:"hr"`
A *string `json:"a"`
Cd string `json:"cd"`
No int `json:"no"`
RtUrl *string `json:"rtUrl"`
Ftype int `json:"ftype"`
RtUrls []string `json:"rtUrls"`
DjId int `json:"djId"`
Copyright int `json:"copyright"`
SId int `json:"s_id"`
Mark int64 `json:"mark"`
OriginCoverType int `json:"originCoverType"`
Tns []string `json:"tns"`
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
TagPicList *string `json:"tagPicList"`
ResourceState bool `json:"resourceState"`
Version int `json:"version"`
SongJumpInfo *string `json:"songJumpInfo"`
EntertainmentTags *string `json:"entertainmentTags"`
AwardTags *string `json:"awardTags"`
DisplayTags *string `json:"displayTags"`
Single int `json:"single"`
NoCopyrightRcmd *string `json:"noCopyrightRcmd"`
Mv int `json:"mv"`
Rtype int `json:"rtype"`
Rurl *string `json:"rurl"`
Mst int `json:"mst"`
Cp int `json:"cp"`
PublishTime int64 `json:"publishTime"`
} `json:"songs"`
Privileges []struct {
ID int `json:"id"`
Fee int `json:"fee"`
Payed int `json:"payed"`
St int `json:"st"`
Pl int `json:"pl"`
Dl int `json:"dl"`
Sp int `json:"sp"`
Cp int `json:"cp"`
Subp int `json:"subp"`
Cs bool `json:"cs"`
Maxbr int `json:"maxbr"`
Fl int `json:"fl"`
Toast bool `json:"toast"`
Flag int `json:"flag"`
PreSell bool `json:"preSell"`
PlayMaxbr int `json:"playMaxbr"`
DownloadMaxbr int `json:"downloadMaxbr"`
MaxBrLevel string `json:"maxBrLevel"`
PlayMaxBrLevel string `json:"playMaxBrLevel"`
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
PlLevel string `json:"plLevel"`
DlLevel string `json:"dlLevel"`
FlLevel string `json:"flLevel"`
Rscl interface{} `json:"rscl"`
FreeTrialPrivilege struct {
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
ListenType interface{} `json:"listenType"`
CannotListenReason interface{} `json:"cannotListenReason"`
PlayReason interface{} `json:"playReason"`
FreeLimitTagType interface{} `json:"freeLimitTagType"`
} `json:"freeTrialPrivilege"`
RightSource int `json:"rightSource"`
ChargeInfoList []struct {
Rate int `json:"rate"`
ChargeUrl interface{} `json:"chargeUrl"`
ChargeMessage interface{} `json:"chargeMessage"`
ChargeType int `json:"chargeType"`
} `json:"chargeInfoList"`
Code int `json:"code"`
Message *string `json:"message"`
} `json:"privileges"`
Code int `json:"code"` // 响应状态码
}
//播放列表详情回复
MusicListDetailResponse struct {
Code int `json:"code"` // 响应状态码
Songs []struct {
Name string `json:"name"` // 歌曲名称
MainTitle *string `json:"mainTitle"` // 主标题(可选)
AdditionalTitle *string `json:"additionalTitle"` // 副标题(可选)
ID int64 `json:"id"` // 歌曲 ID
Pst int `json:"pst"`
T int `json:"t"`
Ar []struct {
ID int64 `json:"id"` // 歌手 ID
Name string `json:"name"` // 歌手名称
Tns []string `json:"tns"` // 翻译名
Alias []string `json:"alias"` // 别名
} `json:"ar"` // 歌手列表
Al struct {
ID int64 `json:"id"` // 专辑 ID
Name string `json:"name"` // 专辑名称
PicURL string `json:"picUrl"` // 专辑封面 URL
PicStr string `json:"pic_str"` // 封面图字符串
Pic int64 `json:"pic"` // 封面图 ID
Tns []string `json:"tns"` // 专辑翻译名
} `json:"al"` // 专辑信息
Pop int `json:"pop"` // 热度
Fee int `json:"fee"` // 版权费用标记
DT int `json:"dt"` // 时长(单位:毫秒)
H struct {
Br int `json:"br"` // 码率
Size int `json:"size"` // 文件大小(字节)
Vd int `json:"vd"` // 音量动态
Sr int `json:"sr"` // 采样率
Fid int `json:"fid"` // 文件 ID
} `json:"h"` // 高音质
M struct {
Br int `json:"br"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
Fid int `json:"fid"`
} `json:"m"` // 中音质
L struct {
Br int `json:"br"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
Fid int `json:"fid"`
} `json:"l"` // 低音质
SQ *struct {
Br int `json:"br"`
Size int `json:"size"`
Vd int `json:"vd"`
Sr int `json:"sr"`
Fid int `json:"fid"`
} `json:"sq,omitempty"` // 超高音质(可选)
MV int `json:"mv"` // MV ID
PublishTime int64 `json:"publishTime"` // 发布时间(时间戳)
Tns []string `json:"tns"` // 歌曲翻译名
} `json:"songs"`
Privileges []struct {
ID int64 `json:"id"` // 歌曲 ID
Fee int `json:"fee"` // 收费类型
Payed int `json:"payed"` // 是否已付费
ST int `json:"st"` // 状态码
Pl int `json:"pl"` // 播放权限
Dl int `json:"dl"` // 下载权限
Sp int `json:"sp"` // 播放标记
Cp int `json:"cp"` // 复制权限
Subp int `json:"subp"` // 订阅权限
Maxbr int `json:"maxbr"` // 最大码率
Flag int `json:"flag"` // 标记位
Fl int `json:"fl"` // 免费播放标记
ChargeInfoList []struct {
Rate int `json:"rate"` // 码率
ChargeType int `json:"chargeType"` // 收费类型
ChargeUrl string `json:"chargeUrl"` // 收费链接(一般为空)
ChargeMsg string `json:"chargeMessage"` // 提示信息(一般为空)
} `json:"chargeInfoList"` // 收费信息列表
FreeTrialPrivilege struct {
ResConsumable bool `json:"resConsumable"` // 资源是否可消费
UserConsumable bool `json:"userConsumable"` // 用户是否可试听
ListenType interface{} `json:"listenType"` // 听歌类型(可空)
CannotListenReason interface{} `json:"cannotListenReason"` // 无法播放原因(可空)
} `json:"freeTrialPrivilege"` // 试听权限设置
} `json:"privileges"`
}
ISys interface {
SearchMusic(keywords string, limit, offset int) (result *SearchResultResponse, err error)
SearchMusicList(keywords string, limit, offset int) (result *PlaylistSearchResponse, err error)
MusicListDetail(id int64, limit, offset int) (result *MusicListDetailResponse, err error)
MusicUrl(id int64) (result *UrlResult, err error)
}
)
var defsys ISys
func OnInit(config map[string]interface{}, option ...Option) (err error) {
defsys, err = newSys(newOptions(config, option...))
return
}
func NewSys(option ...Option) (sys ISys, err error) {
sys, err = newSys(newOptionsByOption(option...))
return
}
func SearchMusic(keywords string, limit, offset int) (result *SearchResultResponse, err error) {
return defsys.SearchMusic(keywords, limit, offset)
}
func SearchMusicList(keywords string, limit, offset int) (result *PlaylistSearchResponse, err error) {
return defsys.SearchMusicList(keywords, limit, offset)
}
func MusicListDetail(id int64, limit, offset int) (result *MusicListDetailResponse, err error) {
return defsys.MusicListDetail(id, limit, offset)
}
func MusicUrl(id int64) (result *UrlResult, err error) {
return defsys.MusicUrl(id)
}