Import song duration with hundredths when using TagLib

This is how ffmpeg extractor currently works, and it makes album durations more precise.
This commit is contained in:
Deluan
2021-08-20 21:33:12 -04:00
parent 05e27095b2
commit 143f5ba9d5
4 changed files with 14 additions and 4 deletions
+9
View File
@@ -1,6 +1,8 @@
package taglib
import (
"strconv"
"github.com/navidrome/navidrome/log"
)
@@ -32,6 +34,13 @@ func (e *Parser) extractMetadata(filePath string) (parsedTags, error) {
"tracknumber": {"trck", "_track"},
}
if length, ok := tags["lengthinmilliseconds"]; ok && len(length) > 0 {
millis, _ := strconv.Atoi(length[0])
if duration := float64(millis) / 1000.0; duration > 0 {
tags["duration"] = []string{strconv.FormatFloat(duration, 'f', 2, 32)}
}
}
for tagName, alternatives := range alternativeTags {
for _, altName := range alternatives {
if altValue, ok := tags[altName]; ok {
+2 -2
View File
@@ -27,7 +27,7 @@ var _ = Describe("Parser", func() {
Expect(m).To(HaveKeyWithValue("tracknumber", []string{"2/10", "2/10", "2"}))
Expect(m).To(HaveKeyWithValue("discnumber", []string{"1/2"}))
Expect(m).To(HaveKeyWithValue("has_picture", []string{"true"}))
Expect(m).To(HaveKeyWithValue("duration", []string{"1"}))
Expect(m).To(HaveKeyWithValue("duration", []string{"1.02"}))
Expect(m).To(HaveKeyWithValue("bitrate", []string{"192"}))
Expect(m).To(HaveKeyWithValue("comment", []string{"Comment1\nComment2"}))
Expect(m).To(HaveKeyWithValue("lyrics", []string{"Lyrics 1\rLyrics 2"}))
@@ -37,7 +37,7 @@ var _ = Describe("Parser", func() {
Expect(err).To(BeNil())
Expect(m).ToNot(HaveKey("title"))
Expect(m).ToNot(HaveKey("has_picture"))
Expect(m).To(HaveKeyWithValue("duration", []string{"1"}))
Expect(m).To(HaveKeyWithValue("duration", []string{"1.04"}))
Expect(m).To(HaveKeyWithValue("fbpm", []string{"141.7"}))
// TabLib 1.12 returns 18, previous versions return 39.
@@ -31,6 +31,7 @@ int taglib_read(const char *filename, unsigned long id) {
// Add audio properties to the tags
const TagLib::AudioProperties *props(f.audioProperties());
go_map_put_int(id, (char *)"duration", props->length());
go_map_put_int(id, (char *)"lengthinmilliseconds", props->lengthInMilliseconds());
go_map_put_int(id, (char *)"bitrate", props->bitrate());
TagLib::PropertyMap tags = f.file()->properties();