gomus/pkg/track_fetcher.go

73 lines
1.2 KiB
Go

package gomus
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/mewkiz/flac"
"github.com/mewkiz/flac/meta"
)
type track struct {
name string
artist string
trackPath string
}
func (t track) FilterValue() string { return "" }
func (t track) fullName() string {
return fmt.Sprintf("%s - %s", t.artist, t.name)
}
func (t track) getReader() io.Reader {
f, err := os.Open(t.trackPath)
check(err)
return f
}
func trackFromFlac(path string) track {
s, err := flac.ParseFile(path)
check(err)
t := track{trackPath: path}
for _, block := range s.Blocks {
if block.Header.Type == meta.TypeVorbisComment {
c := block.Body.(*meta.VorbisComment)
for _, tag := range c.Tags {
if tag[0] == "ARTIST" {
t.artist = tag[1]
} else if tag[0] == "TITLE" {
t.name = tag[1]
}
}
}
}
return t
}
type trackIndex struct {
tracks []track
}
func NewDirTrackIndex(path string) trackIndex {
files, err := ioutil.ReadDir(path)
check(err)
tracks := []track{}
for _, file := range files {
if !file.IsDir() && strings.HasSuffix(file.Name(), ".flac") {
p := filepath.Join(path, file.Name())
tracks = append(tracks, trackFromFlac(p))
}
}
return trackIndex{tracks: tracks}
}