diff --git a/beets/util/m3u.py b/beets/util/m3u.py index 0f03d78da..9c961a291 100644 --- a/beets/util/m3u.py +++ b/beets/util/m3u.py @@ -42,18 +42,18 @@ class M3UFile(): """Reads the m3u file from disk and sets the object's attributes.""" pl_normpath = normpath(self.path) try: - with open(syspath(pl_normpath), "r", encoding="utf-8") as pl_file: + with open(syspath(pl_normpath), "rb") as pl_file: raw_contents = pl_file.readlines() except OSError as exc: raise FilesystemError(exc, 'read', (pl_normpath, ), traceback.format_exc()) - self.extm3u = True if raw_contents[0] == "#EXTM3U\n" else False + self.extm3u = True if raw_contents[0].rstrip() == b"#EXTM3U" else False for line in raw_contents[1:]: - if line.startswith("#"): - # Some EXTM3U comment, do something. FIXME + if line.startswith(b"#"): + # Support for specific EXTM3U comments could be added here. continue - self.media_list.append(syspath(line, prefix=False)) + self.media_list.append(normpath(line.rstrip())) if not self.media_list: raise EmptyPlaylistError diff --git a/test/rsrc/playlist_windows.m3u8 b/test/rsrc/playlist_windows.m3u8 index c1f4af63a..f75dfd74f 100644 --- a/test/rsrc/playlist_windows.m3u8 +++ b/test/rsrc/playlist_windows.m3u8 @@ -1,3 +1,3 @@ -#EXTM3U -x:\This\is\å\path\to_a_file.mp3 -x:\This\is\another\path\tö_a_file.mp3 +#EXTM3U +x:\This\is\å\path\to_a_file.mp3 +x:\This\is\another\path\tö_a_file.mp3 diff --git a/test/test_m3ufile.py b/test/test_m3ufile.py index b133f65e1..a24dc6ca8 100644 --- a/test/test_m3ufile.py +++ b/test/test_m3ufile.py @@ -90,13 +90,14 @@ class M3UFileTest(unittest.TestCase): ) rmtree(tempdir) + @unittest.skipIf(sys.platform == 'win32', 'win32') def test_playlist_load_ascii(self): """Test loading ascii paths from a playlist file.""" the_playlist_file = path.join(RSRC, b'playlist.m3u') m3ufile = M3UFile(the_playlist_file) m3ufile.load() self.assertEqual(m3ufile.media_list[0], - '/This/is/a/path/to_a_file.mp3\n') + bytestring_path('/This/is/a/path/to_a_file.mp3')) @unittest.skipIf(sys.platform == 'win32', 'win32') def test_playlist_load_unicode(self): @@ -105,18 +106,19 @@ class M3UFileTest(unittest.TestCase): m3ufile = M3UFile(the_playlist_file) m3ufile.load() self.assertEqual(m3ufile.media_list[0], - '/This/is/å/path/to_a_file.mp3\n') + bytestring_path('/This/is/å/path/to_a_file.mp3')) @unittest.skipUnless(sys.platform == 'win32', 'win32') def test_playlist_load_unicode_windows(self): """Test loading unicode paths from a playlist file.""" the_playlist_file = path.join(RSRC, b'playlist_windows.m3u8') - winpath = path.join('x:\\', 'This', 'is', 'å', 'path', 'to_a_file.mp3') + winpath = bytestring_path(path.join( + 'x:\\', 'This', 'is', 'å', 'path', 'to_a_file.mp3')) m3ufile = M3UFile(the_playlist_file) m3ufile.load() self.assertEqual( m3ufile.media_list[0], - winpath + '\n' + winpath ) def test_playlist_load_extm3u(self):