diff --git a/docs/changelog.rst b/docs/changelog.rst index bf09b81e..0f8823d3 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -120,6 +120,19 @@ Internal changes :issue:`1115`) +v1.0.8 (UNRELEASED) +=================== + +Bug fix release. + +- Fix reversal of ``Title`` and ``Name`` in MPD protocol (Fixes: :issue:`1212` + PR: :issue:`1214`) + +- Fix crash if an M3U file in the :confval:`m3u/playlist_dir` directory has a + file name not decodable with the current file system encoding. (Fixes: + :issue:`1209`) + + v1.0.7 (2015-06-26) =================== diff --git a/docs/ext/mixers.rst b/docs/ext/mixers.rst index f934efce..88fd27dd 100644 --- a/docs/ext/mixers.rst +++ b/docs/ext/mixers.rst @@ -29,6 +29,14 @@ Extension for controlling volume using an external Arcam amplifier. Developed and tested with an Arcam AVR-300. +Mopidy-dam1021 +============== + +https://github.com/fortaa/mopidy-dam1021 + +Extension for controlling volume using a dam1021 DAC device. + + Mopidy-NAD ========== diff --git a/docs/ext/web.rst b/docs/ext/web.rst index f07fb40b..bf29bf72 100644 --- a/docs/ext/web.rst +++ b/docs/ext/web.rst @@ -48,6 +48,22 @@ To install, run:: pip install Mopidy-Local-Images +Mopidy-Material-Webclient +========================= + +https://github.com/matgallacher/mopidy-material-webclient + +A Mopidy web client with an Android Material design feel. + +.. image:: /ext/material_webclient.png + :width: 960 + :height: 520 + +To install, run:: + + pip install Mopidy-Material-Webclient + + Mopidy-Mobile ============= diff --git a/mopidy/m3u/playlists.py b/mopidy/m3u/playlists.py index cfc2b746..bd8b8bfd 100644 --- a/mopidy/m3u/playlists.py +++ b/mopidy/m3u/playlists.py @@ -67,7 +67,7 @@ class M3UPlaylistsProvider(backend.PlaylistsProvider): for path in glob.glob(os.path.join(self._playlists_dir, b'*.m3u')): relpath = os.path.basename(path) uri = translator.path_to_playlist_uri(relpath) - name = os.path.splitext(relpath)[0].decode(encoding) + name = os.path.splitext(relpath)[0].decode(encoding, 'replace') tracks = translator.parse_m3u(path) playlists[uri] = Playlist(uri=uri, name=name, tracks=tracks) diff --git a/tests/m3u/test_playlists.py b/tests/m3u/test_playlists.py index 77f179ba..f490887a 100644 --- a/tests/m3u/test_playlists.py +++ b/tests/m3u/test_playlists.py @@ -1,9 +1,12 @@ +# encoding: utf-8 + from __future__ import absolute_import, unicode_literals import os import shutil import tempfile import unittest +import urllib import pykka @@ -109,6 +112,7 @@ class M3UPlaylistsProviderTest(unittest.TestCase): with open(path) as f: m3u = f.read().splitlines() + self.assertEqual(['#EXTM3U', '#EXTINF:60,Test', track.uri], m3u) def test_latin1_playlist_contents_is_written_to_disk(self): @@ -143,9 +147,17 @@ class M3UPlaylistsProviderTest(unittest.TestCase): self.assertEqual(playlist.name, result.name) self.assertEqual(track.uri, result.tracks[0].uri) - @unittest.SkipTest - def test_santitising_of_playlist_filenames(self): - pass + def test_load_playlist_with_nonfilesystem_encoding_of_filename(self): + uri = 'm3u:%s.m3u' % urllib.quote('øæå'.encode('latin-1')) + path = playlist_uri_to_path(uri, self.playlists_dir) + with open(path, 'wb+') as f: + f.write(b'#EXTM3U\n') + + self.core.playlists.refresh() + + self.assertEqual(len(self.core.playlists.as_list()), 1) + result = self.core.playlists.lookup(uri) + self.assertEqual('\ufffd\ufffd\ufffd', result.name) @unittest.SkipTest def test_playlists_dir_is_created(self):