playlists: Add urilist fallback parser
This commit is contained in:
parent
80adc100ae
commit
ea2017c968
@ -7,6 +7,7 @@ pygst.require('0.10')
|
||||
import gst # noqa
|
||||
|
||||
from mopidy.compat import configparser
|
||||
from mopidy.internal import validation
|
||||
|
||||
try:
|
||||
import xml.etree.cElementTree as elementtree
|
||||
@ -24,7 +25,7 @@ def parse(data):
|
||||
for detector, parser in handlers.items():
|
||||
if detector(data):
|
||||
return list(parser(data))
|
||||
return []
|
||||
return parse_urilist(data) # Fallback
|
||||
|
||||
|
||||
def detect_extm3u_header(data):
|
||||
@ -116,3 +117,16 @@ def parse_asx(data):
|
||||
|
||||
for entry in element.findall('entry[@href]'):
|
||||
yield entry.get('href', '').strip()
|
||||
|
||||
|
||||
def parse_urilist(data):
|
||||
result = []
|
||||
for line in data.splitlines():
|
||||
if not line.strip() or line.startswith('#'):
|
||||
continue
|
||||
try:
|
||||
validation.check_uri(line)
|
||||
except ValueError:
|
||||
return []
|
||||
result.append(line)
|
||||
return result
|
||||
|
||||
@ -21,6 +21,14 @@ file:///tmp/bar
|
||||
file:///tmp/baz
|
||||
"""
|
||||
|
||||
URILIST = b"""
|
||||
file:///tmp/foo
|
||||
# a comment
|
||||
file:///tmp/bar
|
||||
|
||||
file:///tmp/baz
|
||||
"""
|
||||
|
||||
PLS = b"""[Playlist]
|
||||
NumberOfEntries=3
|
||||
File1=file:///tmp/foo
|
||||
@ -84,6 +92,7 @@ EXPECTED = [b'file:///tmp/foo', b'file:///tmp/bar', b'file:///tmp/baz']
|
||||
|
||||
@pytest.mark.parametrize('data,result', [
|
||||
(BAD, []),
|
||||
(URILIST, EXPECTED),
|
||||
(EXTM3U, EXPECTED),
|
||||
(PLS, EXPECTED),
|
||||
(ASX, EXPECTED),
|
||||
@ -148,3 +157,17 @@ class XspfPlaylistTest(BasePlaylistTest, unittest.TestCase):
|
||||
invalid = BAD
|
||||
detect = staticmethod(playlists.detect_xspf_header)
|
||||
parse = staticmethod(playlists.parse_xspf)
|
||||
|
||||
|
||||
class UriListPlaylistTest(unittest.TestCase):
|
||||
valid = URILIST
|
||||
invalid = BAD
|
||||
parse = staticmethod(playlists.parse_urilist)
|
||||
|
||||
def test_parse_valid_playlist(self):
|
||||
uris = list(self.parse(self.valid))
|
||||
self.assertEqual(uris, EXPECTED)
|
||||
|
||||
def test_parse_invalid_playlist(self):
|
||||
uris = list(self.parse(self.invalid))
|
||||
self.assertEqual(uris, [])
|
||||
|
||||
Loading…
Reference in New Issue
Block a user