local source refactor

This commit is contained in:
aynakeya
2024-06-04 15:13:00 +08:00
parent db3b5c7f16
commit 6e30f93ca8
3 changed files with 25 additions and 139 deletions

View File

@@ -15,7 +15,6 @@ type localPlaylist struct {
type localMedia struct {
info miaosic.MediaInfo
quality miaosic.Quality
lyrics []miaosic.Lyrics
}
func (l *localPlaylist) GetMediaInfo(meta miaosic.MetaData) (miaosic.MediaInfo, error) {
@@ -88,16 +87,12 @@ func (l *Local) GetMediaUrl(meta miaosic.MetaData, quality miaosic.Quality) ([]m
}
func (l *Local) GetMediaLyric(meta miaosic.MetaData) ([]miaosic.Lyrics, error) {
playlist, ok := l.playlists[l.metaToId(meta)]
if !ok {
return []miaosic.Lyrics{}, miaosic.ErrorInvalidMediaMeta
lyrics, err := readLyric(l.localDir, meta)
if err == nil {
return lyrics, nil
}
for _, m := range playlist.medias {
if m.info.Meta.Identifier == meta.Identifier {
newM := m
_ = readMediaFile(l.localDir, &newM)
return newM.lyrics, nil
}
if len(lyrics) == 0 {
return lyrics, miaosic.ErrorExternalApi
}
return []miaosic.Lyrics{}, miaosic.ErrorExternalApi
}

View File

@@ -3,12 +3,9 @@ package local
import (
"github.com/AynaLivePlayer/miaosic"
"github.com/dhowden/tag"
"github.com/sahilm/fuzzy"
"os"
"path"
"path/filepath"
"sort"
"strings"
)
func getPlaylistNames(localdir string) []string {
@@ -74,14 +71,9 @@ func readMediaFile(localdir string, media *localMedia) error {
media.info.Title = _getOrDefault(meta.Title(), filepath.Base(p))
media.info.Artist = _getOrDefault(meta.Artist(), "Unknown")
media.info.Album = _getOrDefault(meta.Album(), "Unknown")
media.lyrics = []miaosic.Lyrics{miaosic.ParseLyrics("default", meta.Lyrics())}
if meta.Picture() != nil {
media.info.Cover.Data = meta.Picture().Data
}
data, err := os.ReadFile(filepath.Dir(p) + filepath.Base(p) + ".lrc")
if err == nil && len(data) > 0 {
media.lyrics = append(media.lyrics, miaosic.ParseLyrics("default", string(data)))
}
return nil
}
@@ -102,49 +94,24 @@ func readMediaFileInfo(localdir string, media *localMedia) error {
return nil
}
type mediaRanking struct {
media *miaosic.MediaInfo
score int
}
func rankMedia(keyword string, medias *[]miaosic.MediaInfo) []miaosic.MediaInfo {
patterns := strings.Split(keyword, " ")
data := make([]*mediaRanking, 0)
for i, _ := range *medias {
data = append(data, &mediaRanking{
media: &(*medias)[i],
score: 0,
})
}
for _, pattern := range patterns {
pattern = strings.ToLower(pattern)
dataStr := make([]string, 0)
for _, d := range data {
dataStr = append(dataStr, strings.ToLower(d.media.Title))
}
for _, match := range fuzzy.Find(pattern, dataStr) {
data[match.Index].score += match.Score
}
dataStr = make([]string, 0)
for _, d := range data {
dataStr = append(dataStr, strings.ToLower(d.media.Artist))
}
for _, match := range fuzzy.Find(pattern, dataStr) {
data[match.Index].score += match.Score
}
}
sort.Slice(data, func(i, j int) bool {
return data[i].score > data[j].score
})
result := make([]miaosic.MediaInfo, 0)
for _, d := range data {
if d.score > 0 {
result = append(result, *d.media)
}
}
return result
func readLyric(localdir string, meta miaosic.MetaData) ([]miaosic.Lyrics, error) {
lyrics := make([]miaosic.Lyrics, 0)
p := path.Join(localdir, meta.Identifier)
data, err := os.ReadFile(filepath.Dir(p) + filepath.Base(p) + ".lrc")
if err == nil && len(data) > 0 {
lyrics = append(lyrics, miaosic.ParseLyrics("default", string(data)))
}
f, err := os.Open(p)
defer f.Close()
if err == nil {
mMeta, err := tag.ReadFrom(f)
if err == nil {
name := "builtin"
if len(lyrics) == 0 {
name = "default"
}
lyrics = append(lyrics, miaosic.ParseLyrics(name, mMeta.Lyrics()))
}
}
return lyrics, nil
}

View File

@@ -1,77 +1 @@
package local
import (
"fmt"
"github.com/AynaLivePlayer/miaosic"
"github.com/sahilm/fuzzy"
"sort"
"strings"
"testing"
)
var testData = []miaosic.MediaInfo{
{Title: "Shape of You", Artist: "Ed Sheeran"},
{Title: "Lose Yourself", Artist: "Eminem"},
{Title: "Believer", Artist: "Imagine Dragons"},
{Title: "Counting Stars", Artist: "OneRepublic"},
{Title: "Rolling in the Deep", Artist: "Adele"},
{Title: "Uptown Funk", Artist: "Mark Ronson ft. Bruno Mars"},
{Title: "Imagine", Artist: "John Lennon"},
{Title: "I Will Always Love You", Artist: "Whitney Houston"},
{Title: "Smells Like Teen Spirit", Artist: "Nirvana"},
{Title: "Billie Jean", Artist: "Michael Jackson"},
// Chinese songs
{Title: "平凡之路", Artist: "朴树"},
{Title: "染", Artist: "reol"},
{Title: "怪物", Artist: "reol"},
{Title: "怪物", Artist: "王菲"},
{Title: "怪物", Artist: "怪物"},
{Title: "小幸运", Artist: "田馥甄"},
{Title: "遥远的她", Artist: "张学友"},
{Title: "匆匆那年", Artist: "王菲"},
{Title: "岁月神偷", Artist: "金玟岐"},
{Title: "突然好想你", Artist: "五月天"},
{Title: "蓝莲花", Artist: "许巍"},
{Title: "红豆", Artist: "王菲"},
{Title: "夜空中最亮的星", Artist: "逃跑计划"},
{Title: "爱情转移", Artist: "陈奕迅"},
}
func TestLocal_SearchTest1(t *testing.T) {
testPattern := "王菲"
patterns := strings.Split(testPattern, " ")
data := make([]*mediaRanking, 0)
for _, media := range testData {
m := media
data = append(data, &mediaRanking{
media: &m,
score: 0,
})
}
dataStr := make([]string, 0)
for _, d := range data {
dataStr = append(dataStr, strings.ToLower(d.media.Title+" "+d.media.Artist))
}
for _, pattern := range patterns {
for _, match := range fuzzy.Find(pattern, dataStr) {
data[match.Index].score += match.Score
}
}
sort.Slice(data, func(i, j int) bool {
return data[i].score > data[j].score
})
for _, d := range data {
fmt.Println(d.score, d.media)
}
}
func TestLocal_SearchTest2(t *testing.T) {
for _, media := range rankMedia("怪物 reol", &testData) {
fmt.Println(media)
}
}