Files
AynaLivePlayer/provider/bilibili.go
2022-06-21 13:02:22 -07:00

106 lines
2.6 KiB
Go

package provider
import (
"AynaLivePlayer/player"
"fmt"
"github.com/tidwall/gjson"
"net/url"
)
type Bilibili struct {
InfoApi string
FileApi string
SearchApi string
}
func _newBilibili() *Bilibili {
return &Bilibili{
InfoApi: "https://www.bilibili.com/audio/music-service-c/web/song/info?sid=%s",
FileApi: "https://api.bilibili.com/audio/music-service-c/url?device=phone&mid=8047632&mobi_app=iphone&platform=ios&privilege=2&songid=%s&quality=2",
SearchApi: "https://api.bilibili.com/audio/music-service-c/s?search_type=music&keyword=%s&page=1&pagesize=100",
}
}
var BilibiliAPI *Bilibili
func init() {
BilibiliAPI = _newBilibili()
Providers[BilibiliAPI.GetName()] = BilibiliAPI
}
func (b *Bilibili) GetName() string {
return "bilibili"
}
func (b *Bilibili) FormatPlaylistUrl(uri string) string {
return ""
}
func (b *Bilibili) GetPlaylist(meta Meta) ([]*player.Media, error) {
return nil, ErrorExternalApi
}
func (b *Bilibili) Search(keyword string) ([]*player.Media, error) {
resp := httpGetString(fmt.Sprintf(b.SearchApi, url.QueryEscape(keyword)), map[string]string{
"user-agent": "BiliMusic/2.233.3",
})
if resp == "" {
return nil, ErrorExternalApi
}
result := make([]*player.Media, 0)
gjson.Get(resp, "data.result").ForEach(func(key, value gjson.Result) bool {
result = append(result, &player.Media{
Title: value.Get("title").String(),
Cover: value.Get("cover").String(),
Artist: value.Get("author").String(),
Meta: Meta{
Name: b.GetName(),
Id: value.Get("id").String(),
},
})
return true
})
return result, nil
}
func (b *Bilibili) UpdateMedia(media *player.Media) error {
resp := httpGetString(fmt.Sprintf(b.InfoApi, media.Meta.(Meta).Id), map[string]string{
"user-agent": "BiliMusic/2.233.3",
})
if resp == "" {
return ErrorExternalApi
}
if gjson.Get(resp, "data.title").String() == "" {
return ErrorExternalApi
}
media.Title = gjson.Get(resp, "data.title").String()
media.Cover = gjson.Get(resp, "data.cover").String()
media.Artist = gjson.Get(resp, "data.author").String()
media.Album = media.Title
return nil
}
func (b *Bilibili) UpdateMediaUrl(media *player.Media) error {
resp := httpGetString(fmt.Sprintf(b.FileApi, media.Meta.(Meta).Id), map[string]string{
"user-agent": "BiliMusic/2.233.3",
})
if resp == "" {
return ErrorExternalApi
}
media.Header = map[string]string{
"user-agent": "BiliMusic/2.233.3",
}
fmt.Println(fmt.Sprintf(b.InfoApi, media.Meta.(Meta).Id))
uri := gjson.Get(resp, "data.cdns.0").String()
if uri == "" {
return ErrorExternalApi
}
media.Url = uri
return nil
}
func (k *Bilibili) UpdateMediaLyric(media *player.Media) error {
return nil
}