|
a/rdpl2stream/AsxPlaylistDecoder.py |
|
b/rdpl2stream/AsxPlaylistDecoder.py |
|
... |
|
... |
17 |
# along with Radio Tray. If not, see <http://www.gnu.org/licenses/>.
|
17 |
# along with Radio Tray. If not, see <http://www.gnu.org/licenses/>.
|
18 |
#
|
18 |
#
|
19 |
##########################################################################
|
19 |
##########################################################################
|
20 |
import urllib2
|
20 |
import urllib2
|
21 |
from lib.common import USER_AGENT
|
21 |
from lib.common import USER_AGENT
|
22 |
from lxml import etree
|
22 |
import xml.etree.ElementTree as ET
|
23 |
from lxml import objectify
|
|
|
24 |
from StringIO import StringIO
|
23 |
from StringIO import StringIO
|
25 |
import logging
|
24 |
import logging
|
|
|
25 |
import re
|
26 |
|
26 |
|
27 |
class AsxPlaylistDecoder:
|
27 |
class AsxPlaylistDecoder:
|
28 |
|
28 |
|
29 |
def __init__(self):
|
29 |
def __init__(self):
|
30 |
self.log = logging.getLogger('radiotray')
|
30 |
self.log = logging.getLogger('radiotray')
|
|
... |
|
... |
51 |
f.close()
|
51 |
f.close()
|
52 |
|
52 |
|
53 |
self.log.info('Playlist downloaded')
|
53 |
self.log.info('Playlist downloaded')
|
54 |
self.log.info('Decoding playlist...')
|
54 |
self.log.info('Decoding playlist...')
|
55 |
|
55 |
|
56 |
parser = etree.XMLParser(recover=True)
|
56 |
try:
|
57 |
root = etree.parse(StringIO(str),parser)
|
57 |
root = ET.parse(StringIO(str))
|
58 |
|
58 |
except:
|
|
|
59 |
# Last ditch: try to fix docs with mismatched tag name case
|
|
|
60 |
str = re.sub('''<([A-Za-z0-9/]+)''', \
|
|
|
61 |
lambda m: "<" + m.group(1).lower(),
|
|
|
62 |
str)
|
|
|
63 |
root = ET.parse(StringIO(str))
|
|
|
64 |
|
59 |
#ugly hack to normalize the XML
|
65 |
#ugly hack to normalize the XML
|
60 |
for element in root.iter():
|
66 |
for element in root.iter():
|
61 |
|
67 |
|
62 |
tmp = element.tag
|
68 |
tmp = element.tag
|
63 |
element.tag = tmp.lower()
|
69 |
element.tag = tmp.lower()
|
64 |
|
70 |
|
65 |
for key in element.attrib.iterkeys():
|
71 |
keys = element.attrib.keys()
|
|
|
72 |
for key in keys:
|
66 |
element.attrib[key.lower()] = element.attrib[key]
|
73 |
element.attrib[key.lower()] = element.attrib[key]
|
67 |
|
74 |
|
|
|
75 |
elts = root.findall(".//ref/[@href]")
|
68 |
|
76 |
|
69 |
result = root.xpath("//ref/@href")
|
77 |
result = []
|
|
|
78 |
for elt in elts:
|
|
|
79 |
tmp = elt.attrib['href']
|
|
|
80 |
if (tmp.endswith("?MSWMExt=.asf")):
|
|
|
81 |
tmp = tmp.replace("http", "mms")
|
|
|
82 |
result.append(tmp)
|
70 |
|
83 |
|
71 |
if (len(result) > 0):
|
|
|
72 |
|
|
|
73 |
for i in range(1,len(result)):
|
|
|
74 |
|
|
|
75 |
tmp = result[i]
|
|
|
76 |
if (tmp.endswith("?MSWMExt=.asf")):
|
|
|
77 |
result[i] = tmp.replace("http", "mms")
|
|
|
78 |
return result
|
84 |
return result
|
79 |
else:
|
|
|
80 |
return []
|
|
|