EXTM3U playlist saving
This commit is contained in:
parent
a5c02c1034
commit
5d3851b3e1
@ -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):
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user