def _parse_xspf(self, xspf_doc, playlist_id, xspf_url=None, xspf_base_url=None):
    NS_MAP = {'xspf': 'http://xspf.org/ns/0/', 's1': 'http://static.streamone.nl/player/ns/0'}
    entries = []
    for track in xspf_doc.findall(xpath_with_ns('./xspf:trackList/xspf:track', NS_MAP)):
        title = xpath_text(track, xpath_with_ns('./xspf:title', NS_MAP), 'title', default=playlist_id)
        description = xpath_text(track, xpath_with_ns('./xspf:annotation', NS_MAP), 'description')
        thumbnail = xpath_text(track, xpath_with_ns('./xspf:image', NS_MAP), 'thumbnail')
        duration = float_or_none(xpath_text(track, xpath_with_ns('./xspf:duration', NS_MAP), 'duration'), 1000)
        formats = []
        for location in track.findall(xpath_with_ns('./xspf:location', NS_MAP)):
            format_url = urljoin(xspf_base_url, location.text)
            if (not format_url):
                continue
            formats.append({'url': format_url, 'manifest_url': xspf_url, 'format_id': location.get(xpath_with_ns('s1:label', NS_MAP)), 'width': int_or_none(location.get(xpath_with_ns('s1:width', NS_MAP))), 'height': int_or_none(location.get(xpath_with_ns('s1:height', NS_MAP)))})
        self._sort_formats(formats)
        entries.append({'id': playlist_id, 'title': title, 'description': description, 'thumbnail': thumbnail, 'duration': duration, 'formats': formats})
    return entries
def _parse_xspf(self, xspf_doc, playlist_id, xspf_url=None, xspf_base_url=None):
    NS_MAP = {'xspf': 'http://xspf.org/ns/0/', 's1': 'http://static.streamone.nl/player/ns/0'}
    entries = []
    for track in xspf_doc.findall(xpath_with_ns('./xspf:trackList/xspf:track', NS_MAP)):
        title = xpath_text(track, xpath_with_ns('./xspf:title', NS_MAP), 'title', default=playlist_id)
        description = xpath_text(track, xpath_with_ns('./xspf:annotation', NS_MAP), 'description')
        thumbnail = xpath_text(track, xpath_with_ns('./xspf:image', NS_MAP), 'thumbnail')
        duration = float_or_none(xpath_text(track, xpath_with_ns('./xspf:duration', NS_MAP), 'duration'), 1000)
        formats = []
        for location in track.findall(xpath_with_ns('./xspf:location', NS_MAP)):
            format_url = urljoin(xspf_base_url, location.text)
            if (not format_url):
                continue
            formats.append({'url': format_url, 'manifest_url': xspf_url, 'format_id': location.get(xpath_with_ns('s1:label', NS_MAP)), 'width': int_or_none(location.get(xpath_with_ns('s1:width', NS_MAP))), 'height': int_or_none(location.get(xpath_with_ns('s1:height', NS_MAP)))})
        self._sort_formats(formats)
        entries.append({'id': playlist_id, 'title': title, 'description': description, 'thumbnail': thumbnail, 'duration': duration, 'formats': formats})
    return entries