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
|
||||
|
||||
|
||||
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):
|
||||
return data[0:7].upper() == b'#EXTM3U'
|
||||
|
||||
|
||||
@ -4,6 +4,8 @@ from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
|
||||
from mopidy.internal import playlists
|
||||
|
||||
|
||||
@ -75,6 +77,20 @@ XSPF = b"""<?xml version="1.0" encoding="UTF-8"?>
|
||||
</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):
|
||||
valid = None
|
||||
@ -90,8 +106,7 @@ class BasePlaylistTest(object):
|
||||
|
||||
def test_parse_valid_playlist(self):
|
||||
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):
|
||||
uris = list(self.parse(self.invalid))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user