91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package backend
|
|
|
|
import "strings"
|
|
|
|
func normalizeArtistSeparator(separator string) string {
|
|
separator = strings.TrimSpace(separator)
|
|
if separator == "," || separator == ";" {
|
|
return separator
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func splitArtistSegment(segment string, separator string) []string {
|
|
segment = strings.TrimSpace(segment)
|
|
if segment == "" {
|
|
return nil
|
|
}
|
|
|
|
if strings.Contains(segment, "|||SEP|||") {
|
|
return strings.Split(segment, "|||SEP|||")
|
|
}
|
|
|
|
parts := []string{segment}
|
|
|
|
if separator = normalizeArtistSeparator(separator); separator != "" {
|
|
var separated []string
|
|
for _, part := range parts {
|
|
for _, item := range strings.Split(part, separator) {
|
|
separated = append(separated, item)
|
|
}
|
|
}
|
|
parts = separated
|
|
} else if strings.Contains(segment, ";") {
|
|
var separated []string
|
|
for _, part := range parts {
|
|
for _, item := range strings.Split(part, ";") {
|
|
separated = append(separated, item)
|
|
}
|
|
}
|
|
parts = separated
|
|
}
|
|
|
|
return parts
|
|
}
|
|
|
|
func SplitArtistCredits(artistStr, separator string) []string {
|
|
rawParts := splitArtistSegment(artistStr, separator)
|
|
if len(rawParts) == 0 {
|
|
return nil
|
|
}
|
|
|
|
seen := make(map[string]struct{}, len(rawParts))
|
|
result := make([]string, 0, len(rawParts))
|
|
for _, part := range rawParts {
|
|
part = strings.TrimSpace(part)
|
|
if part == "" {
|
|
continue
|
|
}
|
|
if _, exists := seen[part]; exists {
|
|
continue
|
|
}
|
|
seen[part] = struct{}{}
|
|
result = append(result, part)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func SplitMetadataValues(value, separator string) []string {
|
|
rawParts := splitArtistSegment(value, separator)
|
|
if len(rawParts) == 0 {
|
|
return nil
|
|
}
|
|
|
|
seen := make(map[string]struct{}, len(rawParts))
|
|
result := make([]string, 0, len(rawParts))
|
|
for _, part := range rawParts {
|
|
part = strings.TrimSpace(part)
|
|
if part == "" {
|
|
continue
|
|
}
|
|
if _, exists := seen[part]; exists {
|
|
continue
|
|
}
|
|
seen[part] = struct{}{}
|
|
result = append(result, part)
|
|
}
|
|
|
|
return result
|
|
}
|