mirror of
https://github.com/AynaLivePlayer/miaosic.git
synced 2025-12-12 07:48:12 +08:00
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package local
|
|
|
|
import (
|
|
"github.com/AynaLivePlayer/miaosic"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
type localPlaylist struct {
|
|
name string
|
|
medias []localMedia
|
|
}
|
|
|
|
type localMedia struct {
|
|
info miaosic.MediaInfo
|
|
quality miaosic.Quality
|
|
lyrics []miaosic.Lyrics
|
|
}
|
|
|
|
func (l *localPlaylist) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error) {
|
|
for _, m := range l.medias {
|
|
if m.info.Meta.Identifier == meta.Identifier {
|
|
return m.info, nil
|
|
}
|
|
}
|
|
return miaosic.MediaInfo{}, miaosic.ErrorInvalidMediaMeta
|
|
}
|
|
|
|
type Local struct {
|
|
localDir string
|
|
playlists map[string]*localPlaylist
|
|
}
|
|
|
|
func NewLocal(localdir string) *Local {
|
|
l := &Local{localDir: localdir, playlists: make(map[string]*localPlaylist, 0)}
|
|
if err := os.MkdirAll(localdir, 0755); err != nil {
|
|
return l
|
|
}
|
|
for _, n := range getPlaylistNames(localdir) {
|
|
playlist := &localPlaylist{name: n, medias: make([]localMedia, 0)}
|
|
if readLocalPlaylist(localdir, playlist) != nil {
|
|
l.playlists[playlist.name] = playlist
|
|
}
|
|
}
|
|
return l
|
|
}
|
|
|
|
func (l *Local) metaToId(meta miaosic.MediaMeta) (playlist string) {
|
|
return strings.Split(meta.Identifier, "/")[0]
|
|
}
|
|
|
|
func (l *Local) GetName() string {
|
|
return "local"
|
|
}
|
|
|
|
func (l *Local) MatchMedia(uri string) (miaosic.MediaMeta, bool) {
|
|
return miaosic.MediaMeta{}, false
|
|
}
|
|
|
|
func (l *Local) GetMediaInfo(meta miaosic.MediaMeta) (miaosic.MediaInfo, error) {
|
|
if meta.Provider != l.GetName() {
|
|
return miaosic.MediaInfo{}, miaosic.ErrorDifferentProvider
|
|
}
|
|
playlist, ok := l.playlists[l.metaToId(meta)]
|
|
if !ok {
|
|
return miaosic.MediaInfo{}, miaosic.ErrorInvalidMediaMeta
|
|
}
|
|
return playlist.GetMediaInfo(meta)
|
|
}
|
|
|
|
func (l *Local) GetMediaUrl(meta miaosic.MediaMeta, quality miaosic.Quality) ([]miaosic.MediaUrl, error) {
|
|
info, err := l.GetMediaInfo(meta)
|
|
if err != nil {
|
|
return []miaosic.MediaUrl{}, err
|
|
}
|
|
return []miaosic.MediaUrl{{
|
|
Url: path.Join(l.localDir, info.Meta.Identifier),
|
|
Quality: miaosic.QualityUnk,
|
|
}}, nil
|
|
}
|
|
|
|
func (l *Local) GetMediaLyric(meta miaosic.MediaMeta) ([]miaosic.Lyrics, error) {
|
|
return []miaosic.Lyrics{}, miaosic.ErrNotImplemented
|
|
}
|
|
|
|
func (l *Local) Search(keyword string, page, size int) ([]miaosic.MediaInfo, error) {
|
|
allMedias := make([]miaosic.MediaInfo, 0)
|
|
for _, p := range l.playlists {
|
|
for _, m := range p.medias {
|
|
allMedias = append(allMedias, m.info)
|
|
}
|
|
}
|
|
rankedMedias := rankMedia(keyword, &allMedias)
|
|
total := len(rankedMedias)
|
|
if total < page*size {
|
|
return []miaosic.MediaInfo{}, nil
|
|
}
|
|
if total >= page*size {
|
|
total = page * size
|
|
}
|
|
return rankedMedias[(page-1)*size : total], nil
|
|
}
|