add local provider, add cover output in textinfo

This commit is contained in:
Aynakeya
2022-07-07 20:30:12 -07:00
parent fd91b1e130
commit 7bf9372898
22 changed files with 301 additions and 76 deletions

View File

@@ -76,7 +76,7 @@ func (b *Bilibili) Search(keyword string) ([]*player.Media, error) {
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(),
Cover: player.Picture{Url: value.Get("cover").String()},
Artist: value.Get("author").String(),
Meta: Meta{
Name: b.GetName(),
@@ -99,7 +99,7 @@ func (b *Bilibili) UpdateMedia(media *player.Media) error {
return ErrorExternalApi
}
media.Title = gjson.Get(resp, "data.title").String()
media.Cover = gjson.Get(resp, "data.cover").String()
media.Cover.Url = gjson.Get(resp, "data.cover").String()
media.Artist = gjson.Get(resp, "data.author").String()
media.Album = media.Title
return nil

View File

@@ -92,7 +92,7 @@ func (b *BilibiliVideo) Search(keyword string) ([]*player.Media, error) {
jresp.Get("data.result").ForEach(func(key, value gjson.Result) bool {
result = append(result, &player.Media{
Title: r.ReplaceAllString(value.Get("title").String(), ""),
Cover: "https:" + value.Get("pic").String(),
Cover: player.Picture{Url: "https:" + value.Get("pic").String()},
Artist: value.Get("author").String(),
Meta: Meta{
Name: b.GetName(),
@@ -115,7 +115,7 @@ func (b *BilibiliVideo) UpdateMedia(media *player.Media) error {
}
media.Title = jresp.Get("data.View.title").String()
media.Artist = jresp.Get("data.View.owner.name").String()
media.Cover = jresp.Get("data.View.pic").String()
media.Cover.Url = jresp.Get("data.View.pic").String()
media.Album = media.Title
return nil
}
@@ -139,11 +139,11 @@ func (b *BilibiliVideo) UpdateMediaUrl(media *player.Media) error {
return ErrorExternalApi
}
jresp = gjson.Parse(resp)
url := jresp.Get("data.durl.0.url").String()
if url == "" {
uri := jresp.Get("data.durl.0.url").String()
if uri == "" {
return ErrorExternalApi
}
media.Url = url
media.Url = uri
header := make(map[string]string)
_ = copier.Copy(&header, &b.header)
header["Referer"] = fmt.Sprintf("https://www.bilibili.com/video/%s", b.getBv(media.Meta.(Meta).Id))

View File

@@ -116,7 +116,7 @@ func (k *Kuwo) Search(keyword string) ([]*player.Media, error) {
gjson.Parse(resp).Get("data.list").ForEach(func(key, value gjson.Result) bool {
result = append(result, &player.Media{
Title: html.UnescapeString(value.Get("name").String()),
Cover: value.Get("pic").String(),
Cover: player.Picture{Url: value.Get("pic").String()},
Artist: value.Get("artist").String(),
Album: value.Get("album").String(),
Meta: Meta{
@@ -139,7 +139,7 @@ func (k *Kuwo) UpdateMedia(media *player.Media) error {
return ErrorExternalApi
}
media.Title = html.UnescapeString(jresp.Get("data.name").String())
media.Cover = jresp.Get("data.pic").String()
media.Cover.Url = jresp.Get("data.pic").String()
media.Artist = jresp.Get("data.artist").String()
media.Album = jresp.Get("data.album").String()
return nil
@@ -193,7 +193,7 @@ func (k *Kuwo) GetPlaylist(meta Meta) ([]*player.Media, error) {
&player.Media{
Title: html.UnescapeString(value.Get("name").String()),
Artist: value.Get("artist").String(),
Cover: value.Get("pic").String(),
Cover: player.Picture{Url: value.Get("pic").String()},
Album: value.Get("album").String(),
Meta: Meta{
Name: k.GetName(),

View File

@@ -4,6 +4,8 @@ import (
"AynaLivePlayer/config"
"AynaLivePlayer/player"
"os"
"sort"
"strings"
)
type _LocalPlaylist struct {
@@ -19,7 +21,7 @@ var LocalAPI *Local
func init() {
LocalAPI = _newLocal()
//Providers[LocalAPI.GetName()] = LocalAPI
Providers[LocalAPI.GetName()] = LocalAPI
}
func _newLocal() *Local {
@@ -27,43 +29,99 @@ func _newLocal() *Local {
if err := os.MkdirAll(config.Provider.LocalDir, 0755); err != nil {
return l
}
for _, n := range getPlaylistNames() {
l.Playlists = append(l.Playlists, _LocalPlaylist{Name: n})
}
for i, _ := range l.Playlists {
_ = readLocalPlaylist(&l.Playlists[i])
}
return l
}
func (l *Local) GetName() string {
return "local"
}
func (l *Local) MatchMedia(keyword string) *player.Media {
//TODO implement me
panic("implement me")
return nil
}
func (l *Local) UpdateMediaLyric(media *player.Media) error {
//TODO implement me
panic("implement me")
// already update in UpdateMedia, do nothing
return nil
}
func (l *Local) FormatPlaylistUrl(uri string) string {
return ""
return uri
}
func (l *Local) GetPlaylist(playlist string) ([]*player.Media, error) {
//TODO implement me
panic("implement me")
func (l *Local) GetPlaylist(playlist Meta) ([]*player.Media, error) {
var pl *_LocalPlaylist = nil
for _, p := range l.Playlists {
if p.Name == playlist.Id {
pl = &p
}
}
if pl == nil {
l.Playlists = append(l.Playlists, _LocalPlaylist{Name: playlist.Id})
pl = &l.Playlists[len(l.Playlists)-1]
}
if readLocalPlaylist(pl) != nil {
return nil, ErrorExternalApi
}
return pl.Medias, nil
}
func (l *Local) Search(keyword string) ([]*player.Media, error) {
//TODO implement me
panic("implement me")
result := make([]struct {
M *player.Media
N int
}, 0)
keywords := strings.Split(keyword, " ")
for _, p := range l.Playlists {
for _, m := range p.Medias {
n := 0
for _, k := range keywords {
if strings.Contains(m.Title, k) || strings.Contains(m.Artist, k) {
n++
}
if k == m.Title {
n += 2
}
}
if n > 0 {
result = append(result, struct {
M *player.Media
N int
}{M: m, N: n})
}
}
}
sort.Slice(result, func(i, j int) bool {
return result[i].N > result[j].N
})
medias := make([]*player.Media, len(result))
for i, r := range result {
medias[i] = r.M.Copy()
}
return medias, nil
}
func (l *Local) UpdateMedia(media *player.Media) error {
//TODO implement me
panic("implement me")
mediaPath := media.Meta.(Meta).Id
_, err := os.Stat(mediaPath)
if err != nil {
return err
}
return readMediaFile(media)
}
func (l *Local) UpdateMediaUrl(media *player.Media) error {
//TODO implement me
panic("implement me")
mediaPath := media.Meta.(Meta).Id
_, err := os.Stat(mediaPath)
if err != nil {
return err
}
media.Url = mediaPath
return nil
}

73
provider/local_helper.go Normal file
View File

@@ -0,0 +1,73 @@
package provider
import (
"AynaLivePlayer/config"
"AynaLivePlayer/player"
"AynaLivePlayer/util"
"github.com/dhowden/tag"
"io/ioutil"
"os"
"path/filepath"
)
func getPlaylistNames() []string {
names := make([]string, 0)
items, _ := ioutil.ReadDir(config.Provider.LocalDir)
for _, item := range items {
if item.IsDir() {
names = append(names, item.Name())
}
}
return names
}
// readLocalPlaylist read files under a directory
// and return a _LocalPlaylist object.
// This function assume this directory exists
func readLocalPlaylist(playlist *_LocalPlaylist) error {
p1th := playlist.Name
playlist.Medias = make([]*player.Media, 0)
fullPath := filepath.Join(config.Provider.LocalDir, p1th)
if _, err := os.Stat(fullPath); os.IsNotExist(err) {
return err
}
items, _ := ioutil.ReadDir(fullPath)
for _, item := range items {
// if item is a file, read file
if !item.IsDir() {
fn := item.Name()
media := player.Media{
Meta: Meta{
Name: LocalAPI.GetName(),
Id: filepath.Join(fullPath, fn),
},
}
if readMediaFile(&media) != nil {
continue
}
playlist.Medias = append(playlist.Medias, &media)
}
}
return nil
}
func readMediaFile(media *player.Media) error {
p := media.Meta.(Meta).Id
f, err := os.Open(p)
if err != nil {
return err
}
defer f.Close()
meta, err := tag.ReadFrom(f)
if err != nil {
return err
}
media.Title = util.GetOrDefault(meta.Title(), filepath.Base(p))
media.Artist = util.GetOrDefault(meta.Artist(), "Unknown")
media.Album = util.GetOrDefault(meta.Album(), "Unknown")
media.Lyric = meta.Lyrics()
if meta.Picture() != nil {
media.Cover.Data = meta.Picture().Data
}
return nil
}

View File

@@ -120,7 +120,7 @@ func (n *Netease) GetPlaylist(meta Meta) ([]*player.Media, error) {
medias = append(medias, &player.Media{
Title: result2.Songs[i].Name,
Artist: _neteaseGetArtistNames(result2.Songs[i]),
Cover: result2.Songs[i].Al.PicUrl,
Cover: player.Picture{Url: result2.Songs[i].Al.PicUrl},
Album: result2.Songs[i].Al.Name,
Url: "",
Header: nil,
@@ -158,7 +158,7 @@ func (n *Netease) Search(keyword string) ([]*player.Media, error) {
medias = append(medias, &player.Media{
Title: song.Name,
Artist: strings.Join(artists, ","),
Cover: "",
Cover: player.Picture{},
Album: song.Album.Name,
Url: "",
Header: nil,
@@ -182,7 +182,7 @@ func (n *Netease) UpdateMedia(media *player.Media) error {
return ErrorExternalApi
}
media.Title = result.Songs[0].Name
media.Cover = result.Songs[0].Al.PicUrl
media.Cover.Url = result.Songs[0].Al.PicUrl
media.Album = result.Songs[0].Al.Name
media.Artist = _neteaseGetArtistNames(result.Songs[0])
return nil