# OK, this is more than a proof of concept
# things to improve:
# - nicer code
-# - screens need to be defined somehow else.
+# - screens need to be defined somehow else.
# I don't know how, yet. Probably each in an own file.
# - more components, like the channellist
# - better error handling
from WebComponents.Sources.MP import MP
from WebComponents.Sources.ServiceListReload import ServiceListReload
from WebComponents.Sources.AT import AT
+from WebComponents.Sources.CurrentService import CurrentService
from Components.Sources.FrontendStatus import FrontendStatus
WebScreen.__init__(self, session, request)
self["Message"] = Message(session,func = Message.PRINT)
self["GetAnswer"] = Message(session,func = Message.ANSWER)
-
+
class ServiceListReloadWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["ServiceListReload"] = ServiceListReload(session)
-
+
class AudioWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["AudioTracks"] = AudioTracks(session, func=AudioTracks.GET)
- self["SelectAudioTrack"] = AudioTracks(session, func=AudioTracks.SET)
+ self["SelectAudioTrack"] = AudioTracks(session, func=AudioTracks.SET)
class AboutWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["About"] = About(session)
-
+
class VolumeWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["PlayFile"] = MP(session,func = MP.PLAY)
self["Command"] = MP(session,func = MP.COMMAND)
self["WritePlaylist"] = MP(session,func = MP.WRITEPLAYLIST)
-
+
class AutoTimerWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["AutoTimerList"] = AT(session,func = AT.LIST)
self["AutoTimerWrite"] = AT(session,func = AT.WRITE)
-
+
class TimerWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["ParentControlList"] = ParentControl(session)
-
+
class WAPWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["WAPFillOptionListSmonth"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListShour"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListSmin"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-
+
self["WAPFillOptionListEyear"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListEday"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListEmonth"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListEhour"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
self["WAPFillOptionListEmin"] = WAPfunctions(session,func = WAPfunctions.LISTTIME)
-
+
self["WAPFillOptionListRecord"] = WAPfunctions(session,func = WAPfunctions.OPTIONLIST)
self["WAPFillOptionListAfterEvent"] = WAPfunctions(session,func = WAPfunctions.OPTIONLIST)
-
+
self["WAPFillValueName"] = WAPfunctions(session,func = WAPfunctions.FILLVALUE)
self["WAPFillValueDescr"] = WAPfunctions(session,func = WAPfunctions.FILLVALUE)
self["WAPServiceList"] = WAPfunctions(session, func = WAPfunctions.SERVICELIST)
self["WAPdeleteOldOnSave"] = WAPfunctions(session,func = WAPfunctions.DELETEOLD)
-
+
class StreamingWebScreen(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
self["ref"] = StaticText()
self["localip"] = RequestData(request,what=RequestData.HOST)
+class M3UStreamingCurrentServiceWebScreen(WebScreen):
+ def __init__(self, session, request):
+ WebScreen.__init__(self, session, request)
+ self["CurrentService"] = CurrentService(session)
+ self["localip"] = RequestData(request,what=RequestData.HOST)
+
class TsM3U(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
WebScreen.__init__(self, session, request)
import plugin
plugin.restartWebserver(session)
-
+
class GetPid(WebScreen):
def __init__(self, session, request):
WebScreen.__init__(self, session, request)
for key in paramlist:
arg = args.get(key, [])
if len(arg) == 0:
- list[key] = None
+ list[key] = None
elif len(arg) == 1:
- list[key] = "".join(arg)
+ list[key] = "".join(arg)
elif len(arg) == 2:
list[key] = arg[0]
self.source.handleCommand(list)
class TextToXML(Converter):
def __init__(self, arg):
Converter.__init__(self, arg)
-
+
def getHTML(self, id):
return escape_xml(self.source.text).replace("\x19", "").replace("\x1c", "").replace("\x1e", "")
append(element)
elif filternum == 2:
append(str(item[element]).replace("\\", "\\\\").replace("\n", "\\n").replace('"', '\\"'))
- elif filternum == 3:
+ elif filternum == 3:
append(escape_xml(str(item[element])))
elif filternum == 4:
append(str(item[element]).replace("%", "%25").replace("+", "%2B").replace('&', '%26').replace('?', '%3f').replace(' ', '+'))
tag.insert(0, '<')
tag.append('>')
tag = ''.join(tag)#.encode('utf-8')
-
+
if self.mode == 0:
self.res.append(tag)
elif self.mode == 1: # expect "<e2:element>"
self.sub.append(tag)
elif self.mode == 3:
assert name == "e2:item", "found %s instead of e2:item!" % name
-
+
self.parse_item(attrs)
def endElement(self, name):
self.screens = [ ]
def renderPage(stream, path, req, session):
-
+
# read in the template, create required screens
# we don't have persistense yet.
# if we had, this first part would only be done once.
parser.setFeature(feature_namespaces, 0)
parser.setContentHandler(handler)
parser.parse(open(util.sibpath(__file__, path)))
-
+
# by default, we have non-streaming pages
finish = True
-
+
# first, apply "commands" (aka. URL argument)
for x in handler.res:
if isinstance(x, Element):
from twisted.internet import reactor
s.write("\n");
reactor.callLater(3, ping, s)
-
+
# if we met a "StreamingElement", there is at least one
# element which wants to output data more than once,
# i.e. on host-originated changes.
# ok.
# you *need* something which constantly sends something in a regular interval,
# in order to detect disconnected clients.
- # i agree that this "ping" sucks terrible, so better be sure to have something
+ # i agree that this "ping" sucks terrible, so better be sure to have something
# similar. A "CurrentTime" is fine. Or anything that creates *some* output.
ping(stream)
stream.closed_callback = lambda : streamFinish(handler, stream)