Files
miaosic/tag/reader.go
2025-08-06 00:29:00 +08:00

68 lines
1.4 KiB
Go

package tag
import (
"github.com/dhowden/tag"
"github.com/gabriel-vasile/mimetype"
"io"
)
func Read(r io.ReadSeeker) (Metadata, error) {
_, err := r.Seek(0, io.SeekStart)
if err != nil {
return Metadata{}, err
}
b := make([]byte, 512)
_, err = io.ReadFull(r, b)
if err != nil {
return Metadata{}, err
}
mimeType := mimetype.Detect(b).String()
_, err = r.Seek(0, io.SeekStart)
switch {
case string(b[0:4]) == "fLaC":
return ReadFLACTags(r, mimeType)
//case string(b[0:4]) == "OggS":
// return ReadOGGTags(r)
//case string(b[4:8]) == "ftyp":
// return ReadAtoms(r)
case string(b[0:3]) == "ID3":
return ReadID3v2Tags(r, mimeType)
//case string(b[0:4]) == "DSD ":
// return ReadDSFTags(r)
}
return fallbackRead(r, mimeType)
}
func fallbackRead(r io.ReadSeeker, mime string) (Metadata, error) {
meta := Metadata{
Mimetype: mime,
}
m, err := tag.ReadFrom(r)
if err != nil {
return Metadata{}, err
}
meta.Format = string(m.Format())
meta.Title = m.Title()
meta.Artist = m.Artist()
meta.Album = m.Album()
meta.Lyrics = []Lyrics{}
if m.Lyrics() != "" {
meta.Lyrics = append(meta.Lyrics, Lyrics{
Lang: "unk",
Lyrics: m.Lyrics(),
})
}
meta.Pictures = []Picture{}
if m.Picture() != nil {
p := m.Picture()
meta.Pictures = append(meta.Pictures, Picture{
Mimetype: p.MIMEType,
Type: PictureTypeFrontCover,
Description: p.Description,
Data: p.Data,
})
}
return meta, nil
}