Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
348 lines (288 sloc) 14.9 KB
#
# Partnerbox E2
#
# $Id$
#
# Coded by Dr.Best (c) 2009
# RemoteTimerList implemented by dre (c) 2017 - 2018
# Support: board.dreambox.tools
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
from Components.config import config
from Components.ActionMap import ActionMap
from Components.Pixmap import Pixmap
from Components.TimerList import TimerList
from Screens.MessageBox import MessageBox
from Screens.TimerEdit import TimerEditList
from PartnerboxFunctions import FillE2TimerList, sendPartnerBoxWebCommand
from PartnerboxSetup import PartnerboxEntriesListConfigScreen
from RemoteTimerEntry import RemoteTimerEntry
from ServiceReference import ServiceReference
from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
from Tools.FuzzyDate import FuzzyTime
from Tools.LoadPixmap import LoadPixmap
from enigma import eServiceReference, getDesktop
from timer import TimerEntry as RealTimerEntry
from timer import TimerEntry
sz_w = getDesktop(0).size().width()
class RemoteTimerList(TimerEditList):
if sz_w == 1920:
skin = """
<screen name="RemoteTimerList" position="center,170" size="1200,820" title="Remote Timer Editor">
<ePixmap pixmap="Default-FHD/skin_default/buttons/red.svg" position="10,5" scale="stretch" size="270,70" />
<ePixmap pixmap="Default-FHD/skin_default/buttons/green.svg" position="280,5" scale="stretch" size="270,70" />
<ePixmap pixmap="Default-FHD/skin_default/buttons/yellow.svg" position="550,5" scale="stretch" size="270,70" />
<ePixmap pixmap="Default-FHD/skin_default/buttons/blue.svg" position="820,5" scale="stretch" size="270,70" />
<widget backgroundColor="#9f1313" font="Regular;30" halign="center" name="key_red" position="10,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="270,70" transparent="1" valign="center" zPosition="1" />
<widget backgroundColor="#1f771f" font="Regular;30" halign="center" name="key_green" position="280,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="270,70" transparent="1" valign="center" zPosition="1" />
<widget backgroundColor="#a08500" font="Regular;30" halign="center" name="key_yellow" position="550,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="270,70" transparent="1" valign="center" zPosition="1" />
<widget backgroundColor="#18188b" font="Regular;30" halign="center" name="key_blue" position="820,5" foregroundColor="white" shadowColor="black" shadowOffset="-2,-2" size="270,70" transparent="1" valign="center" zPosition="1" />
<eLabel backgroundColor="grey" position="10,80" size="1180,1" />
<widget enableWrapAround="1" name="timerlist" position="10,90" scrollbarMode="showOnDemand" size="1180,700" />
<ePixmap pixmap="Default-FHD/skin_default/icons/info.svg" position="1110,30" size="80,40" />
<widget name="menubutton" pixmap="Default-FHD/skin_default/icons/menu.svg" position="1110,30" size="80,40" zPosition="1" />
</screen>"""
else:
skin = """ <screen name="RemoteTimerList" position="center,120" size="950,520" title="Remote Timer Editor">
<ePixmap pixmap="skin_default/buttons/red.png" position="10,5" size="200,40" />
<ePixmap pixmap="skin_default/buttons/green.png" position="210,5" size="200,40" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="410,5" size="200,40" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="610,5" size="200,40" />
<widget name="menubutton" pixmap="skin_default/icons/menu.png" position="810,15" size="100,20" />
<widget name="key_red" position="10,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" shadowColor="black" shadowOffset="-2,-2" />
<widget name="key_green" position="210,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" shadowColor="black" shadowOffset="-2,-2" />
<widget name="key_yellow" position="410,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" shadowColor="black" shadowOffset="-2,-2" />
<widget name="key_blue" position="610,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" shadowColor="black" shadowOffset="-2,-2" />
<eLabel position="10,50" size="930,1" backgroundColor="grey" />
<widget name="timerlist" position="10,60" size="930,450" enableWrapAround="1" scrollbarMode="showOnDemand" />
</screen> """
def __init__(self, session, partnerboxentry = None):
self.skinName = "RemoteTimerList"
self.partnerboxentry = partnerboxentry
self["RemoteTimerActions"] = ActionMap(["MenuActions"],
{
"menu": self.changePartnerbox,
}, -1)
self["menubutton"] = Pixmap()
self.count = config.plugins.Partnerbox.entriescount.value
if self.count == 1:
self["menubutton"].hide()
TimerEditList.__init__(self, session)
self["timerlist"] = TimerList(list)
self["timerlist"].l.setBuildFunc(self.buildRemoteTimerEntry)
self.onLayoutFinish.append(self.readRemoteTimers)
def changePartnerbox(self):
if self.count > 1:
self.session.openWithCallback(self.openNewPartnerbox, PartnerboxEntriesListConfigScreen)
def openNewPartnerbox(self, session, what, partnerboxentry):
if partnerboxentry is not None:
self.partnerboxentry = partnerboxentry
self.readRemoteTimers()
def buildRemoteTimerEntry(self, timer, processed):
pixmap = None
s_ref = ServiceReference(timer.servicereference)
if s_ref.ref.flags & eServiceReference.isGroup:
pixmap = self.picServiceGroup
else:
orbpos = s_ref.ref.getUnsignedData(4) >> 16
if orbpos == 0xFFFF:
pixmap = self["timerlist"].picDVB_C
elif orbpos == 0xEEEE:
pixmap = self["timerlist"].picDVB_T
else:
pixmap = self["timerlist"].picDVB_S
res = [ None ]
res.append(timer.servicename)
res.append(pixmap)
res.append(timer.name)
repeatedtext = ""
days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") )
if timer.repeated:
flags = timer.repeated
count = 0
for x in (0, 1, 2, 3, 4, 5, 6):
if (flags & 1 == 1):
if (count != 0):
repeatedtext += ", "
repeatedtext += days[x]
count += 1
flags = flags >> 1
if timer.justplay:
if timer.timeend - timer.timebegin < 4: # rounding differences
repeatedtext += ((" %s "+ _("(ZAP)")) % (FuzzyTime(timer.timebegin)[1]))
else:
repeatedtext += ((" %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.timebegin)[1], FuzzyTime(timer.timeend)[1], (timer.timeend - timer.timebegin) / 60)) + _("(ZAP)")
else:
repeatedtext += ((" %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.timebegin)[1], FuzzyTime(timer.timeend)[1], (timer.timeend - timer.timebegin) / 60))
else:
if timer.justplay:
if timer.timeend - timer.timebegin < 4:
repeatedtext += (("%s, %s " + _("(ZAP)")) % (FuzzyTime(timer.timebegin)))
else:
repeatedtext += (("%s, %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.timebegin) + FuzzyTime(timer.timeend)[1:] + ((timer.timeend - timer.timebegin) / 60,))) + _("(ZAP)")
else:
repeatedtext += (("%s, %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.timebegin) + FuzzyTime(timer.timeend)[1:] + ((timer.timeend - timer.timebegin) / 60,)))
res.append(repeatedtext)
if not processed:
if timer.state == TimerEntry.StateWaiting:
state = _("waiting")
elif timer.state == TimerEntry.StatePrepared:
state = _("about to start")
elif timer.state == TimerEntry.StateRunning:
if timer.justplay:
state = _("zapped")
else:
state = _("recording...")
elif timer.state == TimerEntry.StateEnded:
state = _("done!")
else:
state = _("<unknown>")
else:
state = _("done!")
if timer.disabled:
state = _("disabled")
res.append(state)
png = None
if timer.disabled:
png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/redx.png"))
res.append(png)
return res
def readRemoteTimers(self):
self.ip = "%d.%d.%d.%d" % tuple(self.partnerboxentry.ip.value)
self.port = self.partnerboxentry.port.value
self.username = "root"
self.password = self.partnerboxentry.password.value
self.webiftype = self.partnerboxentry.webinterfacetype.value
self.setTitle("Remote Timer Editor %s" %(self.partnerboxentry.name.value))
self.count = config.plugins.Partnerbox.entriescount.value
if self.count == 1:
self["menubutton"].hide()
self["timerlist"].hide()
sCommand = "http://%s:%d/web/timerlist" % (self.ip,self.port)
sendPartnerBoxWebCommand(sCommand, 10, self.username, self.password, self.webiftype).addCallback(self.downloadCallback).addErrback(self.downloadError)
def downloadCallback(self, callback = None):
self.readXML(callback)
self["timerlist"].instance.show()
def downloadError(self, error = None):
if error is not None:
self.session.open(MessageBox,str(error.getErrorMessage()), MessageBox.TYPE_INFO)
#TODO: if serverbox is down don't allow to add/remove/edit/... timer
def readXML(self, xmlstring):
self.E2TimerList = []
self.E2TimerList = FillE2TimerList(xmlstring)
#helper function to move finished timers to end of list
def eol_compare(x, y):
if x[0].state != y[0].state and x[0].state == RealTimerEntry.StateEnded or y[0].state == RealTimerEntry.StateEnded:
return cmp(x[0].state, y[0].state)
return cmp(x[0].begin, y[0].begin)
list = self.list
del list[:]
list.extend([(x,True) for x in self.E2TimerList if x.state == 3])
list.extend([(x,False) for x in self.E2TimerList if x.state < 3])
if config.usage.timerlist_finished_timer_position.index: #end of list
list.sort(cmp = eol_compare)
else:
list.sort(key = lambda x: x[0].begin)
self["timerlist"].l.setList(list)
self.updateState()
def toggleDisabledState(self):
t = self["timerlist"].getCurrent()
if t.disabled == 0:
disabled = 1
else:
disabled = 0
tagset = ""
for tag in t.tags:
if tag == 'None':
break
if tagset == "":
tagset = tag
else:
tagset += " " + tag
sCommand = "http://%s:%d/web/timerchange?sRef=%s&begin=%s&end=%s&name=%s&description=%s&dirname=%s&tags=%s&afterevent=%s&eit=%s&disabled=%s&justplay=%s&channelOld=%s&beginOld=%s&endOld=%s&repeated=%d&deleteOldOnSave=1" % (self.ip, self.port, t.servicereference, t.timebegin, t.timeend, urllib.quote(t.name), urllib.quote(t.description), urllib.quote(t.dirname), urllib.quote(tagset), t.afterEvent, t.eit, disabled, t.justplay, t.servicereference, t.timebegin, t.timeend, t.repeated )
sendPartnerBoxWebCommand(sCommand, 10, self.username, self.password, self.webiftype).addCallback(self.timerChangeCallback).addErrback(self.actionError)
def timerChangeCallback(self, result):
self.readRemoteTimers()
def actionError(self, error):
self.session.open(MessageBox,str(error.getErrorMessage()), MessageBox.TYPE_INFO)
def removeTimerQuestion(self):
t = self["timerlist"].getCurrent()
if not t:
return
self.session.openWithCallback(self.removeTimer, MessageBox, _("Do you really want to delete %s?") %(t.name))
def removeTimer(self, result):
if not result:
return
t = self["timerlist"].getCurrent()
if t:
sCommand = "http://%s:%d/web/timerdelete?sRef=%s&begin=%s&end=%s" %(self.ip, self.port, t.servicereference, t.timebegin, t.timeend)
sendPartnerBoxWebCommand(sCommand, 10, self.username, self.password, self.webiftype).addCallback(self.timerDeleteCallback).addErrback(self.actionError)
def timerDeleteCallback(self, result):
self.readRemoteTimers()
def addTimer(self, timer):
from RemoteTimerEntry import getLocations
self.Locations = []
self.timer = timer
ip = "%d.%d.%d.%d" % tuple(self.partnerboxentry.ip.value)
port = self.partnerboxentry.port.value
http_ = "%s:%d" % (ip,port)
getLocations(self, "http://" + http_ + "/web/getlocations", self.partnerboxentry, False, "read")
def addTimerCallback(self):
from RemoteTimerEntry import RemoteTimerEntry
self.session.openWithCallback(self.finishedAdd, RemoteTimerEntry, self.timer, self.Locations, self.partnerboxentry, self.E2TimerList)
def finishedAdd(self, answer):
if answer[0]:
pass
else:
print "Timeredit aborted"
self.readRemoteTimers()
def openEdit(self):
self.currentTimer=self["timerlist"].getCurrent()
if self.currentTimer:
from RemoteTimerEntry import getLocations
self.timeBeginOld = self.currentTimer.timebegin
self.timeEndOld = self.currentTimer.timeend
self.srefOld = self.currentTimer.servicereference
self.Locations = []
ip = "%d.%d.%d.%d" % tuple(self.partnerboxentry.ip.value)
port = self.partnerboxentry.port.value
http_ = "%s:%d" % (ip,port)
getLocations(self, "http://" + http_ + "/web/getlocations", self.partnerboxentry, False, "edit")
def openEditCallback(self):
self.session.openWithCallback(self.finishedEdit, RemoteTimerEntry, self.currentTimer, self.Locations, self.partnerboxentry, self.E2TimerList, mode="edit")
def finishedEdit(self, answer):
# when editing a timer from Remote Timer List the timer is already updated there. So, answer[0] is False
if answer[0]:
t = answer[1]
tagset = ""
for tag in t.tags:
if tag == 'None':
break
if tagset == "":
tagset = tag
else:
tagset += " " + tag
sCommand = "http://%s:%d/web/timerchange?sRef=%s&begin=%s&end=%s&name=%s&description=%s&dirname=%s&tags=%s&afterevent=%s&eit=%s&disabled=%s&justplay=%s&channelOld=%s&beginOld=%s&endOld=%s&repeated=%d&deleteOldOnSave=1" % (self.ip, self.port, t.servicereference, t.timebegin, t.timeend, urllib.quote(t.name), urllib.quote(t.description), urllib.quote(t.dirname), urllib.quote(tagset), t.afterEvent, t.eit, t.disabled, t.justplay, self.srefOld, self.timeBeginOld, self.timeEndOld, t.repeated )
sendPartnerBoxWebCommand(sCommand, 10, self.username, self.password, self.webiftype).addCallback(self.timerChangeCallback).addErrback(self.actionError)
else:
# this is used when editing a timer from Remote Timer List. As the timer is already changed we only need to reload the list
if len(answer)>1:
if answer[1] == True:
self.readRemoteTimers()
else:
print "Timeredit aborted"
def cleanupTimer(self, delete):
if delete:
sCommand = "http://%s:%d/web/timercleanup?cleanup=true" % (self.ip, self.port)
sendPartnerBoxWebCommand(sCommand, 10, self.username, self.password, self.webiftype).addCallback(self.timerChangeCallback).addErrback(self.actionError)
def cleanupTimerCallback(self, result):
self.readRemoteTimers()