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 }