49 lines
1023 B
Go
49 lines
1023 B
Go
// Package metadata provides audio file metadata extraction utilities.
|
|
package metadata
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
// genreSeparators defines the characters treated as genre delimiters.
|
|
const genreSeparators = ",;"
|
|
|
|
// ParseGenres splits a raw genre string on commas and semicolons,
|
|
// trims whitespace, normalizes each entry to title case, removes
|
|
// duplicates, and returns the unique genre names. An empty or
|
|
// whitespace-only input returns nil.
|
|
func ParseGenres(raw string) []string {
|
|
parts := strings.FieldsFunc(
|
|
raw, func(r rune) bool {
|
|
return strings.ContainsRune(genreSeparators, r)
|
|
},
|
|
)
|
|
|
|
caser := cases.Title(language.English)
|
|
seen := make(map[string]struct{}, len(parts))
|
|
|
|
var genres []string
|
|
|
|
for _, p := range parts {
|
|
name := strings.TrimSpace(p)
|
|
if name == "" {
|
|
continue
|
|
}
|
|
|
|
name = caser.String(name)
|
|
|
|
if _, ok := seen[name]; ok {
|
|
continue
|
|
}
|
|
|
|
seen[name] = struct{}{}
|
|
|
|
genres = append(genres, name)
|
|
}
|
|
|
|
return genres
|
|
}
|