From 9a60759448f07ac68ba66e894698fda56e2e0697 Mon Sep 17 00:00:00 2001 From: aynakeya Date: Tue, 31 Oct 2023 21:30:07 -0700 Subject: [PATCH] fix netease --- providers/netease/netease.go | 149 ++++++++++++++++++++++++++++++ providers/netease/netease_test.go | 67 ++++++++++++++ registry.go | 5 + 3 files changed, 221 insertions(+) create mode 100644 providers/netease/netease.go create mode 100644 providers/netease/netease_test.go diff --git a/providers/netease/netease.go b/providers/netease/netease.go new file mode 100644 index 0000000..a9a095b --- /dev/null +++ b/providers/netease/netease.go @@ -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 +} diff --git a/providers/netease/netease_test.go b/providers/netease/netease_test.go new file mode 100644 index 0000000..3406116 --- /dev/null +++ b/providers/netease/netease_test.go @@ -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) +// } +// +//} diff --git a/registry.go b/registry.go index d617bfe..3cbc31d 100644 --- a/registry.go +++ b/registry.go @@ -21,6 +21,11 @@ func RegisterProvider(provider MediaProvider) { _providers[provider.GetName()] = provider } +func GetProvider(name string) (MediaProvider, bool) { + provider, ok := _providers[name] + return provider, ok +} + func ListAvailableProviders() []string { var names []string for name := range _providers {