diff --git a/scanner/playlist_sync.go b/scanner/playlist_sync.go index 50bebfc40..69f54c6e0 100644 --- a/scanner/playlist_sync.go +++ b/scanner/playlist_sync.go @@ -5,6 +5,7 @@ import ( "bytes" "context" "fmt" + "net/url" "os" "path/filepath" "strings" @@ -82,6 +83,10 @@ func (s *playlistSync) parsePlaylist(ctx context.Context, playlistFile string, b if strings.HasPrefix(path, "#") { continue } + if strings.HasPrefix(path, "file://") { + path = strings.TrimPrefix(path, "file://") + path, _ = url.QueryUnescape(path) + } if !filepath.IsAbs(path) { path = filepath.Join(baseDir, path) } diff --git a/scanner/playlist_sync_test.go b/scanner/playlist_sync_test.go index b211c94ba..445fb079d 100644 --- a/scanner/playlist_sync_test.go +++ b/scanner/playlist_sync_test.go @@ -22,6 +22,15 @@ var _ = Describe("playlistSync", func() { }) It("parses well-formed playlists", func() { + pls, err := ps.parsePlaylist(ctx, "playlists/pls1.m3u", "tests/fixtures") + Expect(err).To(BeNil()) + Expect(pls.Tracks).To(HaveLen(3)) + Expect(pls.Tracks[0].Path).To(Equal("tests/fixtures/test.mp3")) + Expect(pls.Tracks[1].Path).To(Equal("tests/fixtures/test.ogg")) + Expect(pls.Tracks[2].Path).To(Equal("/tests/fixtures/01 Invisible (RED) Edit Version.mp3")) + }) + + It("parses playlists using LF ending", func() { pls, err := ps.parsePlaylist(ctx, "lf-ended.m3u", "tests/fixtures/playlists") Expect(err).To(BeNil()) Expect(pls.Tracks).To(HaveLen(2)) diff --git a/tests/fixtures/playlists/pls1.m3u b/tests/fixtures/playlists/pls1.m3u new file mode 100644 index 000000000..d8f30e943 --- /dev/null +++ b/tests/fixtures/playlists/pls1.m3u @@ -0,0 +1,3 @@ +test.mp3 +test.ogg +file:///tests/fixtures/01%20Invisible%20(RED)%20Edit%20Version.mp3 \ No newline at end of file