def P_eventview(self, request): event = {} event['sref'] = "" event['title'] = "" event['picon'] = "" event['shortdesc'] = "" event['longdesc'] = "" event['begin'] = 0 event['end'] = 0 event['duration'] = 0 event['channel'] = "" eventid = getUrlArg(request, "eventid") ref = getUrlArg(request, "eventref") if ref and eventid: event = getEvent(ref, eventid)['event'] event['id'] = eventid event['picon'] = getPicon(ref) event['end'] = event['begin'] + event['duration'] event['duration'] = int(event['duration'] / 60) event['start'] = event['begin'] event['begin'] = strftime("%H:%M", (localtime(event['begin']))) event['end'] = strftime("%H:%M", (localtime(event['end']))) return {"event": event}
def __init__(self, request, session): self.request = request mode = None graboptions = [GRAB_PATH, '-q', '-s'] fileformat = getUrlArg(request, "format", "jpg") if fileformat == "jpg": graboptions.append("-j") graboptions.append("95") elif fileformat == "png": graboptions.append("-p") elif fileformat != "bmp": fileformat = "bmp" size = getUrlArg(request, "r") if size != None: graboptions.append("-r") graboptions.append("%d" % int(size)) mode = getUrlArg(request, "mode") if mode != None: if mode == "osd": graboptions.append("-o") elif mode == "video": graboptions.append("-v") elif mode == "pip": graboptions.append("-v") if InfoBar.instance.session.pipshown: graboptions.append("-i 1") elif mode == "lcd": eDBoxLCD.getInstance().dumpLCD() fileformat = "png" command = "cat /tmp/lcdshot.%s" % fileformat self.filepath = "/tmp/screenshot." + fileformat self.container = eConsoleAppContainer() self.container.appClosed.append(self.grabFinished) self.container.stdoutAvail.append(request.write) self.container.setBufferSize(32768) if mode == "lcd": if self.container.execute(command): raise Exception("failed to execute: ", command) sref = 'lcdshot' else: self.container.execute(GRAB_PATH, *graboptions) try: if mode == "pip" and InfoBar.instance.session.pipshown: ref = InfoBar.instance.session.pip.getCurrentService().toString() else: ref = session.nav.getCurrentlyPlayingServiceReference().toString() sref = '_'.join(ref.split(':', 10)[:10]) if config.OpenWebif.webcache.screenshotchannelname.value: sref = ServiceReference(ref).getServiceName() except: # nosec # noqa: E722 sref = 'screenshot' sref = sref + '_' + time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) request.notifyFinish().addErrback(self.requestAborted) request.setHeader('Content-Disposition', 'inline; filename=%s.%s;' % (sref, fileformat)) request.setHeader('Content-Type', 'image/%s' % fileformat.replace("jpg", "jpeg"))
def P_epgpop(self, request): events = [] timers = [] sref = getUrlArg(request, "sref") sstr = getUrlArg(request, "sstr") if sref != None: ev = getChannelEpg(sref) events = ev["events"] elif sstr != None: fulldesc = False if getUrlArg(request, "full") != None: fulldesc = True bouquetsonly = False if getUrlArg(request, "bouquetsonly") != None: bouquetsonly = True ev = getSearchEpg(sstr, None, fulldesc, bouquetsonly) events = sorted(ev["events"], key=lambda ev: ev['begin_timestamp']) at = False if len(events) > 0: t = getTimers(self.session) timers = t["timers"] try: from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer # noqa: F401 at = True except ImportError: pass if config.OpenWebif.webcache.theme.value: theme = config.OpenWebif.webcache.theme.value else: theme = 'original' moviedb = config.OpenWebif.webcache.moviedb.value if config.OpenWebif.webcache.moviedb.value else EXT_EVENT_INFO_SOURCE extEventInfoProvider = getEventInfoProvider(moviedb) return {"theme": theme, "events": events, "timers": timers, "at": at, "moviedb": moviedb, "extEventInfoProvider": extEventInfoProvider}
def render(self, request): request.setHeader('Content-type', 'application/xhtml+xml') request.setHeader('charset', 'UTF-8') try: wol_active = config.plugins.wolconfig.activate.value wol_location = config.plugins.wolconfig.location.value except: # nosec # noqa: E722 return createResult(False, b"WOLSetup plugin is not installed or your STB does not support WOL") if len(request.args): config_changed = False wol_state = getUrlArg(request, "wol") location = getUrlArg(request, "location") wol_standby = getUrlArg(request, "wolstandby") if wol_state != None: wol_state = str(wol_state).lower() if wol_state in ('true', '1', 'enabled', 'enable', 'active'): config.plugins.wolconfig.activate.value = True elif wol_state in ('false', '0', 'disabled', 'disable', 'inactive'): config.plugins.wolconfig.activate.value = False if wol_active != config.plugins.wolconfig.activate.value: config_changed = True elif location != None: if location not in config.plugins.wolconfig.location.choices: location = wol_location if location != config.plugins.wolconfig.location.value: config.plugins.wolconfig.location.value = location config_changed = True elif wol_standby != None: wol_standby = str(wol_standby).lower() if wol_standby in ('true', '1', 'enabled', 'enable', 'active'): try: from Plugins.SystemPlugins.WOLSetup.plugin import WOLSetup, _deviseWOL, _flagForceEnable, _flagSupportWol, _tryQuitTable, _ethDevice # noqa: F401 from Screens.Standby import TryQuitMainloop except ImportError: return createResult(False, b"WOLSetup plugin is not installed or your STB does not support WOL") WOLSetup.ActivateWOL(self.session, writeDevice=True) self.session.open(TryQuitMainloop, _tryQuitTable["deepstandby"]) if config_changed: config.plugins.wolconfig.save() locations = "" for location_available in config.plugins.wolconfig.location.choices: locations += location_available + ", " locations = locations.rstrip(', ') return ensure_binary("""<?xml version=\"1.0\" encoding=\"UTF-8\" ?> <e2configs> <e2config> <e2configname>wol_active</e2configname> <e2configvalue>%s</e2configvalue> </e2config> <e2config> <e2configname>wol_location</e2configname> <e2configchoices>%s</e2configchoices> <e2configvalue>%s</e2configvalue> </e2config> </e2configs>""" % (str(config.plugins.wolconfig.activate.value), locations, str(config.plugins.wolconfig.location.value)))
def P_channels(self, request): stype = getUrlArg(request, "stype", "tv") idbouquet = getUrlArg(request, "id", "ALL") channels = getChannels(idbouquet, stype) channels['transcoding'] = TRANSCODING channels['type'] = stype channels['showpicons'] = config.OpenWebif.webcache.showpicons.value channels['showpiconbackground'] = config.OpenWebif.responsive_show_picon_background.value return channels
def P_channels(self, request): stype = getUrlArg(request, "stype", "tv") idbouquet = getUrlArg(request, "id", "ALL") channels = getChannels(idbouquet, stype) channels['transcoding'] = TRANSCODING channels['type'] = stype channels[ 'showchannelpicon'] = config.OpenWebif.webcache.showchannelpicon.value return channels
def render(self, request): self.request = request self.json = False self.container = None self.action = getUrlArg(request, "command", "") package = getUrlArg(request, "package") self.json = getUrlArg(request, "format") == "json" fa = getUrlArg(request, "filter") if fa is None: self.filter = [] elif fa == 'all': self.filter = ['dev', 'staticdev', 'dbg', 'doc', 'src', 'po'] else: self.filter = fa.split(',') if self.action != '': if self.action in ("update", "upgrade"): return self.CallOPKG(request) elif self.action in ("info", "status", "install", "forceinstall", "remove", "forceremove"): if package != None: return self.CallOPKG(request, package) else: return self.ShowError(request, "parameter: package is missing") elif self.action in ("full", "listall", "list", "list_installed", "list_upgradable"): return self.CallOPKList(request) elif self.action in ("tmp"): import glob tmpfiles = glob.glob('/tmp/*.ipk') # nosec ipks = [] for tmpfile in tmpfiles: ipks.append({ 'path': tmpfile, 'name': (tmpfile.split('/')[-1]), 'size': os.stat(tmpfile).st_size, 'date': os.stat(tmpfile).st_mtime, }) request.setHeader("content-type", "text/plain") if PY3: request.write( json.dumps({ 'ipkfiles': ipks }).encode("ISO-8859-1")) else: request.write( json.dumps({'ipkfiles': ipks}, encoding="ISO-8859-1")) request.finish() return server.NOT_DONE_YET else: return self.ShowError(request, "Unknown command: " + self.action) else: return self.ShowHint(request) return self.ShowError(request, "Error")
def P_event(self, request): event = getEvent(getUrlArg(request, "sref"), getUrlArg(request, "idev")) event['event'][ 'recording_margin_before'] = config.recording.margin_before.value event['event'][ 'recording_margin_after'] = config.recording.margin_after.value event['at'] = HASAUTOTIMER event['transcoding'] = TRANSCODING event[ 'moviedb'] = config.OpenWebif.webcache.moviedb.value if config.OpenWebif.webcache.moviedb.value else EXT_EVENT_INFO_SOURCE event[ 'extEventInfoProvider'] = extEventInfoProvider = getEventInfoProvider( event['moviedb']) return event
def P_event(self, request): event = getEvent(getUrlArg(request, "sref"), getUrlArg(request, "idev")) event['event']['recording_margin_before'] = config.recording.margin_before.value event['event']['recording_margin_after'] = config.recording.margin_after.value at = False try: from Plugins.Extensions.AutoTimer.AutoTimer import AutoTimer # noqa: F401 at = True except ImportError: pass event['at'] = at event['transcoding'] = TRANSCODING event['moviedb'] = config.OpenWebif.webcache.moviedb.value if config.OpenWebif.webcache.moviedb.value else EXT_EVENT_INFO_SOURCE event['extEventInfoProvider'] = extEventInfoProvider = getEventInfoProvider(event['moviedb']) return event
def render(self, request): import struct import socket request.setHeader('Content-type', 'application/xhtml+xml') request.setHeader('charset', 'UTF-8') if len(request.args): port = 9 mac = "" ip = "" man_port = getUrlArg(request, "port") if man_port != None: try: port = int(man_port) except ValueError: pass mac = getUrlArg(request, "mac") if mac != None: mac = str(mac).lower() mac = mac.split(':') if len(mac) != 6: return b'<?xml version="1.0" encoding="UTF-8" ?><e2simplexmlresult><e2state>false</e2state><e2statetext>MAC address invalid see example: AA:BB:CC:DD:EE:FF</e2statetext></e2simplexmlresult>' ip = getUrlArg(request, "ip") if ip != None: ip = str(ip).lower() ip = ip.split('.') if len(ip) != 4: return b'<?xml version="1.0" encoding="UTF-8" ?><e2simplexmlresult><e2state>false</e2state><e2statetext>IP address invalid see example: 192.168.2.10</e2statetext></e2simplexmlresult>' try: for digit in ip: is_int = int(digit) # noqa: F841 except ValueError: return b'<?xml version="1.0" encoding="UTF-8" ?><e2simplexmlresult><e2state>false</e2state><e2statetext>IP address invalid see example: 192.168.2.10</e2statetext></e2simplexmlresult>' ip = ip[0] + "." + ip[1] + "." + ip[2] + ".255" if ip and mac: mac_struct = struct.pack('BBBBBB', int(mac[0], 16), int(mac[1], 16), int(mac[2], 16), int(mac[3], 16), int(mac[4], 16), int(mac[5], 16)) magic = '\xff' * 6 + mac_struct * 16 my_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) my_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) my_socket.sendto(magic, (ip, port)) my_socket.close() return six.ensure_binary( """<?xml version=\"1.0\" encoding=\"UTF-8\" ?><e2simplexmlresult><e2state>true</e2state><e2statetext>MagicPacket send to IP %s at port %d</e2statetext></e2simplexmlresult> """ % (ip, port)) else: return b'<?xml version="1.0" encoding="UTF-8" ?><e2simplexmlresult><e2state>false</e2state><e2statetext>IP address and MAC address are mandatory arguments</e2statetext></e2simplexmlresult>'
def setSkinColor(self, request): skincolor = getUrlArg(request, "skincolor") if skincolor != None: print("save color:", skincolor) config.OpenWebif.responsive_skinColor.value = skincolor config.OpenWebif.responsive_skinColor.save() return {}
def setThemeMode(self, request): themeMode = getUrlArg(request, "themeMode") if themeMode != None: print("save theme mode:", themeMode) config.OpenWebif.responsive_themeMode.value = themeMode config.OpenWebif.responsive_themeMode.save() return {}
def P_editmovie(self, request): sref = getUrlArg(request, "sRef") title = "" description = "" tags = "" resulttext = "" result = False if sref: mi = getMovieInfo(sref, NewFormat=True) result = mi["result"] if result: title = mi["title"] if title: description = mi["description"] tags = mi["tags"] else: result = False resulttext = "meta file not found" else: resulttext = mi["resulttext"] return { "title": title, "description": description, "sref": sref, "result": result, "tags": tags, "resulttext": resulttext }
def P_timers(self, request): timers = getTimers(self.session) unsort = timers['timers'] sorttype = getUrlArg(request, "sort") if sorttype == None: return timers if sorttype == 'name': timers['timers'] = sorted(unsort, key=lambda k: k['name']) elif sorttype == 'named': timers['timers'] = sorted(unsort, key=lambda k: k['name'], reverse=True) elif sorttype == 'date': timers['timers'] = sorted(unsort, key=lambda k: k['begin']) else: timers['timers'] = sorted(unsort, key=lambda k: k['begin'], reverse=True) sorttype = 'dated' timers['sort'] = sorttype return timers
def render_POST(self, request): request.setResponseCode(http.OK) request.setHeader('content-type', 'text/plain') request.setHeader('charset', 'UTF-8') content = request.args[b'rfile'][0] filename = self.mbasename(getUrlArg(request, "filename")) if not content or not config.OpenWebif.allow_upload_ipk.value: result = [False, _('Error upload File')] else: if not filename.endswith(".ipk"): result = [False, _('wrong filetype')] else: FN = "/tmp/" + filename # nosec fileh = os.open(FN, os.O_WRONLY | os.O_CREAT) bytes = 0 if fileh: bytes = os.write(fileh, content) os.close(fileh) if bytes <= 0: try: os.remove(FN) except OSError: pass result = [False, _('Error writing File')] else: result = [True, FN] return six.ensure_binary(json.dumps({"Result": result}))
def P_multiepg(self, request): epgmode = getUrlArg(request, "epgmode", "tv") if epgmode not in ["tv", "radio"]: epgmode = "tv" bouq = getBouquets(epgmode) bref = getUrlArg(request, "bref") if bref == None: bref = bouq['bouquets'][0][0] endtime = 1440 begintime = -1 day = 0 week = 0 wadd = 0 _week = getUrlArg(request, "week") if _week != None: try: week = int(_week) wadd = week * 7 except ValueError: pass _day = getUrlArg(request, "day") if _day != None: try: day = int(_day) if day > 0 or wadd > 0: now = localtime() begintime = int( mktime( (now.tm_year, now.tm_mon, now.tm_mday + day + wadd, 0, 0, 0, -1, -1, -1))) except ValueError: pass mode = 1 if config.OpenWebif.webcache.mepgmode.value: try: mode = int(config.OpenWebif.webcache.mepgmode.value) except ValueError: pass epg = getMultiEpg(self, bref, begintime, endtime, mode) epg['bouquets'] = bouq['bouquets'] epg['bref'] = bref epg['day'] = day epg['week'] = week epg['mode'] = mode epg['epgmode'] = epgmode return epg
def setVTiWebConfig(self, request): if b"moviesearchextended" in list(request.args.keys()): val = int(getUrlArg(request, "moviesearchextended")) print("save moviesearchextended:", val) config.OpenWebif.responsive_moviesearch_extended.value = val == 1 and True or False config.OpenWebif.responsive_moviesearch_extended.save() if b"moviesearchshort" in list(request.args.keys()): val = int(getUrlArg(request, "moviesearchshort")) print("save moviesearchshort:", val) config.OpenWebif.responsive_moviesearch_short.value = val == 1 and True or False config.OpenWebif.responsive_moviesearch_short.save() if b"fullsearch" in list(request.args.keys()): val = int(getUrlArg(request, "fullsearch")) print("save fullsearch:", val) config.OpenWebif.responsive_epgsearch_full.value = val == 1 and True or False config.OpenWebif.responsive_epgsearch_full.save() if b"bqonly" in list(request.args.keys()): val = int(getUrlArg(request, "bqonly")) print("save bqonly:", val) config.OpenWebif.responsive_epgsearch_only_bq.value = val == 1 and True or False config.OpenWebif.responsive_epgsearch_only_bq.save() if b"rcugrabscreen" in list(request.args.keys()): val = int(getUrlArg(request, "rcugrabscreen")) print("save rcugrabscreen:", val) config.OpenWebif.responsive_rcu_screenshot.value = val == 1 and True or False config.OpenWebif.responsive_rcu_screenshot.save() if b"minmovielist" in list(request.args.keys()): val = int(getUrlArg(request, "minmovielist")) print("save minmovielist:", val) config.OpenWebif.responsive_min_movielist.value = val == 1 and True or False config.OpenWebif.responsive_min_movielist.save() if b"mintimerlist" in list(request.args.keys()): val = int(getUrlArg(request, "mintimerlist")) print("save mintimerlist:", val) config.OpenWebif.responsive_min_timerlist.value = val == 1 and True or False config.OpenWebif.responsive_min_timerlist.save() if b"minepglist" in list(request.args.keys()): val = int(getUrlArg(request, "minepglist")) print("save minepglist:", val) config.OpenWebif.responsive_min_epglist.value = val == 1 and True or False config.OpenWebif.responsive_min_epglist.save() if b"remotecontrolview" in list(request.args.keys()): val = int(getUrlArg(request, "remotecontrolview")) print("save remotecontrolview:", val) config.OpenWebif.responsive_rcu_full_view.value = val == 1 and True or False config.OpenWebif.responsive_rcu_full_view.save() return ''
def P_index(self, request): if config.OpenWebif.responsive_enabled.value and os.path.exists(VIEWS_PATH + "/responsive"): return {} mode = getUrlArg(request, "mode", "") uagent = request.getHeader('User-Agent') if uagent and mode != 'fullpage' and os.path.exists(getPublicPath('mobile')): if uagent.lower().find("iphone") != -1 or uagent.lower().find("ipod") != -1 or uagent.lower().find("blackberry") != -1 or uagent.lower().find("mobile") != -1: request.setHeader("Location", "/mobile/") request.setResponseCode(http.FOUND) return "" return {}
def render(self, request): request.setHeader('Content-Type', 'application/xhtml+xml') request.setHeader('Charset', 'UTF-8') if len(request.args): port = 9 mac = "" ip = "" man_port = getUrlArg(request, "port") if man_port != None: try: port = int(man_port) except ValueError: pass mac = getUrlArg(request, "mac") if mac != None: mac = str(mac).lower() mac = mac.split(':') if len(mac) != 6: return createResult(False, b"MAC address invalid see example: AA:BB:CC:DD:EE:FF") ip = getUrlArg(request, "ip") if ip != None: ip = str(ip).lower() ip = ip.split('.') if len(ip) != 4: return createResult(False, b"IP address invalid see example: 192.168.2.10") try: for digit in ip: is_int = int(digit) # noqa: F841 except ValueError: return createResult(False, b"IP address invalid see example: 192.168.2.10") ip = ip[0] + "." + ip[1] + "." + ip[2] + ".255" if ip and mac: mac_struct = pack('BBBBBB', int(mac[0], 16), int(mac[1], 16), int(mac[2], 16), int(mac[3], 16), int(mac[4], 16), int(mac[5], 16)) magic = ensure_binary(('\xff' * 6) + str(mac_struct * 16)) my_socket = socket(AF_INET, SOCK_DGRAM) my_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) my_socket.sendto(magic, (ip, port)) my_socket.close() return createResult(True, ensure_binary("MagicPacket send to IP %s at port %d" % (ip, port))) return createResult(False, b"'ip' and 'mac' are mandatory arguments")
def render_POST(self, request): request.setResponseCode(http.OK) request.setHeader('content-type', 'text/plain') request.setHeader('charset', 'UTF-8') result = [False, 'Error upload File'] if getUrlArg(request, "json") != None: try: from Plugins.Extensions.OpenWebif.controllers.BouquetEditor import BouquetEditor bqe = BouquetEditor(self.session, func=BouquetEditor.IMPORT_BOUQUET) bqe.handleCommand(request.args) result = bqe.result except ImportError: result = [False, 'BouquetEditor plugin not found'] return json.dumps({"Result": result})
def P_index(self, request): if config.OpenWebif.responsive_enabled.value and os.path.exists(VIEWS_PATH + "/responsive"): return {} # TODO: enable this if modern UI is finished for mobile # setMobile() mode = getUrlArg(request, "mode", "") uagent = request.getHeader('User-Agent') # TODO: enable this if modern UI is finished for mobile #if os.path.exists(VIEWS_PATH + "/responsive"): # if uagent.lower().find("iphone") != -1 or uagent.lower().find("ipod") != -1 or uagent.lower().find("blackberry") != -1 or uagent.lower().find("mobile") != -1: # setMobile(True) # return {} # TODO: remove this if mobile parts removed if uagent and mode != 'fullpage' and os.path.exists(getPublicPath('mobile')): if uagent.lower().find("iphone") != -1 or uagent.lower().find("ipod") != -1 or uagent.lower().find("blackberry") != -1 or uagent.lower().find("mobile") != -1: request.setHeader("Location", "/mobile/") request.setResponseCode(http.FOUND) return "" return {}
def P_channelinfo(self, request): channelinfo = {} channelepg = {} sref = getUrlArg(request, "sref") if sref != None: channelepg = getChannelEpg(sref) # Detect if sRef contains a stream if ("://" in sref): # Repair sRef (URL part gets unquoted somewhere in between but MUST NOT) sref = ":".join(sref.split(':')[:10]) + ":" + quote(":".join( sref.split(':')[10:-1])) + ":" + sref.split(':')[-1] # Get service name from last part of the sRef channelinfo['sname'] = sref.split(':')[-1] # Use quoted sref when stream has EPG if len(channelepg['events']) > 1: channelepg['events'][0]['sref'] = sref else: # todo: Get service name channelinfo['sname'] = "" # Assume some sane blank defaults channelinfo['sref'] = sref channelinfo['title'] = "" channelinfo['picon'] = "" channelinfo['shortdesc'] = "" channelinfo['longdesc'] = "" channelinfo['begin'] = 0 channelinfo['end'] = 0 # Got EPG information? if len(channelepg['events']) > 1: # Return the EPG return { "channelinfo": channelepg["events"][0], "channelepg": channelepg["events"] } else: # Make sure at least some basic channel info gets returned when there is no EPG return {"channelinfo": channelinfo, "channelepg": None}
def getStreamSubservices(session, request): services = [] currentServiceRef = session.nav.getCurrentlyPlayingServiceReference() # TODO : this will only work if sref = current channel # the DMM webif can also show subservices for other channels like the current # ideas are welcome sRef = getUrlArg(request, "sRef") if sRef != None: currentServiceRef = eServiceReference(sRef) if currentServiceRef is not None: currentService = session.nav.getCurrentService() subservices = currentService.subServices() services.append({ "servicereference": currentServiceRef.toString(), "servicename": ServiceReference(currentServiceRef).getServiceName() }) if subservices and subservices.getNumberOfSubservices() != 0: n = subservices and subservices.getNumberOfSubservices() z = 0 while z < n: sub = subservices.getSubservice(z) services.append({ "servicereference": sub.toString(), "servicename": sub.getName() }) z += 1 else: services.append = ({ "servicereference": "N/A", "servicename": "N/A" }) return {"services": services}
def P_eventdescription(self, request): return getEventDesc(getUrlArg(request, "sref"), getUrlArg(request, "idev"))
def P_satellites(self, request): stype = getUrlArg(request, "stype", "tv") sat = getSatellites(stype) return {"satellites": sat['satellites'], "stype": stype}
def P_providers(self, request): stype = getUrlArg(request, "stype", "tv") prov = getProviders(stype) return {"providers": prov['providers'], "stype": stype}
def P_bouquets(self, request): stype = getUrlArg(request, "stype", "tv") bouq = getBouquets(stype) return {"bouquets": bouq['bouquets'], "stype": stype}
def P_config(self, request): section = getUrlArg(request, "section", "usage") return getConfigs(section)
def P_tvradio(self, request): epgmode = getUrlArg(request, "epgmode", "tv") if epgmode not in ["tv", "radio"]: epgmode = "tv" return {"epgmode": epgmode}
def P_channels(self, request): stype = getUrlArg(request, "stype", "tv") idbouquet = getUrlArg(request, "id", "ALL") channels = getChannels(idbouquet, stype) channels['transcoding'] = TRANSCODING return channels