mirror of
https://github.com/AynaLivePlayer/miaosic.git
synced 2025-12-07 05:22:49 +08:00
local source refactor
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user