update interface

This commit is contained in:
aynakeya
2024-04-05 02:48:10 -07:00
parent e587ae69fc
commit f84570d64f
18 changed files with 232 additions and 88 deletions

View File

@@ -27,7 +27,7 @@ func NewBilibili() *Bilibili {
},
}
bili.InfoApi = deepcolor.CreateApiResultFunc(
func(meta miaosic.MediaMeta) (*dphttp.Request, error) {
func(meta miaosic.MetaData) (*dphttp.Request, error) {
return deepcolor.NewGetRequestWithSingleQuery(
"https://www.bilibili.com/audio/music-service-c/web/song/info",
"sid", meta.Identifier,
@@ -81,7 +81,7 @@ func NewBilibili() *Bilibili {
Title: r.Get("title").String(),
Cover: miaosic.Picture{Url: r.Get("cover").String()},
Artist: r.Get("author").String(),
Meta: miaosic.MediaMeta{
Meta: miaosic.MetaData{
Provider: bili.GetName(),
Identifier: r.Get("id").String(),
},
@@ -97,18 +97,18 @@ func (b *Bilibili) GetName() string {
return "bilibili"
}
func (b *Bilibili) MatchMedia(keyword string) (miaosic.MediaMeta, bool) {
func (b *Bilibili) MatchMedia(keyword string) (miaosic.MetaData, bool) {
if id := b.IdRegex0.FindString(keyword); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: b.GetName(),
Identifier: id,
}, true
}
if id := b.IdRegex1.FindString(keyword); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: b.GetName(),
Identifier: id[2:],
}, true
}
return miaosic.MediaMeta{}, false
return miaosic.MetaData{}, false
}

View File

@@ -15,7 +15,7 @@ func TestBilibili_Search(t *testing.T) {
}
func TestBilibili_GetMusic(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "1560601",
}

View File

@@ -0,0 +1,11 @@
package bilibili
import "github.com/AynaLivePlayer/miaosic"
func (n *Bilibili) MatchPlaylist(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false
}
func (n *Bilibili) GetPlaylist(meta miaosic.MetaData) (*miaosic.Playlist, error) {
return nil, miaosic.ErrNotImplemented
}

View File

@@ -38,7 +38,7 @@ func NewBilibiliViedo() *BilibiliVideo {
header: headers,
}
pvdr.InfoApi = deepcolor.CreateApiResultFunc(
func(meta miaosic.MediaMeta) (*dphttp.Request, error) {
func(meta miaosic.MetaData) (*dphttp.Request, error) {
return deepcolor.NewGetRequestWithQuery(
"https://api.bilibili.com/x/web-interface/view/detail?&aid=&jsonp=jsonp",
map[string]any{
@@ -93,7 +93,7 @@ func NewBilibiliViedo() *BilibiliVideo {
Title: r.ReplaceAllString(value.Get("title").String(), ""),
Cover: miaosic.Picture{Url: "https:" + value.Get("pic").String()},
Artist: value.Get("author").String(),
Meta: miaosic.MediaMeta{
Meta: miaosic.MetaData{
Provider: pvdr.GetName(),
Identifier: value.Get("bvid").String(),
},
@@ -120,17 +120,17 @@ func (b *BilibiliVideo) GetName() string {
return "bilibili-video"
}
func (b *BilibiliVideo) MatchMedia(keyword string) (miaosic.MediaMeta, bool) {
func (b *BilibiliVideo) MatchMedia(keyword string) (miaosic.MetaData, bool) {
if id := b.IdRegex.FindString(keyword); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: b.GetName(),
Identifier: id,
}, true
}
return miaosic.MediaMeta{}, false
return miaosic.MetaData{}, false
}
func (b *BilibiliVideo) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
func (b *BilibiliVideo) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
page := b.getPage(meta.Identifier) - 1
cids, err := b.cidApi(b.getBv(meta.Identifier))
if err != nil {

View File

@@ -1,7 +0,0 @@
package bilivideo
import "github.com/AynaLivePlayer/miaosic"
func init() {
miaosic.RegisterProvider(NewBilibiliViedo())
}

View File

@@ -0,0 +1,11 @@
package bilivideo
import "github.com/AynaLivePlayer/miaosic"
func (n *BilibiliVideo) MatchPlaylist(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false
}
func (n *BilibiliVideo) GetPlaylist(meta miaosic.MetaData) (*miaosic.Playlist, error) {
return nil, miaosic.ErrNotImplemented
}

View File

@@ -1,7 +0,0 @@
package kuwo
import "github.com/AynaLivePlayer/miaosic"
func init() {
miaosic.RegisterProvider(NewKuwo())
}

View File

@@ -34,7 +34,7 @@ func NewKuwo() *Kuwo {
}
kw.initToken()
kw.InfoApi = deepcolor.CreateApiResultFunc(
func(meta miaosic.MediaMeta) (*dphttp.Request, error) {
func(meta miaosic.MetaData) (*dphttp.Request, error) {
return deepcolor.NewGetRequestWithSingleQuery(
"http://www.kuwo.cn/api/www/music/musicInfo?httpsStatus=1",
"mid", meta.Identifier, kw.header)
@@ -62,7 +62,7 @@ func NewKuwo() *Kuwo {
return nil
})
kw.LyricApi = deepcolor.CreateApiResultFunc(
func(meta miaosic.MediaMeta) (*dphttp.Request, error) {
func(meta miaosic.MetaData) (*dphttp.Request, error) {
return deepcolor.NewGetRequestWithSingleQuery(
"http://m.kuwo.cn/newh5/singles/songinfoandlrc",
"musicId", meta.Identifier, kw.header)
@@ -98,7 +98,7 @@ func NewKuwo() *Kuwo {
Cover: miaosic.Picture{Url: "https://img2.kuwo.cn/star/albumcover/" + value.Get("web_albumpic_short").String()},
Artist: value.Get("ARTIST").String(),
Album: value.Get("ALBUM").String(),
Meta: miaosic.MediaMeta{
Meta: miaosic.MetaData{
Provider: kw.GetName(),
Identifier: value.Get("DC_TARGETID").String(),
},
@@ -125,20 +125,20 @@ func (k *Kuwo) GetName() string {
return "kuwo"
}
func (k *Kuwo) MatchMedia(keyword string) (miaosic.MediaMeta, bool) {
func (k *Kuwo) MatchMedia(keyword string) (miaosic.MetaData, bool) {
if id := k.IdRegex0.FindString(keyword); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: k.GetName(),
Identifier: id,
}, true
}
if id := k.IdRegex1.FindString(keyword); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: k.GetName(),
Identifier: id[2:],
}, true
}
return miaosic.MediaMeta{}, false
return miaosic.MetaData{}, false
}
//func (k *Kuwo) MatchPlaylist(uri string) *miaosic.Playlist {
@@ -146,13 +146,13 @@ func (k *Kuwo) MatchMedia(keyword string) (miaosic.MediaMeta, bool) {
// id = k.PlaylistRegex0.FindString(uri)
// if id != "" {
// return &miaosic.Playlist{
// Meta: miaosic.MediaMeta{k.GetName(), id},
// Meta: miaosic.MetaData{k.GetName(), id},
// }
// }
// id = k.PlaylistRegex1.FindString(uri)
// if id != "" {
// return &miaosic.Playlist{
// Meta: miaosic.MediaMeta{k.GetName(), id[9:]},
// Meta: miaosic.MetaData{k.GetName(), id[9:]},
// }
// }
// return nil
@@ -250,7 +250,7 @@ func (k *Kuwo) generateSecret(t, e string) string {
// Artist: value.Get("artist").String(),
// Cover: miaosic.Picture{Url: value.Get("pic").String()},
// Album: value.Get("album").String(),
// Meta: miaosic.MediaMeta{
// Meta: miaosic.MetaData{
// Provider: k.GetName(),
// Identifier: value.Get("rid").String(),
// },

View File

@@ -34,7 +34,7 @@ func TestKuwo_Search(t *testing.T) {
}
func TestKuwo_GetMusicMeta(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "22804772",
}
@@ -44,7 +44,7 @@ func TestKuwo_GetMusicMeta(t *testing.T) {
}
func TestKuwo_GetMusic(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "22804772",
}
@@ -54,7 +54,7 @@ func TestKuwo_GetMusic(t *testing.T) {
}
func TestKuwo_UpdateMediaLyric(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "22804772",
}
@@ -66,7 +66,7 @@ func TestKuwo_UpdateMediaLyric(t *testing.T) {
//func TestKuwo_GetPlaylist(t *testing.T) {
// playlist := miaosic.Playlist{
// Meta: miaosic.MediaMeta{
// Meta: miaosic.MetaData{
// Provider: api.GetName(),
// Identifier: "2959147566",
// },

View File

@@ -0,0 +1,11 @@
package kuwo
import "github.com/AynaLivePlayer/miaosic"
func (n *Kuwo) MatchPlaylist(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false
}
func (n *Kuwo) GetPlaylist(meta miaosic.MetaData) (*miaosic.Playlist, error) {
return nil, miaosic.ErrNotImplemented
}

View File

@@ -18,7 +18,7 @@ type localMedia struct {
lyrics []miaosic.Lyrics
}
func (l *localPlaylist) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error) {
func (l *localPlaylist) GetMediaInfo(meta miaosic.MetaData) (miaosic.MediaInfo, error) {
for _, m := range l.medias {
if m.info.Meta.Identifier == meta.Identifier {
return m.info, nil
@@ -46,7 +46,7 @@ func NewLocal(localdir string) *Local {
return l
}
func (l *Local) metaToId(meta miaosic.MediaMeta) (playlist string) {
func (l *Local) metaToId(meta miaosic.MetaData) (playlist string) {
return strings.Split(meta.Identifier, "/")[0]
}
@@ -54,11 +54,11 @@ func (l *Local) GetName() string {
return "local"
}
func (l *Local) MatchMedia(uri string) (miaosic.MediaMeta, bool) {
return miaosic.MediaMeta{}, false
func (l *Local) MatchMedia(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false
}
func (l *Local) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error) {
func (l *Local) GetMediaInfo(meta miaosic.MetaData) (miaosic.MediaInfo, error) {
if meta.Provider != l.GetName() {
return miaosic.MediaInfo{}, miaosic.ErrorDifferentProvider
}
@@ -69,7 +69,7 @@ func (l *Local) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error)
return playlist.GetMediaInfo(meta)
}
func (l *Local) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
func (l *Local) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
info, err := l.GetMediaInfo(meta)
if err != nil {
return []miaosic.MediaUrl{}, err
@@ -80,7 +80,7 @@ func (l *Local) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]
}}, nil
}
func (l *Local) GetMediaLyric(meta miaosic.MediaMeta) ([]miaosic.Lyrics, error) {
func (l *Local) GetMediaLyric(meta miaosic.MetaData) ([]miaosic.Lyrics, error) {
return []miaosic.Lyrics{}, miaosic.ErrNotImplemented
}

View File

@@ -38,7 +38,7 @@ func readLocalPlaylist(localdir string, playlist *localPlaylist) error {
fn := item.Name()
media := localMedia{
info: miaosic.MediaInfo{
Meta: miaosic.MediaMeta{
Meta: miaosic.MetaData{
Provider: "local",
Identifier: path.Join(playlist.name, fn),
},

View File

@@ -0,0 +1,94 @@
package netease
import (
"encoding/base64"
"encoding/json"
"fmt"
"github.com/AynaLivePlayer/miaosic"
neteaseApi "github.com/XiaoMengXinX/Music163Api-Go/api"
"net/http"
)
func (n *Netease) Login(username string, password string) error {
return miaosic.ErrNotImplemented
}
func (n *Netease) QrLogin() (*miaosic.QrLoginSession, error) {
unikey, err := neteaseApi.GetQrUnikey(n.ReqData)
if err != nil {
return nil, err
}
return &miaosic.QrLoginSession{
Key: unikey.Unikey,
Url: fmt.Sprintf("https://music.163.com/login?codekey=%s", unikey.Unikey),
}, nil
}
func (n *Netease) QrLoginVerify(qrlogin *miaosic.QrLoginSession) (*miaosic.QrLoginResult, error) {
login, h, err := neteaseApi.CheckQrLogin(n.ReqData, qrlogin.Key)
if err != nil {
return nil, err
}
// if login.Code == 800 || login.Code == 803. login success
if login.Code != 800 && login.Code != 803 {
return &miaosic.QrLoginResult{
Success: false,
Message: login.Message,
}, nil
}
cookies := make([]*http.Cookie, 0)
for _, c := range (&http.Response{Header: h}).Cookies() {
if c.Name == "MUSIC_U" || c.Name == "__csrf" {
cookies = append(cookies, c)
}
}
n.ReqData.Cookies = cookies
return &miaosic.QrLoginResult{
Success: true,
Message: login.Message,
}, nil
}
func (n *Netease) Logout() {
n.ReqData.Cookies = []*http.Cookie{
{Name: "MUSIC_U", Value: ""},
{Name: "__csrf", Value: ""},
}
return
}
func (n *Netease) SaveSession() string {
// save session to string MUSIC_U and __csrf
data := make(map[string]string)
data["MUSIC_U"] = ""
data["__csrf"] = ""
for _, c := range n.ReqData.Cookies {
if c.Name == "MUSIC_U" || c.Name == "__csrf" {
data[c.Name] = c.Value
}
}
b, _ := json.Marshal(data)
return base64.StdEncoding.EncodeToString(b)
}
func (n *Netease) RestoreSession(session string) error {
// restore session from string MUSIC_U and __csrf
b, err := base64.StdEncoding.DecodeString(session)
if err != nil {
return err
}
data := make(map[string]string)
err = json.Unmarshal(b, &data)
if err != nil {
return err
}
cookies := make([]*http.Cookie, 0)
for name, value := range data {
cookies = append(cookies, &http.Cookie{
Name: name,
Value: value,
})
}
n.ReqData.Cookies = cookies
return nil
}

View File

@@ -31,27 +31,27 @@ func NewNetease() *Netease {
}
}
func (n Netease) GetName() string {
func (n *Netease) GetName() string {
return "netease"
}
func (n Netease) MatchMedia(uri string) (miaosic.MediaMeta, bool) {
func (n *Netease) MatchMedia(uri string) (miaosic.MetaData, bool) {
if id := n.IdRegex0.FindString(uri); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: n.GetName(),
Identifier: id,
}, true
}
if id := n.IdRegex1.FindString(uri); id != "" {
return miaosic.MediaMeta{
return miaosic.MetaData{
Provider: n.GetName(),
Identifier: id[2:],
}, true
}
return miaosic.MediaMeta{}, false
return miaosic.MetaData{}, false
}
func (n Netease) Search(keyword string, page, size int) ([]miaosic.MediaInfo, error) {
func (n *Netease) Search(keyword string, page, size int) ([]miaosic.MediaInfo, error) {
rawResult, err := neteaseApi.SearchSong(
n.ReqData,
neteaseApi.SearchSongConfig{
@@ -73,7 +73,7 @@ func (n Netease) Search(keyword string, page, size int) ([]miaosic.MediaInfo, er
Artist: strings.Join(artists, ","),
Cover: miaosic.Picture{},
Album: song.Album.Name,
Meta: miaosic.MediaMeta{
Meta: miaosic.MetaData{
Provider: n.GetName(),
Identifier: strconv.Itoa(song.Id),
},
@@ -90,7 +90,7 @@ func _neteaseGetArtistNames(data neteaseTypes.SongDetailData) string {
return strings.Join(artists, ",")
}
func (n Netease) GetMediaInfo(meta miaosic.MediaMeta) (media miaosic.MediaInfo, err error) {
func (n *Netease) GetMediaInfo(meta miaosic.MetaData) (media miaosic.MediaInfo, err error) {
result, err := neteaseApi.GetSongDetail(
n.ReqData,
[]int{cast.ToInt(meta.Identifier)})
@@ -107,7 +107,7 @@ func (n Netease) GetMediaInfo(meta miaosic.MediaMeta) (media miaosic.MediaInfo,
return media, nil
}
func (n Netease) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
func (n *Netease) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
result, err := neteaseApi.GetSongURL(
n.ReqData,
neteaseApi.SongURLConfig{Ids: []int{cast.ToInt(meta.Identifier)}})
@@ -130,7 +130,7 @@ func (n Netease) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([
return urls, nil
}
func (n Netease) GetMediaLyric(meta miaosic.MediaMeta) ([]miaosic.Lyrics, error) {
func (n *Netease) GetMediaLyric(meta miaosic.MetaData) ([]miaosic.Lyrics, error) {
result, err := neteaseApi.GetSongLyric(n.ReqData, cast.ToInt(meta.Identifier))
if err != nil || result.Code != 200 {
return nil, miaosic.ErrorExternalApi

View File

@@ -25,10 +25,11 @@ func TestNetease_Search2(t *testing.T) {
require.NoError(t, err)
require.NotEmpty(t, urls)
require.True(t, strings.Contains(urls[0].Url, "http"))
t.Log(urls[0].Url)
}
func TestNetease_GetMusicMeta(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "33516503",
}
@@ -39,7 +40,7 @@ func TestNetease_GetMusicMeta(t *testing.T) {
}
func TestNetease_UpdateMediaLyric(t *testing.T) {
meta := miaosic.MediaMeta{
meta := miaosic.MetaData{
Provider: api.GetName(),
Identifier: "33516503",
}

View File

@@ -0,0 +1,11 @@
package netease
import "github.com/AynaLivePlayer/miaosic"
func (n *Netease) MatchPlaylist(uri string) (miaosic.MetaData, bool) {
return miaosic.MetaData{}, false
}
func (n *Netease) GetPlaylist(meta miaosic.MetaData) (*miaosic.Playlist, error) {
return nil, miaosic.ErrNotImplemented
}

View File

@@ -6,7 +6,7 @@ import (
)
type FileApiParam struct {
Meta miaosic.MediaMeta
Meta miaosic.MetaData
Quality miaosic.Quality
}
@@ -17,9 +17,9 @@ type MediaSearchParam struct {
}
type DeepcolorProvider struct {
InfoApi dphttp.ApiResultFunc[miaosic.MediaMeta, miaosic.MediaInfo]
InfoApi dphttp.ApiResultFunc[miaosic.MetaData, miaosic.MediaInfo]
FileApi dphttp.ApiResultFunc[FileApiParam, []miaosic.MediaUrl]
LyricApi dphttp.ApiResultFunc[miaosic.MediaMeta, []miaosic.Lyrics]
LyricApi dphttp.ApiResultFunc[miaosic.MetaData, []miaosic.Lyrics]
//PlaylistFunc dphttp.ApiFunc[*miaosic.Playlist, *miaosic.Playlist]
SearchApi dphttp.ApiResultFunc[MediaSearchParam, []miaosic.MediaInfo]
}
@@ -31,7 +31,7 @@ func (p *DeepcolorProvider) Search(keyword string, page, size int) ([]miaosic.Me
return p.SearchApi(MediaSearchParam{Keyword: keyword, Page: page, PageSize: size})
}
func (p *DeepcolorProvider) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error) {
func (p *DeepcolorProvider) GetMediaInfo(meta miaosic.MetaData) (miaosic.MediaInfo, error) {
if p.InfoApi == nil {
return miaosic.MediaInfo{}, miaosic.ErrNotImplemented
}
@@ -42,14 +42,14 @@ func (p *DeepcolorProvider) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaI
return val, err
}
func (p *DeepcolorProvider) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
func (p *DeepcolorProvider) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
if p.FileApi == nil {
return nil, miaosic.ErrNotImplemented
}
return p.FileApi(FileApiParam{Meta: meta, Quality: quality})
}
func (p *DeepcolorProvider) GetMediaLyric(meta miaosic.MediaMeta) ([]miaosic.Lyrics, error) {
func (p *DeepcolorProvider) GetMediaLyric(meta miaosic.MetaData) ([]miaosic.Lyrics, error) {
if p.LyricApi == nil {
return nil, miaosic.ErrNotImplemented
}