package library import ( "strconv" "strings" "github.com/dhowden/tag" ) // ReadTrackAndDisc reads a file's track and disc numbers. dhowden/tag reads a // Vorbis TRACKNUMBER or DISCNUMBER only as a bare number, but taggers also // write "3/20" there (Minstrel's own importer did until #6171), and that // reads as 0. For Vorbis the number before the slash is taken instead. func ReadTrackAndDisc(m tag.Metadata) (track, disc int) { track, _ = m.Track() disc, _ = m.Disc() if m.Format() != tag.VORBIS { return track, disc } raw := m.Raw() if track == 0 { track = leadingNumber(raw["tracknumber"]) } if disc == 0 { disc = leadingNumber(raw["discnumber"]) } return track, disc } // leadingNumber is the number in a tag value of "3" or "3/20"; 0 for // anything else. func leadingNumber(v any) int { s, _ := v.(string) before, _, _ := strings.Cut(s, "/") n, err := strconv.Atoi(strings.TrimSpace(before)) if err != nil || n < 0 { return 0 } return n }