feat: improve cover selection algorithm
Some checks failed
Some checks failed
This commit is contained in:
83
scanner/coverresolve/cover.go
Normal file
83
scanner/coverresolve/cover.go
Normal file
@@ -0,0 +1,83 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user