From 5d3851b3e15a769432c533eba8c8a54936b530f1 Mon Sep 17 00:00:00 2001 From: Thomas Kemmer Date: Mon, 9 Dec 2013 06:09:16 +0100 Subject: [PATCH] EXTM3U playlist saving --- mopidy/backends/local/playlists.py | 10 ++++++++++ mopidy/backends/local/translator.py | 15 +++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mopidy/backends/local/playlists.py b/mopidy/backends/local/playlists.py index 48c60c2a..ff8ffd41 100644 --- a/mopidy/backends/local/playlists.py +++ b/mopidy/backends/local/playlists.py @@ -90,10 +90,20 @@ class LocalPlaylistsProvider(base.BasePlaylistsProvider): path.check_file_path_is_inside_base_dir(file_path, self._playlists_dir) return file_path + def _write_m3u_extinf(self, file_handle, track): + title = track.name.encode('latin-1', 'replace') + runtime = track.length / 1000 if track.length else -1 + file_handle.write('#EXTINF:' + runtime + ',' + title + '\n') + def _save_m3u(self, playlist): file_path = self._m3u_uri_to_path(playlist.uri) + extended = any(track.name for track in playlist.tracks) with open(file_path, 'w') as file_handle: + if extended: + file_handle.write('#EXTM3U\n') for track in playlist.tracks: + if extended and track.name: + self._write_m3u_extinf(file_handle, track) file_handle.write(track.uri + '\n') def _delete_m3u(self, uri): diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index 1aee553b..2b2008e4 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -10,7 +10,7 @@ from mopidy.models import Track from mopidy.utils.encoding import locale_decode from mopidy.utils.path import path_to_uri, uri_to_path -EXTINF_RE = re.compile(r'^#EXTINF:\s*(-1|\d+)\s*,\s*(.+?)\s*$') +M3U_EXTINF_RE = re.compile(r'#EXTINF:(-1|\d+),(.*)') logger = logging.getLogger('mopidy.backends.local') @@ -33,9 +33,9 @@ def path_to_local_track_uri(relpath): return b'local:track:%s' % urllib.quote(relpath) -def extm3u_directive_to_track(line): +def m3u_extinf_to_track(line): """Convert extended M3U directive to track template.""" - m = EXTINF_RE.match(line) + m = M3U_EXTINF_RE.match(line) if not m: logger.warning('Invalid extended M3U directive: %s', line) return Track() @@ -85,15 +85,18 @@ def parse_m3u(file_path, media_dir): logger.warning('Couldn\'t open m3u: %s', locale_decode(error)) return tracks - extm3u = contents and contents[0].decode('latin1').startswith('#EXTM3U') + if not contents: + return tracks + + extended = contents[0].decode('latin1').startswith('#EXTM3U') track = Track() for line in contents: line = line.strip().decode('latin1') if line.startswith('#'): - if extm3u and line.startswith('#EXTINF'): - track = extm3u_directive_to_track(line) + if extended and line.startswith('#EXTINF'): + track = m3u_extinf_to_track(line) continue if urlparse.urlsplit(line).scheme: