Files
miaosic/providers/netease/playlist.go
2024-04-13 00:57:43 -07:00

90 lines
2.0 KiB
Go

package netease
import (
"github.com/AynaLivePlayer/miaosic"
neteaseApi "github.com/XiaoMengXinX/Music163Api-Go/api"
"github.com/spf13/cast"
"strconv"
)
func (n *Netease) MatchPlaylist(uri string) (miaosic.MetaData, bool) {
var id string
id = n.PlaylistRegex0.FindString(uri)
if id != "" {
return miaosic.MetaData{
Provider: n.GetName(),
Identifier: id,
}, true
}
id = n.PlaylistRegex1.FindString(uri)
if id != "" {
return miaosic.MetaData{
Provider: n.GetName(),
Identifier: id[12:],
}, true
}
return miaosic.MetaData{}, false
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func (n *Netease) GetPlaylist(meta miaosic.MetaData) (*miaosic.Playlist, error) {
if meta.Provider != n.GetName() {
return nil, miaosic.ErrorInvalidMediaMeta
}
result, err := neteaseApi.GetPlaylistDetail(
n.ReqData, cast.ToInt(meta.Identifier))
if err != nil || result.Code != 200 {
return nil, miaosic.ErrorExternalApi
}
cnt := len(result.Playlist.TrackIds)
if cnt == 0 {
return nil, miaosic.ErrorExternalApi
}
playlist := &miaosic.Playlist{
Meta: meta,
Medias: make([]miaosic.MediaInfo, 0),
Title: result.Playlist.Name,
}
ids := make([]int, len(result.Playlist.TrackIds))
for i := 0; i < cnt; i++ {
ids[i] = result.Playlist.TrackIds[i].Id
}
for index := 0; index < len(ids); index += 1000 {
result2, err := neteaseApi.GetSongDetail(
n.ReqData,
ids[index:min(index+1000, len(ids))])
if err != nil || result2.Code != 200 {
break
}
cnt = len(result2.Songs)
if cnt == 0 {
break
}
for i := 0; i < cnt; i++ {
playlist.Medias = append(playlist.Medias, miaosic.MediaInfo{
Title: result2.Songs[i].Name,
Artist: _neteaseGetArtistNames(result2.Songs[i]),
Cover: miaosic.Picture{Url: result2.Songs[i].Al.PicUrl},
Album: result2.Songs[i].Al.Name,
Meta: miaosic.MetaData{
Provider: n.GetName(),
Identifier: strconv.Itoa(result2.Songs[i].Id),
},
})
}
}
if len(playlist.Medias) == 0 {
return nil, miaosic.ErrorExternalApi
}
return playlist, nil
}