playlists: Add parse() that detects format and parses
This commit is contained in:
parent
2bcbbf03be
commit
6af11b563f
@ -14,6 +14,19 @@ except ImportError:
|
|||||||
import xml.etree.ElementTree as elementtree
|
import xml.etree.ElementTree as elementtree
|
||||||
|
|
||||||
|
|
||||||
|
def parse(data):
|
||||||
|
handlers = {
|
||||||
|
detect_m3u_header: parse_m3u,
|
||||||
|
detect_pls_header: parse_pls,
|
||||||
|
detect_asx_header: parse_asx,
|
||||||
|
detect_xspf_header: parse_xspf,
|
||||||
|
}
|
||||||
|
for detector, parser in handlers.items():
|
||||||
|
if detector(data):
|
||||||
|
return list(parser(data))
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def detect_m3u_header(data):
|
def detect_m3u_header(data):
|
||||||
return data[0:7].upper() == b'#EXTM3U'
|
return data[0:7].upper() == b'#EXTM3U'
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,8 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from mopidy.internal import playlists
|
from mopidy.internal import playlists
|
||||||
|
|
||||||
|
|
||||||
@ -75,6 +77,20 @@ XSPF = b"""<?xml version="1.0" encoding="UTF-8"?>
|
|||||||
</playlist>
|
</playlist>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
EXPECTED = [b'file:///tmp/foo', b'file:///tmp/bar', b'file:///tmp/baz']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('data,result', [
|
||||||
|
(BAD, []),
|
||||||
|
(M3U, EXPECTED),
|
||||||
|
(PLS, EXPECTED),
|
||||||
|
(ASX, EXPECTED),
|
||||||
|
(SIMPLE_ASX, EXPECTED),
|
||||||
|
(XSPF, EXPECTED),
|
||||||
|
])
|
||||||
|
def test_parse(data, result):
|
||||||
|
assert playlists.parse(data) == result
|
||||||
|
|
||||||
|
|
||||||
class BasePlaylistTest(object):
|
class BasePlaylistTest(object):
|
||||||
valid = None
|
valid = None
|
||||||
@ -90,8 +106,7 @@ class BasePlaylistTest(object):
|
|||||||
|
|
||||||
def test_parse_valid_playlist(self):
|
def test_parse_valid_playlist(self):
|
||||||
uris = list(self.parse(self.valid))
|
uris = list(self.parse(self.valid))
|
||||||
expected = [b'file:///tmp/foo', b'file:///tmp/bar', b'file:///tmp/baz']
|
self.assertEqual(uris, EXPECTED)
|
||||||
self.assertEqual(uris, expected)
|
|
||||||
|
|
||||||
def test_parse_invalid_playlist(self):
|
def test_parse_invalid_playlist(self):
|
||||||
uris = list(self.parse(self.invalid))
|
uris = list(self.parse(self.invalid))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user