mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2026-05-19 09:15:47 +08:00
add local provider, add cover output in textinfo
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
73
provider/local_helper.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user