Support turbo2.
[vuplus_dvbapp] / lib / python / Plugins / Extensions / HbbTV / aitreader.py
1 import os, xml.dom.minidom, re
2 from enigma import iServiceInformation
3
4 import vbcfg
5
6 RE_XML_ILLEGAL = u'([\u0000-\u0008\u000b-\u000c\u000e-\u001f\ufffe-\uffff])' + \
7                                 u'|' + \
8                                 u'([%s-%s][^%s-%s])|([^%s-%s][%s-%s])|([%s-%s]$)|(^[%s-%s])' % \
9                                 (unichr(0xd800),unichr(0xdbff),unichr(0xdc00),unichr(0xdfff),
10                                 unichr(0xd800),unichr(0xdbff),unichr(0xdc00),unichr(0xdfff),
11                                 unichr(0xd800),unichr(0xdbff),unichr(0xdc00),unichr(0xdfff))
12
13 DUMPBIN = vbcfg.PLUGINROOT + "/dumpait"
14 class eAITSectionReader:
15         def __init__(self, demux, pmtid, sid):
16                 self.mVuplusBox = False
17                 self.mInfo = None
18                 self.mAppList  = []
19                 self.mDocument = None
20                 self.mCommand  = "%s --demux=%s --pmtid=%x --serviceid=%x"%(DUMPBIN, demux, pmtid, sid)
21
22         def __text(self, nodelist):
23                 rc = []
24                 for node in nodelist:
25                         if node.nodeType == node.TEXT_NODE:
26                                 rc.append(node.data)
27                 return ''.join(rc)
28
29         def __item(self, application, name):
30                 for item in application.getElementsByTagName(name):
31                         return self.__text(item.childNodes)
32                 return None
33
34         def __application(self, application):
35                 item = {}
36
37                 if self.mVuplusBox:
38                         item["name"]    = str(application[1])
39                         item["url"]     = str(application[2])
40                         item["control"] = int(application[0])
41                         item["orgid"]   = int(application[3])
42                         item["appid"]   = int(application[4])
43                         item["profile"] = int(application[5])
44                 else:
45                         item["name"]    = str(self.__item(application, "name"))
46                         item["url"]     = str(self.__item(application, "url"))
47                         item["control"] = int(self.__item(application, "control"))
48                         item["orgid"]   = int(self.__item(application, "orgid"))
49                         item["appid"]   = int(self.__item(application, "appid"))
50                         item["profile"] = int(self.__item(application, "profile"))
51                 return item
52
53         def doParseApplications(self):
54                 l = []
55
56                 if self.mVuplusBox:
57                         for application in self.mInfo.getInfoObject(iServiceInformation.sHBBTVUrl):
58                                 item = self.__application(application)
59                                 l.append(item)
60                 else:
61                         for application in self.mDocument.getElementsByTagName("application"):
62                                 item = self.__application(application)
63                                 l.append(item)
64                 self.mAppList = l
65
66         def getApplicationList(self):
67                 return self.mAppList
68
69         def doOpen(self, info, is_vuplusbox):
70                 if is_vuplusbox:
71                         self.mVuplusBox = is_vuplusbox
72                         self.mInfo = info
73                         return True
74
75                 document = ""
76                 try:    document = os.popen(self.mCommand).read()
77                 except Exception, ErrMsg:
78                         vbcfg.ERR(ErrMsg)
79                         return False
80                 if len(document) == 0:
81                         return False
82                 document = re.sub(RE_XML_ILLEGAL, "?", document)
83                 document = re.sub("&", "+", document)
84                 document = document.decode("cp1252").encode("utf-8")
85                 document = "<URL>" + document + "</URL>"
86                 try:
87                         self.mDocument = xml.dom.minidom.parseString(document)
88                 except Exception, ErrMsg:
89                         vbcfg.ERR("XML parse: %s" % ErrMsg)
90                         return False
91                 return True
92
93         def doDump(self):
94                 for x in self.getApplicationList():
95                         print "Name  :", x["name"]
96                         print "URL   :", x["url"]
97                         print "OrgID :", x["orgid"]
98                         print "AppID :", x["appid"]
99                         print "Control Code :", x["control"]
100                         print "Profile Code :", x["profile"]
101                         print ""
102
103 def unit_test(demux, pmtid, sid):
104         reader = eAITSectionReader(demux, pmtid, sid)
105         if reader.doOpen():
106                 reader.doParseApplications()
107                 reader.doDump()
108         else:
109                 vbcfg.ERR("no data!!")
110
111 #unit_test('0', 0x17d4, 0x2b66)