fix netease

This commit is contained in:
aynakeya
2023-10-31 21:30:07 -07:00
parent 3c98bd394a
commit 9a60759448
3 changed files with 221 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
package netease
import (
"github.com/AynaLivePlayer/miaosic"
neteaseApi "github.com/XiaoMengXinX/Music163Api-Go/api"
neteaseTypes "github.com/XiaoMengXinX/Music163Api-Go/types"
neteaseUtil "github.com/XiaoMengXinX/Music163Api-Go/utils"
"github.com/spf13/cast"
"regexp"
"strconv"
"strings"
)
type Netease struct {
ReqData neteaseUtil.RequestData
IdRegex0 *regexp.Regexp
IdRegex1 *regexp.Regexp
}
func NewNetease() *Netease {
return &Netease{
ReqData: neteaseUtil.RequestData{
Headers: neteaseUtil.Headers{
{
"X-Real-IP",
"118.88.88.88",
},
}},
IdRegex0: regexp.MustCompile("^[0-9]+"),
IdRegex1: regexp.MustCompile("^wy[0-9]+"),
}
}
func (n Netease) GetName() string {
return "netease"
}
func (n Netease) MatchMedia(uri string) (miaosic.MediaMeta, bool) {
if id := n.IdRegex0.FindString(uri); id != "" {
return miaosic.MediaMeta{
Provider: n.GetName(),
Identifier: id,
}, true
}
if id := n.IdRegex1.FindString(uri); id != "" {
return miaosic.MediaMeta{
Provider: n.GetName(),
Identifier: id[2:],
}, true
}
return miaosic.MediaMeta{}, false
}
func (n Netease) Search(keyword string, page, size int) ([]miaosic.MediaInfo, error) {
rawResult, err := neteaseApi.SearchSong(
n.ReqData,
neteaseApi.SearchSongConfig{
Keyword: keyword,
Limit: size,
Offset: (page - 1) * size,
})
if err != nil || rawResult.Code != 200 {
return nil, miaosic.ErrorExternalApi
}
medias := make([]miaosic.MediaInfo, 0)
for _, song := range rawResult.Result.Songs {
artists := make([]string, 0)
for _, a := range song.Artists {
artists = append(artists, a.Name)
}
medias = append(medias, miaosic.MediaInfo{
Title: song.Name,
Artist: strings.Join(artists, ","),
Cover: miaosic.Picture{},
Album: song.Album.Name,
Meta: miaosic.MediaMeta{
Provider: n.GetName(),
Identifier: strconv.Itoa(song.Id),
},
})
}
return medias, nil
}
func _neteaseGetArtistNames(data neteaseTypes.SongDetailData) string {
artists := make([]string, 0)
for _, a := range data.Ar {
artists = append(artists, a.Name)
}
return strings.Join(artists, ",")
}
func (n Netease) GetMediaInfo(meta miaosic.MediaMeta) (media miaosic.MediaInfo, err error) {
result, err := neteaseApi.GetSongDetail(
n.ReqData,
[]int{cast.ToInt(meta.Identifier)})
if err != nil || result.Code != 200 {
return miaosic.MediaInfo{}, miaosic.ErrorExternalApi
}
if len(result.Songs) == 0 {
return miaosic.MediaInfo{}, miaosic.ErrorExternalApi
}
media.Title = result.Songs[0].Name
media.Cover.Url = result.Songs[0].Al.PicUrl
media.Album = result.Songs[0].Al.Name
media.Artist = _neteaseGetArtistNames(result.Songs[0])
return media, nil
}
func (n Netease) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
result, err := neteaseApi.GetSongURL(
n.ReqData,
neteaseApi.SongURLConfig{Ids: []int{cast.ToInt(meta.Identifier)}})
if err != nil || result.Code != 200 {
return nil, miaosic.ErrorExternalApi
}
if len(result.Data) == 0 {
return nil, miaosic.ErrorExternalApi
}
if result.Data[0].Code != 200 {
return nil, miaosic.ErrorExternalApi
}
urls := make([]miaosic.MediaUrl, 0)
for _, u := range result.Data {
urls = append(urls, miaosic.MediaUrl{
Url: u.Url,
Quality: miaosic.QualityUnk,
})
}
return urls, nil
}
func (n Netease) GetMediaLyric(meta miaosic.MediaMeta) ([]miaosic.Lyrics, error) {
result, err := neteaseApi.GetSongLyric(n.ReqData, cast.ToInt(meta.Identifier))
if err != nil || result.Code != 200 {
return nil, miaosic.ErrorExternalApi
}
lrcs := make([]miaosic.Lyrics, 0)
if result.Lrc.Lyric != "" {
lrcs = append(lrcs, miaosic.ParseLyrics("default", result.Lrc.Lyric))
}
if result.Tlyric.Lyric != "" {
lrcs = append(lrcs, miaosic.ParseLyrics("translation", result.Tlyric.Lyric))
}
if result.Klyric.Lyric != "" {
lrcs = append(lrcs, miaosic.ParseLyrics("karaoke", result.Klyric.Lyric))
}
return lrcs, nil
}

View File

@@ -0,0 +1,67 @@
package netease
import (
"github.com/AynaLivePlayer/miaosic"
"github.com/stretchr/testify/require"
"strings"
"testing"
)
var api = NewNetease()
func TestNetease_Search(t *testing.T) {
result, err := api.Search("染 reol", 1, 20)
require.NoError(t, err)
require.NotEmpty(t, result)
t.Log(result[0].Title, result[0].Artist, result[0].Album)
}
func TestNetease_Search2(t *testing.T) {
result, err := api.Search("出山", 1, 20)
require.NoError(t, err)
media := result[0]
require.Equal(t, "花粥,王胜娚", result[0].Artist)
urls, err := api.GetMediaUrl(media.Meta, miaosic.QualityAny)
require.NoError(t, err)
require.NotEmpty(t, urls)
require.True(t, strings.Contains(urls[0].Url, "http"))
}
func TestNetease_GetMusicMeta(t *testing.T) {
meta := miaosic.MediaMeta{
Provider: api.GetName(),
Identifier: "33516503",
}
media, err := api.GetMediaInfo(meta)
require.NoError(t, err)
require.Equal(t, "染", media.Title)
require.Equal(t, "Reol", media.Artist)
}
func TestNetease_UpdateMediaLyric(t *testing.T) {
meta := miaosic.MediaMeta{
Provider: api.GetName(),
Identifier: "33516503",
}
lrcs, err := api.GetMediaLyric(meta)
require.NoError(t, err)
require.NotEmpty(t, lrcs)
}
//func TestNetease_GetPlaylist(t *testing.T) {
// var api adapter.MediaProvider = NeteaseAPI
// playlist, err := api.GetPlaylist(&model.Meta{
// Name: api.GetName(),
// //Id: "2520739691",
// Id: "2382819181",
// })
// if err != nil {
// fmt.Println(err)
// return
// }
// fmt.Println(len(playlist))
// for _, media := range playlist {
// fmt.Println(media.Title, media.Artist, media.Album)
// }
//
//}

View File

@@ -21,6 +21,11 @@ func RegisterProvider(provider MediaProvider) {
_providers[provider.GetName()] = provider _providers[provider.GetName()] = provider
} }
func GetProvider(name string) (MediaProvider, bool) {
provider, ok := _providers[name]
return provider, ok
}
func ListAvailableProviders() []string { func ListAvailableProviders() []string {
var names []string var names []string
for name := range _providers { for name := range _providers {