From ea2017c9685fd5359428ce7e27d2070f3adfb36e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 25 Jul 2015 19:13:37 +0200 Subject: [PATCH] playlists: Add urilist fallback parser --- mopidy/internal/playlists.py | 16 +++++++++++++++- tests/internal/test_playlists.py | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/mopidy/internal/playlists.py b/mopidy/internal/playlists.py index 4d01556e..219d3ec6 100644 --- a/mopidy/internal/playlists.py +++ b/mopidy/internal/playlists.py @@ -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 diff --git a/tests/internal/test_playlists.py b/tests/internal/test_playlists.py index 4550ea3d..21537813 100644 --- a/tests/internal/test_playlists.py +++ b/tests/internal/test_playlists.py @@ -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, [])