mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-07 19:03:18 +03:00
refactor: separate metadata extraction from audio files scanning
This commit is contained in:
parent
edb839a41d
commit
d9993c5877
@ -43,7 +43,7 @@ func (m *Metadata) FilePath() string { return m.filePath }
|
|||||||
func (m *Metadata) Suffix() string { return m.suffix }
|
func (m *Metadata) Suffix() string { return m.suffix }
|
||||||
func (m *Metadata) Size() int { return int(m.fileInfo.Size()) }
|
func (m *Metadata) Size() int { return int(m.fileInfo.Size()) }
|
||||||
|
|
||||||
func ExtractAllMetadata(dirPath string) (map[string]*Metadata, error) {
|
func LoadAllAudioFiles(dirPath string) ([]os.FileInfo, error) {
|
||||||
dir, err := os.Open(dirPath)
|
dir, err := os.Open(dirPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -52,7 +52,7 @@ func ExtractAllMetadata(dirPath string) (map[string]*Metadata, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var audioFiles []string
|
var audioFiles []os.FileInfo
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
if f.IsDir() {
|
if f.IsDir() {
|
||||||
continue
|
continue
|
||||||
@ -62,16 +62,18 @@ func ExtractAllMetadata(dirPath string) (map[string]*Metadata, error) {
|
|||||||
if !isAudioFile(extension) {
|
if !isAudioFile(extension) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
audioFiles = append(audioFiles, filePath)
|
fi, err := os.Stat(filePath)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Could not stat file", "filePath", filePath, err)
|
||||||
|
} else {
|
||||||
|
audioFiles = append(audioFiles, fi)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(audioFiles) == 0 {
|
return audioFiles, nil
|
||||||
return map[string]*Metadata{}, nil
|
|
||||||
}
|
|
||||||
return probe(audioFiles)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func probe(inputs []string) (map[string]*Metadata, error) {
|
func ExtractAllMetadata(inputs []string) (map[string]*Metadata, error) {
|
||||||
cmdLine, args := createProbeCommand(inputs)
|
cmdLine, args := createProbeCommand(inputs)
|
||||||
|
|
||||||
log.Trace("Executing command", "arg0", cmdLine, "args", args)
|
log.Trace("Executing command", "arg0", cmdLine, "args", args)
|
||||||
|
@ -9,9 +9,9 @@ var _ = Describe("Metadata", func() {
|
|||||||
// TODO Need to mock `ffmpeg`
|
// TODO Need to mock `ffmpeg`
|
||||||
XContext("ExtractAllMetadata", func() {
|
XContext("ExtractAllMetadata", func() {
|
||||||
It("correctly parses metadata from all files in folder", func() {
|
It("correctly parses metadata from all files in folder", func() {
|
||||||
mds, err := ExtractAllMetadata("tests/fixtures")
|
mds, err := ExtractAllMetadata([]string{"tests/fixtures/test.mp3", "tests/fixtures/test.ogg"})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(mds).To(HaveLen(3))
|
Expect(mds).To(HaveLen(2))
|
||||||
|
|
||||||
m := mds["tests/fixtures/test.mp3"]
|
m := mds["tests/fixtures/test.mp3"]
|
||||||
Expect(m.Title()).To(Equal("Song"))
|
Expect(m.Title()).To(Equal("Song"))
|
||||||
@ -45,14 +45,21 @@ var _ = Describe("Metadata", func() {
|
|||||||
Expect(m.FilePath()).To(Equal("tests/fixtures/test.ogg"))
|
Expect(m.FilePath()).To(Equal("tests/fixtures/test.ogg"))
|
||||||
Expect(m.Size()).To(Equal(4408))
|
Expect(m.Size()).To(Equal(4408))
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Context("LoadAllAudioFiles", func() {
|
||||||
|
It("return all audiofiles from the folder", func() {
|
||||||
|
files, err := LoadAllAudioFiles("tests/fixtures")
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(files).To(HaveLen(3))
|
||||||
|
})
|
||||||
It("returns error if path does not exist", func() {
|
It("returns error if path does not exist", func() {
|
||||||
_, err := ExtractAllMetadata("./INVALID/PATH")
|
_, err := LoadAllAudioFiles("./INVALID/PATH")
|
||||||
Expect(err).To(HaveOccurred())
|
Expect(err).To(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("returns empty map if there are no audio files in path", func() {
|
It("returns empty map if there are no audio files in path", func() {
|
||||||
Expect(ExtractAllMetadata(".")).To(BeEmpty())
|
Expect(LoadAllAudioFiles(".")).To(BeEmpty())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -207,10 +207,21 @@ func (s *TagScanner) processDeletedDir(ctx context.Context, dir string, updatedA
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *TagScanner) loadTracks(dirPath string) (model.MediaFiles, error) {
|
func (s *TagScanner) loadTracks(dirPath string) (model.MediaFiles, error) {
|
||||||
mds, err := ExtractAllMetadata(dirPath)
|
audioFiles, err := LoadAllAudioFiles(dirPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filePaths := make([]string, len(audioFiles))
|
||||||
|
for i, _ := range audioFiles {
|
||||||
|
filePaths[i] = filepath.Join(dirPath, audioFiles[i].Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
mds, err := ExtractAllMetadata(filePaths)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var mfs model.MediaFiles
|
var mfs model.MediaFiles
|
||||||
for _, md := range mds {
|
for _, md := range mds {
|
||||||
mf := s.toMediaFile(md)
|
mf := s.toMediaFile(md)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user