gomus/pkg/track.go

75 lines
1.6 KiB
Go

package gomus
import (
"fmt"
"os"
"path/filepath"
"strconv"
"strings"
"github.com/faiface/beep"
bflac "github.com/faiface/beep/flac"
"github.com/mewkiz/flac"
"github.com/mewkiz/flac/meta"
)
type track struct {
Title string
Album string
Artist string
TrackPath string
TrackTotal uint8
TrackNumber uint8
}
func (t track) FilterValue() string { return "" }
func (t track) fullName() string { return fmt.Sprintf("%s - %s", t.Artist, t.Title) }
func (t track) GetStream() (beep.StreamSeekCloser, beep.Format, error) {
f, err := os.Open(t.TrackPath)
check(err)
if strings.HasSuffix(t.TrackPath, ".flac") {
streamer, format, err := bflac.Decode(f)
check(err)
return streamer, format, nil
}
return nil, beep.Format{}, fmt.Errorf("Could not parse track")
}
func TrackFromFlac(path string) track {
path, err := filepath.Abs(path)
check(err)
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 _, tagTuple := range c.Tags {
tag, val := tagTuple[0], tagTuple[1]
switch tag {
case "TITLE":
t.Title = val
case "ARTIST":
t.Artist = val
case "ALBUM":
t.Album = val
case "TRACKNUMBER":
trackNum, err := strconv.ParseUint(val, 10, 8)
check(err)
t.TrackNumber = uint8(trackNum)
case "TRACKTOTAL":
trackTotal, err := strconv.ParseUint(val, 10, 8)
check(err)
t.TrackTotal = uint8(trackTotal)
}
}
}
}
return t
}