from Plugins.Plugin import PluginDescriptor
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.Button import Button
from Components.ActionMap import ActionMap
from Components.ConfigList import ConfigListScreen
from Components.config import config, ConfigSubsection, ConfigDateTime, ConfigClock, ConfigText, getConfigListEntry
import enigma
from enigma import eTimer, iServiceInformation
from datetime import datetime, time as dt_time
from os import system
import gettext
import time, httplib
config.plugins.SetClock = ConfigSubsection()
config.plugins.SetClock.HostName = ConfigText(default='ya.ru', fixed_size=False)
ver = '1.1'
def _(txt):
t = gettext.gettext(txt)
return t
def Plugins(**kwargs):
return [PluginDescriptor(name='SetClock', description='SetClock plug-in v.' + ver + ' (c)2011 by SatCat', where=PluginDescriptor.WHERE_PLUGINMENU, icon='plugin.png', fnc=main), PluginDescriptor(name='SetClock', description='SetClock plug-in v.' + ver + '(c)2011 by SatCat', where=[PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc=autostart)]
def main(session, servicereference = None, **kwargs):
try:
session.open(SetClockMain)
except:
print '[SetClock] Pluginexecution failed'
def autostart(reason, **kwargs):
global session
if reason == 0 and kwargs.has_key('session'):
session = kwargs['session']
session.open(AutoCorrTime)
def get_time_str(res_time):
replace_months = {
'Jan': '1',
'Feb': '2',
'Mar': '3',
'Apr': '4',
'May': '5',
'June': '6',
'Jun': '6',
'July': '7',
'Jul': '7',
'Aug': '8',
'Sept': '9',
'Sep': '9',
'Oct': '10',
'Nov': '11',
'Dec': '12',
}
gmts = [
'GMT',
]
_res_time = res_time
try:
time_tuple = time.strptime(res_time, '%a, %d %b %Y %H:%M:%S %Z')
except ValueError:
for m1, m2 in replace_months.items():
res_time = res_time.replace(m1, m2)
fro gmt in gmts:
res_time = res_time.replace(gmt, '')
res_time = res_time.split(', ')[1].strip()
try:
time_tuple = time.strptime(res_time, '%d %m %Y %H:%M:%S')
except ValueError:
open('/usr/lib/enigma2/python/Plugins/Extensions/SetClock/log.txt', 'a').write(_res_time)
raise
t = time.localtime(time.mktime(time_tuple) - time.timezone)
return time.strftime('%Y%m%d%H%M.%S', t)
class AutoCorrTime(Screen):
skin = '''
<screen position="100,100" size="280,300" title="SetClock" >
</screen>'''
def __init__(self, session):
Screen.__init__(self, session)
self.session = session
if time.localtime().tm_year == 2000:
self.limit = 0
self.cursorTimer = eTimer()
self.cursorTimer.callback.append(self.timer)
self.cursorTimer.start(75, False)
def timer(self):
if time.localtime().tm_year > 2000:
refstr = dtt = 'n/a'
try:
service = self.session.nav.getCurrentService()
if service:
info = service.info()
if info:
refstr = info.getInfoString(iServiceInformation.sServiceref)
except:
refstr = 'ref error'
if refstr == '1:0:1:1:65:64:3840000:0:0:0:':
tc = time.time() - 189391980
dtt = datetime.fromtimestamp(tc).strftime('%Y%m%d%H%M')
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % dtt)
print '[SetClock] Set clock!'
except:
pass
self.cursorTimer.stop()
print '[SetClock] Stop timer.'
self.limit = self.limit + 1
if self.limit > 1200:
self.cursorTimer.stop()
print '[SetClock] Stop timer (limit).'
class SetClockMain(ConfigListScreen, Screen):
skin = '''
<screen position="center,250" size="420,190" title="SetClock Menu" >
<widget name="config" position="10,10" size="400,130" scrollbarMode="showOnDemand" />
<widget name="key_green" position="0,150" size="140,40" valign="center" halign="center" zPosition="4" foregroundColor="white" font="Regular;18" transparent="1"/>
<ePixmap name="green" position="0,150" size="140,40" zPosition="2" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
<widget name="key_blue" position="140,150" size="140,40" valign="center" halign="center" zPosition="4" foregroundColor="white" font="Regular;18" transparent="1"/>
<ePixmap name="blue" position="140,150" size="140,40" zPosition="2" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
<widget name="key_red" position="280,150" size="140,40" valign="center" halign="center" zPosition="4" foregroundColor="white" font="Regular;18" transparent="1"/>
<ePixmap name="red" position="280,150" size="140,40" zPosition="2" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
</screen>'''
def __init__(self, session, args = 0):
self.skin = SetClockMain.skin
self.session = session
Screen.__init__(self, session)
self.list = []
self.date_en = ConfigDateTime(default=time.time(), formatstring='%d.%m.%y')
self.entryDate = getConfigListEntry(_('Date'), self.date_en)
self.time_en = ConfigClock(default=time.time())
self.entryTime = getConfigListEntry(_('Time'), self.time_en)
self.list.append(self.entryDate)
self.list.append(self.entryTime)
self.list.append(getConfigListEntry('HTTP host:', config.plugins.SetClock.HostName))
self['key_green'] = Button(_('SET!'))
self['key_blue'] = Button(_('HTTP SET'))
self['key_red'] = Button(_('Cancel'))
ConfigListScreen.__init__(self, self.list, session=session)
self['setupActions'] = ActionMap(['SetupActions', 'ColorActions'], {'red': self.cancel,
'green': self.set,
'blue': self.inet_set,
'save': self.set,
'cancel': self.cancel,
'ok': self.pressed_ok}, -2)
self['config'].list = self.list
self['config'].l.setList(self.list)
def pressed_ok(self):
config.plugins.SetClock.HostName.save()
self.set()
def set(self, dtt = 0):
d = time.localtime(self.date_en.value)
dtt = '%d%02d%02d%02d%02d' % (d.tm_year,
d.tm_mon,
d.tm_mday,
self.time_en.value[0],
self.time_en.value[1])
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % dtt)
except:
pass
self.close()
print '[SetClock] SET! ** %s' % time.strftime('%X %x (%Y) %Z')
def inet_set(self):
config.plugins.SetClock.HostName.save()
conn = httplib.HTTPConnection(config.plugins.SetClock.HostName.value)
try:
conn.request('HEAD', '/favicon.ico')
t_rtt = time.clock()
res_time = conn.getresponse().getheader('date')
except:
self.session.open(MessageBox, 'Error: No server responce: ' + config.plugins.SetClock.HostName.value, MessageBox.TYPE_ERROR, timeout=3)
return
enigma.eDVBLocalTimeHandler.getInstance().setUseDVBTime(False)
try:
system('/bin/date -s %s' % get_time_str(res_time))
except:
pass
self.close()
print '[SetClock] inet SET! ** %s' % time.strftime('%X %x (%Y) %Z')
def cancel(self):
self.close()
Comments