Recover from any possible taglib panics. Fixes #1343
This commit is contained in:
@@ -13,18 +13,16 @@ type parsedTags = map[string][]string
|
|||||||
func (e *Parser) Parse(paths ...string) (map[string]parsedTags, error) {
|
func (e *Parser) Parse(paths ...string) (map[string]parsedTags, error) {
|
||||||
fileTags := map[string]parsedTags{}
|
fileTags := map[string]parsedTags{}
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
tags, err := e.extractMetadata(path)
|
fileTags[path] = e.extractMetadata(path)
|
||||||
if err == nil {
|
|
||||||
fileTags[path] = tags
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return fileTags, nil
|
return fileTags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
|
func (e *Parser) extractMetadata(filePath string) parsedTags {
|
||||||
tags, err := Read(filePath)
|
tags, err := Read(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("Error reading metadata from file. Skipping", "filePath", filePath, err)
|
log.Warn("Error reading metadata from file. Skipping", "filePath", filePath, err)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
alternativeTags := map[string][]string{
|
alternativeTags := map[string][]string{
|
||||||
@@ -48,5 +46,5 @@ func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tags, nil
|
return tags
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,13 @@ import (
|
|||||||
"github.com/navidrome/navidrome/log"
|
"github.com/navidrome/navidrome/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Read(filename string) (map[string][]string, error) {
|
func Read(filename string) (tags map[string][]string, err error) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Error("TagLib: recovered from panic", "error", r)
|
||||||
|
err = fmt.Errorf("TagLib: recovered from panic: %s", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
fp := getFilename(filename)
|
fp := getFilename(filename)
|
||||||
defer C.free(unsafe.Pointer(fp))
|
defer C.free(unsafe.Pointer(fp))
|
||||||
id, m := newMap()
|
id, m := newMap()
|
||||||
|
|||||||
Reference in New Issue
Block a user