84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
package coverresolve
|
|
|
|
import (
|
|
"regexp"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var DefaultKeywords = []string{
|
|
"cover",
|
|
"folder",
|
|
"front",
|
|
"albumart",
|
|
"album",
|
|
"artist",
|
|
"scan",
|
|
}
|
|
|
|
// Helper function to extract the number from the filename
|
|
func extractNumber(filename string) int {
|
|
re := regexp.MustCompile(`\d+`)
|
|
matches := re.FindAllString(filename, -1)
|
|
if len(matches) == 0 {
|
|
return 0
|
|
}
|
|
num, _ := strconv.Atoi(matches[0])
|
|
return num
|
|
}
|
|
|
|
type CoverAlternative struct {
|
|
Name string
|
|
Score int
|
|
}
|
|
|
|
func SelectCover(covers []string) string {
|
|
if len(covers) == 0 {
|
|
return ""
|
|
}
|
|
|
|
coverAlternatives := make([]CoverAlternative, 0)
|
|
|
|
for _, keyword := range DefaultKeywords {
|
|
if len(coverAlternatives) > 0 {
|
|
break
|
|
}
|
|
|
|
for _, cover := range covers {
|
|
if strings.Contains(strings.ToLower(cover), keyword) {
|
|
coverAlternatives = append(coverAlternatives, CoverAlternative{
|
|
Name: cover,
|
|
Score: 0,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
// parse the integer from the filename
|
|
// eg. cover(1).jpg will have higher score than cover(114514).jpg
|
|
for i := range coverAlternatives {
|
|
coverAlternatives[i].Score -= extractNumber(coverAlternatives[i].Name)
|
|
}
|
|
|
|
// sort by score
|
|
sort.Slice(coverAlternatives, func(i, j int) bool {
|
|
return coverAlternatives[i].Score > coverAlternatives[j].Score
|
|
})
|
|
|
|
if len(coverAlternatives) == 0 {
|
|
return covers[0]
|
|
}
|
|
|
|
return coverAlternatives[0].Name
|
|
}
|
|
|
|
func IsCover(name string) bool {
|
|
for _, ext := range []string{"jpg", "jpeg", "png", "bmp", "gif"} {
|
|
if strings.HasSuffix(strings.ToLower(name), "."+ext) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|