Files
yellowjacket/backend/metadata/genre.go
T

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
}