package utils
import (
"fmt"
"path/filepath"
"regexp"
"strconv"
"strings"
)
func ParseSelectionFilename(filename string) (baseFilename string, startS, endS float64, err error) {
nameWithoutExt := strings.TrimSuffix(filename, filepath.Ext(filename))
parts := strings.Split(nameWithoutExt, "-")
if len(parts) < 3 {
return "", 0, 0, fmt.Errorf("invalid selection filename format (expected at least 3 dash-separated parts): %s", filename)
}
endTimeStr := parts[len(parts)-1]
startTimeStr := parts[len(parts)-2]
baseFilename = strings.Join(parts[:len(parts)-2], "-")
startS, err = strconv.ParseFloat(startTimeStr, 64)
if err != nil {
return "", 0, 0, fmt.Errorf("invalid start time '%s': %w", startTimeStr, err)
}
endS, err = strconv.ParseFloat(endTimeStr, 64)
if err != nil {
return "", 0, 0, fmt.Errorf("invalid end time '%s': %w", endTimeStr, err)
}
if startS >= endS {
return "", 0, 0, fmt.Errorf("start time (%.2f) must be less than end time (%.2f)", startS, endS)
}
return baseFilename, startS, endS, nil
}
func ParseMLFolderName(folderName string) (filterName string, date string, err error) {
pattern := regexp.MustCompile(`^Clips_(.+)_(\d{4}-\d{2}-\d{2})$`)
matches := pattern.FindStringSubmatch(folderName)
if len(matches) != 3 {
return "", "", fmt.Errorf("invalid ML folder name format (expected 'Clips_{filter_name}_{YYYY-MM-DD}'): %s", folderName)
}
filterName = matches[1]
date = matches[2]
return filterName, date, nil
}
func ValidateWAVPNGPairs(wavFiles, pngFiles []string) (paired []string, mismatched []string) {
pngMap := make(map[string]bool)
for _, pngFile := range pngFiles {
baseName := strings.TrimSuffix(pngFile, filepath.Ext(pngFile))
pngMap[baseName] = true
}
for _, wavFile := range wavFiles {
baseName := strings.TrimSuffix(wavFile, filepath.Ext(wavFile))
if pngMap[baseName] {
paired = append(paired, baseName)
} else {
mismatched = append(mismatched, wavFile)
}
}
return paired, mismatched
}
func ExtractDateTimePattern(filename string) (pattern string, found bool) {
pattern8 := regexp.MustCompile(`(\d{8}_\d{6})`)
if match := pattern8.FindString(filename); match != "" {
return match, true
}
pattern6 := regexp.MustCompile(`(\d{6}_\d{6})`)
if match := pattern6.FindString(filename); match != "" {
return match, true
}
return "", false
}