playlists: Add parse() that detects format and parses

This commit is contained in:
Stein Magnus Jodal 2015-07-23 16:36:35 +02:00
parent 2bcbbf03be
commit 6af11b563f
2 changed files with 30 additions and 2 deletions

View File

@ -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'

View File

@ -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))