fix(scanner): better detect years given extraneous year tags
This commit is contained in:
@@ -21,13 +21,22 @@ type Tagger struct {
|
|||||||
|
|
||||||
func (t *Tagger) first(keys ...string) string {
|
func (t *Tagger) first(keys ...string) string {
|
||||||
for _, key := range keys {
|
for _, key := range keys {
|
||||||
if val, ok := t.raw[key]; ok {
|
if v := strings.TrimSpace(t.raw[key]); v != "" {
|
||||||
return val
|
return v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tagger) firstInt(sep string, keys ...string) int {
|
||||||
|
for _, key := range keys {
|
||||||
|
if v := intSep(t.raw[key], sep); v > 0 {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Tagger) Title() string { return t.first("title") }
|
func (t *Tagger) Title() string { return t.first("title") }
|
||||||
func (t *Tagger) BrainzID() string { return t.first("musicbrainz_trackid") }
|
func (t *Tagger) BrainzID() string { return t.first("musicbrainz_trackid") }
|
||||||
func (t *Tagger) Artist() string { return t.first("artist") }
|
func (t *Tagger) Artist() string { return t.first("artist") }
|
||||||
@@ -35,11 +44,11 @@ func (t *Tagger) Album() string { return t.first("album") }
|
|||||||
func (t *Tagger) AlbumArtist() string { return t.first("albumartist", "album artist") }
|
func (t *Tagger) AlbumArtist() string { return t.first("albumartist", "album artist") }
|
||||||
func (t *Tagger) AlbumBrainzID() string { return t.first("musicbrainz_albumid") }
|
func (t *Tagger) AlbumBrainzID() string { return t.first("musicbrainz_albumid") }
|
||||||
func (t *Tagger) Genre() string { return t.first("genre") }
|
func (t *Tagger) Genre() string { return t.first("genre") }
|
||||||
func (t *Tagger) TrackNumber() int { return intSep(t.first("tracknumber"), "/") } // eg. 5/12
|
func (t *Tagger) TrackNumber() int { return t.firstInt("/" /* eg. 5/12 */, "tracknumber") }
|
||||||
func (t *Tagger) DiscNumber() int { return intSep(t.first("discnumber"), "/") } // eg. 1/2
|
func (t *Tagger) DiscNumber() int { return t.firstInt("/" /* eg. 1/2 */, "discnumber") }
|
||||||
func (t *Tagger) Length() int { return t.props.Length }
|
func (t *Tagger) Length() int { return t.props.Length }
|
||||||
func (t *Tagger) Bitrate() int { return t.props.Bitrate }
|
func (t *Tagger) Bitrate() int { return t.props.Bitrate }
|
||||||
func (t *Tagger) Year() int { return intSep(t.first("originaldate", "date", "year"), "-") }
|
func (t *Tagger) Year() int { return t.firstInt("-", "originaldate", "date", "year") }
|
||||||
|
|
||||||
func (t *Tagger) SomeAlbum() string { return first("Unknown Album", t.Album()) }
|
func (t *Tagger) SomeAlbum() string { return first("Unknown Album", t.Album()) }
|
||||||
func (t *Tagger) SomeArtist() string { return first("Unknown Artist", t.Artist()) }
|
func (t *Tagger) SomeArtist() string { return first("Unknown Artist", t.Artist()) }
|
||||||
@@ -48,27 +57,6 @@ func (t *Tagger) SomeAlbumArtist() string {
|
|||||||
}
|
}
|
||||||
func (t *Tagger) SomeGenre() string { return first("Unknown Genre", t.Genre()) }
|
func (t *Tagger) SomeGenre() string { return first("Unknown Genre", t.Genre()) }
|
||||||
|
|
||||||
func first(or string, strs ...string) string {
|
|
||||||
for _, str := range strs {
|
|
||||||
if str != "" {
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return or
|
|
||||||
}
|
|
||||||
|
|
||||||
func intSep(in, sep string) int {
|
|
||||||
if in == "" {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
start := strings.SplitN(in, sep, 2)[0]
|
|
||||||
out, err := strconv.Atoi(start)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
type Reader interface {
|
type Reader interface {
|
||||||
Read(abspath string) (Parser, error)
|
Read(abspath string) (Parser, error)
|
||||||
}
|
}
|
||||||
@@ -92,3 +80,24 @@ type Parser interface {
|
|||||||
SomeAlbumArtist() string
|
SomeAlbumArtist() string
|
||||||
SomeGenre() string
|
SomeGenre() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func intSep(in, sep string) int {
|
||||||
|
if in == "" {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
start := strings.SplitN(in, sep, 2)[0]
|
||||||
|
out, err := strconv.Atoi(start)
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func first(or string, strs ...string) string {
|
||||||
|
for _, str := range strs {
|
||||||
|
if str != "" {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return or
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user