From d84d4fe3d913d20b5472ea101b6474a19ece1860 Mon Sep 17 00:00:00 2001 From: andy Date: Thu, 30 Oct 2008 18:24:06 +0100 Subject: fix execute string for tasks --- lib/python/Components/Task.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index 7ea64f1a..c152e9a2 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -136,7 +136,6 @@ class Task(object): def setTool(self, tool): self.cmd = tool - self.args = [tool] self.global_preconditions.append(ToolExistsPrecondition()) self.postconditions.append(ReturncodePostcondition()) @@ -172,7 +171,7 @@ class Task(object): if self.cwd is not None: self.container.setCWD(self.cwd) - execstr = self.cmd + " ".join(self.args) + #execstr = " ".join([self.cmd]+self.args) print "execute:", self.container.execute(execstr), execstr if self.initial_input: self.writeInput(self.initial_input) -- cgit v1.2.3 From 52c94625063d5ea3ebf77db99acac8a43639c12a Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Fri, 31 Oct 2008 11:18:40 +0100 Subject: uncomment necessary line --- lib/python/Components/Task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index c152e9a2..47acc87e 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -171,7 +171,7 @@ class Task(object): if self.cwd is not None: self.container.setCWD(self.cwd) - #execstr = " ".join([self.cmd]+self.args) + execstr = " ".join([self.cmd]+self.args) print "execute:", self.container.execute(execstr), execstr if self.initial_input: self.writeInput(self.initial_input) -- cgit v1.2.3 From 728c78384a71b0231cfe0047292e34b8ec860522 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 31 Oct 2008 13:07:01 +0100 Subject: add possibility to call eConsoleAppContainer execute with unlimited count of arguments when its called with single argument, then /bin/sh is started else not --- lib/base/console.cpp | 36 +++++++++++++++++++++++++++++++----- lib/python/Components/Task.py | 4 ++-- 2 files changed, 33 insertions(+), 7 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/base/console.cpp b/lib/base/console.cpp index a12cb5e2..25318cc9 100644 --- a/lib/base/console.cpp +++ b/lib/base/console.cpp @@ -476,11 +476,37 @@ eConsolePy_running(eConsolePy* self) static PyObject * eConsolePy_execute(eConsolePy* self, PyObject *argt) { - const char *str; - if (PyArg_ParseTuple(argt, "s", &str)) - return PyInt_FromLong(self->cont->execute(str)); - PyErr_SetString(PyExc_TypeError, - "argument is not a string"); + Py_ssize_t argc = PyTuple_Size(argt); + if (argc > 1) + { + const char *argv[argc + 1]; + int argpos=0; + while(argpos < argc) + { + PyObject *arg = PyTuple_GET_ITEM(argt, argpos); + if (!PyString_Check(arg)) + { + char err[255]; + if (argpos) + snprintf(err, 255, "arg %d is not a string", argpos); + else + snprintf(err, 255, "cmd is not a string!"); + PyErr_SetString(PyExc_TypeError, err); + return NULL; + } + argv[argpos++] = PyString_AsString(arg); + } + argv[argpos] = 0; + return PyInt_FromLong(self->cont->execute(argv[0], argv)); + } + else + { + const char *str; + if (PyArg_ParseTuple(argt, "s", &str)) + return PyInt_FromLong(self->cont->execute(str)); + PyErr_SetString(PyExc_TypeError, + "cmd is not a string!"); + } return NULL; } diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index 47acc87e..ab85c667 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -136,6 +136,7 @@ class Task(object): def setTool(self, tool): self.cmd = tool + self.args = [tool] self.global_preconditions.append(ToolExistsPrecondition()) self.postconditions.append(ReturncodePostcondition()) @@ -171,8 +172,7 @@ class Task(object): if self.cwd is not None: self.container.setCWD(self.cwd) - execstr = " ".join([self.cmd]+self.args) - print "execute:", self.container.execute(execstr), execstr + print "execute:", self.container.execute(self.cmd, *self.args), self.cmd, *self.args if self.initial_input: self.writeInput(self.initial_input) -- cgit v1.2.3 From 0a9c12b0d928a0d4837046830a253fef966ef672 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 31 Oct 2008 14:04:12 +0100 Subject: fix syntax error --- lib/python/Components/Task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index ab85c667..f249f711 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -172,7 +172,7 @@ class Task(object): if self.cwd is not None: self.container.setCWD(self.cwd) - print "execute:", self.container.execute(self.cmd, *self.args), self.cmd, *self.args + print "execute:", self.container.execute(self.cmd, *self.args), self.cmd, self.args if self.initial_input: self.writeInput(self.initial_input) -- cgit v1.2.3 From d1969e292c8208feb7825bdcd4fc3e64e0dbc2fa Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 31 Oct 2008 16:43:41 +0100 Subject: needed update for avahi stuff --- lib/python/Components/Network.py | 102 +++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 37 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 9b0898e0..5c9e06b7 100644 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -14,10 +14,11 @@ class Network: self.Console = Console() self.getInterfaces() - def getInterfaces(self): + def getInterfaces(self, callback = None): devicesPattern = re_compile('[a-z]+[0-9]+') self.configuredInterfaces = [] fp = file('/proc/net/dev', 'r') + system("cat /proc/net/dev") result = fp.readlines() fp.close() for line in result: @@ -25,19 +26,10 @@ class Network: device = devicesPattern.search(line).group() if device == 'wifi0': continue - self.getDataForInterface(device) - # Show only UP Interfaces in E2 - #if self.getAdapterAttribute(device, 'up') is False: - # del self.ifaces[device] + self.getDataForInterface(device, callback) except AttributeError: pass - #print "self.ifaces:", self.ifaces - #self.writeNetworkConfig() - #print ord(' ') - #for line in result: - # print ord(line[0]) - # helper function def regExpMatch(self, pattern, string): if string is None: @@ -55,12 +47,37 @@ class Network: ip.append(int(x)) return ip - def getDataForInterface(self, iface): - cmd = "ifconfig " + iface - self.Console.ePopen(cmd, self.ifconfigFinished, iface) - - def ifconfigFinished(self, result, retval, iface): + def IPaddrFinished(self, result, retval, extra_args): + (iface, callback ) = extra_args data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False } + globalIPpattern = re_compile("scope global") + ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' + ipLinePattern = re_compile('inet ' + ipRegexp +'/') + ipPattern = re_compile(ipRegexp) + + for line in result.splitlines(): + split = line.strip().split(' ',2) + if (split[1] == iface): + if re_search(globalIPpattern, split[2]): + ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) + if ip is not None: + data['ip'] = self.convertIP(ip) + if not data.has_key('ip'): + data['dhcp'] = True + data['ip'] = [0, 0, 0, 0] + data['netmask'] = [0, 0, 0, 0] + data['gateway'] = [0, 0, 0, 0] + + cmd = "ifconfig " + iface + self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback]) + + def getDataForInterface(self, iface,callback): + #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. + cmd = "ip -o addr" + self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) + + def ifconfigFinished(self, result, retval, extra_args ): + (iface, data, callback ) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipLinePattern = re_compile('inet addr:' + ipRegexp) netmaskLinePattern = re_compile('Mask:' + ipRegexp) @@ -68,15 +85,15 @@ class Network: ipPattern = re_compile(ipRegexp) upPattern = re_compile('UP ') macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}') - + for line in result.splitlines(): - ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line)) + #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line)) netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line)) bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line)) up = self.regExpMatch(upPattern, line) mac = self.regExpMatch(macPattern, line) - if ip is not None: - data['ip'] = self.convertIP(ip) + #if ip is not None: + # data['ip'] = self.convertIP(ip) if netmask is not None: data['netmask'] = self.convertIP(netmask) if bcast is not None: @@ -87,27 +104,34 @@ class Network: self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac - if not data.has_key('ip'): - data['dhcp'] = True - data['ip'] = [0, 0, 0, 0] - data['netmask'] = [0, 0, 0, 0] - data['gateway'] = [0, 0, 0, 0] - + cmd = "route -n | grep " + iface - self.Console.ePopen(cmd,self.routeFinished,[iface,data,ipPattern]) + self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback]) def routeFinished(self, result, retval, extra_args): - (iface, data, ipPattern) = extra_args - + (iface, data, callback) = extra_args + ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' + ipPattern = re_compile(ipRegexp) + ipLinePattern = re_compile(ipRegexp) + for line in result.splitlines(): print line[0:7] if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway is not None: data['gateway'] = self.convertIP(gateway) + + for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask + split = line.strip().split(' ') + if re_search(ipPattern, split[0]): + foundip = self.convertIP(split[0]) + if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]): + if re_search(ipPattern, split[4]): + mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4])) + if mask is not None: + data['netmask'] = self.convertIP(mask) self.ifaces[iface] = data - if len(self.Console.appContainers) == 0: - self.loadNetworkConfig() + self.loadNetworkConfig(iface,callback) def writeNetworkConfig(self): self.configuredInterfaces = [] @@ -144,8 +168,7 @@ class Network: fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver)) fp.close() - def loadNetworkConfig(self): - self.loadNameserverConfig() + def loadNetworkConfig(self,iface,callback = None): interfaces = [] # parse the interfaces-file try: @@ -166,7 +189,7 @@ class Network: ifaces[currif]["dhcp"] = True else: ifaces[currif]["dhcp"] = False - if (currif != ""): + if (currif == iface): #read information only for available interfaces if (split[0] == "address"): ifaces[currif]["address"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("ip"): @@ -181,7 +204,7 @@ class Network: ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False: - self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) + self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i @@ -189,11 +212,16 @@ class Network: if self.ifaces[currif].has_key("postdown"): self.ifaces[currif]["postdown"] = i - print "read interfaces:", ifaces for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] - print "self.ifaces after loading:", self.ifaces + if len(self.Console.appContainers) == 0: + # load ns only once + self.loadNameserverConfig() + print "read configured interfac:", ifaces + print "self.ifaces after loading:", self.ifaces + if callback is not None: + callback(True) def loadNameserverConfig(self): ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" -- cgit v1.2.3 From 9d3e9f9dcb8b1f579fac1b36185507d314b2b9b7 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 31 Oct 2008 17:16:10 +0100 Subject: remove debug output --- lib/python/Components/Network.py | 1 - 1 file changed, 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 5c9e06b7..cf21c6d0 100644 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -18,7 +18,6 @@ class Network: devicesPattern = re_compile('[a-z]+[0-9]+') self.configuredInterfaces = [] fp = file('/proc/net/dev', 'r') - system("cat /proc/net/dev") result = fp.readlines() fp.close() for line in result: -- cgit v1.2.3 From ef6af8235aef7f58c25e5962ee14a264fc66fdf8 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 31 Oct 2008 19:36:58 +0100 Subject: add missing import --- lib/python/Components/Network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index cf21c6d0..bed9d95f 100644 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -1,5 +1,5 @@ from os import system, popen, path as os_path, listdir -from re import compile as re_compile +from re import compile as re_compile, search as re_search from socket import * from enigma import eConsoleAppContainer from Components.Console import Console -- cgit v1.2.3 From ce8e939502fb096515b84a16087bdcb2c498bfdc Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 2 Nov 2008 11:14:33 +0100 Subject: add .mp2 as supported filetype --- lib/python/Components/FileList.py | 1 + lib/python/Plugins/Extensions/MediaPlayer/plugin.py | 6 +++--- lib/service/servicemp3.cpp | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index 7801c556..e028ec3a 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -10,6 +10,7 @@ from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \ from Tools.LoadPixmap import LoadPixmap EXTENSIONS = { + "mp2": "music", "mp3": "music", "wav": "music", "ogg": "music", diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py index a144f2cd..841ad614 100644 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -66,7 +66,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB self.addPlaylistParser(PlaylistIOInternal, "e2pls") # 'None' is magic to start at the list of mountpoints - self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(None, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|mkv|mp4|dat|flac)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() @@ -727,7 +727,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB ext = text[-4:].lower() # FIXME: the information if the service contains video (and we should hide our window) should com from the service instead - if ext not in [".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: + if ext not in [".mp2", ".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: self.hide() else: needsInfoUpdate = True @@ -754,7 +754,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB currref = self.playlist.getServiceRefList()[idx] text = currref.getPath() ext = text[-4:].lower() - if ext not in [".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: + if ext not in [".mp2", ".mp3", ".wav", ".ogg", "flac"] and not self.isAudioCD: self.hide() else: needsInfoUpdate = True diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 5c982aa1..c76e346e 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -27,6 +27,7 @@ eServiceFactoryMP3::eServiceFactoryMP3() if (sc) { std::list extensions; + extensions.push_back("mp2"); extensions.push_back("mp3"); extensions.push_back("ogg"); extensions.push_back("mpg"); -- cgit v1.2.3 From 8f1f4a52e0e913bb51e58efa542dcbe404dba77d Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Mon, 3 Nov 2008 13:47:04 +0100 Subject: fix streaming playback (webradio) --- lib/python/Components/Playlist.py | 2 ++ lib/service/servicemp3.cpp | 35 +++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Playlist.py b/lib/python/Components/Playlist.py index 22799692..744ee3af 100644 --- a/lib/python/Components/Playlist.py +++ b/lib/python/Components/Playlist.py @@ -70,6 +70,8 @@ class PlaylistIOM3U(PlaylistIO): # TODO: use e2 facilities to create a service ref from file if entry[0] == "/": self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry)) + elif entry.startswith("http"): + self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry.replace(':',"%3a"))) else: self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + os.path.dirname(filename) + "/" + entry)) file.close() diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index c76e346e..19b7735b 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -227,11 +227,29 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp if (!m_gst_pipeline) m_error_message = "failed to create GStreamer pipeline!\n"; - if ( sourceinfo.containertype == ctCDA ) + if ( sourceinfo.is_streaming ) + { + eDebug("play webradio!"); + source = gst_element_factory_make ("neonhttpsrc", "http-source"); + if (source) + { + g_object_set (G_OBJECT (source), "location", filename, NULL); + g_object_set (G_OBJECT (source), "automatic-redirect", TRUE, NULL); + } + else + m_error_message = "GStreamer plugin neonhttpsrc not available!\n"; + } + else if ( sourceinfo.containertype == ctCDA ) { source = gst_element_factory_make ("cdiocddasrc", "cda-source"); if (source) + { g_object_set (G_OBJECT (source), "device", "/dev/cdroms/cdrom0", NULL); + int track = atoi(filename+18); + eDebug("play audio CD track #%i",track); + if (track > 0) + g_object_set (G_OBJECT (source), "track", track, NULL); + } else sourceinfo.containertype = ctNone; } @@ -243,21 +261,6 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp else m_error_message = "GStreamer can't open filesrc " + (std::string)filename + "!\n"; } - else if ( sourceinfo.is_streaming ) - { - source = gst_element_factory_make ("neonhttpsrc", "http-source"); - if (source) - g_object_set (G_OBJECT (source), "automatic-redirect", TRUE, NULL); - else - m_error_message = "GStreamer plugin neonhttpsrc not available!\n"; - } - else - { - int track = atoi(filename+18); - eDebug("play audio CD track #%i",track); - if (track > 0) - g_object_set (G_OBJECT (source), "track", track, NULL); - } if ( sourceinfo.is_video ) { /* filesrc -> mpegdemux -> | queue_audio -> dvbaudiosink -- cgit v1.2.3 From 1be69784396f194419adda53331d5fee02ea062b Mon Sep 17 00:00:00 2001 From: Acid-Burn Date: Tue, 4 Nov 2008 12:13:37 +0100 Subject: add virtual keyboard as easy input help add icons for virtual keyboard network fixes wlan fixeS --- data/skin_default.xml | 11 +- data/skin_default/vkey_backspace.png | Bin 0 -> 783 bytes data/skin_default/vkey_bg.png | Bin 0 -> 577 bytes data/skin_default/vkey_clr.png | Bin 0 -> 955 bytes data/skin_default/vkey_esc.png | Bin 0 -> 1321 bytes data/skin_default/vkey_icon.png | Bin 0 -> 2512 bytes data/skin_default/vkey_left.png | Bin 0 -> 819 bytes data/skin_default/vkey_ok.png | Bin 0 -> 990 bytes data/skin_default/vkey_right.png | Bin 0 -> 817 bytes data/skin_default/vkey_sel.png | Bin 0 -> 173 bytes data/skin_default/vkey_shift.png | Bin 0 -> 767 bytes data/skin_default/vkey_shift_sel.png | Bin 0 -> 1395 bytes data/skin_default/vkey_space.png | Bin 0 -> 577 bytes data/skin_default/vkey_text.png | Bin 0 -> 262 bytes lib/python/Components/HelpMenuList.py | 25 +- lib/python/Components/Network.py | 331 +++++++++++++------ lib/python/Screens/Makefile.am | 2 +- lib/python/Screens/NetworkSetup.py | 604 ++++++++++++++++++++++++---------- lib/python/Screens/VirtualKeyBoard.py | 287 ++++++++++++++++ 19 files changed, 978 insertions(+), 282 deletions(-) mode change 100644 => 100755 data/skin_default.xml create mode 100755 data/skin_default/vkey_backspace.png create mode 100755 data/skin_default/vkey_bg.png create mode 100755 data/skin_default/vkey_clr.png create mode 100755 data/skin_default/vkey_esc.png create mode 100755 data/skin_default/vkey_icon.png create mode 100755 data/skin_default/vkey_left.png create mode 100755 data/skin_default/vkey_ok.png create mode 100755 data/skin_default/vkey_right.png create mode 100755 data/skin_default/vkey_sel.png create mode 100755 data/skin_default/vkey_shift.png create mode 100755 data/skin_default/vkey_shift_sel.png create mode 100755 data/skin_default/vkey_space.png create mode 100755 data/skin_default/vkey_text.png mode change 100644 => 100755 lib/python/Components/HelpMenuList.py mode change 100644 => 100755 lib/python/Components/Network.py mode change 100644 => 100755 lib/python/Screens/Makefile.am mode change 100644 => 100755 lib/python/Screens/NetworkSetup.py create mode 100755 lib/python/Screens/VirtualKeyBoard.py (limited to 'lib/python/Components') diff --git a/data/skin_default.xml b/data/skin_default.xml old mode 100644 new mode 100755 index 88cf8b40..41a7e4c9 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -42,6 +42,9 @@ + + + @@ -568,7 +571,7 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + @@ -1157,4 +1160,10 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) + + + + + + diff --git a/data/skin_default/vkey_backspace.png b/data/skin_default/vkey_backspace.png new file mode 100755 index 00000000..ed49159f Binary files /dev/null and b/data/skin_default/vkey_backspace.png differ diff --git a/data/skin_default/vkey_bg.png b/data/skin_default/vkey_bg.png new file mode 100755 index 00000000..5151da4c Binary files /dev/null and b/data/skin_default/vkey_bg.png differ diff --git a/data/skin_default/vkey_clr.png b/data/skin_default/vkey_clr.png new file mode 100755 index 00000000..0c7734bf Binary files /dev/null and b/data/skin_default/vkey_clr.png differ diff --git a/data/skin_default/vkey_esc.png b/data/skin_default/vkey_esc.png new file mode 100755 index 00000000..56c52d30 Binary files /dev/null and b/data/skin_default/vkey_esc.png differ diff --git a/data/skin_default/vkey_icon.png b/data/skin_default/vkey_icon.png new file mode 100755 index 00000000..f27b7f86 Binary files /dev/null and b/data/skin_default/vkey_icon.png differ diff --git a/data/skin_default/vkey_left.png b/data/skin_default/vkey_left.png new file mode 100755 index 00000000..2e77e713 Binary files /dev/null and b/data/skin_default/vkey_left.png differ diff --git a/data/skin_default/vkey_ok.png b/data/skin_default/vkey_ok.png new file mode 100755 index 00000000..2c0c7e88 Binary files /dev/null and b/data/skin_default/vkey_ok.png differ diff --git a/data/skin_default/vkey_right.png b/data/skin_default/vkey_right.png new file mode 100755 index 00000000..fefb17c5 Binary files /dev/null and b/data/skin_default/vkey_right.png differ diff --git a/data/skin_default/vkey_sel.png b/data/skin_default/vkey_sel.png new file mode 100755 index 00000000..b612b947 Binary files /dev/null and b/data/skin_default/vkey_sel.png differ diff --git a/data/skin_default/vkey_shift.png b/data/skin_default/vkey_shift.png new file mode 100755 index 00000000..477f8db2 Binary files /dev/null and b/data/skin_default/vkey_shift.png differ diff --git a/data/skin_default/vkey_shift_sel.png b/data/skin_default/vkey_shift_sel.png new file mode 100755 index 00000000..339ddb46 Binary files /dev/null and b/data/skin_default/vkey_shift_sel.png differ diff --git a/data/skin_default/vkey_space.png b/data/skin_default/vkey_space.png new file mode 100755 index 00000000..5151da4c Binary files /dev/null and b/data/skin_default/vkey_space.png differ diff --git a/data/skin_default/vkey_text.png b/data/skin_default/vkey_text.png new file mode 100755 index 00000000..6bdb8c84 Binary files /dev/null and b/data/skin_default/vkey_text.png differ diff --git a/lib/python/Components/HelpMenuList.py b/lib/python/Components/HelpMenuList.py old mode 100644 new mode 100755 index 25c9b8b6..04815c8d --- a/lib/python/Components/HelpMenuList.py +++ b/lib/python/Components/HelpMenuList.py @@ -1,7 +1,6 @@ from GUIComponent import GUIComponent from enigma import eListboxPythonMultiContent, eListbox, gFont - from Tools.KeyBindings import queryKeyBinding, getKeyDescription #getKeyPositions @@ -13,6 +12,7 @@ class HelpMenuList(GUIComponent): self.onSelChanged = [ ] self.l = eListboxPythonMultiContent() self.callback = callback + self.extendedHelp = False l = [ ] for (actionmap, context, actions) in list: @@ -36,17 +36,26 @@ class HelpMenuList(GUIComponent): if flags & 8: # for long keypresses, prepend l_ into the key name. name = (name[0], "long") - print "name:", name - entry.append( (actionmap, context, action, name ) ) - entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) ) - + + if type(help).__name__== 'list': + self.extendedHelp = True + print "extendedHelpEntry found" + entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 26, 0, 0, help[0]) ) + entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 28, 400, 20, 1, 0, help[1]) ) + else: + entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) ) + l.append(entry) self.l.setList(l) - - self.l.setFont(0, gFont("Regular", 24)) - self.l.setItemHeight(38) + if self.extendedHelp is True: + self.l.setFont(0, gFont("Regular", 24)) + self.l.setFont(1, gFont("Regular", 18)) + self.l.setItemHeight(50) + else: + self.l.setFont(0, gFont("Regular", 24)) + self.l.setItemHeight(38) def ok(self): # a list entry has a "private" tuple as first entry... diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py old mode 100644 new mode 100755 index bed9d95f..e10c6a0e --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -7,11 +7,19 @@ from Components.Console import Console class Network: def __init__(self): self.ifaces = {} - self.configuredInterfaces = [] + self.configuredInterfaces = [] + self.configuredNetworkAdapters = [] + self.NetworkState = 0 + self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "/usr/sbin/ethtool" self.container = eConsoleAppContainer() self.Console = Console() + self.LinkConsole = Console() + self.restartConsole = Console() + self.deactivateConsole = Console() + self.activateConsole = Console() + self.resetNetworkConsole = Console() self.getInterfaces() def getInterfaces(self, callback = None): @@ -28,6 +36,11 @@ class Network: self.getDataForInterface(device, callback) except AttributeError: pass + #print "self.ifaces:", self.ifaces + #self.writeNetworkConfig() + #print ord(' ') + #for line in result: + # print ord(line[0]) # helper function def regExpMatch(self, pattern, string): @@ -46,66 +59,58 @@ class Network: ip.append(int(x)) return ip + def getDataForInterface(self, iface,callback): + #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. + cmd = "ip -o addr" + self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) + def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False } globalIPpattern = re_compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' - ipLinePattern = re_compile('inet ' + ipRegexp +'/') + netRegexp = '[0-9]{1,2}' + macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' + ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) - + netmaskLinePattern = re_compile('/' + netRegexp + ' brd ') + netmaskPattern = re_compile(netRegexp) + bcastLinePattern = re_compile(' brd ' + ipRegexp) + upPattern = re_compile('UP') + macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}') + macLinePattern = re_compile('link/ether ' + macRegexp) + for line in result.splitlines(): split = line.strip().split(' ',2) + if (split[1][:-1] == iface): + up = self.regExpMatch(upPattern, split[2]) + mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2])) + if up is not None: + data['up'] = True + if iface is not 'lo': + self.configuredInterfaces.append(iface) + if mac is not None: + data['mac'] = mac if (split[1] == iface): if re_search(globalIPpattern, split[2]): ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) + netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) + bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2])) if ip is not None: data['ip'] = self.convertIP(ip) + if netmask is not None: + data['netmask'] = self.convertIP(netmask) + if bcast is not None: + data['bcast'] = self.convertIP(bcast) + if not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] - cmd = "ifconfig " + iface - self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback]) - - def getDataForInterface(self, iface,callback): - #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. - cmd = "ip -o addr" - self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) - - def ifconfigFinished(self, result, retval, extra_args ): - (iface, data, callback ) = extra_args - ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' - ipLinePattern = re_compile('inet addr:' + ipRegexp) - netmaskLinePattern = re_compile('Mask:' + ipRegexp) - bcastLinePattern = re_compile('Bcast:' + ipRegexp) - ipPattern = re_compile(ipRegexp) - upPattern = re_compile('UP ') - macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}') - - for line in result.splitlines(): - #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line)) - netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line)) - bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line)) - up = self.regExpMatch(upPattern, line) - mac = self.regExpMatch(macPattern, line) - #if ip is not None: - # data['ip'] = self.convertIP(ip) - if netmask is not None: - data['netmask'] = self.convertIP(netmask) - if bcast is not None: - data['bcast'] = self.convertIP(bcast) - if up is not None: - data['up'] = True - if iface is not 'lo': - self.configuredInterfaces.append(iface) - if mac is not None: - data['mac'] = mac - cmd = "route -n | grep " + iface - self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback]) + self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args @@ -119,16 +124,7 @@ class Network: gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway is not None: data['gateway'] = self.convertIP(gateway) - - for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask - split = line.strip().split(' ') - if re_search(ipPattern, split[0]): - foundip = self.convertIP(split[0]) - if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]): - if re_search(ipPattern, split[4]): - mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4])) - if mask is not None: - data['netmask'] = self.convertIP(mask) + self.ifaces[iface] = data self.loadNetworkConfig(iface,callback) @@ -203,7 +199,7 @@ class Network: ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False: - self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) + self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i @@ -215,7 +211,9 @@ class Network: if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if len(self.Console.appContainers) == 0: - # load ns only once + # save configured interfacelist + self.configuredNetworkAdapters = self.configuredInterfaces + # load ns only once self.loadNameserverConfig() print "read configured interfac:", ifaces print "self.ifaces after loading:", self.ifaces @@ -244,16 +242,39 @@ class Network: print "nameservers:", self.nameservers - def deactivateNetworkConfig(self): + def deactivateNetworkConfig(self, callback = None): + self.deactivateConsole = Console() + self.commands = [] + self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): - system("ip addr flush " + iface) - system("/etc/init.d/networking stop") - system("killall -9 udhcpc") - system("rm /var/run/udhcpc*") + cmd = "ip addr flush " + iface + self.commands.append(cmd) + self.commands.append("/etc/init.d/networking stop") + self.commands.append("killall -9 udhcpc") + self.commands.append("rm /var/run/udhcpc*") + self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True) + + def deactivateNetworkFinished(self,extra_args): + callback = extra_args + if len(self.deactivateConsole.appContainers) == 0: + if callback is not None: + callback(True) - def activateNetworkConfig(self): - system("/etc/init.d/networking start") - self.getInterfaces() + def activateNetworkConfig(self, callback = None): + self.activateConsole = Console() + self.commands = [] + self.commands.append("/etc/init.d/networking start") + self.commands.append("/etc/init.d/avahi-daemon start") + self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True) + + def activateNetworkFinished(self,extra_args): + callback = extra_args + if len(self.activateConsole.appContainers) == 0: + if callback is not None: + callback(True) + + def getConfiguredAdapters(self): + return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) @@ -312,7 +333,24 @@ class Network: if self.nameservers[i] == oldnameserver: self.nameservers[i] = newnameserver - def writeDefaultNetworkConfig(self,mode='lan'): + def resetNetworkConfig(self, mode='lan', callback = None): + self.resetNetworkConsole = Console() + self.commands = [] + self.commands.append("/etc/init.d/avahi-daemon stop") + for iface in self.ifaces.keys(): + cmd = "ip addr flush " + iface + self.commands.append(cmd) + self.commands.append("/etc/init.d/networking stop") + self.commands.append("killall -9 udhcpc") + self.commands.append("rm /var/run/udhcpc*") + self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) + + def resetNetworkFinishedCB(self, extra_args): + (mode, callback) = extra_args + if len(self.resetNetworkConsole.appContainers) == 0: + self.writeDefaultNetworkConfig(mode, callback) + + def writeDefaultNetworkConfig(self,mode='lan', callback = None): fp = file('/etc/network/interfaces', 'w') fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n") fp.write("auto lo\n") @@ -329,50 +367,95 @@ class Network: fp.write("\n") fp.close() - def resetNetworkConfig(self,mode='lan'): - self.deactivateNetworkConfig() - self.writeDefaultNetworkConfig(mode) + self.resetNetworkConsole = Console() + self.commands = [] if mode == 'wlan': - system("ifconfig eth0 down") - system("ifconfig ath0 down") - system("ifconfig wlan0 up") + self.commands.append("ifconfig eth0 down") + self.commands.append("ifconfig ath0 down") + self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': - system("ifconfig eth0 down") - system("ifconfig wlan0 down") - system("ifconfig ath0 up") + self.commands.append("ifconfig eth0 down") + self.commands.append("ifconfig wlan0 down") + self.commands.append("ifconfig ath0 up") if mode == 'lan': - system("ifconfig eth0 up") - system("ifconfig wlan0 down") - system("ifconfig ath0 down") - self.getInterfaces() - - def checkNetworkState(self): - # www.dream-multimedia-tv.de, www.heise.de, www.google.de - return system("ping -c 1 82.149.226.170") == 0 or \ - system("ping -c 1 193.99.144.85") == 0 or \ - system("ping -c 1 209.85.135.103") == 0 - - def restartNetwork(self): - iNetwork.deactivateNetworkConfig() - iNetwork.activateNetworkConfig() + self.commands.append("ifconfig eth0 up") + self.commands.append("ifconfig wlan0 down") + self.commands.append("ifconfig ath0 down") + self.commands.append("/etc/init.d/avahi-daemon start") + self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True) + + def resetNetworkFinished(self,extra_args): + (mode, callback) = extra_args + if len(self.resetNetworkConsole.appContainers) == 0: + if callback is not None: + callback(True,mode) + + def checkNetworkState(self,statecallback): + # www.dream-multimedia-tv.de, www.heise.de, www.google.de + cmd1 = "ping -c 1 82.149.226.170" + cmd2 = "ping -c 1 193.99.144.85" + cmd3 = "ping -c 1 209.85.135.103" + self.PingConsole = Console() + self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback) + self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback) + self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback) + + def checkNetworkStateFinished(self, result, retval,extra_args): + (statecallback) = extra_args + if self.PingConsole is not None: + if retval == 0: + self.PingConsole = None + statecallback(self.NetworkState) + else: + self.NetworkState += 1 + if len(self.PingConsole.appContainers) == 0: + statecallback(self.NetworkState) + + def restartNetwork(self,callback): + self.restartConsole = Console() + self.commands = [] + self.commands.append("/etc/init.d/avahi-daemon stop") + for iface in self.ifaces.keys(): + cmd = "ip addr flush " + iface + self.commands.append(cmd) + self.commands.append("/etc/init.d/networking stop") + self.commands.append("killall -9 udhcpc") + self.commands.append("rm /var/run/udhcpc*") + self.commands.append("/etc/init.d/networking start") + self.commands.append("/etc/init.d/avahi-daemon start") + self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) + + def restartNetworkFinished(self,extra_args): + callback = extra_args + if len(self.restartConsole.appContainers) == 0: + callback(True) def getLinkState(self,iface,callback): - self.dataAvail = callback cmd = self.ethtool_bin + " " + iface - self.container.appClosed.append(self.cmdFinished) - self.container.dataAvail.append(callback) - self.container.execute(cmd) - - def cmdFinished(self,retval): - self.container.appClosed.remove(self.cmdFinished) - self.container.dataAvail.remove(self.dataAvail) - - def stopContainer(self): - self.container.kill() - - def ContainerRunning(self): - return self.container.running() - + self.LinkConsole = Console() + self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback) + + def getLinkStateFinished(self, result, retval,extra_args): + (callback) = extra_args + if self.LinkConsole is not None: + if len(self.LinkConsole.appContainers) == 0: + callback(result) + + def stopLinkStateConsole(self): + if self.LinkConsole is not None: + self.LinkConsole = None + + def stopRestartConsole(self): + if self.restartConsole is not None: + self.restartConsole = None + + def RestartConsoleRunning(self): + if self.restartConsole is not None: + if len(self.restartConsole.appContainers) == 0: + return False + else: + return True + def checkforInterface(self,iface): if self.getAdapterAttribute(iface, 'up') is True: return True @@ -384,13 +467,37 @@ class Network: else: return False - def checkDNSLookup(self): - return system("nslookup www.dream-multimedia-tv.de") == 0 or \ - system("nslookup www.heise.de") == 0 or \ - system("nslookup www.google.de") + def checkDNSLookup(self,statecallback): + cmd1 = "nslookup www.dream-multimedia-tv.de" + cmd2 = "nslookup www.heise.de" + cmd3 = "nslookup www.google.de" + self.DnsConsole = Console() + self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback) + self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback) + self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback) + + def checkDNSLookupFinished(self, result, retval,extra_args): + (statecallback) = extra_args + if self.DnsConsole is not None: + if retval == 0: + self.DnsConsole = None + statecallback(self.DnsState) + else: + self.DnsState += 1 + if len(self.DnsConsole.appContainers) == 0: + statecallback(self.DnsState) def deactivateInterface(self,iface): - system("ifconfig " + iface + " down") + self.deactivateInterfaceConsole = Console() + self.commands = [] + cmd1 = "ip addr flush " + iface + cmd2 = "ifconfig " + iface + " down" + self.commands.append(cmd1) + self.commands.append(cmd2) + self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, extra_args = None, debug=True) + + def deactivateInterfaceFinished(self,extra_args): + pass def detectWlanModule(self): self.wlanmodule = None @@ -411,6 +518,20 @@ class Network: self.wlanmodule = 'zydas' return self.wlanmodule + def calc_netmask(self,nmask): + from struct import pack, unpack + from socket import inet_ntoa, inet_aton + mask = 1L<<31 + xnet = (1L<<32)-1 + cidr_range = range(0, 32) + cidr = long(nmask) + if cidr not in cidr_range: + print 'cidr invalid: %d' % cidr + return None + else: + nm = ((1L<L', nm))) + return netmask iNetwork = Network() diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am old mode 100644 new mode 100755 index 186c6f32..a3cf70bb --- a/lib/python/Screens/Makefile.am +++ b/lib/python/Screens/Makefile.am @@ -13,5 +13,5 @@ install_PYTHON = \ TimerSelection.py PictureInPicture.py TimeDateInput.py \ SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \ SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \ - SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py + SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py old mode 100644 new mode 100755 index 862bce46..c26302fa --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -1,25 +1,25 @@ from Screen import Screen -from Components.ActionMap import ActionMap,NumberActionMap from Screens.MessageBox import MessageBox from Screens.InputBox import InputBox from Screens.Standby import * +from Screens.VirtualKeyBoard import VirtualKeyBoard +from Screens.HelpMenu import HelpableScreen from Components.Network import iNetwork from Components.Label import Label,MultiColorLabel from Components.Pixmap import Pixmap,MultiPixmap from Components.MenuList import MenuList -from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigSelection, getConfigListEntry, ConfigNothing +from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigPassword, ConfigSelection, getConfigListEntry, ConfigNothing from Components.ConfigList import ConfigListScreen from Components.PluginComponent import plugins from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest +from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap +from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE +from Tools.LoadPixmap import LoadPixmap from Plugins.Plugin import PluginDescriptor -from enigma import eTimer +from enigma import eTimer, ePoint, eSize, RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont from os import path as os_path, system as os_system, unlink from re import compile as re_compile, search as re_search -from Tools.Directories import resolveFilename, SCOPE_PLUGINS -from Tools.Directories import SCOPE_SKIN_IMAGE,SCOPE_PLUGINS, resolveFilename -from Tools.LoadPixmap import LoadPixmap -from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont class InterfaceList(MenuList): def __init__(self, list, enableWrapAround=False): @@ -30,11 +30,13 @@ class InterfaceList(MenuList): def InterfaceEntryComponent(index,name,default,active ): res = [ (index) ] res.append(MultiContentEntryText(pos=(80, 5), size=(430, 25), font=0, text=name)) - if default is True: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png")) - if default is False: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png")) - res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png)) + num_configured_if = len(iNetwork.getConfiguredAdapters()) + if num_configured_if >= 2: + if default is True: + png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png")) + if default is False: + png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png")) + res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png)) if active is True: png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png")) if active is False: @@ -43,41 +45,64 @@ def InterfaceEntryComponent(index,name,default,active ): return res -class NetworkAdapterSelection(Screen): +class NetworkAdapterSelection(Screen,HelpableScreen): def __init__(self, session): Screen.__init__(self, session) - + HelpableScreen.__init__(self) + self.wlan_errortext = _("No working wireless networkadapter found.\nPlease verify that you have attached a compatible WLAN USB Stick and your Network is configured correctly.") self.lan_errortext = _("No working local networkadapter found.\nPlease verify that you have attached a network cable and your Network is configured correctly.") + self.oktext = _("Press OK on your remote control to continue.") + self.restartLanRef = None self["ButtonBluetext"] = Label(_("Set as default Interface")) + self["ButtonBlue"] = Pixmap() self["ButtonRedtext"] = Label(_("Close")) self["introduction"] = Label(_("Press OK to edit the settings.")) self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] - + if len(self.adapters) == 0: self.onFirstExecBegin.append(self.NetworkFallback) - + + self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", + { + "cancel": (self.close, _("exit networkinterface list")), + "ok": (self.okbuttonClick, _("select interface")), + }) + + self["ColorActions"] = HelpableActionMap(self, "ColorActions", + { + "red": (self.close, _("exit networkinterface list")), + }) + + self["DefaultInterfaceAction"] = HelpableActionMap(self, "ColorActions", + { + "blue": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more then one interface is active.")] ), + }) + self.list = [] self["list"] = InterfaceList(self.list) self.updateList() - self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], - { - "ok": self.okbuttonClick, - "cancel": self.close, - "blue": self.setDefaultInterface, - "red": self.close - }, -2) - + if len(self.adapters) == 1: self.onFirstExecBegin.append(self.okbuttonClick) - + self.onClose.append(self.cleanup) + def updateList(self): iNetwork.getInterfaces() self.list = [] default_gw = None - num_configured_if = len(iNetwork.configuredInterfaces) + num_configured_if = len(iNetwork.getConfiguredAdapters()) + if num_configured_if >= 2: + self["ButtonBlue"].show() + self["ButtonBluetext"].show() + self["DefaultInterfaceAction"].setEnabled(True) + else: + self["ButtonBlue"].hide() + self["ButtonBluetext"].hide() + self["DefaultInterfaceAction"].setEnabled(False) + if num_configured_if < 2 and os_path.exists("/etc/default_gw"): unlink("/etc/default_gw") @@ -86,7 +111,7 @@ class NetworkAdapterSelection(Screen): result = fp.read() fp.close() default_gw = result - + if len(self.adapters) == 0: # no interface available => display only eth0 self.list.append(InterfaceEntryComponent("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True )) else: @@ -106,24 +131,22 @@ class NetworkAdapterSelection(Screen): selection = self["list"].getCurrent() num_if = len(self.list) old_default_gw = None + num_configured_if = len(iNetwork.getConfiguredAdapters()) if os_path.exists("/etc/default_gw"): fp = open('/etc/default_gw', 'r') old_default_gw = fp.read() fp.close() - if num_if > 1 and (not old_default_gw or old_default_gw != selection[0]): + if num_configured_if > 1 and (not old_default_gw or old_default_gw != selection[0]): fp = open('/etc/default_gw', 'w+') fp.write(selection[0]) fp.close() - iNetwork.restartNetwork() - self.updateList() - elif old_default_gw and num_if < 2: + self.restartLan() + elif old_default_gw and num_configured_if < 2: unlink("/etc/default_gw") - iNetwork.restartNetwork() - self.updateList() + self.restartLan() def okbuttonClick(self): selection = self["list"].getCurrent() - print "selection",selection if selection is not None: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, selection[0]) @@ -134,25 +157,47 @@ class NetworkAdapterSelection(Screen): self.updateList() def NetworkFallback(self): - if iNetwork.configuredInterfaces.has_key('wlan0') is True: + if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True: self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) - if iNetwork.configuredInterfaces.has_key('ath0') is True: + if iNetwork.configuredNetworkAdapters.has_key('ath0') is True: self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) else: self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.lan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) def ErrorMessageClosed(self, *ret): - if iNetwork.configuredInterfaces.has_key('wlan0') is True: + if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'wlan0') - elif iNetwork.configuredInterfaces.has_key('ath0') is True: + elif iNetwork.configuredNetworkAdapters.has_key('ath0') is True: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'ath0') else: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'eth0') -class NameserverSetup(Screen, ConfigListScreen): + def cleanup(self): + iNetwork.stopLinkStateConsole() + iNetwork.stopRestartConsole() + + def restartLan(self): + iNetwork.restartNetwork(self.restartLanDataAvail) + self.restartLanRef = self.session.openWithCallback(self.restartfinishedCB, MessageBox, _("Please wait while we configure your network..."), type = MessageBox.TYPE_INFO, enable_input = False) + + def restartLanDataAvail(self, data): + if data is True: + iNetwork.getInterfaces(self.getInterfacesDataAvail) + + def getInterfacesDataAvail(self, data): + if data is True: + self.restartLanRef.close(True) + + def restartfinishedCB(self,data): + if data is True: + self.updateList() + self.session.open(MessageBox, _("Finished configuring your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False) + + +class NameserverSetup(Screen, ConfigListScreen, HelpableScreen): def __init__(self, session): Screen.__init__(self, session) - iNetwork.getInterfaces() + HelpableScreen.__init__(self) self.backupNameserverList = iNetwork.getNameserverList()[:] print "backup-list:", self.backupNameserverList @@ -162,14 +207,19 @@ class NameserverSetup(Screen, ConfigListScreen): self["introduction"] = Label(_("Press OK to activate the settings.")) self.createConfig() - self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], - { - "ok": self.ok, - "cancel": self.cancel, - "red": self.cancel, - "green": self.add, - "yellow": self.remove - }, -2) + self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", + { + "cancel": (self.cancel, _("exit nameserver configuration")), + "ok": (self.ok, _("activate current configuration")), + }) + + self["ColorActions"] = HelpableActionMap(self, "ColorActions", + { + "red": (self.cancel, _("exit nameserver configuration")), + "green": (self.add, _("add a nameserver entry")), + "yellow": (self.remove, _("remove a nameserver entry")), + }) + self.list = [] ConfigListScreen.__init__(self, self.list) @@ -222,31 +272,51 @@ class NameserverSetup(Screen, ConfigListScreen): self.createConfig() self.createSetup() -class AdapterSetup(Screen, ConfigListScreen): +class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def __init__(self, session, iface,essid=None, aplist=None): Screen.__init__(self, session) + HelpableScreen.__init__(self) self.session = session self.iface = iface self.essid = essid self.aplist = aplist self.extended = None + self.applyConfigRef = None + self.finished_cb = None + self.oktext = _("Press OK on your remote control to continue.") self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") - iNetwork.getInterfaces() - - self.createConfig() + #iNetwork.getInterfaces() - self["actions"] = NumberActionMap(["SetupActions", "ColorActions"], + self.createConfig() + + self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", + { + "cancel": (self.close, _("exit networkadapter setup menu")), + "ok": (self.ok, _("select menu entry")), + }) + + self["ColorActions"] = HelpableActionMap(self, "ColorActions", + { + "red": (self.cancel, _("exit networkadapter configuration")), + "blue": (self.KeyBlue, _("open nameserver configuration")), + }) + + self["VirtualKB"] = HelpableActionMap(self, "ColorActions", + { + "green": (self.KeyGreen, [_("open virtual keyboard input help"),_("* Only available when entering hidden ssid or network key")] ), + }) + + self["actions"] = NumberActionMap(["SetupActions"], { "ok": self.ok, - "cancel": self.cancel, - "red": self.cancel, - "blue": self.KeyBlue, }, -2) + self.list = [] ConfigListScreen.__init__(self, self.list,session = self.session) self.createSetup() self.onLayoutFinish.append(self.layoutFinished) + self.onClose.append(self.cleanup) self["DNS1text"] = Label(_("Primary DNS")) self["DNS2text"] = Label(_("Secondary DNS")) @@ -271,56 +341,81 @@ class AdapterSetup(Screen, ConfigListScreen): self["ButtonRedtext"] = Label(_("Close")) self["ButtonBlue"] = Pixmap() self["ButtonBluetext"] = Label(_("Edit DNS")) + self["ButtonGreen"] = Pixmap() + self["VKeyIcon"] = Pixmap() + self["HelpWindow"] = Pixmap() def layoutFinished(self): self["DNS1"].setText(self.primaryDNS.getText()) self["DNS2"].setText(self.secondaryDNS.getText()) if self.ipConfigEntry.getText() is not None: - self["IP"].setText(self.ipConfigEntry.getText()) + if self.ipConfigEntry.getText() == "0.0.0.0": + self["IP"].setText(_("N/A")) + else: + self["IP"].setText(self.ipConfigEntry.getText()) else: - self["IP"].setText([0,0,0,0]) - self["Mask"].setText(self.netmaskConfigEntry.getText()) + self["IP"].setText(_("N/A")) + if self.netmaskConfigEntry.getText() is not None: + if self.netmaskConfigEntry.getText() == "0.0.0.0": + self["Mask"].setText(_("N/A")) + else: + self["Mask"].setText(self.netmaskConfigEntry.getText()) + else: + self["IP"].setText(_("N/A")) if iNetwork.getAdapterAttribute(self.iface, "gateway"): - self["Gateway"].setText(self.gatewayConfigEntry.getText()) + if self.gatewayConfigEntry.getText() == "0.0.0.0": + self["Gateway"].setText(_("N/A")) + else: + self["Gateway"].setText(self.gatewayConfigEntry.getText()) else: self["Gateway"].hide() self["Gatewaytext"].hide() self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface)) + self["ButtonGreen"].hide() + self["VKeyIcon"].hide() + self["VirtualKB"].setEnabled(False) + self["HelpWindow"].hide() def createConfig(self): self.InterfaceEntry = None self.dhcpEntry = None self.gatewayEntry = None - self.SSIDscan = None + self.hiddenSSID = None self.wlanSSID = None - self.manualwlanSSID = None self.encryptionEnabled = None self.encryptionKey = None + self.encryptionType = None self.nwlist = None + self.encryptionlist = None + self.weplist = None self.wsconfig = None self.default = None if self.iface == "wlan0" or self.iface == "ath0" : from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant,Wlan + self.w = Wlan(self.iface) self.ws = wpaSupplicant() - list = [] - list.append(_("WEP")) - list.append(_("WPA")) - list.append(_("WPA2")) + self.encryptionlist = [] + self.encryptionlist.append(("WEP", _("WEP"))) + self.encryptionlist.append(("WPA", _("WPA"))) + self.encryptionlist.append(("WPA2", _("WPA2"))) + self.encryptionlist.append(("WPA/WPA2", _("WPA or WPA2"))) + self.weplist = [] + self.weplist.append("ASCII") + self.weplist.append("HEX") if self.aplist is not None: self.nwlist = self.aplist self.nwlist.sort(key = lambda x: x[0]) else: self.nwlist = [] - self.w = None self.aps = None try: - self.w = Wlan(self.iface) self.aps = self.w.getNetworkList() if self.aps is not None: print "[NetworkSetup.py] got Accespoints!" - for ap in aps: - a = aps[ap] + print self.aps + for ap in self.aps: + a = self.aps[ap] if a['active']: if a['essid'] == "": a['essid'] = a['bssid'] @@ -330,17 +425,23 @@ class AdapterSetup(Screen, ConfigListScreen): self.nwlist.append("No Networks found") self.wsconfig = self.ws.loadConfig() - self.default = self.essid or self.wsconfig['ssid'] + if self.essid is not None: # ssid from wlan scan + self.default = self.essid + else: + self.default = self.wsconfig['ssid'] + + if "hidden..." not in self.nwlist: + self.nwlist.append("hidden...") if self.default not in self.nwlist: self.nwlist.append(self.default) - config.plugins.wlan.essidscan = NoSave(ConfigYesNo(default = self.wsconfig['ssidscan'])) - if self.wsconfig['ssidscan'] is True: - config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default )) - else: - config.plugins.wlan.essid = NoSave(ConfigText(default = self.default, visible_width = 50, fixed_size = False)) + + config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default )) + config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = self.wsconfig['hiddenessid'], visible_width = 50, fixed_size = False)) + config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = self.wsconfig['encryption'] )) - config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = self.wsconfig['encryption_type'] )) - config.plugins.wlan.encryption.psk = NoSave(ConfigText(default = self.wsconfig['key'], visible_width = 50, fixed_size = False)) + config.plugins.wlan.encryption.type = NoSave(ConfigSelection(self.encryptionlist, default = self.wsconfig['encryption_type'] )) + config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(self.weplist, default = self.wsconfig['encryption_wepkeytype'] )) + config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = self.wsconfig['key'], visible_width = 50, fixed_size = False)) self.activateInterfaceEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "up") or False)) self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp") or False)) @@ -382,26 +483,56 @@ class AdapterSetup(Screen, ConfigListScreen): self.configStrings = p.__call__["configStrings"] else: self.configStrings = None - self.SSIDscan = getConfigListEntry(_("Automatic SSID lookup"), config.plugins.wlan.essidscan) - self.list.append(self.SSIDscan) - self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid) - self.list.append(self.wlanSSID) + if config.plugins.wlan.essid.value == 'hidden...': + self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid) + self.list.append(self.wlanSSID) + self.hiddenSSID = getConfigListEntry(_("Hidden network SSID"), config.plugins.wlan.hiddenessid) + self.list.append(self.hiddenSSID) + else: + self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid) + self.list.append(self.wlanSSID) self.encryptionEnabled = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption.enabled) self.list.append(self.encryptionEnabled) if config.plugins.wlan.encryption.enabled.value: - self.list.append(getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type)) - self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk) - self.list.append(self.encryptionKey) + self.encryptionType = getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type) + self.list.append(self.encryptionType) + if config.plugins.wlan.encryption.type.value == 'WEP': + self.list.append(getConfigListEntry(_("Encryption Keytype"), config.plugins.wlan.encryption.wepkeytype)) + self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk) + self.list.append(self.encryptionKey) + else: + self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk) + self.list.append(self.encryptionKey) + self["config"].list = self.list self["config"].l.setList(self.list) + if not self.selectionChanged in self["config"].onSelectionChanged: + self["config"].onSelectionChanged.append(self.selectionChanged) def KeyBlue(self): self.session.openWithCallback(self.NameserverSetupClosed, NameserverSetup) + def KeyGreen(self): + if self.iface == "wlan0" or self.iface == "ath0" : + if self["config"].getCurrent() == self.hiddenSSID: + if config.plugins.wlan.essid.value == 'hidden...': + self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN networkname/SSID:")), text = config.plugins.wlan.essid.value) + if self["config"].getCurrent() == self.encryptionKey: + self.session.openWithCallback(self.VirtualKeyBoardKeyCallback, VirtualKeyBoard, title = (_("Enter WLAN passphrase/key:")), text = config.plugins.wlan.encryption.psk.value) + + def VirtualKeyBoardSSIDCallback(self, callback = None): + if callback is not None and len(callback): + config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = callback, visible_width = 50, fixed_size = False)) + self.createSetup() + + def VirtualKeyBoardKeyCallback(self, callback = None): + if callback is not None and len(callback): + config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = callback, visible_width = 50, fixed_size = False)) + self.createSetup() + def newConfig(self): - print self["config"].getCurrent() if self["config"].getCurrent() == self.InterfaceEntry: self.createSetup() if self["config"].getCurrent() == self.dhcpEntry: @@ -409,15 +540,12 @@ class AdapterSetup(Screen, ConfigListScreen): if self["config"].getCurrent() == self.gatewayEntry: self.createSetup() if self.iface == "wlan0" or self.iface == "ath0" : - if self["config"].getCurrent() == self.SSIDscan: - if config.plugins.wlan.essidscan.value is True: - config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default )) - else: - config.plugins.wlan.essid = NoSave(ConfigText(default = self.default, visible_width = 50, fixed_size = False)) + if self["config"].getCurrent() == self.wlanSSID: self.createSetup() if self["config"].getCurrent() == self.encryptionEnabled: self.createSetup() - + if self["config"].getCurrent() == self.encryptionType: + self.createSetup() def keyLeft(self): ConfigListScreen.keyLeft(self) self.newConfig() @@ -426,24 +554,92 @@ class AdapterSetup(Screen, ConfigListScreen): ConfigListScreen.keyRight(self) self.newConfig() + def selectionChanged(self): + current = self["config"].getCurrent() + if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...': + helpwindowpos = self["HelpWindow"].getPosition() + if current[1].help_window.instance is not None: + current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1])) + self["ButtonGreen"].show() + self["VKeyIcon"].show() + self["VirtualKB"].setEnabled(True) + elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value: + helpwindowpos = self["HelpWindow"].getPosition() + if current[1].help_window.instance is not None: + current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1])) + self["ButtonGreen"].show() + self["VKeyIcon"].show() + self["VirtualKB"].setEnabled(True) + else: + self["ButtonGreen"].hide() + self["VKeyIcon"].hide() + self["VirtualKB"].setEnabled(False) + def ok(self): - iNetwork.setAdapterAttribute(self.iface, "up", self.activateInterfaceEntry.value) - iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value) - iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value) - iNetwork.setAdapterAttribute(self.iface, "netmask", self.netmaskConfigEntry.value) - if self.hasGatewayConfigEntry.value: - iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value) + current = self["config"].getCurrent() + if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...': + if current[1].help_window.instance is not None: + current[1].help_window.instance.hide() + elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value: + if current[1].help_window.instance is not None: + current[1].help_window.instance.hide() + self.session.openWithCallback(self.applyConfig, MessageBox, (_("Are you sure you want to activate this network configuration?\n\n") + self.oktext ) ) + + def applyConfig(self, ret = False): + if (ret == True): + iNetwork.setAdapterAttribute(self.iface, "up", self.activateInterfaceEntry.value) + iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value) + iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value) + iNetwork.setAdapterAttribute(self.iface, "netmask", self.netmaskConfigEntry.value) + if self.hasGatewayConfigEntry.value: + iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value) + else: + iNetwork.removeAdapterAttribute(self.iface, "gateway") + if self.extended is not None and self.configStrings is not None: + iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface)) + self.ws.writeConfig() + if self.activateInterfaceEntry.value is False: + iNetwork.deactivateInterface(self.iface) + iNetwork.writeNetworkConfig() + iNetwork.restartNetwork(self.applyConfigDataAvail) + self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait while activating your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False) else: - iNetwork.removeAdapterAttribute(self.iface, "gateway") - if self.extended is not None and self.configStrings is not None: - iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface)) - self.ws.writeConfig() - if self.activateInterfaceEntry.value is False: - iNetwork.deactivateInterface(self.iface) - iNetwork.writeNetworkConfig() - iNetwork.deactivateNetworkConfig() - iNetwork.activateNetworkConfig() - self.close() + self.cancel() + + def applyConfigDataAvail(self, data): + if data is True: + iNetwork.getInterfaces(self.getInterfacesDataAvail) + + def getInterfacesDataAvail(self, data): + if data is True: + self.applyConfigRef.close(True) + + def applyConfigfinishedCB(self,data): + if data is True: + num_configured_if = len(iNetwork.getConfiguredAdapters()) + if num_configured_if >= 2: + self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("Your network configuration has been activated.\nA second configured interface has been found.\n\nDo you want to disable the second networkinterface?"), default = True) + else: + if self.finished_cb: + self.session.openWithCallback(self.finished_cb, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10) + else: + self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10) + + def secondIfaceFoundCB(self,data): + if data is False: + self.close('ok') + else: + configuredInterfaces = configuredNetworkAdapters + for interface in configuredInterfaces: + if interface == self.iface: + continue + iNetwork.setAdapterAttribute(interface, "up", False) + iNetwork.deactivateInterface(interface) + self.applyConfig(True) + + def ConfigfinishedCB(self,data): + if data is True: + self.close('ok') def cancel(self): iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState) @@ -451,11 +647,12 @@ class AdapterSetup(Screen, ConfigListScreen): if self.activateInterfaceEntry.value is False: iNetwork.deactivateInterface(self.iface) iNetwork.getInterfaces() - self.close() + self.close('cancel') - def run(self): + def runAsync(self, finished_cb): + self.finished_cb = finished_cb self.ok() - + def NameserverSetupClosed(self, *ret): iNetwork.loadNameserverConfig() nameserver = (iNetwork.getNameserverList() + [[0,0,0,0]] * 2)[0:2] @@ -463,13 +660,18 @@ class AdapterSetup(Screen, ConfigListScreen): self.secondaryDNS = NoSave(ConfigIP(default=nameserver[1])) self.createSetup() self.layoutFinished() - + + def cleanup(self): + iNetwork.stopLinkStateConsole() + iNetwork.stopRestartConsole() -class AdapterSetupConfiguration(Screen): +class AdapterSetupConfiguration(Screen, HelpableScreen): def __init__(self, session,iface): Screen.__init__(self, session) + HelpableScreen.__init__(self) self.session = session self.iface = iface + self.restartLanRef = None self.mainmenu = self.genMainMenu() self["menulist"] = MenuList(self.mainmenu) self["description"] = Label() @@ -485,8 +687,27 @@ class AdapterSetupConfiguration(Screen): self.oktext = _("Press OK on your remote control to continue.") self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.") - self.errortext = _("No working wireless interface found.\n Please verify that you have attached a compatible WLAN device or enable your local network interface.") + self.errortext = _("No working wireless interface found.\n Please verify that you have attached a compatible WLAN device or enable you local network interface.") + + self["WizardActions"] = HelpableActionMap(self, "WizardActions", + { + "up": (self.up, _("move up to previous entry")), + "down": (self.down, _("move down to next entry")), + "left": (self.left, _("move up to first entry")), + "right": (self.right, _("move down to last entry")), + }) + self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", + { + "cancel": (self.close, _("exit networkadapter setup menu")), + "ok": (self.ok, _("select menu entry")), + }) + + self["ColorActions"] = HelpableActionMap(self, "ColorActions", + { + "red": (self.close, _("exit networkadapter setup menu")), + }) + self["actions"] = NumberActionMap(["WizardActions","ShortcutActions"], { "ok": self.ok, @@ -498,9 +719,10 @@ class AdapterSetupConfiguration(Screen): "right": self.right, }, -2) - iNetwork.getInterfaces() + iNetwork.getInterfaces(self.updateStatusbar) self.onLayoutFinish.append(self.layoutFinished) - self.updateStatusbar() + self.onClose.append(self.cleanup) + self.onHide.append(self.cleanup) def ok(self): if self["menulist"].getCurrent()[1] == 'edit': @@ -549,7 +771,6 @@ class AdapterSetupConfiguration(Screen): self.wlanresponse = ifobj.getStatistics() if self.wlanresponse[0] != 19: self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface) - #self.session.open(WlanStatus,self.iface) else: # Display Wlan not available Message self.showErrorMessage() @@ -584,6 +805,7 @@ class AdapterSetupConfiguration(Screen): self.loadDescription() def loadDescription(self): + print self["menulist"].getCurrent()[1] if self["menulist"].getCurrent()[1] == 'edit': self["description"].setText(_("Edit the network configuration of your Dreambox.\n" ) + self.oktext ) if self["menulist"].getCurrent()[1] == 'test': @@ -601,7 +823,7 @@ class AdapterSetupConfiguration(Screen): if self["menulist"].getCurrent()[1][0] == 'extendedSetup': self["description"].setText(_(self["menulist"].getCurrent()[1][1]) + self.oktext ) - def updateStatusbar(self): + def updateStatusbar(self, data = None): self["IFtext"].setText(_("Network:")) self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface)) self["Statustext"].setText(_("Link:")) @@ -661,21 +883,52 @@ class AdapterSetupConfiguration(Screen): return menu def AdapterSetupClosed(self, *ret): - self.mainmenu = self.genMainMenu() - self["menulist"].l.setList(self.mainmenu) - iNetwork.getInterfaces() - self.updateStatusbar() + if ret is not None and len(ret): + if ret[0] == 'ok' and (self.iface == 'wlan0' or self.iface == 'ath0') and iNetwork.getAdapterAttribute(self.iface, "up") is True: + try: + from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus + from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless + except ImportError: + self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + else: + ifobj = Wireless(self.iface) # a Wireless NIC Object + self.wlanresponse = ifobj.getStatistics() + if self.wlanresponse[0] != 19: + self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface) + else: + # Display Wlan not available Message + self.showErrorMessage() + else: + self.mainmenu = self.genMainMenu() + self["menulist"].l.setList(self.mainmenu) + iNetwork.getInterfaces(self.updateStatusbar) + else: + self.mainmenu = self.genMainMenu() + self["menulist"].l.setList(self.mainmenu) + iNetwork.getInterfaces(self.updateStatusbar) def WlanScanClosed(self,*ret): if ret[0] is not None: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1]) else: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,None,ret[0]) - + self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,None,None) def restartLan(self, ret = False): if (ret == True): - iNetwork.restartNetwork() + iNetwork.restartNetwork(self.restartLanDataAvail) + self.restartLanRef = self.session.openWithCallback(self.restartfinishedCB, MessageBox, _("Please wait while your network is restarting..."), type = MessageBox.TYPE_INFO, enable_input = False) + + def restartLanDataAvail(self, data): + if data is True: + iNetwork.getInterfaces(self.getInterfacesDataAvail) + + def getInterfacesDataAvail(self, data): + if data is True: + self.restartLanRef.close(True) + + def restartfinishedCB(self,data): + if data is True: + self.session.open(MessageBox, _("Finished restarting your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False) def getLinkState(self,iface): iNetwork.getLinkState(iface,self.dataAvail) @@ -693,12 +946,16 @@ class AdapterSetupConfiguration(Screen): def showErrorMessage(self): self.session.open(MessageBox, self.errortext, type = MessageBox.TYPE_INFO,timeout = 10 ) + + def cleanup(self): + iNetwork.stopLinkStateConsole() class NetworkAdapterTest(Screen): def __init__(self, session,iface): Screen.__init__(self, session) self.iface = iface + self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") iNetwork.getInterfaces() self.setLabels() @@ -713,8 +970,8 @@ class NetworkAdapterTest(Screen): self["shortcuts"] = ActionMap(["ShortcutActions","WizardActions"], { - "red": self.close, - "back": self.close, + "red": self.cancel, + "back": self.cancel, }, -2) self["infoshortcuts"] = ActionMap(["ShortcutActions","WizardActions"], { @@ -745,6 +1002,12 @@ class NetworkAdapterTest(Screen): self.nextStepTimer = eTimer() self.nextStepTimer.callback.append(self.nextStepTimerFire) + def cancel(self): + if self.oldInterfaceState is False: + iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState) + iNetwork.deactivateInterface(self.iface) + self.close() + def closeInfo(self): self["shortcuts"].setEnabled(True) self["infoshortcuts"].setEnabled(False) @@ -874,48 +1137,15 @@ class NetworkAdapterTest(Screen): def doStep5(self): self["IPtext"].setForegroundColorNum(1) - ret = iNetwork.checkNetworkState() - if ret == True: - self["IP"].setForegroundColorNum(2) - self["IP"].setText(_("confirmed")) - self["IPInfo_Check"].setPixmapNum(0) - else: - self["IP"].setForegroundColorNum(1) - self["IP"].setText(_("unconfirmed")) - self["IPInfo_Check"].setPixmapNum(1) - self["IPInfo_Check"].show() - self["IPInfo_Text"].setForegroundColorNum(1) - self.steptimer = True - self.nextStepTimer.start(3000) + self["IP"].setText(_("Please wait...")) + iNetwork.checkNetworkState(self.NetworkStatedataAvail) def doStep6(self): self.steptimer = False self.nextStepTimer.stop() self["DNStext"].setForegroundColorNum(1) - ret = iNetwork.checkDNSLookup() - if ret == True: - self["DNS"].setForegroundColorNum(2) - self["DNS"].setText(_("confirmed")) - self["DNSInfo_Check"].setPixmapNum(0) - else: - self["DNS"].setForegroundColorNum(1) - self["DNS"].setText(_("unconfirmed")) - self["DNSInfo_Check"].setPixmapNum(1) - self["DNSInfo_Check"].show() - self["DNSInfo_Text"].setForegroundColorNum(1) - - self["EditSettings_Text"].show() - self["EditSettingsButton"].setPixmapNum(1) - self["EditSettings_Text"].setForegroundColorNum(2) # active - self["EditSettingsButton"].show() - self["ButtonYellow_Check"].setPixmapNum(1) - self["ButtonGreentext"].setText(_("Restart test")) - self["ButtonGreen_Check"].setPixmapNum(0) - self["shortcutsgreen"].setEnabled(False) - self["shortcutsgreen_restart"].setEnabled(True) - self["shortcutsyellow"].setEnabled(False) - self["updown_actions"].setEnabled(True) - self.activebutton = 6 + self["DNS"].setText(_("Please wait...")) + iNetwork.checkDNSLookup(self.DNSLookupdataAvail) def KeyGreen(self): self["shortcutsgreen"].setEnabled(False) @@ -1076,9 +1306,9 @@ class NetworkAdapterTest(Screen): self["NetworkInfo_Check"].setPixmapNum(1) self["NetworkInfo_Check"].show() else: - iNetwork.getLinkState(iface,self.dataAvail) + iNetwork.getLinkState(iface,self.LinkStatedataAvail) - def dataAvail(self,data): + def LinkStatedataAvail(self,data): self.output = data.strip() result = self.output.split('\n') pattern = re_compile("Link detected: yes") @@ -1093,4 +1323,44 @@ class NetworkAdapterTest(Screen): self["NetworkInfo_Check"].setPixmapNum(1) self["NetworkInfo_Check"].show() - + def NetworkStatedataAvail(self,data): + print "DATA",data + if data <= 2: + self["IP"].setForegroundColorNum(2) + self["IP"].setText(_("confirmed")) + self["IPInfo_Check"].setPixmapNum(0) + else: + self["IP"].setForegroundColorNum(1) + self["IP"].setText(_("unconfirmed")) + self["IPInfo_Check"].setPixmapNum(1) + self["IPInfo_Check"].show() + self["IPInfo_Text"].setForegroundColorNum(1) + self.steptimer = True + self.nextStepTimer.start(3000) + + def DNSLookupdataAvail(self,data): + print "DATA",data + if data <= 2: + self["DNS"].setForegroundColorNum(2) + self["DNS"].setText(_("confirmed")) + self["DNSInfo_Check"].setPixmapNum(0) + else: + self["DNS"].setForegroundColorNum(1) + self["DNS"].setText(_("unconfirmed")) + self["DNSInfo_Check"].setPixmapNum(1) + self["DNSInfo_Check"].show() + self["DNSInfo_Text"].setForegroundColorNum(1) + self["EditSettings_Text"].show() + self["EditSettingsButton"].setPixmapNum(1) + self["EditSettings_Text"].setForegroundColorNum(2) # active + self["EditSettingsButton"].show() + self["ButtonYellow_Check"].setPixmapNum(1) + self["ButtonGreentext"].setText(_("Restart test")) + self["ButtonGreen_Check"].setPixmapNum(0) + self["shortcutsgreen"].setEnabled(False) + self["shortcutsgreen_restart"].setEnabled(True) + self["shortcutsyellow"].setEnabled(False) + self["updown_actions"].setEnabled(True) + self.activebutton = 6 + + \ No newline at end of file diff --git a/lib/python/Screens/VirtualKeyBoard.py b/lib/python/Screens/VirtualKeyBoard.py new file mode 100755 index 00000000..53970ab8 --- /dev/null +++ b/lib/python/Screens/VirtualKeyBoard.py @@ -0,0 +1,287 @@ +# -*- coding: iso-8859-1 -*- +from Components.Language import language +from Components.ActionMap import ActionMap +from Components.Label import Label +from Components.Pixmap import Pixmap +from Components.MenuList import MenuList +from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest +from enigma import eListboxPythonMultiContent, gFont, loadPNG, RT_HALIGN_CENTER, RT_VALIGN_CENTER +from Screen import Screen +from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE + +key_backspace = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_backspace.png")) +key_bg = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_bg.png")) +key_clr = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_clr.png")) +key_esc = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_esc.png")) +key_ok = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_ok.png")) +key_sel = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_sel.png")) +key_shift = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift.png")) +key_shift_sel = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift_sel.png")) +key_space = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_space.png")) + +class VirtualKeyBoardList(MenuList): + def __init__(self, list, enableWrapAround=False): + MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) + self.l.setFont(0, gFont("Regular", 22)) + self.l.setItemHeight(45) + +def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False): + res = [ (keys) ] + + x = 0 + count = 0 + if shiftMode: + shiftkey_png = key_shift_sel + else: + shiftkey_png = key_shift + for key in keys: + if key == "EXIT": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_esc)) + elif key == "BACKSPACE": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_backspace)) + elif key == "CLEAR": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_clr)) + elif key == "SHIFT": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=shiftkey_png)) + elif key == "SPACE": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_space)) + elif key == "OK": + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_ok)) + #elif key == "<-": + # res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left)) + #elif key == "->": + # res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right)) + + else: + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_bg)) + res.append(MultiContentEntryText(pos=(x, 0), size=(45, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) + + if selectedKey == count: + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_sel)) + + x += 45 + count += 1 + + return res + + +class VirtualKeyBoard(Screen): + + def __init__(self, session, title="", text=""): + Screen.__init__(self, session) + self.keys_list = [] + self.shiftkeys_list = [] + self.lang = language.getLanguage() + if self.lang == 'de_DE': + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"", u"", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"@", u"", u"OK"]] + + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"", u"", u"'"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"OK"]] + + elif self.lang == 'es_ES': + #still missing keys (u"") + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"", u"", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"@", u"", u"", u"", u"", u"", u"", u"", u"", u"OK"]] + + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"", u"", u"'"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"", u"", u"", u"", u"", u"", u"", u"OK"]] + + elif self.lang in ['sv_SE', 'fi_FI']: + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"", u"", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"@", u"", u"", u"OK"]] + + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"", u"", u"'"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"", u"OK"]] + else: + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"+", u"@"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"#", u"\\"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"OK"]] + + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"'", u"?"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"OK"]] + + self.shiftMode = False + self.text = text + self.selectedKey = 0 + + self["header"] = Label(title) + self["text"] = Label(self.text) + self["list"] = VirtualKeyBoardList([]) + + self["actions"] = ActionMap(["OkCancelActions", "WizardActions", "ColorActions"], + { + "ok": self.okClicked, + "cancel": self.exit, + "left": self.left, + "right": self.right, + "up": self.up, + "down": self.down, + "red": self.backClicked, + "green": self.ok + }, -2) + + self.onLayoutFinish.append(self.buildVirtualKeyBoard) + + def buildVirtualKeyBoard(self, selectedKey=0): + list = [] + + if self.shiftMode: + self.k_list = self.shiftkeys_list + for keys in self.k_list: + if selectedKey < 12 and selectedKey > -1: + list.append(VirtualKeyBoardEntryComponent(keys, selectedKey,True)) + else: + list.append(VirtualKeyBoardEntryComponent(keys, -1,True)) + selectedKey -= 12 + else: + self.k_list = self.keys_list + for keys in self.k_list: + if selectedKey < 12 and selectedKey > -1: + list.append(VirtualKeyBoardEntryComponent(keys, selectedKey)) + else: + list.append(VirtualKeyBoardEntryComponent(keys, -1)) + selectedKey -= 12 + + self["list"].setList(list) + + + def backClicked(self): + self.text = self["text"].getText()[:-1] + self["text"].setText(self.text) + + def okClicked(self): + if self.shiftMode: + list = self.shiftkeys_list + else: + list = self.keys_list + + selectedKey = self.selectedKey + + for x in list: + if selectedKey < 12: + text = x[selectedKey] + break + else: + selectedKey -= 12 + + text = text.encode("utf-8") + + if text == "EXIT": + self.close(None) + + elif text == "BACKSPACE": + self.text = self["text"].getText()[:-1] + self["text"].setText(self.text) + + elif text == "CLEAR": + self.text = "" + self["text"].setText(self.text) + + elif text == "SHIFT": + if self.shiftMode: + self.shiftMode = False + else: + self.shiftMode = True + + self.buildVirtualKeyBoard(self.selectedKey) + + elif text == "SPACE": + self.text += " " + self["text"].setText(self.text) + + elif text == "OK": + self.close(self["text"].getText()) + + else: + self.text = self["text"].getText() + self.text += text + self["text"].setText(self.text) + + def ok(self): + self.close(self["text"].getText()) + + def exit(self): + self.close(None) + + def left(self): + self.selectedKey -= 1 + + if self.selectedKey == -1: + self.selectedKey = 11 + elif self.selectedKey == 11: + self.selectedKey = 23 + elif self.selectedKey == 23: + self.selectedKey = 35 + elif self.selectedKey == 35: + self.selectedKey = 47 + elif self.selectedKey == 47: + self.selectedKey = 59 + + self.showActiveKey() + + def right(self): + self.selectedKey += 1 + + if self.selectedKey == 12: + self.selectedKey = 0 + elif self.selectedKey == 24: + self.selectedKey = 12 + elif self.selectedKey == 36: + self.selectedKey = 24 + elif self.selectedKey == 48: + self.selectedKey = 36 + elif self.selectedKey == 60: + self.selectedKey = 48 + + self.showActiveKey() + + def up(self): + self.selectedKey -= 12 + + if self.selectedKey < 0: + self.selectedKey += 60 + + self.showActiveKey() + + def down(self): + self.selectedKey += 12 + + if self.selectedKey > 59: + self.selectedKey -= 60 + + self.showActiveKey() + + def showActiveKey(self): + self.buildVirtualKeyBoard(self.selectedKey) -- cgit v1.2.3 From bae21e629bb99a0be7194d22eb4b7c25ea1646a9 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 5 Nov 2008 09:00:27 +0100 Subject: don't crash when background jobs fail and user presses red key --- lib/python/Components/Task.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index f249f711..b276438f 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -265,6 +265,7 @@ class JobManager: from Tools import Notifications if self.in_background: from Screens.TaskView import JobView + self.in_background = False Notifications.AddNotification(JobView, self.active_job) if problems: from Screens.MessageBox import MessageBox -- cgit v1.2.3 From d14da9c99de7d25b8811292e53cc745e30594234 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Wed, 5 Nov 2008 17:25:52 +0100 Subject: allow setting progress for current task from within resident task, implement rudimentary progress for mplextask in dvdburn (requires dvdauthor patch) --- lib/python/Components/Task.py | 12 ++++--- lib/python/Plugins/Extensions/DVDBurn/Process.py | 45 ++++++++++++++---------- 2 files changed, 33 insertions(+), 24 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index b276438f..9a768425 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -45,6 +45,7 @@ class Job(object): def addTask(self, task): task.job = self + task.task_progress_changed = self.task_progress_changed_CB self.tasks.append(task) def start(self, callback): @@ -70,7 +71,7 @@ class Job(object): else: print "still waiting for %d resident task(s) %s to finish" % (len(self.resident_tasks), str(self.resident_tasks)) else: - self.tasks[self.current_task].run(self.taskCallback, self.task_progress_changed_CB) + self.tasks[self.current_task].run(self.taskCallback) self.state_changed() def taskCallback(self, task, res, stay_resident = False): @@ -151,7 +152,7 @@ class Task(object): not_met.append(precondition) return not_met - def run(self, callback, task_progress_changed): + def run(self, callback): failed_preconditions = self.checkPreconditions(True) + self.checkPreconditions(False) if len(failed_preconditions): callback(self, failed_preconditions) @@ -159,7 +160,6 @@ class Task(object): self.prepare() self.callback = callback - self.task_progress_changed = task_progress_changed from enigma import eConsoleAppContainer self.container = eConsoleAppContainer() self.container.appClosed.append(self.processFinished) @@ -235,7 +235,8 @@ class Task(object): if progress < 0: progress = 0 self.__progress = progress - self.task_progress_changed() + if self.task_progress_changed: + self.task_progress_changed() progress = property(getProgress, setProgress) @@ -372,7 +373,8 @@ class ToolExistsPrecondition(Condition): return _("A required tool (%s) was not found.") % (self.realpath) class AbortedPostcondition(Condition): - pass + def getErrorMessage(self, task): + return "Cancelled upon user request" class ReturncodePostcondition(Condition): def check(self, task): diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 9cca8f70..49054596 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -10,8 +10,8 @@ class png2yuvTask(Task): self.dumpFile = outputfile self.weighting = 15 - def run(self, callback, task_progress_changed): - Task.run(self, callback, task_progress_changed) + def run(self, callback): + Task.run(self, callback) self.container.stdoutAvail.remove(self.processStdout) self.container.dumpToFile(self.dumpFile) @@ -26,8 +26,8 @@ class mpeg2encTask(Task): self.inputFile = inputfile self.weighting = 25 - def run(self, callback, task_progress_changed): - Task.run(self, callback, task_progress_changed) + def run(self, callback): + Task.run(self, callback) self.container.readFromFile(self.inputFile) def processOutputLine(self, line): @@ -42,8 +42,8 @@ class spumuxTask(Task): self.dumpFile = outputfile self.weighting = 15 - def run(self, callback, task_progress_changed): - Task.run(self, callback, task_progress_changed) + def run(self, callback): + Task.run(self, callback) self.container.stdoutAvail.remove(self.processStdout) self.container.dumpToFile(self.dumpFile) self.container.readFromFile(self.inputFile) @@ -212,7 +212,7 @@ class RemoveESFiles(Task): class DVDAuthorTask(Task): def __init__(self, job): Task.__init__(self, job, "Authoring DVD") - self.weighting = 300 + self.weighting = 20 self.setTool("/usr/bin/dvdauthor") self.CWD = self.job.workspace self.args += ["-x", self.job.workspace+"/dvdauthor.xml"] @@ -222,6 +222,14 @@ class DVDAuthorTask(Task): print "[DVDAuthorTask] ", line[:-1] if not self.menupreview and line.startswith("STAT: Processing"): self.callback(self, [], stay_resident=True) + elif line.startswith("STAT: VOBU"): + try: + progress = int(line.split("MB")[0].split(" ")[-1]) + if progress: + self.job.mplextask.progress = progress + print "[DVDAuthorTask] update mplextask progress:", self.job.mplextask.progress, "of", self.job.mplextask.end + except: + print "couldn't set mux progress" class DVDAuthorFinalTask(Task): def __init__(self, job): @@ -233,7 +241,7 @@ class WaitForResidentTasks(Task): def __init__(self, job): Task.__init__(self, job, "waiting for dvdauthor to finalize") - def run(self, callback, task_progress_changed): + def run(self, callback): print "waiting for %d resident task(s) %s to finish..." % (len(self.job.resident_tasks),str(self.job.resident_tasks)) if self.job.resident_tasks == 0: callback(self, []) @@ -334,23 +342,24 @@ class RemoveDVDFolder(Task): class CheckDiskspaceTask(Task): def __init__(self, job): Task.__init__(self, job, "Checking free space") - totalsize = 50*1024*1024 # require an extra safety 50 MB + totalsize = 0 # require an extra safety 50 MB maxsize = 0 for title in job.project.titles: titlesize = title.estimatedDiskspace if titlesize > maxsize: maxsize = titlesize totalsize += titlesize diskSpaceNeeded = totalsize + maxsize + job.estimateddvdsize = totalsize / 1024 / 1024 + totalsize += 50*1024*1024 # require an extra safety 50 MB self.global_preconditions.append(DiskspacePrecondition(diskSpaceNeeded)) self.weighting = 5 - def run(self, callback, task_progress_changed): + def run(self, callback): failed_preconditions = self.checkPreconditions(True) + self.checkPreconditions(False) if len(failed_preconditions): callback(self, failed_preconditions) return self.callback = callback - self.task_progress_changed = task_progress_changed Task.processFinished(self, 0) class PreviewTask(Task): @@ -361,9 +370,8 @@ class PreviewTask(Task): self.path = path self.weighting = 10 - def run(self, callback, task_progress_changed): + def run(self, callback): self.callback = callback - self.task_progress_changed = task_progress_changed if self.job.menupreview: self.previewProject() else: @@ -439,9 +447,8 @@ class ImagePrepareTask(Task): self.job = job self.Menus = job.Menus - def run(self, callback, task_progress_changed): + def run(self, callback): self.callback = callback - self.task_progress_changed = task_progress_changed # we are doing it this weird way so that the TaskView Screen actually pops up before the spinner comes from enigma import eTimer self.delayTimer = eTimer() @@ -451,7 +458,7 @@ class ImagePrepareTask(Task): def conduct(self): try: from ImageFont import truetype - from Image import open as Image_open + from Image import open as Image_open s = self.job.project.settings self.Menus.im_bg_orig = Image_open(s.menubg.getValue()) if self.Menus.im_bg_orig.size != (self.Menus.imgwidth, self.Menus.imgheight): @@ -475,9 +482,8 @@ class MenuImageTask(Task): self.menubgpngfilename = menubgpngfilename self.highlightpngfilename = highlightpngfilename - def run(self, callback, task_progress_changed): + def run(self, callback): self.callback = callback - self.task_progress_changed = task_progress_changed try: import ImageDraw, Image, os s = self.job.project.settings @@ -712,7 +718,8 @@ class DVDJob(Job): title_filename = self.workspace + "/dvd_title_%d.mpg" % (self.i+1) LinkTS(self, title.inputfile, link_name) demux = DemuxTask(self, link_name) - MplexTask(self, outputfile=title_filename, demux_task=demux) + self.mplextask = MplexTask(self, outputfile=title_filename, demux_task=demux) + self.mplextask.end = self.estimateddvdsize RemoveESFiles(self, demux) WaitForResidentTasks(self) PreviewTask(self, self.workspace + "/dvd/VIDEO_TS/") -- cgit v1.2.3 From 040e658a3f89783e0030392110e87cc992264cdd Mon Sep 17 00:00:00 2001 From: Mladen Horvat Date: Wed, 5 Nov 2008 20:22:38 +0100 Subject: some fixes B A A --- lib/python/Components/Network.py | 5 ++ lib/python/Screens/NetworkSetup.py | 102 ++++++++++++++++++++++++------------- 2 files changed, 73 insertions(+), 34 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index e10c6a0e..8e9fc120 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -20,6 +20,7 @@ class Network: self.deactivateConsole = Console() self.activateConsole = Console() self.resetNetworkConsole = Console() + self.DnsConsole = Console() self.getInterfaces() def getInterfaces(self, callback = None): @@ -445,6 +446,10 @@ class Network: if self.LinkConsole is not None: self.LinkConsole = None + def stopDNSConsole(self): + if self.DnsConsole is not None: + self.DnsConsole = None + def stopRestartConsole(self): if self.restartConsole is not None: self.restartConsole = None diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index c26302fa..6ace1857 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -770,7 +770,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): ifobj = Wireless(self.iface) # a Wireless NIC Object self.wlanresponse = ifobj.getStatistics() if self.wlanresponse[0] != 19: - self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface) + self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) else: # Display Wlan not available Message self.showErrorMessage() @@ -830,19 +830,14 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): if self.iface == 'wlan0' or self.iface == 'ath0': try: - from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan - w = Wlan(self.iface) - stats = w.getStatus() - if stats['BSSID'] == "00:00:00:00:00:00": - self["statuspic"].setPixmapNum(1) - else: - self["statuspic"].setPixmapNum(0) - self["statuspic"].show() + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status except: self["statuspic"].setPixmapNum(1) self["statuspic"].show() + else: + iStatus.getDataForInterface(self.iface,self.getInfoCB) else: - self.getLinkState(self.iface) + iNetwork.getLinkState(self.iface,self.dataAvail) def doNothing(self): pass @@ -894,7 +889,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): ifobj = Wireless(self.iface) # a Wireless NIC Object self.wlanresponse = ifobj.getStatistics() if self.wlanresponse[0] != 19: - self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface) + self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) else: # Display Wlan not available Message self.showErrorMessage() @@ -907,6 +902,14 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self["menulist"].l.setList(self.mainmenu) iNetwork.getInterfaces(self.updateStatusbar) + def WlanStatusClosed(self, *ret): + if ret is not None and len(ret): + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + iStatus.stopWlanConsole() + self.mainmenu = self.genMainMenu() + self["menulist"].l.setList(self.mainmenu) + iNetwork.getInterfaces(self.updateStatusbar) + def WlanScanClosed(self,*ret): if ret[0] is not None: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1]) @@ -930,18 +933,15 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): if data is True: self.session.open(MessageBox, _("Finished restarting your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False) - def getLinkState(self,iface): - iNetwork.getLinkState(iface,self.dataAvail) - def dataAvail(self,data): self.output = data.strip() result = self.output.split('\n') pattern = re_compile("Link detected: yes") for item in result: if re_search(pattern, item): - self["statuspic"].setPixmapNum(0) - else: self["statuspic"].setPixmapNum(1) + else: + self["statuspic"].setPixmapNum(0) self["statuspic"].show() def showErrorMessage(self): @@ -949,7 +949,27 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() - + try: + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + except ImportError: + pass + else: + iStatus.stopWlanConsole() + + def getInfoCB(self,data,status): + print "im getInfoCB" + if data is not None: + if data is True: + if status is not None: + print "im getInfoCB status" + print "acesspoint",status[self.iface]["acesspoint"] + if status[self.iface]["acesspoint"] == "No Connection" or status[self.iface]["acesspoint"] == "Not-Associated" or status[self.iface]["acesspoint"] == False: + print "setting statuspix 1" + self["statuspic"].setPixmapNum(1) + else: + self["statuspic"].setPixmapNum(0) + print "setting statuspix 0" + self["statuspic"].show() class NetworkAdapterTest(Screen): def __init__(self, session,iface): @@ -958,6 +978,8 @@ class NetworkAdapterTest(Screen): self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") iNetwork.getInterfaces() self.setLabels() + self.onClose.append(self.cleanup) + self.onHide.append(self.cleanup) self["updown_actions"] = NumberActionMap(["WizardActions","ShortcutActions"], { @@ -1115,6 +1137,7 @@ class NetworkAdapterTest(Screen): def doStep3(self): self["Networktext"].setForegroundColorNum(1) + self["Network"].setText(_("Please wait...")) self.getLinkState(self.iface) self["NetworkInfo_Text"].setForegroundColorNum(1) self.steptimer = True @@ -1287,24 +1310,14 @@ class NetworkAdapterTest(Screen): def getLinkState(self,iface): if iface == 'wlan0' or iface == 'ath0': try: - from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan - w = Wlan(iface) - stats = w.getStatus() - if stats['BSSID'] == "00:00:00:00:00:00": - self["Network"].setForegroundColorNum(1) - self["Network"].setText(_("disconnected")) - self["NetworkInfo_Check"].setPixmapNum(1) - self["NetworkInfo_Check"].show() - else: - self["Network"].setForegroundColorNum(2) - self["Network"].setText(_("connected")) - self["NetworkInfo_Check"].setPixmapNum(0) - self["NetworkInfo_Check"].show() + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status except: self["Network"].setForegroundColorNum(1) self["Network"].setText(_("disconnected")) self["NetworkInfo_Check"].setPixmapNum(1) self["NetworkInfo_Check"].show() + else: + iStatus.getDataForInterface(self.iface,self.getInfoCB) else: iNetwork.getLinkState(iface,self.LinkStatedataAvail) @@ -1324,7 +1337,6 @@ class NetworkAdapterTest(Screen): self["NetworkInfo_Check"].show() def NetworkStatedataAvail(self,data): - print "DATA",data if data <= 2: self["IP"].setForegroundColorNum(2) self["IP"].setText(_("confirmed")) @@ -1339,7 +1351,6 @@ class NetworkAdapterTest(Screen): self.nextStepTimer.start(3000) def DNSLookupdataAvail(self,data): - print "DATA",data if data <= 2: self["DNS"].setForegroundColorNum(2) self["DNS"].setText(_("confirmed")) @@ -1362,5 +1373,28 @@ class NetworkAdapterTest(Screen): self["shortcutsyellow"].setEnabled(False) self["updown_actions"].setEnabled(True) self.activebutton = 6 - - \ No newline at end of file + + def getInfoCB(self,data,status): + if data is not None: + if data is True: + if status is not None: + if status[self.iface]["acesspoint"] == "No Connection" or status[self.iface]["acesspoint"] == "Not-Associated" or status[self.iface]["acesspoint"] == False: + self["Network"].setForegroundColorNum(1) + self["Network"].setText(_("disconnected")) + self["NetworkInfo_Check"].setPixmapNum(1) + self["NetworkInfo_Check"].show() + else: + self["Network"].setForegroundColorNum(2) + self["Network"].setText(_("connected")) + self["NetworkInfo_Check"].setPixmapNum(0) + self["NetworkInfo_Check"].show() + + def cleanup(self): + iNetwork.stopLinkStateConsole() + iNetwork.stopDNSConsole() + try: + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + except ImportError: + pass + else: + iStatus.stopWlanConsole() \ No newline at end of file -- cgit v1.2.3 From 85acd407a2cc4029270d904fdc12643f00fea1de Mon Sep 17 00:00:00 2001 From: acid-burn Date: Thu, 6 Nov 2008 11:06:45 +0100 Subject: better netmask parsing --- lib/python/Components/Network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 8e9fc120..e317ef05 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -74,7 +74,7 @@ class Network: macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) - netmaskLinePattern = re_compile('/' + netRegexp + ' brd ') + netmaskLinePattern = re_compile(ipRegexp + '/' + netRegexp) netmaskPattern = re_compile(netRegexp) bcastLinePattern = re_compile(' brd ' + ipRegexp) upPattern = re_compile('UP') -- cgit v1.2.3 From 56253715ea1292610ad7fc802a533a99304af8cb Mon Sep 17 00:00:00 2001 From: acid-burn Date: Thu, 6 Nov 2008 14:48:51 +0100 Subject: better async handling dont open adaptersetup after wlanscan close, only open on connect inside wlanscan some cleanups and fixes --- lib/python/Components/Network.py | 31 ++++++++++++++++------------ lib/python/Screens/NetworkSetup.py | 42 ++++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 28 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index e317ef05..c41469da 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -18,6 +18,7 @@ class Network: self.LinkConsole = Console() self.restartConsole = Console() self.deactivateConsole = Console() + self.deactivateInterfaceConsole = Console() self.activateConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() @@ -74,7 +75,7 @@ class Network: macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) - netmaskLinePattern = re_compile(ipRegexp + '/' + netRegexp) + netmaskLinePattern = re_compile('/' + netRegexp) netmaskPattern = re_compile(netRegexp) bcastLinePattern = re_compile(' brd ' + ipRegexp) upPattern = re_compile('UP') @@ -412,7 +413,7 @@ class Network: if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) - def restartNetwork(self,callback): + def restartNetwork(self,callback = None): self.restartConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") @@ -427,8 +428,8 @@ class Network: self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self,extra_args): - callback = extra_args - if len(self.restartConsole.appContainers) == 0: + ( callback ) = extra_args + if callback is not None: callback(True) def getLinkState(self,iface,callback): @@ -454,12 +455,13 @@ class Network: if self.restartConsole is not None: self.restartConsole = None - def RestartConsoleRunning(self): - if self.restartConsole is not None: - if len(self.restartConsole.appContainers) == 0: - return False - else: - return True + def stopGetInterfacesConsole(self): + if self.Console is not None: + self.Console = None + + def stopDeactivateInterfaceConsole(self): + if self.deactivateInterfaceConsole: + self.deactivateInterfaceConsole = None def checkforInterface(self,iface): if self.getAdapterAttribute(iface, 'up') is True: @@ -492,17 +494,20 @@ class Network: if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) - def deactivateInterface(self,iface): + def deactivateInterface(self,iface,callback = None): self.deactivateInterfaceConsole = Console() self.commands = [] cmd1 = "ip addr flush " + iface cmd2 = "ifconfig " + iface + " down" self.commands.append(cmd1) self.commands.append(cmd2) - self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, extra_args = None, debug=True) + self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, callback, debug=True) def deactivateInterfaceFinished(self,extra_args): - pass + callback = extra_args + if len(self.deactivateInterfaceConsole.appContainers) == 0: + if callback is not None: + callback(True) def detectWlanModule(self): self.wlanmodule = None diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index 619db4e1..887e1674 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -285,13 +285,12 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.finished_cb = None self.oktext = _("Press OK on your remote control to continue.") self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") - #iNetwork.getInterfaces() self.createConfig() self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { - "cancel": (self.close, _("exit networkadapter setup menu")), + "cancel": (self.cancel, _("exit networkadapter setup menu")), "ok": (self.ok, _("select menu entry")), }) @@ -413,7 +412,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.aps = self.w.getNetworkList() if self.aps is not None: print "[NetworkSetup.py] got Accespoints!" - #print self.aps for ap in self.aps: a = self.aps[ap] if a['active']: @@ -638,17 +636,26 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.applyConfig(True) def ConfigfinishedCB(self,data): - if data is True: - self.close('ok') + if data is not None: + if data is True: + self.close('ok') def cancel(self): - iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState) - self.activateInterfaceEntry.value = self.oldInterfaceState - if self.activateInterfaceEntry.value is False: - iNetwork.deactivateInterface(self.iface) - iNetwork.getInterfaces() - self.close('cancel') + if self.oldInterfaceState is False: + iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB) + else: + self.close('cancel') + def deactivateInterfaceCB(self,data): + if data is not None: + if data is True: + iNetwork.getInterfaces(self.cancelCB) + + def cancelCB(self,data): + if data is not None: + if data is True: + self.close('cancel') + def runAsync(self, finished_cb): self.finished_cb = finished_cb self.ok() @@ -663,7 +670,8 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() - iNetwork.stopRestartConsole() + iNetwork.stopDeactivateInterfaceConsole() + class AdapterSetupConfiguration(Screen, HelpableScreen): def __init__(self, session,iface): @@ -722,7 +730,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): iNetwork.getInterfaces(self.updateStatusbar) self.onLayoutFinish.append(self.layoutFinished) self.onClose.append(self.cleanup) - self.onHide.append(self.cleanup) def ok(self): if self["menulist"].getCurrent()[1] == 'edit': @@ -914,8 +921,12 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): if ret[0] is not None: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1]) else: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,None,None) - + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + iStatus.stopWlanConsole() + self.mainmenu = self.genMainMenu() + self["menulist"].l.setList(self.mainmenu) + iNetwork.getInterfaces(self.updateStatusbar) + def restartLan(self, ret = False): if (ret == True): iNetwork.restartNetwork(self.restartLanDataAvail) @@ -949,6 +960,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() + iNetwork.stopDeactivateInterfaceConsole() try: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status except ImportError: -- cgit v1.2.3 From e0e7cf8fbfac3bfbf577b7c76c3b9d461a2854ee Mon Sep 17 00:00:00 2001 From: acid-burn Date: Thu, 6 Nov 2008 21:26:23 +0100 Subject: fix Dreambox Keyboard Numberinput inside ConfigIP --- lib/python/Components/config.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) mode change 100644 => 100755 lib/python/Components/config.py (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py old mode 100644 new mode 100755 index b448ca6d..c21a9192 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -513,6 +513,7 @@ class ConfigIP(ConfigSequence): self.auto_jump = auto_jump def handleKey(self, key): + if key == KEY_LEFT: if self.marked_block > 0: self.marked_block -= 1 @@ -531,8 +532,14 @@ class ConfigIP(ConfigSequence): self.marked_block = len(self.limits)-1 self.overwrite = True - if key in KEY_NUMBERS: - number = getKeyNumber(key) + if key in KEY_NUMBERS or key == KEY_ASCII: + if key == KEY_ASCII: + code = getPrevAsciiCode() + if code < 48 or code > 57: + return + number = code - 48 + else: + number = getKeyNumber(key) oldvalue = self._value[self.marked_block] if self.overwrite: -- cgit v1.2.3 From be71c7f9fddf86a831914bc5096a1339d331d91d Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Fri, 7 Nov 2008 08:40:20 +0100 Subject: parse #EXTINT title info from m3u playlists --- lib/python/Components/Playlist.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Playlist.py b/lib/python/Components/Playlist.py index 744ee3af..c9ebe479 100644 --- a/lib/python/Components/Playlist.py +++ b/lib/python/Components/Playlist.py @@ -58,6 +58,7 @@ class PlaylistIOM3U(PlaylistIO): def open(self, filename): self.clear() + self.displayname = None try: file = open(filename, "r") except IOError: @@ -66,14 +67,22 @@ class PlaylistIOM3U(PlaylistIO): entry = file.readline().strip() if entry == "": break - if entry[0] != "#": + if entry.startswith("#EXTINF:"): + extinf = entry.split(',',1) + if len(extinf) > 1: + self.displayname = extinf[1] # TODO: use e2 facilities to create a service ref from file + elif entry[0] != "#": if entry[0] == "/": - self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry)) + sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry) elif entry.startswith("http"): - self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry.replace(':',"%3a"))) + sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry.replace(':',"%3a")) else: - self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + os.path.dirname(filename) + "/" + entry)) + sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + os.path.dirname(filename) + "/" + entry) + if self.displayname: + sref.ref.setName(self.displayname) + self.displayname = None + self.addService(sref) file.close() return self.list -- cgit v1.2.3 From 8c5e8f7163867e2e8bfc07784904dc14a9ebaa86 Mon Sep 17 00:00:00 2001 From: Fraxinas Date: Fri, 7 Nov 2008 08:58:21 +0100 Subject: move selection index on EOS (this will scroll through playlist instead of always displaying the uppermost page) --- lib/python/Components/MediaPlayer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/MediaPlayer.py b/lib/python/Components/MediaPlayer.py index 791274fc..87ba977c 100644 --- a/lib/python/Components/MediaPlayer.py +++ b/lib/python/Components/MediaPlayer.py @@ -40,7 +40,7 @@ def PlaylistEntryComponent(serviceref, state): if png is not None: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 16, 16, png)) - + return res class PlayList(MenuList): @@ -76,6 +76,7 @@ class PlayList(MenuList): def setCurrentPlaying(self, index): self.oldCurrPlaying = self.currPlaying self.currPlaying = index + self.moveToIndex(index) def updateState(self, state): if len(self.list) > self.oldCurrPlaying and self.oldCurrPlaying != -1: -- cgit v1.2.3 From a90424c0dc460b587898b65f6a89a564399ab551 Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 7 Nov 2008 20:35:57 +0100 Subject: fix non working invert of oled display add non working standby slider in display setup --- lib/gdi/lcd.cpp | 8 +++++++- lib/python/Components/Lcd.py | 10 ++++++---- lib/python/Components/config.py | 5 +++++ 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp index 39117194..ecc19b53 100644 --- a/lib/gdi/lcd.cpp +++ b/lib/gdi/lcd.cpp @@ -166,8 +166,14 @@ void eDBoxLCD::update() memset(raw, 0, 64*64); for (y=0; y<64; y++) { + int pix=0; for (x=0; x<128 / 2; x++) - raw[y*64+x] = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4); + { + pix = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4); + if (inverted) + pix = 0xFF - pix; + raw[y*64+x] = pix; + } } if (lcdfd >= 0) write(lcdfd, raw, 64*64); diff --git a/lib/python/Components/Lcd.py b/lib/python/Components/Lcd.py index 0471843c..0e501237 100644 --- a/lib/python/Components/Lcd.py +++ b/lib/python/Components/Lcd.py @@ -44,9 +44,14 @@ def InitLcd(): ilcd = LCD() - config.lcd.bright = ConfigSlider(default=10, limits=(0, 10)) + config.lcd.standby = ConfigSlider(default=0, limits=(0, 10)) + config.lcd.standby.addNotifier(setLCDbright); + config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby) + + config.lcd.bright = ConfigSlider(default=5, limits=(0, 10)) config.lcd.bright.addNotifier(setLCDbright); config.lcd.bright.apply = lambda : setLCDbright(config.lcd.bright) + config.lcd.bright.callNotifiersOnSaveAndCancel = True if not ilcd.isOled(): config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20)) @@ -54,9 +59,6 @@ def InitLcd(): else: config.lcd.contrast = ConfigNothing() - config.lcd.standby = ConfigSlider(default=0, limits=(0, 10)) - config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby) - config.lcd.invert = ConfigYesNo(default=False) config.lcd.invert.addNotifier(setLCDinverted); else: diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index c21a9192..4ddcabec 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -34,6 +34,7 @@ class ConfigElement(object): self.save_disabled = False self.notifiers = [] self.enabled = True + self.callNotifiersOnSaveAndCancel = False # you need to override this to do input validation def setValue(self, value): @@ -66,9 +67,13 @@ class ConfigElement(object): self.saved_value = None else: self.saved_value = self.tostring(self.value) + if self.callNotifiersOnSaveAndCancel: + self.changed() def cancel(self): self.load() + if self.callNotifiersOnSaveAndCancel: + self.changed() def isChanged(self): sv = self.saved_value -- cgit v1.2.3 From 68182033644faf17e06f10d1b98a128b5e3a7058 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 8 Nov 2008 00:18:59 +0100 Subject: fix TimerSanityCheck for Service Groups (Alternatives) dont care about tuner slot num in Timersanity Check fix wrong timersanitycheck result in some cases (Bug: unknown Conflict) --- Navigation.py | 4 +-- lib/python/Components/TimerSanityCheck.py | 54 +++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 19 deletions(-) (limited to 'lib/python/Components') diff --git a/Navigation.py b/Navigation.py index bda6f584..42733cb2 100644 --- a/Navigation.py +++ b/Navigation.py @@ -79,14 +79,14 @@ class Navigation: def getCurrentlyPlayingServiceReference(self): return self.currentlyPlayingServiceReference - def recordService(self, ref): + def recordService(self, ref, simulate=False): service = None print "recording service: %s" % (str(ref)) if isinstance(ref, ServiceReference.ServiceReference): ref = ref.ref if ref: if ref.flags & eServiceReference.isGroup: - ref = getBestPlayableServiceReference(ref, eServiceReference()) + ref = getBestPlayableServiceReference(ref, eServiceReference(), simulate) service = ref and self.pnav and self.pnav.recordService(ref) if service is None: print "record returned non-zero" diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py index e793cdcd..031c9cae 100644 --- a/lib/python/Components/TimerSanityCheck.py +++ b/lib/python/Components/TimerSanityCheck.py @@ -1,9 +1,7 @@ -import string import NavigationInstance from time import localtime -from Components.NimManager import nimmanager from ServiceReference import ServiceReference -from enigma import iServiceInformation, eServiceCenter +from enigma import iServiceInformation, eServiceCenter, eServiceReference class TimerSanityCheck: def __init__(self, timerlist, newtimer=None): @@ -54,6 +52,7 @@ class TimerSanityCheck: # index -1 for the new Timer, 0..n index of the existing timers # count of running timers + serviceHandler = eServiceCenter.getInstance() print "checkTimerlist" # create a list with all start and end times # split it into recurring and singleshot timers @@ -149,9 +148,7 @@ class TimerSanityCheck: fakeRecList = [] ConflictTimer = None ConflictTunerType = None - ConflictSlot = None newTimerTunerType = None - newTimerTunerSlot = None cnt = 0 idx = 0 overlaplist = [] @@ -162,24 +159,45 @@ class TimerSanityCheck: else: timer = self.timerlist[event[2]] if event[1] == self.bflag: - fakeRecService = NavigationInstance.instance.recordService(timer.service_ref) - fakeRecResult = fakeRecService.start(True) - feinfo = fakeRecService.frontendInfo().getFrontendData() - tunerType = feinfo.get("tuner_type") - tunerSlot = feinfo.get("tuner_number") + tunerType = [ ] + fakeRecService = NavigationInstance.instance.recordService(timer.service_ref, True) + if fakeRecService: + fakeRecResult = fakeRecService.start(True) + else: + fakeRecResult = -1 + if not fakeRecResult: # tune okay + feinfo = fakeRecService.frontendInfo().getFrontendData() + tunerType.append(feinfo.get("tuner_type")) + else: # tune failed.. so we must go another way to get service type (DVB-S, DVB-T, DVB-C) + + def getServiceType(ref): # helper function to get a service type of a service reference + serviceInfo = serviceHandler.info(ref) + serviceInfo = serviceInfo and serviceInfo.getInfoObject(ref, iServiceInformation.sTransponderData) + if serviceInfo: + return { "Satellite" : "DVB-S", "Cable" : "DVB-C", "Terrestrial" : "DVB-T"}[serviceInfo["type"]] + + ref = timer.service_ref.ref + if ref.flags & eServiceReference.isGroup: # service group ? + serviceList = serviceHandler.list(ref) # get all alternative services + if serviceList: + for ref in serviceList.getContent("R"): # iterate over all group service references + type = getServiceType(ref) + if not type in tunerType: # just add single time + tunerType.append(type) + else: + tunerType.append(getServiceType(ref)) + if event[2] == -1: # new timer newTimerTunerType = tunerType - newTimerTunerSlot = tunerSlot - overlaplist.append((fakeRecResult, timer, tunerType, tunerSlot)) + overlaplist.append((fakeRecResult, timer, tunerType)) fakeRecList.append((timer, fakeRecService)) if fakeRecResult: if ConflictTimer is None: # just take care of the first conflict ConflictTimer = timer ConflictTunerType = tunerType - ConflictTunerSlot = tunerSlot elif event[1] == self.eflag: for fakeRec in fakeRecList: - if timer == fakeRec[0]: + if timer == fakeRec[0] and fakeRec[1]: NavigationInstance.instance.stopRecordService(fakeRec[1]) fakeRecList.remove(fakeRec) del fakeRec @@ -211,7 +229,6 @@ class TimerSanityCheck: if nt and kt: ConflictTimer = self.newtimer ConflictTunerType = newTimerTunerType - ConflictSlot = newTimerTunerSlot break self.simultimer = [ ConflictTimer ] @@ -223,8 +240,11 @@ class TimerSanityCheck: else: continue for entry in event[4]: - if not self.simultimer.count(entry[1]) and (entry[2] == ConflictTunerType or entry[3] == ConflictTunerSlot): - self.simultimer.append(entry[1]) + if not entry[1] in self.simultimer: + for x in entry[2]: + if x in ConflictTunerType: + self.simultimer.append(entry[1]) + break if len(self.simultimer) < 2: print "Bug: unknown Conflict!" -- cgit v1.2.3 From 2aa5cf5a1bfe64fbb1ef6b082920c82ff927007a Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 8 Nov 2008 00:23:39 +0100 Subject: fix rotor input current measurement default value for dm8000 --- lib/python/Components/NimManager.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 3c7a147e..434ab4aa 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -1,3 +1,5 @@ +from Tools.HardwareInfo import HardwareInfo + from config import config, ConfigSubsection, ConfigSelection, ConfigFloat, \ ConfigSatlist, ConfigYesNo, ConfigInteger, ConfigSubList, ConfigNothing, \ ConfigSubDict, ConfigOnOff, ConfigDateTime @@ -153,6 +155,7 @@ class SecConfigure: for slot in nim_slots: x = slot.slot nim = slot.config + hw = HardwareInfo() if slot.isCompatible("DVB-S"): print "slot: " + str(x) + " configmode: " + str(nim.configMode.value) if nim.configMode.value in [ "loopthrough", "satposdepends", "nothing" ]: @@ -185,7 +188,7 @@ class SecConfigure: loValue = rotorParam.EAST else: loValue = rotorParam.WEST - inputPowerDelta=50 + inputPowerDelta=hw.get_device_name() == "dm8000" and 50 or 15 useInputPower=False turning_speed=0 if nim.powerMeasurement.value: @@ -842,6 +845,7 @@ def InitSecParams(): def InitNimManager(nimmgr): InitSecParams() + hw = HardwareInfo() config.Nims = ConfigSubList() for x in range(len(nimmgr.nim_slots)): @@ -972,7 +976,7 @@ def InitNimManager(nimmgr): nim.advanced.lnb[x].latitude = ConfigFloat(default = [50,767], limits = [(0,359),(0,999)]) nim.advanced.lnb[x].latitudeOrientation = ConfigSelection(choices = [("north", _("North")), ("south", _("South"))], default = "north") nim.advanced.lnb[x].powerMeasurement = ConfigYesNo(default=True) - nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=50, limits=(0, 100)) + nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100)) nim.advanced.lnb[x].turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch"))], default = "fast") btime = datetime(1970, 1, 1, 7, 0); nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600) -- cgit v1.2.3 From cb725de8216cb61d0a889b3a6a7651619161ef08 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 8 Nov 2008 00:28:33 +0100 Subject: 15 <-> 50 --- lib/python/Components/NimManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 434ab4aa..1ee8dddd 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -188,7 +188,7 @@ class SecConfigure: loValue = rotorParam.EAST else: loValue = rotorParam.WEST - inputPowerDelta=hw.get_device_name() == "dm8000" and 50 or 15 + inputPowerDelta=hw.get_device_name() == "dm8000" and 15 or 50 useInputPower=False turning_speed=0 if nim.powerMeasurement.value: -- cgit v1.2.3 From d3a03446578d5cf77ea3f2128aa3aeee434a23b8 Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 8 Nov 2008 00:52:00 +0100 Subject: fix typos --- lib/python/Components/NimManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 1ee8dddd..3c1fe455 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -659,7 +659,7 @@ class NimManager: def canEqualTo(self, slotid): type = self.getNimType(slotid) - if self.getNimConfig(slotid) == "DVB-S2": + if type == "DVB-S2": type = "DVB-S" nimList = self.getNimListOfType(type, slotid) for nim in nimList[:]: @@ -667,10 +667,10 @@ class NimManager: if mode.configMode.value == "loopthrough" or mode.configMode.value == "satposdepends": nimList.remove(nim) return nimList - + def canDependOn(self, slotid): type = self.getNimType(slotid) - if self.getNimConfig(slotid) == "DVB-S2": + if type == "DVB-S2": type = "DVB-S" nimList = self.getNimListOfType(type, slotid) positionerList = [] -- cgit v1.2.3 From ae5651346d0b371a89287365003466fef729b72a Mon Sep 17 00:00:00 2001 From: ghost Date: Sat, 8 Nov 2008 01:01:18 +0100 Subject: add possibility to select "second cable of motorized LNB" also when the rotor is configured in advanced mode --- lib/python/Components/NimManager.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 3c1fe455..32fca47f 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -683,6 +683,13 @@ class NimManager: if lnb != 0: nimHaveRotor = True break + if not nimHaveRotor: + for sat in mode.advanced.sat.values(): + lnb_num = int(sat.lnb.value) + diseqcmode = lnb_num and mode.advanced.lnb[lnb_num].diseqcMode.value or "" + if diseqcmode == "1_2": + nimHaveRotor = True + break if nimHaveRotor: alreadyConnected = False for testnim in nimList: -- cgit v1.2.3 From c138841fc86578cb4344a305cc2ca7e0f7fd4ca8 Mon Sep 17 00:00:00 2001 From: acid-burn Date: Mon, 10 Nov 2008 16:15:44 +0100 Subject: remove unneeded calls to iNetwork.getinterfaces cleanups fix typo --- lib/python/Components/Network.py | 7 ++++--- lib/python/Screens/NetworkSetup.py | 21 +++++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index c41469da..7cc61d84 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -505,9 +505,10 @@ class Network: def deactivateInterfaceFinished(self,extra_args): callback = extra_args - if len(self.deactivateInterfaceConsole.appContainers) == 0: - if callback is not None: - callback(True) + if self.deactivateInterfaceConsole: + if len(self.deactivateInterfaceConsole.appContainers) == 0: + if callback is not None: + callback(True) def detectWlanModule(self): self.wlanmodule = None diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index 580673e4..6bfe54ad 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -90,7 +90,6 @@ class NetworkAdapterSelection(Screen,HelpableScreen): self.onClose.append(self.cleanup) def updateList(self): - iNetwork.getInterfaces() self.list = [] default_gw = None num_configured_if = len(iNetwork.getConfiguredAdapters()) @@ -290,7 +289,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.finished_cb = None self.oktext = _("Press OK on your remote control to continue.") self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") - + self.createConfig() self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", @@ -675,8 +674,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() - iNetwork.stopDeactivateInterfaceConsole() - + class AdapterSetupConfiguration(Screen, HelpableScreen): def __init__(self, session,iface): @@ -732,7 +730,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): "right": self.right, }, -2) - iNetwork.getInterfaces(self.updateStatusbar) + self.updateStatusbar() self.onLayoutFinish.append(self.layoutFinished) self.onClose.append(self.cleanup) @@ -908,11 +906,11 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): else: self.mainmenu = self.genMainMenu() self["menulist"].l.setList(self.mainmenu) - iNetwork.getInterfaces(self.updateStatusbar) + self.updateStatusbar() else: self.mainmenu = self.genMainMenu() self["menulist"].l.setList(self.mainmenu) - iNetwork.getInterfaces(self.updateStatusbar) + self.updateStatusbar() def WlanStatusClosed(self, *ret): if ret is not None and len(ret): @@ -920,7 +918,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): iStatus.stopWlanConsole() self.mainmenu = self.genMainMenu() self["menulist"].l.setList(self.mainmenu) - iNetwork.getInterfaces(self.updateStatusbar) + self.updateStatusbar() def WlanScanClosed(self,*ret): if ret[0] is not None: @@ -930,7 +928,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): iStatus.stopWlanConsole() self.mainmenu = self.genMainMenu() self["menulist"].l.setList(self.mainmenu) - iNetwork.getInterfaces(self.updateStatusbar) + self.updateStatusbar() def restartLan(self, ret = False): if (ret == True): @@ -955,9 +953,9 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): pattern = re_compile("Link detected: yes") for item in result: if re_search(pattern, item): - self["statuspic"].setPixmapNum(1) - else: self["statuspic"].setPixmapNum(0) + else: + self["statuspic"].setPixmapNum(1) self["statuspic"].show() def showErrorMessage(self): @@ -988,7 +986,6 @@ class NetworkAdapterTest(Screen): Screen.__init__(self, session) self.iface = iface self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") - iNetwork.getInterfaces() self.setLabels() self.onClose.append(self.cleanup) self.onHide.append(self.cleanup) -- cgit v1.2.3 From b0e31efd2aca2cb7774f031e2d23e0e4d0668dbc Mon Sep 17 00:00:00 2001 From: ghost Date: Tue, 11 Nov 2008 19:12:46 +0100 Subject: change default input power current for dm8000 (for rotor turning) --- lib/python/Components/NimManager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 32fca47f..e1d3b068 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -188,12 +188,11 @@ class SecConfigure: loValue = rotorParam.EAST else: loValue = rotorParam.WEST - inputPowerDelta=hw.get_device_name() == "dm8000" and 15 or 50 + inputPowerDelta=nim.powerThreshold.value useInputPower=False turning_speed=0 if nim.powerMeasurement.value: useInputPower=True - inputPowerDelta=nim.powerThreshold.value turn_speed_dict = { "fast": rotorParam.FAST, "slow": rotorParam.SLOW } if turn_speed_dict.has_key(nim.turningSpeed.value): turning_speed = turn_speed_dict[nim.turningSpeed.value] @@ -908,7 +907,7 @@ def InitNimManager(nimmgr): nim.latitude = ConfigFloat(default=[50,767], limits=[(0,359),(0,999)]) nim.latitudeOrientation = ConfigSelection(choices={"north": _("North"), "south": _("South")}, default="north") nim.powerMeasurement = ConfigYesNo(default=True) - nim.powerThreshold = ConfigInteger(default=50, limits=(0, 100)) + nim.powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100)) nim.turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch")) ], default = "fast") btime = datetime(1970, 1, 1, 7, 0); nim.fastTurningBegin = ConfigDateTime(default = mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 900) -- cgit v1.2.3 From 4eb0a9517110f531d15184ea155ccf3176f7d854 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 12 Nov 2008 15:02:53 +0100 Subject: add possibility to set diseqc inputs to "nothing connected" --- lib/python/Components/NimManager.py | 10 +++++----- lib/python/Screens/Satconfig.py | 13 +++++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index e1d3b068..41925aeb 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -40,7 +40,7 @@ class SecConfigure: self.configuredSatellites.add(orbpos) def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50): - if orbpos is None: + if orbpos is None or orbpos == 3601: return #simple defaults sec.addLNB() @@ -893,10 +893,10 @@ def InitNimManager(nimmgr): if id != x: choices.append((str(id), nimmgr.getNimDescription(id))) nim.connectedTo = ConfigSelection(choices = choices) - nim.diseqcA = getConfigSatlist(192, nimmgr.satList) - nim.diseqcB = getConfigSatlist(130, nimmgr.satList) - nim.diseqcC = ConfigSatlist(list = nimmgr.satList) - nim.diseqcD = ConfigSatlist(list = nimmgr.satList) + nim.diseqcA = getConfigSatlist(192, [(3601, _('nothing connected'), 1)] + nimmgr.satList) + nim.diseqcB = getConfigSatlist(130, [(3601, _('nothing connected'), 1)] + nimmgr.satList) + nim.diseqcC = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList) + nim.diseqcD = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList) nim.positionerMode = ConfigSelection( choices = [ ("usals", _("USALS")), diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index ccb776ea..6dc9f416 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -407,12 +407,17 @@ class NimSelection(Screen): text = _("nothing connected") elif nimConfig.configMode.value == "simple": if nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - text = _("Sats") + ": " + nimmanager.getSatName(int(nimConfig.diseqcA.value)) + text = _("Sats") + ": " + if nimConfig.diseqcA.orbital_position != 3601: + text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) if nimConfig.diseqcMode.value in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) + if nimConfig.diseqcB.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": - text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) - text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) + if nimConfig.diseqcC.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) + if nimConfig.diseqcD.orbital_position != 3601: + text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) elif nimConfig.diseqcMode.value == "positioner": text = _("Positioner") + ":" if nimConfig.positionerMode.value == "usals": -- cgit v1.2.3 From 47c0f019cb4e1a0c70e497b17c214f1dc851c7ce Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 12 Nov 2008 16:34:46 +0100 Subject: more flexible diseqc / sat config --- lib/python/Components/NimManager.py | 38 ++++++++++++++++++++++++++----------- lib/python/Screens/Satconfig.py | 17 +++++++++++------ po/ar.po | 2 +- po/ca.po | 4 ++-- po/cs.po | 4 ++-- po/da.po | 4 ++-- po/de.po | 4 ++-- po/el.po | 4 ++-- po/en.po | 2 +- po/enigma2.pot | 2 +- po/es.po | 4 ++-- po/fi.po | 4 ++-- po/fr.po | 4 ++-- po/hr.po | 4 ++-- po/hu.po | 4 ++-- po/is.po | 4 ++-- po/it.po | 4 ++-- po/lt.po | 4 ++-- po/nl.po | 4 ++-- po/no.po | 4 ++-- po/pl.po | 4 ++-- po/pt.po | 4 ++-- po/ru.po | 4 ++-- po/sv.po | 4 ++-- po/tr.po | 4 ++-- 25 files changed, 81 insertions(+), 60 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 41925aeb..17297e67 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -39,7 +39,7 @@ class SecConfigure: sec.addSatellite(orbpos) self.configuredSatellites.add(orbpos) - def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50): + def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True): if orbpos is None or orbpos == 3601: return #simple defaults @@ -56,10 +56,16 @@ class SecConfigure: sec.setLNBThreshold(11700000) sec.setLNBIncreasedVoltage(lnbParam.OFF) sec.setRepeats(0) - sec.setFastDiSEqC(0) + sec.setFastDiSEqC(fastDiSEqC) sec.setSeqRepeat(0) - sec.setVoltageMode(switchParam.HV) - sec.setToneMode(switchParam.HILO) + + if setVoltageTone: + sec.setVoltageMode(switchParam.HV) + sec.setToneMode(switchParam.HILO) + else: + sec.setVoltageMode(switchParam._14V) + sec.setToneMode(switchParam.OFF) + sec.setCommandOrder(0) #user values @@ -167,18 +173,25 @@ class SecConfigure: elif nim.configMode.value == "simple": #simple config print "diseqcmode: ", nim.diseqcMode.value if nim.diseqcMode.value == "single": #single - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO) + if nim.simpleSingleSendDiSEqC.value: + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA) + else: + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO) elif nim.diseqcMode.value == "toneburst_a_b": #Toneburst A/B self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO) elif nim.diseqcMode.value == "diseqc_a_b": #DiSEqC A/B - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB) + fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value + setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) elif nim.diseqcMode.value == "diseqc_a_b_c_d": #DiSEqC A/B/C/D - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA) - self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB) + fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value + setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) + self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone) elif nim.diseqcMode.value == "positioner": #Positioner if nim.latitudeOrientation.value == "north": laValue = rotorParam.NORTH @@ -893,6 +906,9 @@ def InitNimManager(nimmgr): if id != x: choices.append((str(id), nimmgr.getNimDescription(id))) nim.connectedTo = ConfigSelection(choices = choices) + nim.simpleSingleSendDiSEqC = ConfigYesNo(default=False) + nim.simpleDiSEqCSetVoltageTone = ConfigYesNo(default=True) + nim.simpleDiSEqCOnlyOnSatChange = ConfigYesNo(default=False) nim.diseqcA = getConfigSatlist(192, [(3601, _('nothing connected'), 1)] + nimmgr.satList) nim.diseqcB = getConfigSatlist(130, [(3601, _('nothing connected'), 1)] + nimmgr.satList) nim.diseqcC = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList) diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 6dc9f416..6489f28f 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -14,16 +14,21 @@ from datetime import datetime class NimSetup(Screen, ConfigListScreen): def createSimpleSetup(self, list, mode): + nim = self.nimConfig if mode == "single": - list.append(getConfigListEntry(_("Satellite"), self.nimConfig.diseqcA)) + list.append(getConfigListEntry(_("Satellite"), nim.diseqcA)) + list.append(getConfigListEntry(_("Send DiSEqC"), nim.simpleSingleSendDiSEqC)) else: - list.append(getConfigListEntry(_("Port A"), self.nimConfig.diseqcA)) + list.append(getConfigListEntry(_("Port A"), nim.diseqcA)) if mode in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - list.append(getConfigListEntry(_("Port B"), self.nimConfig.diseqcB)) + list.append(getConfigListEntry(_("Port B"), nim.diseqcB)) if mode == "diseqc_a_b_c_d": - list.append(getConfigListEntry(_("Port C"), self.nimConfig.diseqcC)) - list.append(getConfigListEntry(_("Port D"), self.nimConfig.diseqcD)) + list.append(getConfigListEntry(_("Port C"), nim.diseqcC)) + list.append(getConfigListEntry(_("Port D"), nim.diseqcD)) + if mode != "toneburst_a_b": + list.append(getConfigListEntry(_("Set Voltage and 22KHz"), nim.simpleDiSEqCSetVoltageTone)) + list.append(getConfigListEntry(_("Send DiSEqC only on satellite change"), nim.simpleDiSEqCOnlyOnSatChange)) def createPositionerSetup(self, list): nim = self.nimConfig @@ -88,7 +93,7 @@ class NimSetup(Screen, ConfigListScreen): self.list.append(self.configMode) if self.nimConfig.configMode.value == "simple": #simple setup - self.diseqcModeEntry = getConfigListEntry(_("DiSEqC Mode"), self.nimConfig.diseqcMode) + self.diseqcModeEntry = getConfigListEntry(_("Mode"), self.nimConfig.diseqcMode) self.list.append(self.diseqcModeEntry) if self.nimConfig.diseqcMode.value in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: self.createSimpleSetup(self.list, self.nimConfig.diseqcMode.value) diff --git a/po/ar.po b/po/ar.po index 0c9f0248..7ff6583e 100755 --- a/po/ar.po +++ b/po/ar.po @@ -820,7 +820,7 @@ msgstr "دايزك أ/ب" msgid "DiSEqC A/B/C/D" msgstr "دايزك أ/ب/ج/د" -msgid "DiSEqC Mode" +msgid "Mode" msgstr "وضع الدايزك" msgid "DiSEqC mode" diff --git a/po/ca.po b/po/ca.po index 331ebe3c..7935a925 100755 --- a/po/ca.po +++ b/po/ca.po @@ -851,8 +851,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "Mode DiSEqC" +msgid "Mode" +msgstr "Mode" msgid "DiSEqC mode" msgstr "mode DiSEqC" diff --git a/po/cs.po b/po/cs.po index 1638798b..711b8204 100755 --- a/po/cs.po +++ b/po/cs.po @@ -840,8 +840,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Mód" +msgid "Mode" +msgstr "Mód" msgid "DiSEqC mode" msgstr "DiSEqC Mód" diff --git a/po/da.po b/po/da.po index 55016cd8..c4d8a941 100755 --- a/po/da.po +++ b/po/da.po @@ -849,8 +849,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Type" +msgid "Mode" +msgstr "Type" msgid "DiSEqC mode" msgstr "DiSEqC type" diff --git a/po/de.po b/po/de.po index e5f33eec..e506fd97 100755 --- a/po/de.po +++ b/po/de.po @@ -879,8 +879,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC-Modus" +msgid "Mode" +msgstr "Modus" msgid "DiSEqC mode" msgstr "DiSEqC-Modus" diff --git a/po/el.po b/po/el.po index 3053587f..322659a8 100755 --- a/po/el.po +++ b/po/el.po @@ -841,8 +841,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Mode" +msgid "Mode" +msgstr "Mode" msgid "DiSEqC mode" msgstr "DiSEqC mode" diff --git a/po/en.po b/po/en.po index daff3168..a6b3fd61 100644 --- a/po/en.po +++ b/po/en.po @@ -815,7 +815,7 @@ msgstr "" msgid "DiSEqC A/B/C/D" msgstr "" -msgid "DiSEqC Mode" +msgid "Mode" msgstr "" msgid "DiSEqC mode" diff --git a/po/enigma2.pot b/po/enigma2.pot index 375931bd..9c131a79 100644 --- a/po/enigma2.pot +++ b/po/enigma2.pot @@ -783,7 +783,7 @@ msgid "DiSEqC A/B/C/D" msgstr "" #: ../lib/python/Screens/Satconfig.py:74 -msgid "DiSEqC Mode" +msgid "Mode" msgstr "" #: ../lib/python/Screens/Satconfig.py:180 diff --git a/po/es.po b/po/es.po index 59a83032..1e42b605 100644 --- a/po/es.po +++ b/po/es.po @@ -856,8 +856,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "Modo DiSEqC" +msgid "Mode" +msgstr "Modo" msgid "DiSEqC mode" msgstr "Modo DiSEqC" diff --git a/po/fi.po b/po/fi.po index 19a3ddd9..4f9e0234 100755 --- a/po/fi.po +++ b/po/fi.po @@ -854,8 +854,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC-tila" +msgid "Mode" +msgstr "Tila" msgid "DiSEqC mode" msgstr "DiSEqC-tila" diff --git a/po/fr.po b/po/fr.po index b71e1ce1..885e305a 100644 --- a/po/fr.po +++ b/po/fr.po @@ -854,8 +854,8 @@ msgstr "" msgid "DiSEqC A/B/C/D" msgstr "" -msgid "DiSEqC Mode" -msgstr "Mode DiSEqC" +msgid "Mode" +msgstr "Mode" msgid "DiSEqC mode" msgstr "Mode DiSEqC" diff --git a/po/hr.po b/po/hr.po index 26b554f3..e051eea6 100755 --- a/po/hr.po +++ b/po/hr.po @@ -840,8 +840,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Mod" +msgid "Mode" +msgstr "Mod" msgid "DiSEqC mode" msgstr "DiSEqC mod" diff --git a/po/hu.po b/po/hu.po index 345f90b4..098761c1 100755 --- a/po/hu.po +++ b/po/hu.po @@ -852,8 +852,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC mód" +msgid "Mode" +msgstr "Mód" msgid "DiSEqC mode" msgstr "DiSEqC mód" diff --git a/po/is.po b/po/is.po index 71e0d6d3..facb2468 100755 --- a/po/is.po +++ b/po/is.po @@ -848,8 +848,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Gerð" +msgid "Mode" +msgstr "Gerð" msgid "DiSEqC mode" msgstr "DiSEqC gerð" diff --git a/po/it.po b/po/it.po index 0b1bde29..b81e982c 100755 --- a/po/it.po +++ b/po/it.po @@ -847,8 +847,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "Modalità DiSEqc" +msgid "Mode" +msgstr "Modalit" msgid "DiSEqC mode" msgstr "Modalità DiSEqC" diff --git a/po/lt.po b/po/lt.po index 2cdc4f79..61714a9a 100755 --- a/po/lt.po +++ b/po/lt.po @@ -856,8 +856,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC pasirinkimas" +msgid "Mode" +msgstr "Pasirinkimas" msgid "DiSEqC mode" msgstr "DiSEqC pasirinkimas" diff --git a/po/nl.po b/po/nl.po index e63e24b5..8627e0f0 100644 --- a/po/nl.po +++ b/po/nl.po @@ -861,8 +861,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC-modus" +msgid "Mode" +msgstr "Modus" msgid "DiSEqC mode" msgstr "DiSEqC-modus" diff --git a/po/no.po b/po/no.po index a16e0884..520816f4 100755 --- a/po/no.po +++ b/po/no.po @@ -844,8 +844,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC-Modus" +msgid "Mode" +msgstr "Modus" msgid "DiSEqC mode" msgstr "DiSEqC-Modus" diff --git a/po/pl.po b/po/pl.po index eef53bc4..b3332c12 100755 --- a/po/pl.po +++ b/po/pl.po @@ -851,8 +851,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "Tryb DiSEqC" +msgid "Mode" +msgstr "Tryb" msgid "DiSEqC mode" msgstr "Tryb DiSEqC" diff --git a/po/pt.po b/po/pt.po index d37a8e87..72df8b21 100755 --- a/po/pt.po +++ b/po/pt.po @@ -847,8 +847,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "Modo DiSEqC" +msgid "Mode" +msgstr "Modo" msgid "DiSEqC mode" msgstr "Modo DiSEqC" diff --git a/po/ru.po b/po/ru.po index d5c8fff9..2407e7dc 100755 --- a/po/ru.po +++ b/po/ru.po @@ -823,8 +823,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC-режим" +msgid "Mode" +msgstr "режим" msgid "DiSEqC mode" msgstr "DiSEqC-режим" diff --git a/po/sv.po b/po/sv.po index 8f8cb010..1474d7f0 100644 --- a/po/sv.po +++ b/po/sv.po @@ -868,8 +868,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Läge" +msgid "Mode" +msgstr "Läge" msgid "DiSEqC mode" msgstr "DiSEqC läge" diff --git a/po/tr.po b/po/tr.po index aa9ffc7d..720e17ba 100644 --- a/po/tr.po +++ b/po/tr.po @@ -866,8 +866,8 @@ msgstr "DiSEqC A/B" msgid "DiSEqC A/B/C/D" msgstr "DiSEqC A/B/C/D" -msgid "DiSEqC Mode" -msgstr "DiSEqC Modu" +msgid "Mode" +msgstr "Modu" msgid "DiSEqC mode" msgstr "DiSEqC modu" -- cgit v1.2.3 From 47c5768da94377e1cea40a3d45a2e6f0cc9dafb6 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 12 Nov 2008 22:48:04 +0100 Subject: NimManager.py: fix service searching with simple config --- lib/python/Components/NimManager.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 17297e67..0290ff6d 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -747,12 +747,16 @@ class NimManager: if configMode == "simple": dm = nim.diseqcMode.value if dm in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - list.append(self.satList[nim.diseqcA.index]) + if nim.diseqcA.orbital_position != 3601: + list.append(self.satList[nim.diseqcA.index-1]) if dm in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]: - list.append(self.satList[nim.diseqcB.index]) + if nim.diseqcB.orbital_position != 3601: + list.append(self.satList[nim.diseqcB.index-1]) if dm == "diseqc_a_b_c_d": - list.append(self.satList[nim.diseqcC.index]) - list.append(self.satList[nim.diseqcD.index]) + if nim.diseqcC.orbital_position != 3601: + list.append(self.satList[nim.diseqcC.index-1]) + if nim.diseqcD.orbital_position != 3601: + list.append(self.satList[nim.diseqcD.index-1]) if dm == "positioner": for x in self.satList: list.append(x) -- cgit v1.2.3 From 4f3fcdfda1657e35deb3759173024e3b478a4b15 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 12 Nov 2008 23:39:25 +0100 Subject: when passing a broken utf-8 string, ignore characters. fixes #55. --- lib/python/Components/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 4ddcabec..4d57bbb9 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -782,12 +782,12 @@ class ConfigText(ConfigElement, NumericalTextInput): def getValue(self): return self.text.encode("utf-8") - + def setValue(self, val): try: self.text = val.decode("utf-8") except UnicodeDecodeError: - self.text = val + self.text = val.decode("utf-8", "ignore") print "Broken UTF8!" value = property(getValue, setValue) -- cgit v1.2.3 From 549ebaf137cabfbe9b9c3c346011c7d6241e7655 Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 13 Nov 2008 11:50:50 +0100 Subject: NimManager.py: fix non working option "Set Voltage and 22KHz" --- lib/python/Components/NimManager.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 0290ff6d..7060168e 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -58,14 +58,6 @@ class SecConfigure: sec.setRepeats(0) sec.setFastDiSEqC(fastDiSEqC) sec.setSeqRepeat(0) - - if setVoltageTone: - sec.setVoltageMode(switchParam.HV) - sec.setToneMode(switchParam.HILO) - else: - sec.setVoltageMode(switchParam._14V) - sec.setToneMode(switchParam.OFF) - sec.setCommandOrder(0) #user values @@ -77,6 +69,12 @@ class SecConfigure: if 0 <= diseqcmode < 3: self.addSatellite(sec, orbpos) + if setVoltageTone: + sec.setVoltageMode(switchParam.HV) + sec.setToneMode(switchParam.HILO) + else: + sec.setVoltageMode(switchParam._14V) + sec.setToneMode(switchParam.OFF) elif (diseqcmode == 3): # diseqc 1.2 if self.satposdepends.has_key(slotid): for slot in self.satposdepends[slotid]: -- cgit v1.2.3 From 58163e18dce8d07d32500c8b24e616518e40710b Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 13 Nov 2008 13:32:15 +0100 Subject: add possibility to change delay after diseqc reset command and delay after diseqc peripherial poweron command via satellite equipment control plugin --- lib/dvb/sec.cpp | 4 ++-- lib/dvb/sec.h | 2 ++ lib/python/Components/NimManager.py | 8 ++++++++ .../Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 2a6016e0..2b7f717b 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -637,11 +637,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA diseqc.data[2] = 0; // diseqc reset sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_RESET_CMD]) ); diseqc.data[2] = 3; // diseqc peripherial powersupply on sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 150) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD]) ); } for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat) diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h index 42e53ebe..e68ed167 100644 --- a/lib/dvb/sec.h +++ b/lib/dvb/sec.h @@ -267,6 +267,8 @@ public: MOTOR_COMMAND_RETRIES, // max transmit tries of rotor command when the rotor dont start turning (with power measurement) MOTOR_RUNNING_TIMEOUT, // max motor running time before timeout DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS, // delay after change voltage before transmit toneburst/diseqc + DELAY_AFTER_DISEQC_RESET_CMD, + DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD, MAX_PARAMS }; private: diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 7060168e..f4e91083 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -858,6 +858,14 @@ def InitSecParams(): x.addNotifier(lambda configElement: secClass.setParam(secClass.MOTOR_COMMAND_RETRIES, configElement.value)) config.sec.motor_command_retries = x + x = ConfigInteger(default=50, limits = (0, 9999)) + x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_DISEQC_RESET_CMD, configElement.value)) + config.sec.delay_after_diseqc_reset_cmd = x + + x = ConfigInteger(default=150, limits = (0, 9999)) + x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD, configElement.value)) + config.sec.delay_after_diseqc_peripherial_poweron_cmd = x + # TODO add support for satpos depending nims to advanced nim configuration # so a second/third/fourth cable from a motorized lnb can used behind a # diseqc 1.0 / diseqc 1.1 / toneburst switch diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py index 7b3d08f6..ec223d3e 100644 --- a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py @@ -23,6 +23,8 @@ class SecParameterSetup(Screen, ConfigListScreen): Screen.__init__(self, session) list = [ + ("Delay after diseqc reset command", config.sec.delay_after_diseqc_reset_cmd), + ("Delay after diseqc peripherial poweron command", config.sec.delay_after_diseqc_peripherial_poweron_cmd), ("Delay after continuous tone change", config.sec.delay_after_continuous_tone_change), ("Delay after last voltage change", config.sec.delay_after_final_voltage_change), ("Delay between diseqc commands", config.sec.delay_between_diseqc_repeats), -- cgit v1.2.3 From 6933710b3eab806151f6352d3b1a228fb72a3e96 Mon Sep 17 00:00:00 2001 From: acid-burn Date: Fri, 14 Nov 2008 08:24:36 +0100 Subject: small skin fix fix possible crash when leaving networksetup --- data/skin_default.xml | 4 ++-- lib/python/Components/Network.py | 1 + lib/python/Screens/NetworkSetup.py | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/python/Components') diff --git a/data/skin_default.xml b/data/skin_default.xml index 41a7e4c9..993fd320 100755 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -37,13 +37,13 @@ - + - + diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 7cc61d84..53b487d5 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -63,6 +63,7 @@ class Network: def getDataForInterface(self, iface,callback): #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. + self.Console = Console() cmd = "ip -o addr" self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index 588a46ff..32e2dafd 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -174,6 +174,7 @@ class NetworkAdapterSelection(Screen,HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() iNetwork.stopRestartConsole() + iNetwork.stopGetInterfacesConsole() def restartLan(self): iNetwork.restartNetwork(self.restartLanDataAvail) -- cgit v1.2.3 From 3efc0ecb3b3d250b2ccc13fb1b2bcad06efb1aa4 Mon Sep 17 00:00:00 2001 From: acid-burn Date: Fri, 14 Nov 2008 12:26:44 +0100 Subject: dont start self.console twice --- lib/python/Components/Network.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'lib/python/Components') diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 53b487d5..f32a648c 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -63,7 +63,8 @@ class Network: def getDataForInterface(self, iface,callback): #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. - self.Console = Console() + if not self.Console: + self.Console = Console() cmd = "ip -o addr" self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) @@ -213,15 +214,16 @@ class Network: for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] - if len(self.Console.appContainers) == 0: - # save configured interfacelist - self.configuredNetworkAdapters = self.configuredInterfaces - # load ns only once - self.loadNameserverConfig() - print "read configured interfac:", ifaces - print "self.ifaces after loading:", self.ifaces - if callback is not None: - callback(True) + if self.Console: + if len(self.Console.appContainers) == 0: + # save configured interfacelist + self.configuredNetworkAdapters = self.configuredInterfaces + # load ns only once + self.loadNameserverConfig() + print "read configured interfac:", ifaces + print "self.ifaces after loading:", self.ifaces + if callback is not None: + callback(True) def loadNameserverConfig(self): ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" -- cgit v1.2.3 From e2d09fa1a9f91993f11a546a85ff41ccfd9f72ce Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 16 Nov 2008 23:24:15 +0100 Subject: add ukrainian (uk) language --- data/countries/ua.png | Bin 0 -> 1257 bytes lib/python/Components/Language.py | 1 + po/Makefile.am | 2 +- po/uk.po | 4863 +++++++++++++++++++++++++++++++++++++ 4 files changed, 4865 insertions(+), 1 deletion(-) create mode 100644 data/countries/ua.png create mode 100644 po/uk.po (limited to 'lib/python/Components') diff --git a/data/countries/ua.png b/data/countries/ua.png new file mode 100644 index 00000000..fa8751ee Binary files /dev/null and b/data/countries/ua.png differ diff --git a/lib/python/Components/Language.py b/lib/python/Components/Language.py index acb50e51..6d1e31f3 100644 --- a/lib/python/Components/Language.py +++ b/lib/python/Components/Language.py @@ -35,6 +35,7 @@ class Language: self.addLanguage(_("Spanish"), "es", "ES") self.addLanguage(_("Swedish"), "sv", "SE") self.addLanguage(_("Turkish"), "tr", "TR") + self.addLanguage(_("Ukrainian"), "uk", "UA") self.callbacks = [] diff --git a/po/Makefile.am b/po/Makefile.am index 106cc9b7..02727930 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -5,7 +5,7 @@ GETTEXT=xgettext #MSGFMT = ./msgfmt.py MSGFMT = msgfmt -LANGS := de en ar nl es is it da sv no fr fi tr ca cs hr hu ru pt el lt pl +LANGS := de en ar nl es is it da sv no fr fi tr ca cs hr hu ru pt el lt pl uk LANGPO := $(foreach LANG, $(LANGS),$(LANG).po) LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo) diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 00000000..34a2998b --- /dev/null +++ b/po/uk.po @@ -0,0 +1,4863 @@ +# Ukrainian translations for tuxbox-enigma package. +# Copyright (C) 2005 THE tuxbox-enigma'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tuxbox-enigma package. +# Automatically generated, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: tuxbox-enigma 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-16 23:21+0100\n" +"PO-Revision-Date: 2008-09-28 14:03+0200\n" +"Last-Translator: stepan_kv \n" +"Language-Team: http://sat-ukraine.info/\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Ukrainian\n" +"X-Poedit-Country: UKRAINE\n" +"X-Poedit-SourceCharset: iso-8859-15\n" + +msgid " " +msgstr "" + +msgid "#000000" +msgstr "" + +msgid "#0064c7" +msgstr "" + +msgid "#25062748" +msgstr "" + +msgid "#389416" +msgstr "" + +msgid "#80000000" +msgstr "" + +msgid "#80ffffff" +msgstr "" + +msgid "#bab329" +msgstr "" + +msgid "#f23d21" +msgstr "" + +msgid "#ffffff" +msgstr "" + +msgid "#ffffffff" +msgstr "" + +msgid "%H:%M" +msgstr "%Г:%ХВ" + +#, python-format +msgid "%d jobs are running in the background!" +msgstr "" + +#, python-format +msgid "%d min" +msgstr "%d хвил." + +#, python-format +msgid "%d services found!" +msgstr "%d каналів знайдено!" + +msgid "%d.%B %Y" +msgstr "%d.%B %Y" + +#, python-format +msgid "" +"%s\n" +"(%s, %d MB free)" +msgstr "" +"%s\n" +"(%s, %d MB вільно)" + +#, python-format +msgid "%s (%s)\n" +msgstr "%s (%s)\n" + +msgid "(ZAP)" +msgstr "(Переключити)" + +msgid "(empty)" +msgstr "(пусто)" + +msgid "(show optional DVD audio menu)" +msgstr "(показати додаткове DVD аудіо меню)" + +msgid "* Only available if more than one interface is active." +msgstr "" + +msgid "* Only available when entering hidden SSID or network key" +msgstr "" + +msgid ".NFI Download failed:" +msgstr "" + +msgid ".NFI Flasher bootable USB stick successfully created." +msgstr "" + +msgid "" +".NFI file passed md5sum signature check. You can safely flash this image!" +msgstr "" + +msgid "/usr/share/enigma2 directory" +msgstr "директорія /usr/share/enigma2" + +msgid "/var directory" +msgstr "директорія /var" + +msgid "0" +msgstr "" + +msgid "1" +msgstr "" + +msgid "1.0" +msgstr "1.0" + +msgid "1.1" +msgstr "1.1" + +msgid "1.2" +msgstr "1.2" + +msgid "12V output" +msgstr "12V Вихід" + +msgid "13 V" +msgstr "13 V" + +msgid "16:10" +msgstr "" + +msgid "16:10 Letterbox" +msgstr "" + +msgid "16:10 PanScan" +msgstr "" + +msgid "16:9" +msgstr "16:9" + +msgid "16:9 Letterbox" +msgstr "" + +msgid "16:9 always" +msgstr "16:9 завжди" + +msgid "18 V" +msgstr "18 V" + +msgid "2" +msgstr "" + +msgid "3" +msgstr "" + +msgid "30 minutes" +msgstr "30 хвилин" + +msgid "4" +msgstr "" + +msgid "4:3" +msgstr "" + +msgid "4:3 Letterbox" +msgstr "" + +msgid "4:3 PanScan" +msgstr "" + +msgid "5" +msgstr "" + +msgid "5 minutes" +msgstr "5 хвилин" + +msgid "50 Hz" +msgstr "" + +msgid "6" +msgstr "" + +msgid "60 minutes" +msgstr "60 хвилин" + +msgid "7" +msgstr "" + +msgid "8" +msgstr "" + +msgid "9" +msgstr "" + +msgid "" +msgstr "<невідомий>" + +msgid "??" +msgstr "??" + +msgid "A" +msgstr "A" + +#, python-format +msgid "" +"A configuration file (%s) was modified since Installation.\n" +"Do you want to keep your version?" +msgstr "" +"Файл конфігурації (%s) був змінений від моменту інсталяції.\n" +"Бажаєте зберегти ці зміни?" + +msgid "" +"A finished record timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"Запис закінчено. Таймер переведе ваш Dreambox\n" +"в режим очікування. Зробити це?" + +msgid "" +"A finished record timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"Запис закінчено. Таймер зараз вимкне ваш\n" +"Dreamboxa. Зробити це?" + +msgid "A graphical EPG for all services of an specific bouquet" +msgstr "Графічний EPG для всіх каналів цього списку" + +#, python-format +msgid "" +"A record has been started:\n" +"%s" +msgstr "" +"Запис почався:\n" +"%s" + +msgid "" +"A recording is currently running.\n" +"What do you want to do?" +msgstr "" +"В даний час йде запис.\n" +"Що хочете зробити?" + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"configure the positioner." +msgstr "В даний час йде запис. Зупиніть запис перед налаштуванням позиціонера." + +msgid "" +"A recording is currently running. Please stop the recording before trying to " +"start the satfinder." +msgstr "В даний час йде запис. Зупиніть запис перед стартом satfinder'а." + +#, python-format +msgid "A required tool (%s) was not found." +msgstr "Потрібний інструмент (%s) не знайдено." + +msgid "" +"A sleep timer wants to set your\n" +"Dreambox to standby. Do that now?" +msgstr "" +"Таймер переведе ваш Dreambox\n" +"в режим очікування. Зробити це?" + +msgid "" +"A sleep timer wants to shut down\n" +"your Dreambox. Shutdown now?" +msgstr "" +"Таймер зараз вимкне\n" +"ваш Dreambox. Зробити це?" + +msgid "" +"A timer failed to record!\n" +"Disable TV and try again?\n" +msgstr "" +"Таймер не в змозі виконати запис!\n" +"Вибрати іншу TV-програму і спробувати знову?\n" + +msgid "A/V Settings" +msgstr "Аудіо/Відео налаштування" + +msgid "AA" +msgstr "AA" + +msgid "AB" +msgstr "AB" + +msgid "AC3 default" +msgstr "AC3 за замовчуванням" + +msgid "AC3 downmix" +msgstr "" + +msgid "AGC" +msgstr "" + +msgid "AGC:" +msgstr "AGC:" + +msgid "About" +msgstr "Інформація" + +msgid "About..." +msgstr "Інформація про Dreambox" + +msgid "Action on long powerbutton press" +msgstr "Дія при утримуванні кнопки вимкнення" + +msgid "Action:" +msgstr "Дія: " + +msgid "Activate Picture in Picture" +msgstr "Ввімкнути PiP" + +msgid "Activate network settings" +msgstr "Задіяти налаштування мережі" + +msgid "Adapter settings" +msgstr "Налаштування адаптера" + +msgid "Add" +msgstr "Додати" + +msgid "Add Bookmark" +msgstr "Закладка" + +msgid "Add a mark" +msgstr "Додати закладку" + +msgid "Add a new title" +msgstr "Додати нову назву" + +msgid "Add timer" +msgstr "Таймер" + +msgid "Add title" +msgstr "Додати назву" + +msgid "Add to bouquet" +msgstr "Додати до списку" + +msgid "Add to favourites" +msgstr "Додати до фаворитів" + +msgid "" +"Adjust the color settings so that all the color shades are distinguishable, " +"but appear as saturated as possible. If you are happy with the result, press " +"OK to close the video fine-tuning, or use the number keys to select other " +"test screens." +msgstr "" +"Налаштуйте параметри кольору так щоб всі відтінки були відображені, але щоб " +"залишались насиченими, настільки наскільки це можливо.Якщо результат вас " +"задовільняє, натисніть ОК, щоб вийти з налаштувань, або на цифрові кнопки " +"від 1 до 6, щоб вибрати інший тестовий екран." + +msgid "Advanced" +msgstr "Розширене" + +msgid "Advanced Video Setup" +msgstr "Розширене налаштування відео" + +msgid "After event" +msgstr "Після виконання" + +msgid "" +"After the start wizard is completed, you need to protect single services. " +"Refer to your dreambox's manual on how to do that." +msgstr "" +"Після завершення роботи помічника Ви можете встановити обмеження на деякі " +"сервіси. Як це зробити, Ви можете прочитати в інструкції. " + +msgid "Album:" +msgstr "Альбом:" + +msgid "All" +msgstr "Всі канали" + +msgid "All Satellites" +msgstr "" + +msgid "All..." +msgstr "Всі..." + +msgid "Alpha" +msgstr "Прозорість" + +msgid "Alternative radio mode" +msgstr "Альтернативний радіо режим" + +msgid "Alternative services tuner priority" +msgstr "Альтернативний приорітет налаштування сервісів" + +msgid "An empty filename is illegal." +msgstr "Пусте ім'я файлу є недопустимим." + +msgid "An unknown error occured!" +msgstr "Виникла невідома помилка!" + +msgid "Arabic" +msgstr "Арабський" + +msgid "" +"Are you sure you want to activate this network configuration?\n" +"\n" +msgstr "" + +msgid "" +"Are you sure you want to restart your network interfaces?\n" +"\n" +msgstr "" +"Ви впевнені, що хочете перезавантажити мережеві інтерфейси?\n" +"\n" + +msgid "Artist:" +msgstr "Артист:" + +msgid "Ask before shutdown:" +msgstr "Запитувати перед вимкненням:" + +msgid "Ask user" +msgstr "Запитувати користувача" + +msgid "Aspect Ratio" +msgstr "Співвідношення сторін:" + +msgid "Audio" +msgstr "Аудіо" + +msgid "Audio Options..." +msgstr "вибір аудіо-доріжки..." + +msgid "Authoring mode" +msgstr "Режим авторинга" + +msgid "Auto" +msgstr "Авто" + +msgid "Auto chapter split every ? minutes (0=never)" +msgstr "Автоматична розбивка на фрагмети через кожні ? хвилин (0=ні)" + +msgid "Auto scart switching" +msgstr "Авто переключення на скарт" + +msgid "Automatic" +msgstr "Автоматично" + +msgid "Automatic Scan" +msgstr "Автоматичний пошук" + +msgid "Available format variables" +msgstr "Доступні формати" + +msgid "B" +msgstr "B" + +msgid "BA" +msgstr "BA" + +msgid "BB" +msgstr "BB" + +msgid "BER" +msgstr "" + +msgid "BER:" +msgstr "BER:" + +msgid "Back" +msgstr "Назад" + +msgid "Background" +msgstr "" + +msgid "Backup" +msgstr "Копія" + +msgid "Backup Location" +msgstr "Місце збереження" + +msgid "Backup Mode" +msgstr "Режим збереження" + +msgid "Backup is done. Please press OK to see the result." +msgstr "Збережено. Натисніть ОК, щоб побачити результат." + +msgid "Band" +msgstr "Діапазон" + +msgid "Bandwidth" +msgstr "Ширина діапазону" + +msgid "Begin time" +msgstr "Час початку" + +msgid "Behavior of 'pause' when paused" +msgstr "Дія при натисканні на кнопку 'пауза'" + +msgid "Behavior of 0 key in PiP-mode" +msgstr "Дія при натискання на кнопку 0 в PiP-режимі" + +msgid "Behavior when a movie is started" +msgstr "Дія коли фільм почався" + +msgid "Behavior when a movie is stopped" +msgstr "Дія коли фільм закінчився" + +msgid "Behavior when a movie reaches the end" +msgstr "Дія коли фільм доходить до кінця" + +msgid "Bookmarks" +msgstr "Закладки" + +msgid "Brightness" +msgstr "Яскравість" + +msgid "Burn DVD" +msgstr "Записати DVD" + +msgid "Burn existing image to DVD" +msgstr "" + +msgid "Burn to DVD..." +msgstr "Запис на DVD..." + +msgid "Bus: " +msgstr "Шина:" + +msgid "" +"By pressing the OK Button on your remote control, the info bar is being " +"displayed." +msgstr "При натисканні на кнопку ОК буде відображено інфопанель." + +msgid "C" +msgstr "" + +msgid "C-Band" +msgstr "С-Діапазон" + +msgid "CF Drive" +msgstr "Карта CF" + +msgid "CVBS" +msgstr "CVBS" + +msgid "Cable" +msgstr "Кабель" + +msgid "Cache Thumbnails" +msgstr "Кешувати ескізи" + +msgid "Call monitoring" +msgstr "Монітор розмов" + +msgid "Cancel" +msgstr "Відмінити" + +msgid "Cannot parse feed directory" +msgstr "" + +msgid "Capacity: " +msgstr "Емність: " + +msgid "Card" +msgstr "Карта" + +msgid "Catalan" +msgstr "Каталонська" + +msgid "Change bouquets in quickzap" +msgstr "Автоматична зміна пакетів користувача" + +msgid "Change dir." +msgstr "" + +msgid "Change pin code" +msgstr "Змінити PIN-код" + +msgid "Change service pin" +msgstr "Змінити PIN-код каналу" + +msgid "Change service pins" +msgstr "Змінити PIN-код каналів" + +msgid "Change setup pin" +msgstr "Змінити PIN-код для налаштувань" + +msgid "Channel" +msgstr "Канал" + +msgid "Channel Selection" +msgstr "Вибір каналу" + +msgid "Channel:" +msgstr "Канал:" + +msgid "Channellist menu" +msgstr "Меню списку каналів" + +msgid "Chap." +msgstr "Kap." + +msgid "Chapter" +msgstr "Розд." + +msgid "Chapter:" +msgstr "Розділ" + +msgid "Check" +msgstr "Перевірити" + +msgid "Checking Filesystem..." +msgstr "Перевірка файлової системи..." + +msgid "Choose Tuner" +msgstr "Виберіть Тюнер" + +msgid "Choose bouquet" +msgstr "Виберіть список" + +msgid "Choose source" +msgstr "Виберіть джерело" + +msgid "Choose target folder" +msgstr "Виберіть кінцеву папку" + +msgid "Choose your Skin" +msgstr "Виберіть свою оболонку" + +msgid "Cleanup" +msgstr "Очистити" + +msgid "Clear before scan" +msgstr "Очистити перед пошуком" + +msgid "Clear log" +msgstr "Очистити лог" + +msgid "Close" +msgstr "Закрити" + +msgid "Code rate high" +msgstr "Швидкість кодування висока" + +msgid "Code rate low" +msgstr "Швидкість кодування низька" + +msgid "Coderate HP" +msgstr "Швидкість кодування HP" + +msgid "Coderate LP" +msgstr "Швидкість кодування LP" + +msgid "Collection name" +msgstr "Назва проекту" + +msgid "Collection settings" +msgstr "Налаштування проекту" + +msgid "Color Format" +msgstr "Формат кольору" + +msgid "Command execution..." +msgstr "Команда виконується..." + +msgid "Command order" +msgstr "Послідовність команд" + +msgid "Committed DiSEqC command" +msgstr "Команда переключення DiSEqC" + +msgid "Common Interface" +msgstr "CI-модуль" + +msgid "Compact Flash" +msgstr "Compact Flash" + +msgid "Compact flash card" +msgstr "Compact Flash карта" + +msgid "Complete" +msgstr "Виконано" + +msgid "Complex (allows mixing audio tracks and aspects)" +msgstr "" + +msgid "Configuration Mode" +msgstr "Режим конфігурації" + +msgid "Configuring" +msgstr "Конфігурування" + +msgid "Conflicting timer" +msgstr "Конфлікт таймера" + +msgid "Connected to" +msgstr "Під'єднано до" + +msgid "Connected to Fritz!Box!" +msgstr "Під'єднано до Fritz!Box!" + +msgid "Connecting to Fritz!Box..." +msgstr "Під'єднання до Fritz!Box..." + +#, python-format +msgid "" +"Connection to Fritz!Box\n" +"failed! (%s)\n" +"retrying..." +msgstr "" +"Під'єднання до Fritz!Box\n" +"невдале! (%s)\n" +"повторно..." + +msgid "Constellation" +msgstr "Сукупність" + +msgid "Content does not fit on DVD!" +msgstr "Інформація не поміститься на DVD!!" + +msgid "Continue in background" +msgstr "" + +msgid "Continue playing" +msgstr "Продовжити перегляд" + +msgid "Contrast" +msgstr "Контрастність" + +msgid "Copying USB flasher boot image to stick..." +msgstr "" + +msgid "Could not connect to Dreambox .NFI Image Feed Server:" +msgstr "" + +msgid "Could not load Medium! No disc inserted?" +msgstr "Неможливо визначити носій! DVD диск вставлений?" + +msgid "Create DVD-ISO" +msgstr "" + +msgid "Create movie folder failed" +msgstr "Створення папки невдале" + +#, python-format +msgid "Creating directory %s failed." +msgstr "Створення директорії %s невдале." + +msgid "Creating partition failed" +msgstr "Створення розділу невдале" + +msgid "Croatian" +msgstr "Хорватьска" + +msgid "Current Transponder" +msgstr "Поточний транспондер" + +msgid "Current settings:" +msgstr "Поточні налаштування:" + +msgid "Current version:" +msgstr "Актуальна версія:" + +msgid "Custom skip time for '1'/'3'-keys" +msgstr "Встановіть час пропущення ключів '1'/'3'" + +msgid "Custom skip time for '4'/'6'-keys" +msgstr "Встановіть час пропущення ключів '4'/'6'" + +msgid "Custom skip time for '7'/'9'-keys" +msgstr "Встановіть час пропущення ключів '7'/'9'" + +msgid "Customize" +msgstr "Додаткові налаштування" + +msgid "Cut" +msgstr "Вирізати" + +msgid "Cutlist editor..." +msgstr "Редактор..." + +msgid "Czech" +msgstr "Чешська" + +msgid "D" +msgstr "" + +msgid "DHCP" +msgstr "" + +msgid "DVB-S" +msgstr "DVB-S" + +msgid "DVB-S2" +msgstr "DVB-S2" + +msgid "DVD Player" +msgstr "DVD Програвач" + +msgid "DVD media toolbox" +msgstr "" + +msgid "Danish" +msgstr "Данська" + +msgid "Date" +msgstr "Дата" + +msgid "Decompressing USB stick flasher boot image..." +msgstr "" + +msgid "Deep Standby" +msgstr "Вимкнути Dreambox" + +msgid "Default services lists" +msgstr "Стандартний список каналів" + +msgid "Default settings" +msgstr "Стандартні налаштування" + +msgid "Delay" +msgstr "Затримка" + +msgid "Delete" +msgstr "Видалити" + +msgid "Delete entry" +msgstr "Відмінити завдання" + +msgid "Delete failed!" +msgstr "Видалення невдале!" + +#, python-format +msgid "" +"Delete no more configured satellite\n" +"%s?" +msgstr "" +"Видалити не налаштовані супутники\n" +"%s?" + +msgid "Description" +msgstr "Опис" + +msgid "Destination directory" +msgstr "" + +msgid "Detected HDD:" +msgstr "Виявлено HDD:" + +msgid "Detected NIMs:" +msgstr "Виявлено NIMs:" + +msgid "DiSEqC" +msgstr "DiSEqC" + +msgid "DiSEqC A/B" +msgstr "DiSEqC A/B" + +msgid "DiSEqC A/B/C/D" +msgstr "DiSEqC A/B/C/D" + +msgid "DiSEqC mode" +msgstr "DiSEqC режим" + +msgid "DiSEqC repeats" +msgstr "DiSEqC повторювання" + +msgid "Direct playback of linked titles without menu" +msgstr "Пряме програвання звязаних епізодів без меню" + +#, python-format +msgid "Directory %s nonexistent." +msgstr "Директорія %s неіснує." + +msgid "Disable" +msgstr "Вимкнути" + +msgid "Disable Picture in Picture" +msgstr "Вимкнути PiP" + +msgid "Disable Subtitles" +msgstr "Вимкнути субтитри" + +msgid "Disable timer" +msgstr "Відмінити таймер" + +msgid "Disabled" +msgstr "Вимкнуто" + +#, python-format +msgid "" +"Disconnected from\n" +"Fritz!Box! (%s)\n" +"retrying..." +msgstr "" +"Від'єднано від\n" +"Fritz!Box! (%s)\n" +"повторно..." + +msgid "Dish" +msgstr "Антена" + +msgid "Display 16:9 content as" +msgstr "Показувати 16:9 як" + +msgid "Display 4:3 content as" +msgstr "Показувати 4:3 як" + +msgid "Display Setup" +msgstr "Налаштування LCD" + +#, python-format +msgid "" +"Do you really want to REMOVE\n" +"the plugin \"%s\"?" +msgstr "" + +msgid "" +"Do you really want to check the filesystem?\n" +"This could take lots of time!" +msgstr "" +"Ви дійсно хочете перевірити файлову систему?\n" +"Це може зайняти багато часу!" + +#, python-format +msgid "Do you really want to delete %s?" +msgstr "Ви дійсно хочете видалити %s?" + +#, python-format +msgid "" +"Do you really want to download\n" +"the plugin \"%s\"?" +msgstr "" + +msgid "" +"Do you really want to initialize the harddisk?\n" +"All data on the disk will be lost!" +msgstr "" +"Ви дійсно хочете ініціалізувати HDD?\n" +"Всі дані на диску будуть втрачені!" + +#, python-format +msgid "Do you really want to remove directory %s from the disk?" +msgstr "Ви дійсно хочете видалити директорію %s з диску" + +#, python-format +msgid "Do you really want to remove your bookmark of %s?" +msgstr "Ви дійсно хочете видалити Вашу закладку з %s?" + +msgid "" +"Do you want to backup now?\n" +"After pressing OK, please wait!" +msgstr "" +"Ви хочете зробити резервну копію зараз?\n" +"Натисніть на ОК і зачекайте будь ласка!" + +msgid "Do you want to burn this collection to DVD medium?" +msgstr "Ви хочете записати цей проект на DVD диск?" + +msgid "Do you want to do a service scan?" +msgstr "Хочете виконати пошук каналів?" + +msgid "Do you want to do another manual service scan?" +msgstr "Хочете виконати інший ручний пошук каналів?" + +msgid "Do you want to enable the parental control feature on your dreambox?" +msgstr "Ви хочете встановити батьківський контроль на Dreambox?" + +msgid "Do you want to install default sat lists?" +msgstr "Ви хочете встановити стандартний список супутників?" + +msgid "Do you want to play DVD in drive?" +msgstr "Ви хочете відтворити DVD, який є в приводі?" + +msgid "Do you want to preview this DVD before burning?" +msgstr "Ви хочете переглянути цей DVD перед записом?" + +msgid "Do you want to restore your settings?" +msgstr "Ви хочете відновити свої налаштування?" + +msgid "Do you want to resume this playback?" +msgstr "Ви хочете продовжити відтворення?" + +msgid "" +"Do you want to update your Dreambox?\n" +"After pressing OK, please wait!" +msgstr "" +"Ви хочете обновити свій Dreambox?\n" +"Після натискання на OK, будь ласка зачекайте!" + +msgid "Do you want to view a tutorial?" +msgstr "Ви хочете переглянути інструкцію?" + +msgid "Don't stop current event but disable coming events" +msgstr "Не зупиняйте поточне завдання, але відмініть слідуючі" + +#, python-format +msgid "Done - Installed or upgraded %d packages" +msgstr "Виконано - Встановлено або обновлено %d пакети" + +#, python-format +msgid "Done - Installed or upgraded %d packages with %d errors" +msgstr "Виконано - Встановлено або обновлено %d пакети з %d помилками" + +msgid "Download" +msgstr "" + +msgid "Download .NFI-Files for USB-Flasher" +msgstr "" + +msgid "Download Plugins" +msgstr "Завантажити" + +msgid "Download of USB flasher boot image failed: " +msgstr "" + +msgid "Downloadable new plugins" +msgstr "Доступні нові додатки" + +msgid "Downloadable plugins" +msgstr "Доступні додатки" + +msgid "Downloading" +msgstr "Завантажується..." + +msgid "Downloading image description..." +msgstr "" + +msgid "Downloading plugin information. Please wait..." +msgstr "Завантаження інформації про додатки. Зачекайте..." + +msgid "Dreambox format data DVD (HDTV compatible)" +msgstr "DVD дані в Dreambox-формат (HDTV-сумісний)" + +msgid "Dutch" +msgstr "Данська" + +msgid "E" +msgstr "O" + +msgid "EPG Selection" +msgstr "Вибір EPG" + +#, python-format +msgid "ERROR - failed to scan (%s)!" +msgstr "ПОМИЛКА - сканування невдале (%s)!" + +msgid "East" +msgstr "Схід" + +msgid "Edit" +msgstr "" + +msgid "Edit DNS" +msgstr "Змінити DNS" + +msgid "Edit Title" +msgstr "" + +msgid "Edit chapters of current title" +msgstr "Редагувати фрагменти цього розділу" + +msgid "Edit services list" +msgstr "Редагувати список каналів" + +msgid "Edit settings" +msgstr "Редагування налаштувань" + +msgid "Edit the Nameserver configuration of your Dreambox.\n" +msgstr "Редагувати налаштування Nameserver вашого Dreambox.\n" + +msgid "Edit the network configuration of your Dreambox.\n" +msgstr "Редагувати налаштування мережі Dreambox.\n" + +msgid "Edit title" +msgstr "Редагувати назву" + +msgid "Electronic Program Guide" +msgstr "Електронний Гід" + +msgid "Enable" +msgstr "Ввімкнути" + +msgid "Enable 5V for active antenna" +msgstr "Подати 5V для активної антени" + +msgid "Enable multiple bouquets" +msgstr "Відображати фаворитні списки" + +msgid "Enable parental control" +msgstr "Ввімкнути батьківський контроль" + +msgid "Enable timer" +msgstr "Ввімкнути таймер" + +msgid "Enabled" +msgstr "Ввімкнено" + +msgid "Encryption" +msgstr "Шифрування" + +msgid "Encryption Key" +msgstr "WLAN ключ шифрування" + +msgid "Encryption Keytype" +msgstr "" + +msgid "Encryption Type" +msgstr "Тип шифрування" + +msgid "End" +msgstr "Кінець" + +msgid "End time" +msgstr "Час закінчення" + +msgid "EndTime" +msgstr "Кінець часу" + +msgid "English" +msgstr "Англійська" + +msgid "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"If you experience any problems please contact\n" +"stephan@reichholf.net\n" +"\n" +"© 2006 - Stephan Reichholf" +msgstr "" +"Enigma2 Skinselector v0.5 BETA\n" +"\n" +"Якщо в Вас виникли певні проблеми, будь ласка звертайтесь на\n" +"stephan@reichholf.net\n" +"\n" +"© 2006 - Stephan Reichholf" + +#. TRANSLATORS: Note that "Enter" in the two strings below should *not* +#. be interpreted as "Give speed as input". The intended meaning is +#. instead "Initial speed when starting winding", i.e. the speed at +#. which "winding mode" is entered when first pressing "rewind" or +#. "fast forward". +msgid "Enter Fast Forward at speed" +msgstr "Швидкість перемотування вперед" + +msgid "Enter Rewind at speed" +msgstr "Швидкість перемотування" + +msgid "Enter WLAN network name/SSID:" +msgstr "" + +msgid "Enter WLAN passphrase/key:" +msgstr "" + +msgid "Enter main menu..." +msgstr "вхід до Головного Меню..." + +msgid "Enter the service pin" +msgstr "Введіть PIN-код каналу" + +msgid "Error" +msgstr "Помилка" + +msgid "Error executing plugin" +msgstr "" + +#, python-format +msgid "" +"Error: %s\n" +"Retry?" +msgstr "" +"Помилка: %s\n" +"Повторити?" + +msgid "Eventview" +msgstr "Перегдяд завдань" + +msgid "Everything is fine" +msgstr "Все є OK" + +msgid "Execution Progress:" +msgstr "Хід виконання:" + +msgid "Execution finished!!" +msgstr "Виконання завершено!!" + +msgid "Exit" +msgstr "Вийти" + +msgid "Exit editor" +msgstr "Вийти з редактора" + +msgid "Exit the wizard" +msgstr "Вихід з помічника" + +msgid "Exit wizard" +msgstr "Закрити помічник" + +msgid "Expert" +msgstr "Експерт" + +msgid "Extended Networksetup Plugin..." +msgstr "" + +msgid "Extended Setup..." +msgstr "Розширені налаштування..." + +msgid "Extensions" +msgstr "Розширення" + +msgid "FEC" +msgstr "FEC" + +msgid "Factory reset" +msgstr "Скидання до заводських налаштувань" + +msgid "Failed" +msgstr "Невдало" + +msgid "Fast" +msgstr "Швидко" + +msgid "Fast DiSEqC" +msgstr "Швидкий DiSEqC" + +msgid "Fast Forward speeds" +msgstr "Швидкість перемотування вперед" + +msgid "Fast epoch" +msgstr "Швидкий період" + +msgid "Favourites" +msgstr "Фаворити" + +msgid "Filesystem Check..." +msgstr "Перевірка файлової системи..." + +msgid "Filesystem contains uncorrectable errors" +msgstr "Файлова система містить невиправні помилки" + +msgid "Finetune" +msgstr "Точно" + +msgid "Finished" +msgstr "Закінчено" + +msgid "Finished configuring your network" +msgstr "" + +msgid "Finished restarting your network" +msgstr "" + +msgid "Finnish" +msgstr "Фінська" + +msgid "" +"First we need to download the latest boot environment for the USB flasher." +msgstr "" + +msgid "Fix USB stick" +msgstr "" + +msgid "Flash" +msgstr "" + +msgid "Flashing failed" +msgstr "" + +msgid "Font size" +msgstr "Розмір шрифта" + +msgid "Format" +msgstr "Форматування" + +msgid "Frame repeat count during non-smooth winding" +msgstr "Кількість повторів кадру під час неплавного переходу" + +msgid "French" +msgstr "Французька" + +msgid "Frequency" +msgstr "Частота" + +msgid "Frequency bands" +msgstr "Полоси частоти" + +msgid "Frequency scan step size(khz)" +msgstr "Розмір кроку пошуку (khz)" + +msgid "Frequency steps" +msgstr "Кроки частоти" + +msgid "Fri" +msgstr "П'ятн" + +msgid "Friday" +msgstr "П'ятниця" + +msgid "Fritz!Box FON IP address" +msgstr "Fritz!Box FON IP адрес" + +#, python-format +msgid "Frontprocessor version: %d" +msgstr "Версія фронтпроцесора: %d" + +msgid "Fsck failed" +msgstr "Fsck невдала" + +msgid "Function not yet implemented" +msgstr "Функція не реалізована" + +msgid "" +"GUI needs a restart to apply a new skin\n" +"Do you want to Restart the GUI now?" +msgstr "" +"Для застосування нової оболонки\n" +"потрібно перезавантажити GUI.\n" +"Хочете перезавантажити GUI зараз??" + +msgid "Gateway" +msgstr "Шлюз" + +msgid "Genre:" +msgstr "Жанр:" + +msgid "German" +msgstr "Німецька" + +msgid "Getting plugin information. Please wait..." +msgstr "Отримування інформації про додатки. Прохання зачекати..." + +msgid "Goto 0" +msgstr "Йти до 0" + +msgid "Goto position" +msgstr "Йти на позицію" + +msgid "Graphical Multi EPG" +msgstr "Графічний Multi EPG" + +msgid "Greek" +msgstr "Грецька" + +msgid "Guard Interval" +msgstr "" + +msgid "Guard interval mode" +msgstr "Режим Guard Interval" + +msgid "Harddisk" +msgstr "Жорсткий диск..." + +msgid "Harddisk setup" +msgstr "Налаштування HDD" + +msgid "Harddisk standby after" +msgstr "Режим очікування HDD після" + +msgid "Hidden network SSID" +msgstr "" + +msgid "Hierarchy Information" +msgstr "Ієрархічна Інформація" + +msgid "Hierarchy mode" +msgstr "Ієрархічний режим" + +msgid "How many minutes do you want to record?" +msgstr "Скільки хвилин Ви хочете записати?" + +msgid "Hungarian" +msgstr "Угорська" + +msgid "IP Address" +msgstr "IP адреса" + +msgid "ISO file is too large for this filesystem!" +msgstr "" + +msgid "ISO path" +msgstr "" + +msgid "Icelandic" +msgstr "Ісландська" + +msgid "If you can see this page, please press OK." +msgstr "Якщо ви хочете побачити цю сторінку, натисніть OK." + +msgid "" +"If you see this, something is wrong with\n" +"your scart connection. Press OK to return." +msgstr "" +"Якщо Ви бачите це, значить щось неправильно з\n" +"Scart приєднанням. Натисніть ОК для повернення." + +msgid "" +"If your TV has a brightness or contrast enhancement, disable it. If there is " +"something called \"dynamic\", set it to standard. Adjust the backlight level " +"to a value suiting your taste. Turn down contrast on your TV as much as " +"possible.\n" +"Then turn the brightness setting as low as possible, but make sure that the " +"two lowermost shades of gray stay distinguishable.\n" +"Do not care about the bright shades now. They will be set up in the next " +"step.\n" +"If you are happy with the result, press OK." +msgstr "" +"Якщо у Вашому TV завищена яскравість чи контрастність, виправте це. Якщо " +"опції виставлені на \"Динамічну\", змініть на \"Стандартну\". Виставте " +"рівень підсвічування на власний смак .Зменшіть контрастність TV до " +"максимально можливої.\n" +"Потім понизьте рівень яскравості, настільки низько, наскільки це можливо, " +"але щоб два самих нижніх відтінки сірого відрізнялись.\n" +"Не турбуйтесь про яскраві відтінки зараз. Вони будуть налаштовані в " +"наступному кроці.\n" +"Якщо Ви задоволені результатом натисніть OK." + +msgid "Image flash utility" +msgstr "" + +msgid "Image-Upgrade" +msgstr "Обновлення Іміджу" + +msgid "In Progress" +msgstr "Виконується" + +msgid "" +"In order to record a timer, the TV was switched to the recording service!\n" +msgstr "" +"Щоб розпочати запис по таймеру, TV буде змінено на записуваний канал!\n" + +msgid "Increased voltage" +msgstr "Збільшена напруга" + +msgid "Index" +msgstr "Індекс" + +msgid "InfoBar" +msgstr "Інфо панель" + +msgid "Infobar timeout" +msgstr "Час показу інфо панелі" + +msgid "Information" +msgstr "Інформація" + +msgid "Init" +msgstr "Ініціалізувати" + +msgid "Initialization..." +msgstr "Ініціалізація..." + +msgid "Initialize" +msgstr "Ініціалізувати" + +msgid "Initializing Harddisk..." +msgstr "Ініціалізація HDD..." + +msgid "Input" +msgstr "Вхід" + +msgid "Installing" +msgstr "Встановлення" + +msgid "Installing Software..." +msgstr "Встановлення ПЗ..." + +msgid "Installing default sat lists... Please wait..." +msgstr "Встановлення стандартного списку супутників...Прохання зачекати..." + +msgid "Installing defaults... Please wait..." +msgstr "Встановлення стандартних налаштувань...Прохання зачекати..." + +msgid "Installing package content... Please wait..." +msgstr "Встановлення пакетів...Прохання зачекати..." + +msgid "Instant Record..." +msgstr "миттєвий запис..." + +msgid "Integrated Ethernet" +msgstr "Інтегрований Ethernet" + +msgid "Integrated Wireless" +msgstr "Інтегрований Wireless" + +msgid "Intermediate" +msgstr "Посередній" + +msgid "Internal Flash" +msgstr "Внутрішня Флеш" + +msgid "Invalid Location" +msgstr "Неправильне розміщення" + +#, python-format +msgid "Invalid directory selected: %s" +msgstr "Вибрано неіснуючу директорію: %s" + +msgid "Inversion" +msgstr "Інверсія" + +msgid "Invert display" +msgstr "Інверсія LCD" + +msgid "Italian" +msgstr "Італійська" + +msgid "Job View" +msgstr "Перегляд завдань" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, even if this breaks the aspect) +msgid "Just Scale" +msgstr "Тільки масштабування" + +msgid "Keyboard Map" +msgstr "Розкладка клавіатури" + +msgid "Keyboard Setup" +msgstr "Налаштування клавіатури" + +msgid "Keymap" +msgstr "Розкладка кнопок" + +msgid "LAN Adapter" +msgstr "LAN Адаптер" + +msgid "LNB" +msgstr "LNB" + +msgid "LOF" +msgstr "LOF" + +msgid "LOF/H" +msgstr "LOF/H" + +msgid "LOF/L" +msgstr "LOF/L" + +msgid "Language selection" +msgstr "Вибір мови" + +msgid "Language..." +msgstr "Мова..." + +msgid "Last speed" +msgstr "Остання швидкість" + +msgid "Latitude" +msgstr "Широта" + +msgid "Leave DVD Player?" +msgstr "Закрити DVD плеєр?" + +msgid "Left" +msgstr "Вліво" + +#. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term. +msgid "Letterbox" +msgstr "" + +msgid "Limit east" +msgstr "Обмеження на схід" + +msgid "Limit west" +msgstr "Обмеження на захід" + +msgid "Limits off" +msgstr "Вимкнути обмеження" + +msgid "Limits on" +msgstr "Ввімкнути обмеження" + +msgid "Link:" +msgstr "Посилання:" + +msgid "Linked titles with a DVD menu" +msgstr "Зв'язані заголовки DVD-Меню" + +msgid "List of Storage Devices" +msgstr "Список запам'ятовуючих пристроїв" + +msgid "Lithuanian" +msgstr "Литовська" + +msgid "Load" +msgstr "Завантажити" + +msgid "Load Length of Movies in Movielist" +msgstr "" + +msgid "Local Network" +msgstr "Локальна Мережа" + +msgid "Location" +msgstr "Розміщення" + +msgid "Lock:" +msgstr "Сигнал:" + +msgid "Long Keypress" +msgstr "Утримування кнопки" + +msgid "Longitude" +msgstr "Довгота" + +msgid "MMC Card" +msgstr "Карта ММС" + +msgid "MORE" +msgstr "Більше" + +msgid "Main menu" +msgstr "Головне Меню" + +msgid "Mainmenu" +msgstr "Головне Меню" + +msgid "Make this mark an 'in' point" +msgstr "Зробити цю закладку як внутрішню" + +msgid "Make this mark an 'out' point" +msgstr "Зробити цю закладку як зовнішню" + +msgid "Make this mark just a mark" +msgstr "Зробити цю закладку як звичайну" + +msgid "Manual Scan" +msgstr "Ручний пошук" + +msgid "Manual transponder" +msgstr "Вибірковий транспондер" + +msgid "Margin after record" +msgstr "Відступ після запису (в хвил.)" + +msgid "Margin before record (minutes)" +msgstr "Відступ перед записом (в хвил.)" + +msgid "Media player" +msgstr "Медіа Програвач" + +msgid "MediaPlayer" +msgstr "Медіа Програвач" + +msgid "Medium is not a writeable DVD!" +msgstr "Носій не є записуючим DVD!" + +msgid "Medium is not empty!" +msgstr "Носій не порожній!" + +msgid "Menu" +msgstr "Меню" + +msgid "Message" +msgstr "Повідомлення" + +msgid "Mkfs failed" +msgstr "Mkfs невдале" + +msgid "Mode" +msgstr "Режим" + +msgid "Model: " +msgstr "Модель: " + +msgid "Modulation" +msgstr "Модуляція" + +msgid "Modulator" +msgstr "Модулятор" + +msgid "Mon" +msgstr "Пон" + +msgid "Mon-Fri" +msgstr "Пон-П'ятн" + +msgid "Monday" +msgstr "Понеділок" + +msgid "Mount failed" +msgstr "Монтування невдале" + +msgid "Move Picture in Picture" +msgstr "Перемістити PiP" + +msgid "Move east" +msgstr "Перемістити на схід" + +msgid "Move west" +msgstr "Перемістити на захід" + +msgid "Movielist menu" +msgstr "Меню списку фільмів" + +msgid "Multi EPG" +msgstr "Multi-EPG" + +msgid "Multiple service support" +msgstr "Підтримка мультисервісів" + +msgid "Multisat" +msgstr "Декілька супутників" + +msgid "Mute" +msgstr "Без звуку" + +msgid "N/A" +msgstr "N/A" + +msgid "NEXT" +msgstr "НАСТУПНИЙ" + +msgid "NFI image flashing completed. Press Yellow to Reboot!" +msgstr "" + +msgid "NOW" +msgstr "ЗАРАЗ" + +msgid "NTSC" +msgstr "NTSC" + +msgid "Name" +msgstr "Ім'я" + +msgid "Nameserver" +msgstr "Nameserver" + +#, python-format +msgid "Nameserver %d" +msgstr "Nameserver %d" + +msgid "Nameserver Setup" +msgstr "Налаштування DNS" + +msgid "Nameserver settings" +msgstr "Параметри DNS" + +msgid "Netmask" +msgstr "Маска мережі" + +msgid "Network Configuration..." +msgstr "Конфігурація мережі..." + +msgid "Network Mount" +msgstr "Network Mount" + +msgid "Network SSID" +msgstr "Мережевий SSID" + +msgid "Network Setup" +msgstr "Налаштування мережі" + +msgid "Network scan" +msgstr "Мережевий пошук" + +msgid "Network setup" +msgstr "Налаштування мережі" + +msgid "Network test" +msgstr "Тест мережевого з'єднання" + +msgid "Network test..." +msgstr "Тест мережевого з'єднання..." + +msgid "Network..." +msgstr "Мережа..." + +msgid "Network:" +msgstr "Мережа:" + +msgid "NetworkWizard" +msgstr "Майстер налаштувань мережі" + +msgid "New" +msgstr "Нові канали" + +msgid "New pin" +msgstr "Новий PIN" + +msgid "New version:" +msgstr "Нова версія:" + +msgid "Next" +msgstr "Наступний" + +msgid "No" +msgstr "Ні" + +msgid "No (supported) DVDROM found!" +msgstr "Ніякого (сумісного)DVD привода не знайдено!" + +msgid "No 50 Hz, sorry. :(" +msgstr "Нема 50 Hz, вибачайте. :(" + +msgid "No HDD found or HDD not initialized!" +msgstr "" +"HDD не знайдено або\n" +"HDD не ініціалізований!" + +msgid "No Networks found" +msgstr "" + +msgid "No backup needed" +msgstr "Резервна копія не потрібна" + +msgid "" +"No data on transponder!\n" +"(Timeout reading PAT)" +msgstr "" +"Нема даних на транспондері!\n" +"(Кінець часу читання PAT)" + +msgid "No details for this image file" +msgstr "" + +msgid "No event info found, recording indefinitely." +msgstr "Не знайдено інформаціїї про завдання, записування не визначене." + +msgid "No free tuner!" +msgstr "Нема вільного тюнера!" + +msgid "" +"No packages were upgraded yet. So you can check your network and try again." +msgstr "" +"Жоден пакет не був обновлений. Перевірте налаштування мережі і спробуйте " +"знову." + +msgid "No picture on TV? Press EXIT and retry." +msgstr "" +"Нема зображення на TV?\n" +"Натисніть EXIT і повторіть." + +msgid "No positioner capable frontend found." +msgstr "Не знайдено позиціонера." + +msgid "No satellite frontend found!!" +msgstr "Не знайдено супутник!!!" + +msgid "No tuner is configured for use with a diseqc positioner!" +msgstr "Нема тюнера налаштованого для роботи з позиціонером!" + +msgid "" +"No tuner is enabled!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Нема активного тюнера!\n" +"Налаштуй параметри свого тюнера перед початком сканування." + +msgid "No useable USB stick found" +msgstr "" + +msgid "" +"No valid service PIN found!\n" +"Do you like to change the service PIN now?\n" +"When you say 'No' here the service protection stay disabled!" +msgstr "" +"Не знайдено PIN-код каналу!\n" +"Хочете змінити PIN-код каналу?\n" +"Якщо вибрати НІ, то захист каналу буде вимкнуто!" + +msgid "" +"No valid setup PIN found!\n" +"Do you like to change the setup PIN now?\n" +"When you say 'No' here the setup protection stay disabled!" +msgstr "" +"Не знайдено PIN-код налаштувань!\n" +"Хочете змінити PIN-код налаштувань?\n" +"Якщо вибрати НІ, то захист налаштувань буде вимкнуто!!" + +msgid "" +"No working local network adapter found.\n" +"Please verify that you have attached a network cable and your network is " +"configured correctly." +msgstr "" + +msgid "" +"No working wireless network adapter found.\n" +"Please verify that you have attached a compatible WLAN device and your " +"network is configured correctly." +msgstr "" + +msgid "" +"No working wireless network interface found.\n" +" Please verify that you have attached a compatible WLAN device or enable " +"your local network interface." +msgstr "" + +msgid "No, but restart from begin" +msgstr "Ні, але відтворити фільм з початку" + +msgid "No, do nothing." +msgstr "Ні, не робити нічого." + +msgid "No, just start my dreambox" +msgstr "Ні, тільки ввімкнути мого Dreambox'a" + +msgid "No, scan later manually" +msgstr "Ні, сканувати вручну пізніше" + +msgid "None" +msgstr "Нічого" + +#. TRANSLATORS: (aspect ratio policy: display as fullscreen, with stretching the left/right) +msgid "Nonlinear" +msgstr "Нелінійний" + +msgid "North" +msgstr "Північ" + +msgid "Norwegian" +msgstr "Норвежська" + +#, python-format +msgid "" +"Not enough diskspace. Please free up some diskspace and try again. (%d MB " +"required, %d MB available)" +msgstr "" +"Не достатньо вільного місця. Будь ласка звільніть місце на диску і спробуйте " +"знов. (%d MB потрібно, %d MB вільно)" + +msgid "" +"Nothing to scan!\n" +"Please setup your tuner settings before you start a service scan." +msgstr "" +"Нічого не знайдено!\n" +"Налаштуй параметри свого тюнера перед початком сканування." + +msgid "Now Playing" +msgstr "Зараз програється" + +msgid "" +"Now please insert the USB stick (minimum size is 64 MB) that you want to " +"format and use as .NFI image flasher. Press OK after you've put the stick " +"back in." +msgstr "" + +msgid "" +"Now, use the contrast setting to turn up the brightness of the background as " +"much as possible, but make sure that you can still see the difference " +"between the two brightest levels of shades.If you have done that, press OK." +msgstr "" +"Тепер, використовуйте регулювання контрастності, щоб збільшити яскравісь " +"фонунаскільки це можливо, але переконайтесь, що Ви все ще бачите різницю між " +"двума самими яскравими рівнями відтінків. Якщо Ви зробили це, то натисніть " +"ОК." + +msgid "OK" +msgstr "OK" + +msgid "OK, guide me through the upgrade process" +msgstr "OK, допоможіть мені в процесі оновлення" + +msgid "OSD Settings" +msgstr "Налаштування OSD" + +msgid "OSD visibility" +msgstr "" + +msgid "Off" +msgstr "Вимкнути" + +msgid "On" +msgstr "Ввімкнути" + +msgid "One" +msgstr "Один" + +msgid "Online-Upgrade" +msgstr "Онлайн-Оновлення" + +msgid "Only Free scan" +msgstr "" + +msgid "Orbital Position" +msgstr "Орбітальна позиція" + +msgid "Other..." +msgstr "Інше..." + +msgid "PAL" +msgstr "PAL" + +msgid "PIDs" +msgstr "Піди" + +msgid "Package list update" +msgstr "Оновлення списку пакетів" + +msgid "Packet management" +msgstr "Управління пакетом" + +msgid "Page" +msgstr "Сторінка" + +#. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term +msgid "Pan&Scan" +msgstr "" + +msgid "Parent Directory" +msgstr "Початкова директорія" + +msgid "Parental control" +msgstr "Батьківський контроль" + +msgid "Parental control services Editor" +msgstr "Редактор каналів батьківського контролю" + +msgid "Parental control setup" +msgstr "Встановлення батьківського контролю" + +msgid "Parental control type" +msgstr "Тип батьківського контролю" + +msgid "Partitioning USB stick..." +msgstr "" + +msgid "Pause movie at end" +msgstr "Затримати фільм в кінці" + +msgid "PiPSetup" +msgstr "Налаштування PiP" + +#. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term. +msgid "Pillarbox" +msgstr "" + +msgid "Pilot" +msgstr "" + +msgid "Pin code needed" +msgstr "Потрібно PIN-код" + +msgid "Play" +msgstr "Відтворення" + +msgid "Play Audio-CD..." +msgstr "" + +msgid "Play recorded movies..." +msgstr "відтворити записані передачі..." + +msgid "Please Reboot" +msgstr "Будь ласка перезавантажте" + +msgid "Please Select Medium to be Scanned" +msgstr "Будь ласка виберіть носій, який буде проскановано" + +msgid "Please change recording endtime" +msgstr "Будь ласка змініть час закінчення запису" + +msgid "Please check your network settings!" +msgstr "" + +msgid "Please choose .NFI image file from feed server to download" +msgstr "" + +msgid "Please choose an extension..." +msgstr "Будь ласка виберіть..." + +msgid "Please choose he package..." +msgstr "Будь ласка виберіть пакет ..." + +msgid "Please choose the default services lists you want to install." +msgstr "" +"Будь ласка виберіть стандартний список каналів, який хочете встановити." + +msgid "Please do not change any values unless you know what you are doing!" +msgstr "Будь ласка не міняйте ніякі значення, якщо не розумієте що робите!" + +msgid "Please enter a name for the new bouquet" +msgstr "Введіть назву нового списку" + +msgid "Please enter a name for the new marker" +msgstr "Введіть назву для нової закладки" + +msgid "Please enter a new filename" +msgstr "Введіть нову назву файла" + +msgid "Please enter filename (empty = use current date)" +msgstr "Введіть назву файла (пусто = актуальна дата)" + +msgid "Please enter name of the new directory" +msgstr "Введіть назву нової директорії" + +msgid "Please enter the correct pin code" +msgstr "Введіть правильний PIN-код" + +msgid "Please enter the old pin code" +msgstr "Введіть старий PIN-код" + +msgid "Please follow the instructions on the TV" +msgstr "Будь ласка, слідкуйте за інструкціями TV" + +msgid "" +"Please note that the previously selected media could not be accessed and " +"therefore the default directory is being used instead." +msgstr "" +"Будь ласка відмітьте, що до раніше вибраних носіїв не було доступу, і тому " +"замість них використовується директорія за замовчуванням" + +msgid "Please press OK to continue." +msgstr "Будь ласка натисніть OK для продовження." + +msgid "Please press OK!" +msgstr "Натисніть OK!" + +msgid "Please select .NFI flash image file from medium" +msgstr "" + +msgid "Please select a playlist to delete..." +msgstr "Виберіть плейлист для видалення..." + +msgid "Please select a playlist..." +msgstr "Виберіть плейлист..." + +msgid "Please select a subservice to record..." +msgstr "Виберіть підсервіс для запису..." + +msgid "Please select a subservice..." +msgstr "Виберіть підсервіс..." + +msgid "Please select keyword to filter..." +msgstr "Виберіть ключове слово для фільтрування..." + +msgid "Please select target directory or medium" +msgstr "" + +msgid "Please select the movie path..." +msgstr "Виберіть шлях до фільму..." + +msgid "Please set up tuner B" +msgstr "Налаштуйте тюнер B" + +msgid "Please set up tuner C" +msgstr "Налаштуйте тюнер C" + +msgid "Please set up tuner D" +msgstr "Налаштуйте тюнер D" + +msgid "" +"Please use direction keys to move the PiP window.\n" +"Press Bouquet +/- to resize the window.\n" +"Press OK to go back to the TV mode or EXIT to cancel the moving." +msgstr "" +"Використовуйте кнопки управління для переміщення вікна PiP.\n" +"Натисніть +/-, для зміни розміру вікна.\n" +"Натисніть OK, щоб повернутись в режим TV, або EXIT для відміни." + +msgid "" +"Please use the UP and DOWN keys to select your language. Afterwards press " +"the OK button." +msgstr "" +"Використовуйте кнопки ВВЕРХ і ВНИЗ, щоб вибрати Вашу мову. Після вибору " +"натисніть OK." + +msgid "Please wait for activation of your network configuration..." +msgstr "" + +msgid "Please wait for md5 signature verification..." +msgstr "" + +msgid "Please wait while we configure your network..." +msgstr "" + +msgid "Please wait while your network is restarting..." +msgstr "" + +msgid "Please wait..." +msgstr "" + +msgid "Please wait... Loading list..." +msgstr "Прохання зачекати... Завантаження списку..." + +msgid "Plugin browser" +msgstr "Список додатків" + +msgid "Plugins" +msgstr "Додатки" + +msgid "Polarity" +msgstr "Поляризація" + +msgid "Polarization" +msgstr "Поляризація" + +msgid "Polish" +msgstr "Польська" + +msgid "Port A" +msgstr "Порт A" + +msgid "Port B" +msgstr "Порт B" + +msgid "Port C" +msgstr "Порт C" + +msgid "Port D" +msgstr "Порт D" + +msgid "Portuguese" +msgstr "Португальська" + +msgid "Positioner" +msgstr "Позиціонер" + +msgid "Positioner fine movement" +msgstr "Точний рух позиціонера" + +msgid "Positioner movement" +msgstr "Рух позиціонера" + +msgid "Positioner setup" +msgstr "Налаштування позиціонера" + +msgid "Positioner storage" +msgstr "Збереження позиціонера" + +msgid "Power threshold in mA" +msgstr "Поріг потужності в mA" + +msgid "Predefined transponder" +msgstr "Визначений транспондер" + +msgid "Preparing... Please wait" +msgstr "Йде приготування... Зачекайте будь ласка" + +msgid "Press OK on your remote control to continue." +msgstr "Натисніть на ОК для продовження." + +msgid "Press OK to activate the settings." +msgstr "Натисніть ОК для для активації налаштувань." + +msgid "Press OK to edit the settings." +msgstr "Натисніть ОК для редагування налаштувань" + +msgid "Press OK to scan" +msgstr "Натисніть ОК для пошуку" + +msgid "Press OK to start the scan" +msgstr "Натисніть ОК щоб почати пошук" + +msgid "Prev" +msgstr "Попередній" + +msgid "Preview menu" +msgstr "Перегляд DVD-Меню" + +msgid "Primary DNS" +msgstr "Первинний DNS" + +msgid "Properties of current title" +msgstr "" + +msgid "Protect services" +msgstr "Захист каналів" + +msgid "Protect setup" +msgstr "Налаштування захисту" + +msgid "Provider" +msgstr "Провайдери" + +msgid "Provider to scan" +msgstr "Сканування провайдера" + +msgid "Providers" +msgstr "Провайдери" + +msgid "Quickzap" +msgstr "Швидке перемикання" + +msgid "RC Menu" +msgstr "Меню ДУ" + +msgid "RF output" +msgstr "RF вихід" + +msgid "RGB" +msgstr "RGB" + +msgid "RSS Feed URI" +msgstr "RSS-Feed-URI" + +msgid "Radio" +msgstr "Радіо" + +msgid "Ram Disk" +msgstr "Ram диск" + +msgid "Really close without saving settings?" +msgstr "Вийти без збереження налаштувань?" + +msgid "Really delete done timers?" +msgstr "Видалити виконане завдання?" + +msgid "Really delete this timer?" +msgstr "Видалити це завдання?" + +msgid "Really exit the subservices quickzap?" +msgstr "Вийти з підсервісів?" + +msgid "Really reboot now?" +msgstr "" + +msgid "Really restart now?" +msgstr "" + +msgid "Really shutdown now?" +msgstr "" + +msgid "Reboot" +msgstr "" + +msgid "Reception Settings" +msgstr "Параметри прийому" + +msgid "Record" +msgstr "Запис" + +msgid "Recorded files..." +msgstr "Записані файли..." + +msgid "Recording" +msgstr "Запис" + +msgid "Recording(s) are in progress or coming up in few seconds!" +msgstr "" + +msgid "Recordings always have priority" +msgstr "Запис завжди має перевагу" + +msgid "Reenter new pin" +msgstr "Введіть новий PIN-код ще раз" + +msgid "Refresh Rate" +msgstr "Частота оновлення" + +msgid "Refresh rate selection." +msgstr "Вибір частоти оновлення" + +msgid "Remounting stick partition..." +msgstr "" + +msgid "Remove Bookmark" +msgstr "Видалити закладку" + +msgid "Remove Plugins" +msgstr "Видалити" + +msgid "Remove a mark" +msgstr "Видалити закладку" + +msgid "Remove currently selected title" +msgstr "Видалити вибрану назву" + +msgid "Remove plugins" +msgstr "Видалення додатків" + +msgid "Remove the broken .NFI file?" +msgstr "" + +msgid "Remove the incomplete .NFI file?" +msgstr "" + +msgid "Remove title" +msgstr "Видалити назву" + +#, python-format +msgid "Removing directory %s failed. (Maybe not empty.)" +msgstr "Видалення директорії %s невдале. (Можливо не пуста)" + +msgid "Rename" +msgstr "Перейменувати" + +msgid "Repeat" +msgstr "Повторити" + +msgid "Repeat Type" +msgstr "Тип повторення" + +msgid "Repeating event currently recording... What do you want to do?" +msgstr "" +"Повторення завдання, яке вже записується...\n" +"Що хочете зробити??" + +msgid "Repeats" +msgstr "Повторення" + +msgid "Reset" +msgstr "Скидання" + +msgid "Reset and renumerate title names" +msgstr "" + +msgid "Resolution" +msgstr "Роздільча здатність" + +msgid "Restart" +msgstr "Перезавантажити" + +msgid "Restart GUI" +msgstr "Перезавантажити GUI" + +msgid "Restart GUI now?" +msgstr "Перезавантажити GUI зараз?" + +msgid "Restart network" +msgstr "Перезавантаження мережі" + +msgid "Restart test" +msgstr "Повторити тест" + +msgid "Restart your network connection and interfaces.\n" +msgstr "Перезавантаження мережевого з'єднання.\n" + +msgid "Restore" +msgstr "Відновлення" + +msgid "" +"Restoring the settings is done. Please press OK to activate the restored " +"settings now." +msgstr "" +"Відновлення параметрів виконано. Натисніть OK щоб зберегти відновлені " +"параметри." + +msgid "Resume from last position" +msgstr "Продовжити з останньої позиції" + +#. TRANSLATORS: The string "Resuming playback" flashes for a moment +#. TRANSLATORS: at the start of a movie, when the user has selected +#. TRANSLATORS: "Resume from last position" as start behavior. +#. TRANSLATORS: The purpose is to notify the user that the movie starts +#. TRANSLATORS: in the middle somewhere and not from the beginning. +#. TRANSLATORS: (Some translators seem to have interpreted it as a +#. TRANSLATORS: question or a choice, but it is a statement.) +msgid "Resuming playback" +msgstr "Продовжити програвання" + +msgid "Return to file browser" +msgstr "Повернутись до оглядача файлів" + +msgid "Return to movie list" +msgstr "Повернутись до списку фільмів" + +msgid "Return to previous service" +msgstr "Повернутись до попереднього каналу" + +msgid "Rewind speeds" +msgstr "Швидкість перемотування" + +msgid "Right" +msgstr "Вправо" + +msgid "Rolloff" +msgstr "" + +msgid "Rotor turning speed" +msgstr "Швидкість обертання ротора" + +msgid "Running" +msgstr "Швидкість обертання ротора" + +msgid "Russian" +msgstr "Російська" + +msgid "S-Video" +msgstr "S-Відео" + +msgid "SNR" +msgstr "" + +msgid "SNR:" +msgstr "" + +msgid "Sat" +msgstr "Суб" + +msgid "Sat / Dish Setup" +msgstr "Налаштування антени" + +msgid "Satellite" +msgstr "Супутник" + +msgid "Satellite Equipment Setup" +msgstr "Налашування супутникового обладнання" + +msgid "Satellites" +msgstr "Супутники" + +msgid "Satfinder" +msgstr "Рівень сигналу" + +msgid "Sats" +msgstr "" + +msgid "Saturday" +msgstr "Субота" + +msgid "Save" +msgstr "Зберегти" + +msgid "Save Playlist" +msgstr "Зберегти плейлист" + +msgid "Scaling Mode" +msgstr "Режим масштабування" + +msgid "Scan " +msgstr "Пошук " + +msgid "Scan QAM128" +msgstr "Сканувати QAM128" + +msgid "Scan QAM16" +msgstr "Сканувати QAM16" + +msgid "Scan QAM256" +msgstr "Сканувати QAM256" + +msgid "Scan QAM32" +msgstr "Сканувати QAM32" + +msgid "Scan QAM64" +msgstr "Сканувати QAM64" + +msgid "Scan SR6875" +msgstr "Сканувати SR6875" + +msgid "Scan SR6900" +msgstr "Сканувати SR6900" + +msgid "Scan Wireless Networks" +msgstr "Пошук WI-FI мереж" + +msgid "Scan additional SR" +msgstr "Сканувати додатковий SR" + +msgid "Scan band EU HYPER" +msgstr "Сканувати полосу EU HYPER" + +msgid "Scan band EU MID" +msgstr "Сканувати полосу EU MID" + +msgid "Scan band EU SUPER" +msgstr "Сканувати полосу EU SUPER" + +msgid "Scan band EU UHF IV" +msgstr "Сканувати полосу EU UHF IV" + +msgid "Scan band EU UHF V" +msgstr "Сканувати полосу EU UHF V" + +msgid "Scan band EU VHF I" +msgstr "Сканувати полосу EU VHF I" + +msgid "Scan band EU VHF III" +msgstr "Сканувати полосу EU VHF III" + +msgid "Scan band US HIGH" +msgstr "Сканувати полосу US HIGH" + +msgid "Scan band US HYPER" +msgstr "Сканувати полосу US HYPER" + +msgid "Scan band US LOW" +msgstr "Сканувати полосу US LOW" + +msgid "Scan band US MID" +msgstr "Сканувати полосу US MID" + +msgid "Scan band US SUPER" +msgstr "Сканувати полосу US SUPER" + +msgid "" +"Scan your network for wireless Access Points and connect to them using your " +"WLAN USB Stick\n" +msgstr "" +"Сканувати мережу на доступність WI-FI точок доступу і з'єднатися с ними " +"використовуючи Ваш USB WI-FI адаптер\n" + +msgid "" +"Scans default lamedbs sorted by satellite with a connected dish positioner" +msgstr "Просканувати снандартні супутники записані в позиціонері" + +msgid "Search east" +msgstr "Пошук на схід" + +msgid "Search west" +msgstr "Пошук на захід" + +msgid "Secondary DNS" +msgstr "Вторинний DNS" + +msgid "Seek" +msgstr "" + +msgid "Select HDD" +msgstr "Вибрати HDD" + +msgid "Select Location" +msgstr "Вибрати місце розташування" + +msgid "Select Network Adapter" +msgstr "Виберіть мережевий адаптер" + +msgid "Select a movie" +msgstr "Виберіть фільм" + +msgid "Select audio mode" +msgstr "Виберіть аудіо режим" + +msgid "Select audio track" +msgstr "Виберіть аудіо доріжку" + +msgid "Select channel to record from" +msgstr "Виберіть канал для запису з" + +msgid "Select image" +msgstr "" + +msgid "Select refresh rate" +msgstr "Виберіть частоту оновлення" + +msgid "Select video input" +msgstr "Виберіть відео вхід" + +msgid "Select video mode" +msgstr "Виберіть режим відео" + +msgid "Selected source image" +msgstr "" + +msgid "Send DiSEqC" +msgstr "" + +msgid "Send DiSEqC only on satellite change" +msgstr "" + +msgid "Seperate titles with a main menu" +msgstr "Окремі заголовки з головного меню" + +msgid "Sequence repeat" +msgstr "Повторення послідовності" + +msgid "Service" +msgstr "Інформація каналу" + +msgid "Service Scan" +msgstr "Пошук каналів" + +msgid "Service Searching" +msgstr "Пошук каналів" + +msgid "Service has been added to the favourites." +msgstr "Канал додано до фаворитів." + +msgid "Service has been added to the selected bouquet." +msgstr "Канал додано до вибраного списку." + +msgid "" +"Service invalid!\n" +"(Timeout reading PMT)" +msgstr "" +"Канал недійсний!\n" +"(Кінець часу читання PMT)" + +msgid "" +"Service not found!\n" +"(SID not found in PAT)" +msgstr "" +"Канал не знайдено!\n" +"(SID не знайдено в PAT)" + +msgid "Service scan" +msgstr "Пошук каналів" + +msgid "" +"Service unavailable!\n" +"Check tuner configuration!" +msgstr "" +"Канал не доступний!\n" +"Перевірте налаштування тюнера!" + +msgid "Serviceinfo" +msgstr "Інформація" + +msgid "Services" +msgstr "Канали" + +msgid "Set Voltage and 22KHz" +msgstr "" + +msgid "Set as default Interface" +msgstr "Встановити як Інтерфейс за замовчуванням" + +msgid "Set interface as default Interface" +msgstr "" + +msgid "Set limits" +msgstr "Встановити обмеження" + +msgid "Settings" +msgstr "Параметри" + +msgid "Setup" +msgstr "Налаштування" + +msgid "Setup Mode" +msgstr "Режим Налаштування" + +msgid "Show Info" +msgstr "Показати інформацію" + +msgid "Show WLAN Status" +msgstr "Показати WLAN статус" + +msgid "Show blinking clock in display during recording" +msgstr "Показувати блимаючий годинник під час запису" + +msgid "Show infobar on channel change" +msgstr "Показувати інфопанель при зміні каналу" + +msgid "Show infobar on event change" +msgstr "Показувати інфопанель під час зміни передачі" + +msgid "Show infobar on skip forward/backward" +msgstr "Показувати інфопанель під час перемотки" + +msgid "Show positioner movement" +msgstr "Показувати рух позиціонера" + +msgid "Show services beginning with" +msgstr "Показати канали починаючи з" + +msgid "Show the radio player..." +msgstr "Радіо-режим..." + +msgid "Show the tv player..." +msgstr "ТБ-режим..." + +msgid "Shows the state of your wireless LAN connection.\n" +msgstr "Показати стан безпровідного LAN з'єднання.\n" + +msgid "Shutdown Dreambox after" +msgstr "Вимкнути Dreambox після" + +msgid "Similar" +msgstr "Подібне" + +msgid "Similar broadcasts:" +msgstr "Подібні передачі:" + +msgid "Simple" +msgstr "Простий" + +msgid "Simple titleset (compatibility for legacy players)" +msgstr "" + +msgid "Single" +msgstr "Один" + +msgid "Single EPG" +msgstr " Простий EPG" + +msgid "Single satellite" +msgstr "Один супутник" + +msgid "Single transponder" +msgstr "Один транспондер" + +msgid "Singlestep (GOP)" +msgstr "Однокроковий (GOP)" + +msgid "Skin..." +msgstr "" + +msgid "Sleep Timer" +msgstr "Таймер Вимкнення" + +msgid "Sleep timer action:" +msgstr "Дія таймера: " + +msgid "Slideshow Interval (sec.)" +msgstr "Інтервал слайдшоу (в сек.)" + +#, python-format +msgid "Slot %d" +msgstr "Слот %d" + +msgid "Slow" +msgstr "Повільно" + +msgid "Slow Motion speeds" +msgstr "Slow Motion швидкість" + +msgid "Some plugins are not available:\n" +msgstr "Деякі додатки не доступні:\n" + +msgid "Somewhere else" +msgstr "Десь інакше" + +msgid "" +"Sorry your Backup destination does not exist\n" +"\n" +"Please choose an other one." +msgstr "" +"Вибачте, але шлях доступу до копії не існує\n" +"\n" +"Будь ласка, виберіть інший." + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort A-Z" +msgstr "Сорт. A-Z" + +#. TRANSLATORS: This must fit into the header button in the EPG-List +msgid "Sort Time" +msgstr "Сорт. по часу" + +msgid "Sound" +msgstr "Звук" + +msgid "Soundcarrier" +msgstr "Soundcarrier" + +msgid "South" +msgstr "Південь" + +msgid "Spanish" +msgstr "Іспанська" + +msgid "Standby" +msgstr "Режим очікування" + +msgid "Standby / Restart" +msgstr "Меню вимкнення" + +msgid "Start" +msgstr "Початок" + +msgid "Start from the beginning" +msgstr "Почати з початку" + +msgid "Start recording?" +msgstr "Почати запис?" + +msgid "Start test" +msgstr "Почати тест" + +msgid "StartTime" +msgstr "Час початку" + +msgid "Starting on" +msgstr "Почати на" + +msgid "Step east" +msgstr "Крок на схід" + +msgid "Step west" +msgstr "Крок на схід" + +msgid "Stereo" +msgstr "Стерео" + +msgid "Stop" +msgstr "Зупинити" + +msgid "Stop Timeshift?" +msgstr "Зупинити Timeshift?" + +msgid "Stop current event and disable coming events" +msgstr "Зупинити активне завдання і відмінити наступне" + +msgid "Stop current event but not coming events" +msgstr "Зупинити активне завдання але не наступне" + +msgid "Stop playing this movie?" +msgstr "Зупинити відтворення цього фільму?" + +msgid "Stop test" +msgstr "Зупинити тест" + +msgid "Store position" +msgstr "Зберегти позицію" + +msgid "Stored position" +msgstr "Збережена позиція" + +msgid "Subservice list..." +msgstr "список підсервісів..." + +msgid "Subservices" +msgstr "Підсервіси" + +msgid "Subtitle selection" +msgstr "Вибір субтитрів" + +msgid "Subtitles" +msgstr "Субтитри" + +msgid "Sun" +msgstr "Нед" + +msgid "Sunday" +msgstr "Неділя" + +msgid "Swap Services" +msgstr "Заміна каналів" + +msgid "Swedish" +msgstr "Шведська" + +msgid "Switch to next subservice" +msgstr "перемкнути на наступний підсервіс" + +msgid "Switch to previous subservice" +msgstr "перемкнути на попередній підсервіс" + +msgid "Symbol Rate" +msgstr "Символьна швидкість" + +msgid "Symbolrate" +msgstr "Символ. швидкість" + +msgid "System" +msgstr "Система" + +#. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline) +msgid "TRANSLATOR_INFO" +msgstr "" + +msgid "TS file is too large for ISO9660 level 1!" +msgstr "" + +msgid "TV System" +msgstr "TV Система" + +msgid "Table of content for collection" +msgstr "Таблиця вмісту для колекції" + +msgid "Terrestrial" +msgstr "Наземний" + +msgid "Terrestrial provider" +msgstr "Наземний провайдер" + +msgid "Test mode" +msgstr "Тестовий режим" + +msgid "Test the network configuration of your Dreambox.\n" +msgstr "Тест мережевого з'єднання Вашого Dreambox'а.\n" + +msgid "Test-Messagebox?" +msgstr "Тест-Messagebox?" + +msgid "" +"Thank you for using the wizard. Your box is now ready to use.\n" +"Please press OK to start using your Dreambox." +msgstr "" + +msgid "" +"The .NFI Image flasher USB stick is now ready to use. Please download an ." +"NFI image file from the feed server and save it on the stick. Then reboot " +"and hold the 'Down' key on the front panel to boot the .NFI flasher from the " +"stick!" +msgstr "" + +msgid "" +"The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to " +"create a Dreambox format data DVD (which will not play in stand-alone DVD " +"players) instead?" +msgstr "" +"DVD-стандарт не підтримує H.264 (HDTV) відео. Ви хочете створити DVD з " +"даними в Dreambox-форматі (який не буде програватись в стандартних DVD " +"програвачах)?" + +msgid "The backup failed. Please choose a different backup location." +msgstr "Збереження невдале. Виберіть інше місце для розташування копії." + +#, python-format +msgid "" +"The following device was found:\n" +"\n" +"%s\n" +"\n" +"Do you want to write the USB flasher to this stick?" +msgstr "" + +msgid "" +"The input port should be configured now.\n" +"You can now configure the screen by displaying some test pictures. Do you " +"want to do that now?" +msgstr "" +"Вхідний порт повинен бути налаштований зараз.\n" +"Ви можете налаштувати зображення за допомогою декількох тестових екранів. " +"Бажаєте це зробити зараз?" + +msgid "The installation of the default services lists is finished." +msgstr "Встановлення стандартного списку каналів завершено." + +msgid "" +"The installation of the default settings is finished. You can now continue " +"configuring your Dreambox by pressing the OK button on the remote control." +msgstr "" +"Встановлення стандартних параметрів завершено. Ви можете продовжити " +"налаштування Dreambox'а натиснувши OK на пульті." + +msgid "" +"The md5sum validation failed, the file may be corrupted! Are you sure that " +"you want to burn this image to flash memory? You are doing this at your own " +"risk!" +msgstr "" + +msgid "" +"The md5sum validation failed, the file may be downloaded incompletely or be " +"corrupted!" +msgstr "" + +msgid "The package doesn't contain anything." +msgstr "Пакет не містить в собі ніяких даних." + +#, python-format +msgid "The path %s already exists." +msgstr "Шлях %s вже існує " + +msgid "The pin code has been changed successfully." +msgstr "PIN-код змінено успішно." + +msgid "The pin code you entered is wrong." +msgstr "Введений PIN-код невірний." + +msgid "The pin codes you entered are different." +msgstr "Введений PIN-код є іншим." + +msgid "The sleep timer has been activated." +msgstr "Таймер сну активний." + +msgid "The sleep timer has been disabled." +msgstr "Таймер сну було відмінено." + +msgid "The timer file (timers.xml) is corrupt and could not be loaded." +msgstr "Файл таймера (timers.xml) є пошкодженим і не може бути виконаний." + +msgid "" +"The wireless LAN plugin is not installed!\n" +"Please install it." +msgstr "" +"WI-FI додаток не встановлений!\n" +"Будь ласка встановіть його." + +msgid "" +"The wizard can backup your current settings. Do you want to do a backup now?" +msgstr "Майстер може зберегти Ваші налаштування. Бажаєте зробити копію зараз?" + +msgid "The wizard is finished now." +msgstr "Майстер завершив роботу." + +msgid "There are no default services lists in your image." +msgstr "Цей імідж не містить стандартного списку каналів." + +msgid "There are no default settings in your image." +msgstr "Цей імідж не містить стандартних налаштувань." + +msgid "" +"There might not be enough Space on the selected Partition.\n" +"Do you really want to continue?" +msgstr "" +"Недостатньо місця на вибраному розділі.\n" +"Ви дійсно хочете продовжити?" + +#, python-format +msgid "This .NFI file does not contain a valid %s image!" +msgstr "" + +msgid "" +"This .NFI file does not have a md5sum signature and is not guaranteed to " +"work. Do you really want to burn this image to flash memory?" +msgstr "" + +msgid "" +"This .NFI file has a valid md5 signature. Continue programming this image to " +"flash memory?" +msgstr "" + +msgid "" +"This DVD RW medium is already formatted - reformatting will erase all " +"content on the disc." +msgstr "" +"Цей DVD-RW диск вже відформатований - переформатування знищить всі дані на " +"диску" + +#, python-format +msgid "This Dreambox can't decode %s video streams!" +msgstr "Цей Dreambox не в змозі декодувати %s відео потік!" + +msgid "This is step number 2." +msgstr "Це крок номер 2." + +msgid "This is unsupported at the moment." +msgstr "Це не підтримується на даний час." + +msgid "" +"This test checks for configured Nameservers.\n" +"If you get a \"unconfirmed\" message:\n" +"- please check your DHCP, cabling and Adapter setup\n" +"- if you configured your Nameservers manually please verify your entries in " +"the \"Nameserver\" Configuration" +msgstr "" +"Цей тест перевіряє правильність налаштувань Nameserver'ів.\n" +"Якщо побачите повідомлення \"unconfirmed\":\n" +"- перевірте DHCP, кабель і налаштування мережі\n" +"- якщо ви налаштовували Nameserver вручну, будь ласка перевірте записи в " +"\"Nameserver\" Конфігурація" + +msgid "" +"This test checks whether a network cable is connected to your LAN-Adapter.\n" +"If you get a \"disconnected\" message:\n" +"- verify that a network cable is attached\n" +"- verify that the cable is not broken" +msgstr "" +"Цей тест перевірить чи під'єднаний кабель до Вашого мережевого адаптера.\n" +"Якщо побачите повідомлення \"disconnected\":\n" +"- перевірте чи мережевий кабель дійсно під'єднано\n" +"- перевірте чи мережевий кабель не пошкоджений" + +msgid "" +"This test checks whether a valid IP Address is found for your LAN Adapter.\n" +"If you get a \"unconfirmed\" message:\n" +"- no valid IP Address was found\n" +"- please check your DHCP, cabling and adapter setup" +msgstr "" +"Цей тест перевірить чи знайдено дійсний IP-адрес для Вашого мережевого " +"адаптера.\n" +"Якщо побачите повідомлення \"unconfirmed\":\n" +"- не знайдено дійсний IP-адрес\n" +"- перевірте DHCP, кабель і мережевий адаптер" + +msgid "" +"This test checks whether your LAN Adapter is set up for automatic IP Address " +"configuration with DHCP.\n" +"If you get a \"disabled\" message:\n" +" - then your LAN Adapter is configured for manual IP Setup\n" +"- verify thay you have entered correct IP informations in the AdapterSetup " +"dialog.\n" +"If you get an \"enabeld\" message:\n" +"-verify that you have a configured and working DHCP Server in your network." +msgstr "" +"Цей тест перевірить чи налаштований Ваш мережевий адаптер для " +"автоматичноїконфігурації IP-адреси з DHCP.\n" +"Якщо побачите повідомлення \"disabled\":\n" +"- тоді мережевий адаптер налаштований для ручної конфігурації IP-адреси без " +"DHCP\n" +"- перевірте чи в налаштуваннях адаптера введена правильна IP інформація.\n" +"Якщо побачите повідомлення \"enabled\":\n" +"- перевірте чи є в Вашій мережі правильно налаштований і працюючий DHCP " +"сервер" + +msgid "This test detects your configured LAN-Adapter." +msgstr "Цей тест визначить Ваш мережевий адаптер." + +msgid "Three" +msgstr "Три" + +msgid "Threshold" +msgstr "Поріг" + +msgid "Thu" +msgstr "Четв" + +msgid "Thursday" +msgstr "Четвер" + +msgid "Time" +msgstr "Час" + +msgid "Time/Date Input" +msgstr "Час / Дата" + +msgid "Timer" +msgstr "Таймер" + +msgid "Timer Edit" +msgstr "Редагування Таймера" + +msgid "Timer Editor" +msgstr "Редактор Таймера" + +msgid "Timer Type" +msgstr "Тип Таймера" + +msgid "Timer entry" +msgstr "Ввід таймера" + +msgid "Timer log" +msgstr "Лог таймера" + +msgid "" +"Timer overlap in timers.xml detected!\n" +"Please recheck it!" +msgstr "" + +msgid "Timer sanity error" +msgstr "Помилка таймера" + +msgid "Timer selection" +msgstr "Вибір таймера" + +msgid "Timer status:" +msgstr "Статус таймера:" + +msgid "Timeshift" +msgstr "Timeshift" + +msgid "Timeshift not possible!" +msgstr "Timeshift неможливий!" + +msgid "Timezone" +msgstr "Часовий пояс" + +msgid "Title" +msgstr "Епізод" + +msgid "Title properties" +msgstr "" + +msgid "Title:" +msgstr "Заголовок:" + +msgid "Titleset mode" +msgstr "" + +msgid "" +"To make sure you intend to do this, please remove the target USB stick now " +"and stick it back in upon prompt. Press OK when you have taken the stick out." +msgstr "" + +msgid "Today" +msgstr "Сьогодні" + +msgid "Tone mode" +msgstr "Тоновий режим" + +msgid "Toneburst" +msgstr "Тоновий сигнал" + +msgid "Toneburst A/B" +msgstr "Тоновий сигнал A/B" + +msgid "Track" +msgstr "Трек" + +msgid "Translation" +msgstr "" + +msgid "Translation:" +msgstr "" + +msgid "Transmission Mode" +msgstr "Режим передавання" + +msgid "Transmission mode" +msgstr "Режим передавання" + +msgid "Transponder" +msgstr "Транспондер" + +msgid "Transponder Type" +msgstr "Тип Транспондера" + +msgid "Tries left:" +msgstr "Залишилось спроб:" + +msgid "Try to find used Transponders in cable network.. please wait..." +msgstr "" +"Спроба знайти використовувані транспондери в кабельній мережі... Зачекайте " +"будь ласка..." + +msgid "Try to find used transponders in cable network.. please wait..." +msgstr "" +"Спроба знайти використовувані транспондери в кабельній мережі... Зачекайте " +"будь ласка..." + +msgid "Tue" +msgstr "Вівт" + +msgid "Tuesday" +msgstr "Вівторок" + +msgid "Tune" +msgstr "" + +msgid "Tune failed!" +msgstr "" + +msgid "Tuner" +msgstr "Тюнер" + +msgid "Tuner " +msgstr "Тюнер " + +msgid "Tuner Slot" +msgstr "Слот Тюнера" + +msgid "Tuner configuration" +msgstr "Конфігурація тюнера" + +msgid "Tuner status" +msgstr "Статус тюнера" + +msgid "Turkish" +msgstr "Турецька" + +msgid "Two" +msgstr "Два" + +msgid "Type of scan" +msgstr "Тип сканування" + +msgid "USALS" +msgstr "USALS" + +msgid "USB" +msgstr "USB" + +msgid "USB Stick" +msgstr "USB-Stick" + +msgid "Ukrainian" +msgstr "" + +msgid "" +"Unable to complete filesystem check.\n" +"Error: " +msgstr "" +"Неможливо завершити перевірку файлової системи.\n" +"Помилка: " + +msgid "" +"Unable to initialize harddisk.\n" +"Error: " +msgstr "" +"Неможливо визначити HDD.\n" +"Помилка: " + +msgid "Uncommitted DiSEqC command" +msgstr "Нейтральна DiSEqC команда" + +msgid "Universal LNB" +msgstr "Універсальна LNB" + +msgid "Unmount failed" +msgstr "Розмонтування невдале" + +msgid "Update" +msgstr "" + +msgid "Updates your receiver's software" +msgstr "Оновлення ПЗ Вашого ресівера" + +msgid "Updating finished. Here is the result:" +msgstr "Оновлення завершено. Ось результат:" + +msgid "Updating... Please wait... This can take some minutes..." +msgstr "Йде оновлення... Прохання зачекати... Це займе декілька хвилин..." + +msgid "Upgrade finished. Do you want to reboot your Dreambox?" +msgstr "Оновлення завершено. Бажаєте перезавантажити Dreambox?" + +msgid "Upgrading" +msgstr "Оновлення" + +msgid "Upgrading Dreambox... Please wait" +msgstr "Оновлення Dreambox'a... Прохання зачекати" + +msgid "Use" +msgstr "" + +msgid "Use DHCP" +msgstr "Використовувати DHCP" + +msgid "Use Interface" +msgstr "" + +msgid "Use Power Measurement" +msgstr "Використовувати вимірювання потужності" + +msgid "Use a gateway" +msgstr "Використовувати шлюз" + +#. TRANSLATORS: The effect of "Non-smooth winding" is that rather +#. than using ordinary "continuous" or "smooth" winding, a fast +#. sequence of stills is shown when winding at high speeds. This +#. makes it much easier too follow when almost each frame comes from +#. a new scene. The effect is achieved by repeating each shown frame +#. a couple of times. The settings control both at which speed this +#. winding mode sets in, and how many times each frame should be +#. repeated. This was previously called "Discontinuous playback" +#. which was incomprehensible. "Non-smooth winding" may be a better +#. term, but note that there is nothing irregular about it. Synonyms +#. better suited for translation to other languages may be "stepwise +#. winding/playback", or "winding/playback using stills". +msgid "Use non-smooth winding at speeds above" +msgstr "Неплавне перемотування на швидкостях вище" + +msgid "Use power measurement" +msgstr "Використовувати вимірювання потужності" + +msgid "Use the Networkwizard to configure your Network\n" +msgstr "Використовувати Networkwizard для налаштувань мережі\n" + +msgid "" +"Use the left and right buttons to change an option.\n" +"\n" +"Please set up tuner A" +msgstr "" +"Для зміни параметрів використовуйте кнопки вліво/вправо.\n" +"\n" +"Виберіть Тюнер A" + +msgid "" +"Use the up/down keys on your remote control to select an option. After that, " +"press OK." +msgstr "" +"Для зміни параметрів використовуйте кнопки вверх/вниз. Після цього, " +"натисніть OK." + +msgid "Use usals for this sat" +msgstr "Використовувати USALS для цього супутника" + +msgid "Use wizard to set up basic features" +msgstr "Використати помічник для налаштування" + +msgid "Used service scan type" +msgstr "Тип пошуку каналів" + +msgid "User defined" +msgstr "Визначені користувачем" + +msgid "VCR scart" +msgstr "VCR скарт" + +msgid "VMGM (intro trailer)" +msgstr "" + +msgid "Video Fine-Tuning" +msgstr "Налаштування зображення" + +msgid "Video Fine-Tuning Wizard" +msgstr "Майстер налаштування зображення" + +msgid "Video Output" +msgstr "Відео вихід" + +msgid "Video Setup" +msgstr "Налаштування відео" + +msgid "Video Wizard" +msgstr "Майстер налаштувань відео" + +msgid "" +"Video input selection\n" +"\n" +"Please press OK if you can see this page on your TV (or select a different " +"input port).\n" +"\n" +"The next input port will be automatically probed in 10 seconds." +msgstr "" +"Вибір відео виходу\n" +"\n" +"Якщо Ви бачити цю сторінку на екрані TV то натисніть ОК (або виберіть інший " +"вхідний порт).\n" +"\n" +"Наступний вхідний порт буде автоматично випробувано через 10 сек.." + +msgid "Video mode selection." +msgstr "Вибір Відео режиму" + +msgid "View Rass interactive..." +msgstr "Показати інтерактивний Rass..." + +msgid "View teletext..." +msgstr "показати телетекст..." + +msgid "Virtual KeyBoard" +msgstr "" + +msgid "Voltage mode" +msgstr "Режим напруги" + +msgid "Volume" +msgstr "Гучність" + +msgid "W" +msgstr "W" + +msgid "WEP" +msgstr "" + +msgid "WPA" +msgstr "" + +msgid "WPA or WPA2" +msgstr "" + +msgid "WPA2" +msgstr "" + +msgid "WSS on 4:3" +msgstr "WSS na 4:3" + +msgid "Waiting" +msgstr "Очікування" + +msgid "Waiting for USB stick to settle..." +msgstr "" + +msgid "" +"We will now test if your TV can also display this resolution at 50hz. If " +"your screen goes black, wait 20 seconds and it will switch back to 60hz.\n" +"Please press OK to begin." +msgstr "" +"Зараз перевірим чи Ваш може TV відобразити цю роздільчу здатність при 50Гц " +"Якщо екран буде чорним, то зачекайте 20 сек. і він перключиться назад на " +"60Гц\n" +"Для початку натисніть на ОК." + +msgid "Wed" +msgstr "Сер" + +msgid "Wednesday" +msgstr "Середа" + +msgid "Weekday" +msgstr "День тижня" + +msgid "" +"Welcome to the Cutlist editor.\n" +"\n" +"Seek to the start of the stuff you want to cut away. Press OK, select 'start " +"cut'.\n" +"\n" +"Then seek to the end, press OK, select 'end cut'. That's it." +msgstr "" + +msgid "" +"Welcome to the Image upgrade wizard. The wizard will assist you in upgrading " +"the firmware of your Dreambox by providing a backup facility for your " +"current settings and a short explanation of how to upgrade your firmware." +msgstr "" +"Ласкаво просимо до помічника оновлення Іміджів. Він допоможе Вам в оновленні " +"програмного забезпечення, забезпечуючи резервне копіювання параметрів та " +"налаштувань і коротко пояснить як оновити програмне забезпечення." + +msgid "" +"Welcome.\n" +"\n" +"This start wizard will guide you through the basic setup of your Dreambox.\n" +"Press the OK button on your remote control to move to the next step." +msgstr "" +"Ласкаво просимо.\n" +"\n" +"Цей помічник допоможе Вам зробити основні налаштування вашого Dreambox'а\n" +"Натисніть на ОК щоб перейти до слідуючого кроку." + +msgid "Welcome..." +msgstr "Ласкаво просимо..." + +msgid "West" +msgstr "Захід" + +msgid "What do you want to scan?" +msgstr "Що хочете сканувати?" + +msgid "Where do you want to backup your settings?" +msgstr "Де хочете зробити копію своїх налаштувань?" + +msgid "Wireless" +msgstr "Безпровідний" + +msgid "Wireless Network" +msgstr "Безпровідна мережа" + +msgid "Write error while recording. Disk full?\n" +msgstr "Виникла помилка під час запису. Диск заповнений?\n" + +msgid "Write failed!" +msgstr "Записати невдалось!" + +msgid "Writing NFI image file to flash completed" +msgstr "" + +msgid "Writing image file to NAND Flash" +msgstr "" + +msgid "YPbPr" +msgstr "YPbPr" + +msgid "Year:" +msgstr "Рік:" + +msgid "Yes" +msgstr "Так" + +msgid "Yes, and delete this movie" +msgstr "" + +msgid "Yes, backup my settings!" +msgstr "Так, зробити копію моїх налаштувань!" + +msgid "Yes, do a manual scan now" +msgstr "Так, розпочати ручний пошук" + +msgid "Yes, do an automatic scan now" +msgstr "Так, розпочати автоматичний пошук" + +msgid "Yes, do another manual scan now" +msgstr "Так, почати інший ручний пошук" + +msgid "Yes, perform a shutdown now." +msgstr "Так вимкнути зараз." + +msgid "Yes, restore the settings now" +msgstr "Так, відновити мої налаштування зараз" + +msgid "Yes, returning to movie list" +msgstr "Так, але повернутись до списку фільмів" + +msgid "Yes, view the tutorial" +msgstr "Так, показати інструкцію" + +msgid "" +"You can choose some default settings now. Please select the settings you " +"want to be installed." +msgstr "" +"Ви можете вибрати деякі стандартні налаштування зараз. Будь ласка виберіть " +"налаштування які хочете встановити." + +msgid "You can choose, what you want to install..." +msgstr "Ви можете вибрати, що хочете встановити..." + +msgid "You cannot delete this!" +msgstr "Ви не можете це видалити!" + +msgid "You chose not to install any default services lists." +msgstr "Не вибрано жодного стандартного списку для встановлення." + +msgid "" +"You chose not to install any default settings. You can however install the " +"default settings later in the settings menu." +msgstr "" +"Не вибрано жодних стандартних налаштувань до встановлення. Ви можете " +"встановити стандартні налаштування пізніше з меню налаштувань." + +msgid "" +"You chose not to install anything. Please press OK finish the install wizard." +msgstr "" +"Не вибрано нічого до встановлення. Натисніть ОК для завершення роботи " +"помічника.." + +msgid "" +"You do not seem to have a harddisk in your Dreambox. So backing up to a " +"harddisk is not an option for you." +msgstr "" +"Здається, що нема жорсткого диску в Dreambox'і. Отже створити копію на HDD " +"неможливо." + +msgid "" +"You have chosen to backup to a compact flash card. The card must be in the " +"slot. We do not verify if it is really used at the moment. So better backup " +"to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Ви вибрали створення копії на карту CF. Карта повинна бути в слоті. " +"Неможливо перевірити чи дійсно карта використовується зараз. Краще зробити " +"копію на HDD!\n" +"Натисніть на OK щоб створити копію зараз." + +msgid "" +"You have chosen to backup to an usb drive. Better backup to the harddisk!\n" +"Please press OK to start the backup now." +msgstr "" +"Ви вибрали створення копії на USB флеш. Краще зробити копію на HDD!\n" +"Натисніть на OK щоб створити копію зараз." + +msgid "" +"You have chosen to backup to your harddisk. Please press OK to start the " +"backup now." +msgstr "" +"Ви вибрали створення копії на HDD. Будь ласка, натисніть на OK щоб створити " +"копію зараз." + +msgid "" +"You have chosen to create a new .NFI flasher bootable USB stick. This will " +"repartition the USB stick and therefore all data on it will be erased." +msgstr "" + +#, python-format +msgid "You have to wait %s!" +msgstr "" + +msgid "" +"You need a PC connected to your dreambox. If you need further instructions, " +"please visit the website http://www.dm7025.de.\n" +"Your dreambox will now be halted. After you have performed the update " +"instructions from the website, your new firmware will ask you to restore " +"your settings." +msgstr "" +"Вам потрібно з'єднати PC з Вашим Drembox'ом. Якщо необхідно більше " +"інформації, будь ласка відвідайте сайт http://www.dm7025.de.\n" +"Зараз Ваш Drembox буде вимкнено. Після виконання всіх інструкцій з сайта, " +"Ваше нове програмне забезпечення запропонує відновити свої налаштування." + +msgid "" +"You need to define some keywords first!\n" +"Press the menu-key to define keywords.\n" +"Do you want to define keywords now?" +msgstr "" +"Спочатку Ви повинні визначити деякі ключові слова!\n" +"Натисніть клавішу MENU, щоб визначити\n" +"Ви хочете визначити ключові слова зараз?" + +msgid "" +"You need to set a pin code and hide it from your children.\n" +"\n" +"Do you want to set the pin now?" +msgstr "" +"Ви повинні ввести PIN-код і сховати це від своїх дітей.\n" +"\n" +"Хочете ввести PIN-код зараз?" + +msgid "Your Dreambox will restart after pressing OK on your remote control." +msgstr "Ваш Dreambox перезавантажиться після натиснення на ОК пульта ДУ." + +msgid "Your TV works with 50 Hz. Good!" +msgstr "Ваш TБ працює з 50 Гц. Добре!" + +msgid "" +"Your backup succeeded. We will now continue to explain the further upgrade " +"process." +msgstr "" +"Копію зроблено успішно. Зараз ми продовжимо пояснення подальшого процесу " +"оновлення." + +msgid "Your dreambox is shutting down. Please stand by..." +msgstr "Ваш Dreambox вимикається. Прохання зачекати..." + +msgid "" +"Your dreambox isn't connected to the internet properly. Please check it and " +"try again." +msgstr "" +"Ваш Dreambox не під'єднаний до інтернету належним чином. Будь ласка " +"перевірте і спробуйте знов." + +msgid "" +"Your frontprocessor firmware must be upgraded.\n" +"Press OK to start upgrade." +msgstr "" +"ПЗ фронтпроцесора повинно бути оновлене.\n" +"Натисніть OK для початку оновлення." + +msgid "Your network configuration has been activated." +msgstr "" + +msgid "" +"Your network configuration has been activated.\n" +"A second configured interface has been found.\n" +"\n" +"Do you want to disable the second network interface?" +msgstr "" + +msgid "Zap back to service before positioner setup?" +msgstr "" +"Перемкнути назад на канал перед\n" +"налаштуванням позиціонера?" + +msgid "Zap back to service before satfinder?" +msgstr "Повернутись назад на канал?" + +msgid "[alternative edit]" +msgstr "[редагування вибраного]" + +msgid "[bouquet edit]" +msgstr "[редагування пакету]" + +msgid "[favourite edit]" +msgstr "[редагування фаворитів]" + +msgid "[move mode]" +msgstr "[режим переміщення]" + +msgid "abort alternatives edit" +msgstr "відмінити редагування вибраного" + +msgid "abort bouquet edit" +msgstr "відмінити редагування пакету" + +msgid "abort favourites edit" +msgstr "відмінити редагування фаворитів" + +msgid "about to start" +msgstr "Як почати" + +msgid "activate current configuration" +msgstr "" + +msgid "add a nameserver entry" +msgstr "" + +msgid "add alternatives" +msgstr "додати вибране" + +msgid "add bookmark" +msgstr "додати закладку" + +msgid "add bouquet" +msgstr "додати пакет" + +msgid "add directory to playlist" +msgstr "додати папку до плейлиста" + +msgid "add file to playlist" +msgstr "додати файл до плейлиста" + +msgid "add files to playlist" +msgstr "додати файли до плейлиста" + +msgid "add marker" +msgstr "додати закладку" + +msgid "add recording (enter recording duration)" +msgstr "додати запис (вкажіть тривалість запису)" + +msgid "add recording (enter recording endtime)" +msgstr "додати запис (вкажіть час закінчення запису)" + +msgid "add recording (indefinitely)" +msgstr "додати запис (на невизначений час)" + +msgid "add recording (stop after current event)" +msgstr "додати запис (зупинити після виконання)" + +msgid "add service to bouquet" +msgstr "додати канал до списку" + +msgid "add service to favourites" +msgstr "додати канал до фаворитів" + +msgid "add to parental protection" +msgstr "додати в батьківський контроль" + +msgid "advanced" +msgstr "додати в батьківський контроль" + +msgid "alphabetic sort" +msgstr "сортувати за алфавітом" + +msgid "" +"are you sure you want to restore\n" +"following backup:\n" +msgstr "" +"Ви дійсно бажаєте відновити\n" +"наступну копію:\n" + +#, python-format +msgid "audio track (%s) format" +msgstr "" + +#, python-format +msgid "audio track (%s) language" +msgstr "" + +msgid "audio tracks" +msgstr "звукова доріжка" + +msgid "back" +msgstr "назад" + +msgid "background image" +msgstr "фонове зображення" + +msgid "better" +msgstr "кращий" + +msgid "blacklist" +msgstr "чорний список" + +#, python-format +msgid "burn audio track (%s)" +msgstr "" + +msgid "by Exif" +msgstr "" + +msgid "change recording (duration)" +msgstr "змінити тривалість запису" + +msgid "change recording (endtime)" +msgstr "змінити час закінчення запису" + +msgid "chapters" +msgstr "фрагменти" + +msgid "choose destination directory" +msgstr "" + +msgid "circular left" +msgstr "кругова ліва" + +msgid "circular right" +msgstr "кругова права" + +msgid "clear playlist" +msgstr "очистити плейлист" + +msgid "color" +msgstr "колір" + +msgid "complex" +msgstr "комплексний" + +msgid "config menu" +msgstr "меню конфігурації" + +msgid "confirmed" +msgstr "підтверджений" + +msgid "connected" +msgstr "під'єднаний" + +msgid "continue" +msgstr "продовжити" + +msgid "copy to bouquets" +msgstr "копіювати до пакетів" + +msgid "create directory" +msgstr "створити директорію" + +msgid "daily" +msgstr "щодня" + +msgid "day" +msgstr "день" + +msgid "delete cut" +msgstr "видалити вирізане" + +msgid "delete file" +msgstr "" + +msgid "delete playlist entry" +msgstr "видалити запис з плейлиста" + +msgid "delete saved playlist" +msgstr "видалити збережений плейлист" + +msgid "delete..." +msgstr "видалити..." + +msgid "disable" +msgstr "вимкнути" + +msgid "disable move mode" +msgstr "вимкнути режим переміщення" + +msgid "disabled" +msgstr "вимкнуто" + +msgid "disconnected" +msgstr "роз'єднано" + +msgid "do not change" +msgstr "не змінювати" + +msgid "do nothing" +msgstr "не робити нічого" + +msgid "don't record" +msgstr "не записувати" + +msgid "done!" +msgstr "виконано!" + +msgid "edit alternatives" +msgstr "редагувати вибрані канали" + +msgid "empty" +msgstr "пусто" + +msgid "enable" +msgstr "ввівмкнути" + +msgid "enable bouquet edit" +msgstr "ввівмкнути редагування пакету" + +msgid "enable favourite edit" +msgstr "ввівмкнути редагування фаворитів" + +msgid "enable move mode" +msgstr "ввімкнути режим переміщення" + +msgid "enabled" +msgstr "ввімкнуто" + +msgid "end alternatives edit" +msgstr "кінець редагування вибраного" + +msgid "end bouquet edit" +msgstr "кінець редагування пакету" + +msgid "end cut here" +msgstr "кінець вирізання тут" + +msgid "end favourites edit" +msgstr "кінець редагування фаворитів" + +msgid "enigma2 and network" +msgstr "" + +msgid "equal to" +msgstr "однаково як" + +msgid "exceeds dual layer medium!" +msgstr "перевищує розмір Dual-Layer диску!" + +msgid "exit DVD player or return to file browser" +msgstr "вийти з DVD програвача" + +msgid "exit mediaplayer" +msgstr "вийти з медіапрогравача" + +msgid "exit movielist" +msgstr "вийти з списку файлів" + +msgid "exit nameserver configuration" +msgstr "" + +msgid "exit network adapter configuration" +msgstr "" + +msgid "exit network adapter setup menu" +msgstr "" + +msgid "exit network interface list" +msgstr "" + +msgid "exit networkadapter setup menu" +msgstr "" + +msgid "failed" +msgstr "" + +msgid "filename" +msgstr "назва файлу" + +msgid "fine-tune your display" +msgstr "налаштуйте зображення екрану" + +msgid "font face" +msgstr "шрифт" + +msgid "forward to the next chapter" +msgstr "перейти до наступного фрагменту" + +msgid "free" +msgstr "вільно" + +msgid "free diskspace" +msgstr "вільного місця" + +msgid "go to deep standby" +msgstr "вимкнути Dreambox" + +msgid "go to standby" +msgstr "перейти в режим очікування" + +msgid "headline" +msgstr "надпис" + +msgid "hear radio..." +msgstr "слухати радіо..." + +msgid "help..." +msgstr "допомога..." + +msgid "hidden network" +msgstr "" + +msgid "hide extended description" +msgstr "не показувати розширений опис" + +msgid "hide player" +msgstr "не показувати програвач" + +msgid "highlighted button" +msgstr "підсвічена кнопка" + +msgid "horizontal" +msgstr "горизонталь (H)" + +msgid "hour" +msgstr "година" + +msgid "hours" +msgstr "годин" + +msgid "immediate shutdown" +msgstr "миттєве вимкнення" + +#, python-format +msgid "" +"incoming call!\n" +"%s calls on %s!" +msgstr "" +"вхідний дзвінок!\n" +"%s розмову почато %s!" + +msgid "init module" +msgstr "ініціалізувати модуль" + +msgid "insert mark here" +msgstr "вставити закладку тут" + +msgid "jump back to the previous title" +msgstr "перейти до попереднього епізоду" + +msgid "jump forward to the next title" +msgstr "перейти до наступного епізоду" + +msgid "jump to listbegin" +msgstr "перейти до початку списку" + +msgid "jump to listend" +msgstr "перейти до кінця списку" + +msgid "jump to next marked position" +msgstr "перейти до наступної закладки" + +msgid "jump to previous marked position" +msgstr "перейти до попередньої закладки" + +msgid "leave movie player..." +msgstr "вийти з програвача..." + +msgid "left" +msgstr "Лівий канал" + +msgid "length" +msgstr "тривалість" + +msgid "list style compact" +msgstr "компактний стиль списку" + +msgid "list style compact with description" +msgstr "компактний стиль списку з описом" + +msgid "list style default" +msgstr "стандартний стиль списку" + +msgid "list style single line" +msgstr "простий лінійний стиль" + +msgid "load playlist" +msgstr "завантажити плейлист" + +msgid "locked" +msgstr "сигнал" + +msgid "loopthrough to" +msgstr "зв'язаний з" + +msgid "manual" +msgstr "вручну" + +msgid "menu" +msgstr "меню" + +msgid "menulist" +msgstr "" + +msgid "mins" +msgstr "хвилин" + +msgid "minute" +msgstr "хвилина" + +msgid "minutes" +msgstr "хвилин" + +msgid "month" +msgstr "Monat" + +msgid "move PiP to main picture" +msgstr "перемістити PiP до головного зображення" + +msgid "move down to last entry" +msgstr "" + +msgid "move down to next entry" +msgstr "" + +msgid "move up to first entry" +msgstr "" + +msgid "move up to previous entry" +msgstr "" + +msgid "movie list" +msgstr "список фільмів" + +msgid "multinorm" +msgstr "" + +msgid "never" +msgstr "ніколи" + +msgid "next channel" +msgstr "наступний канал в списку" + +msgid "next channel in history" +msgstr "наступний канал в історії перемикання" + +msgid "no" +msgstr "Ні" + +msgid "no HDD found" +msgstr "HDD не знайдено" + +msgid "no Picture found" +msgstr "не знайдено зображення" + +msgid "no module found" +msgstr "модуль не знайдено" + +msgid "no standby" +msgstr "без режиму очікування" + +msgid "no timeout" +msgstr "без зупинки" + +msgid "none" +msgstr "HDD не виявлено" + +msgid "not locked" +msgstr "нема сигналу" + +msgid "nothing connected" +msgstr "нічого не під'єднано" + +msgid "of a DUAL layer medium used." +msgstr "використовується DUAL-Layer диск." + +msgid "of a SINGLE layer medium used." +msgstr "eines SINGLE-Layer-Mediums benutzt." + +msgid "off" +msgstr "Ні" + +msgid "on" +msgstr "Так" + +msgid "on READ ONLY medium." +msgstr "на READ ONLY носії." + +msgid "once" +msgstr "один раз" + +msgid "open nameserver configuration" +msgstr "" + +msgid "open servicelist" +msgstr "відкрити список каналів" + +msgid "open servicelist(down)" +msgstr "відкрити список каналів (вниз)" + +msgid "open servicelist(up)" +msgstr "відкрити список каналів (вгору)" + +msgid "open virtual keyboard input help" +msgstr "" + +msgid "pass" +msgstr "пароль" + +msgid "pause" +msgstr "пауза" + +msgid "play entry" +msgstr "відтворити вибране" + +msgid "play from next mark or playlist entry" +msgstr "слід. закладка або запис плейлиста" + +msgid "play from previous mark or playlist entry" +msgstr "попер. закладка або запис плейлиста" + +msgid "please press OK when ready" +msgstr "Натисніть ОК коли буде виконано" + +msgid "please wait, loading picture..." +msgstr "Почекайте, йде завантаження зображення..." + +msgid "previous channel" +msgstr "попередній канал" + +msgid "previous channel in history" +msgstr "попередній канал в історії" + +msgid "rebooting..." +msgstr "" + +msgid "record" +msgstr "запис" + +msgid "recording..." +msgstr "йде запис..." + +msgid "remove a nameserver entry" +msgstr "" + +msgid "remove after this position" +msgstr "Видалити після цієї позиції" + +msgid "remove all alternatives" +msgstr "видалити вибрані канали" + +msgid "remove all new found flags" +msgstr "очистити список нових каналів" + +msgid "remove before this position" +msgstr "видалити перед цією позицією" + +msgid "remove bookmark" +msgstr "видалити закладку" + +msgid "remove directory" +msgstr "видалити директорію" + +msgid "remove entry" +msgstr "видалити канал зі списку" + +msgid "remove from parental protection" +msgstr "видалити з батьківського контролю" + +msgid "remove new found flag" +msgstr "видалити позначку new found " + +msgid "remove selected satellite" +msgstr "видалити вибраний супутник" + +msgid "remove this mark" +msgstr "видалити цю закладку" + +msgid "repeat playlist" +msgstr "повторне програвання плейлиста" + +msgid "repeated" +msgstr "повторно" + +msgid "rewind to the previous chapter" +msgstr "перейти до попереднього фрагменту" + +msgid "right" +msgstr "Правий канал" + +msgid "save last directory on exit" +msgstr "" + +msgid "save playlist" +msgstr "зберегти плейлист" + +msgid "save playlist on exit" +msgstr "" + +msgid "scan done!" +msgstr "пошук завершено!" + +#, python-format +msgid "scan in progress - %d%% done!" +msgstr "триває пошук - %d%% виконано!" + +msgid "scan state" +msgstr "Статус пошуку" + +msgid "second" +msgstr "секунда" + +msgid "second cable of motorized LNB" +msgstr "другий кабель моторизованої LNB" + +msgid "seconds" +msgstr "секунди" + +msgid "select" +msgstr "вибрати" + +msgid "select .NFI flash file" +msgstr "" + +msgid "select image from server" +msgstr "" + +msgid "select interface" +msgstr "" + +msgid "select menu entry" +msgstr "" + +msgid "select movie" +msgstr "виберіть фільм" + +msgid "select the movie path" +msgstr "виберіть шлях до фільму" + +msgid "service pin" +msgstr "PIN-код каналу" + +msgid "setup pin" +msgstr "PIN-код налаштувань" + +msgid "show DVD main menu" +msgstr "показати головне меню DVD" + +msgid "show EPG..." +msgstr "показати EPG..." + +msgid "show all" +msgstr "показати все" + +msgid "show alternatives" +msgstr "показати вибрані канали" + +msgid "show event details" +msgstr "показати деталі" + +msgid "show extended description" +msgstr "показати розширений опис" + +msgid "show first tag" +msgstr "показати першу помітку" + +msgid "show second tag" +msgstr "показати другу помітку" + +msgid "show shutdown menu" +msgstr "показати меню вимкнення" + +msgid "show single service EPG..." +msgstr "показати EPG одного каналу..." + +msgid "show tag menu" +msgstr "показати меню" + +msgid "show transponder info" +msgstr "інформація транспондера" + +msgid "shuffle playlist" +msgstr "перемішати плейлист" + +msgid "shutdown" +msgstr "вимкнути" + +msgid "simple" +msgstr "простий" + +msgid "skip backward" +msgstr "перескочити назад" + +msgid "skip backward (enter time)" +msgstr "перескочити назад (введіть час)" + +msgid "skip forward" +msgstr "перескочити вперед" + +msgid "skip forward (enter time)" +msgstr "перескочити вперед (введіть час)" + +msgid "sort by date" +msgstr "сортувати по даті" + +msgid "spaces (top, between rows, left)" +msgstr "відстані (зверху, між рядами, зліва)" + +msgid "standard" +msgstr "стандартний" + +msgid "standby" +msgstr "режим очікування" + +msgid "start cut here" +msgstr "початок вирізання тут" + +msgid "start directory" +msgstr "" + +msgid "start timeshift" +msgstr "включити timeshift" + +msgid "stereo" +msgstr "Стерео" + +msgid "stop PiP" +msgstr "вимкнути PiP" + +msgid "stop entry" +msgstr "зупинити вибране" + +msgid "stop recording" +msgstr "зупинити запис" + +msgid "stop timeshift" +msgstr "зупинити timeshift" + +msgid "swap PiP and main picture" +msgstr "змінити PiP і головне зображення" + +msgid "switch to bookmarks" +msgstr "перейти до закладок" + +msgid "switch to filelist" +msgstr "перейти до списку файлів" + +msgid "switch to playlist" +msgstr "перейти до плейлиста" + +msgid "switch to the next audio track" +msgstr "вибрати наступну аудіо доріжку" + +msgid "switch to the next subtitle language" +msgstr "вибрати наступну мову субтитрів" + +msgid "text" +msgstr "текст" + +msgid "this recording" +msgstr "цей запис" + +msgid "this service is protected by a parental control pin" +msgstr "цей канал захищений PIN кодом" + +msgid "toggle a cut mark at the current position" +msgstr "додати мітку вирізання в цю позицію" + +msgid "toggle time, chapter, audio, subtitle info" +msgstr "основна інформація" + +msgid "unconfirmed" +msgstr "неперевірене" + +msgid "unknown service" +msgstr "невідомий канал" + +msgid "until restart" +msgstr "аж до перезапуску" + +msgid "user defined" +msgstr "на вибір користувача" + +msgid "vertical" +msgstr "вертикальна (V)" + +msgid "view extensions..." +msgstr "додаткове меню..." + +msgid "view recordings..." +msgstr "перегляд записаних передач..." + +msgid "wait for ci..." +msgstr "почекайте на CI..." + +msgid "wait for mmi..." +msgstr "почекайте на mmi..." + +msgid "waiting" +msgstr "очікування" + +msgid "weekly" +msgstr "щотижня" + +msgid "whitelist" +msgstr "білий список" + +msgid "year" +msgstr "рік" + +msgid "yes" +msgstr "Так" + +msgid "yes (keep feeds)" +msgstr "Так" + +msgid "" +"your dreambox might be unusable now. Please consult the manual for further " +"assistance before rebooting your dreambox." +msgstr "" +"Ваш Dreambox зараз може бути непридатним для роботи. Будь ласка перегляньте " +"інструкцію користувача перед тим як перезавантажити ваш Dreambox." + +msgid "zap" +msgstr "переключити" + +msgid "zapped" +msgstr "Переключений" + +#~ msgid "" +#~ "\n" +#~ "Enigma2 will restart after the restore" +#~ msgstr "" +#~ "\n" +#~ "Enigma2 буде перезавантажена після відновлення" + +#~ msgid "" +#~ "Are you sure you want to enable WLAN support?\n" +#~ "Connect your Wlan USB Stick to your Dreambox and press OK.\n" +#~ "\n" +#~ msgstr "" +#~ "Ви дійсно бажаєте задіяти мережу WLAN?\n" +#~ "Підключіть WI-FI USB адаптер і натисніть OK.\n" +#~ "\n" + +#~ msgid "" +#~ "Are you sure you want to reset \n" +#~ "your network configuration to defaults?\n" +#~ "\n" +#~ msgstr "" +#~ "Ви впевнені що Ви хочете скинути\n" +#~ "свої налаштування мережі до стандартних?\n" +#~ "\n" + +#~ msgid "Confirm" +#~ msgstr "Перевірити" + +#~ msgid "Custom skip time for 1/3 keys" +#~ msgstr "Час пропуску для клавіш 1/3" + +#~ msgid "DVD ENTER key" +#~ msgstr "DVD кнопка 'ENTER'" + +#~ msgid "DVD down key" +#~ msgstr "DVD кнопка 'вниз'" + +#~ msgid "DVD left key" +#~ msgstr "DVD кнопка 'вліво'" + +#~ msgid "DVD right key" +#~ msgstr "DVD кнопка 'вправо'" + +#~ msgid "DVD up key" +#~ msgstr "DVD кнопка 'догори'" + +#~ msgid "Default-Wizard" +#~ msgstr "Майстер стандартних налаштувань" + +#~ msgid "Device Setup..." +#~ msgstr "Налаштування пристроїв..." + +#~ msgid "DiSEqC Mode" +#~ msgstr "DiSEqC Режим" + +#~ msgid "" +#~ "Do you really want to REMOVE\n" +#~ "the plugin \"" +#~ msgstr "" +#~ "Ви дійсно бажаєте видалити\n" +#~ "додаток \"" + +#~ msgid "" +#~ "Do you really want to download\n" +#~ "the plugin \"" +#~ msgstr "" +#~ "Ви дійсно хочете завантажити\n" +#~ "додаток \"" + +#~ msgid "Do you really want to exit?" +#~ msgstr "Ви дійсно хочете вийти?" + +#~ msgid "Enable WLAN Support" +#~ msgstr "Активувати підтримку WLAN" + +#~ msgid "Games / Plugins" +#~ msgstr "Ігри / Додатки" + +#~ msgid "Jump to video title 1 (play movie from start)" +#~ msgstr "Перейти до епізоду 1 (з початку)" + +#~ msgid "Movie Menu" +#~ msgstr "Меню фільмів" + +#~ msgid "Nameserver Setup..." +#~ msgstr "Налаштування Nameserver'а..." + +#~ msgid "" +#~ "No working local networkadapter found.\n" +#~ "Please verify that you have attached a network cable and your Network is " +#~ "configured correctly." +#~ msgstr "" +#~ "Не знайдено працюючого мережевого адаптера.\n" +#~ "Перевірте чи під'єднано мережевий кабель і чи мережа налаштована вірно." + +#~ msgid "" +#~ "No working wireless interface found.\n" +#~ " Please verify that you have attached a compatible WLAN device or enable " +#~ "you local network interface." +#~ msgstr "" +#~ "Не знайдено працюючого WI-FI інтерфейсу.\n" +#~ "Перевірте чи під'єднано сумісний WLAN USB Stick і чи активовано локальну " +#~ "мережу." + +#~ msgid "" +#~ "No working wireless networkadapter found.\n" +#~ "Please verify that you have attached a compatible WLAN USB Stick and your " +#~ "Network is configured correctly." +#~ msgstr "" +#~ "Не знайдено працюючого WI-FI адаптера.\n" +#~ "Перевірте чи під'єднано сумісний WI-FI USB адаптер і чи мережа " +#~ "налаштована вірно." + +#~ msgid "No, let me choose default lists" +#~ msgstr "Ні, дозволити мені вибрати стандартний список." + +#~ msgid "" +#~ "Pressing OK enables the built in wireless LAN support of your Dreambox.\n" +#~ "Wlan USB Sticks with Zydas ZD1211B and RAlink RT73 Chipset are " +#~ "supported.\n" +#~ "Connect your Wlan USB Stick to your Dreambox before pressing OK.\n" +#~ "\n" +#~ msgstr "" +#~ "Натисніть ОК для активації WI-FI мережі на вашому Dreambox.\n" +#~ "Підтримуюються USB адаптери з чіпсетами Zydas ZD1211B i RAlink RT73.\n" +#~ "Перед тим як натиснути OK вставте USB WI-FI адаптер.\n" +#~ "\n" + +#~ msgid "" +#~ "Recording(s) are in progress or coming up in few seconds... really reboot " +#~ "now?" +#~ msgstr "" +#~ "Запис триває або розпочнеться через декілька секунд...\n" +#~ "Дійсно перезавантажити зараз?" + +#~ msgid "" +#~ "Recording(s) are in progress or coming up in few seconds... really " +#~ "restart now?" +#~ msgstr "" +#~ "Запис триває або розпочнеться через декілька секунд...\n" +#~ "Дійсно почати запис по новому?" + +#~ msgid "" +#~ "Recording(s) are in progress or coming up in few seconds... really " +#~ "shutdown now?" +#~ msgstr "" +#~ "Запис триває або розпочнеться через декілька секунд...\n" +#~ "Дійсно вимкнути зараз?" + +#~ msgid "Reset configuration" +#~ msgstr "Скидання налаштувань" + +#~ msgid "" +#~ "Reset the network configuration of your Dreambox.\n" +#~ "\n" +#~ msgstr "Скинути мережеві налаштування Вашого Dreambox.\n" + +#~ msgid "Show files from %s" +#~ msgstr "Показати файли %s" + +#~ msgid "Startwizard" +#~ msgstr "Майстер налаштувань" + +#~ msgid "Step " +#~ msgstr "Крок " + +#~ msgid "" +#~ "Thank you for using the wizard. Your box is now ready to use.\n" +#~ "Please press OK to start using you Dreambox." +#~ msgstr "" +#~ "Дякуєм за використання помічника. Ваш бокс готовий до використання.\n" +#~ "Натисніть на ОК і почніть користуватись вашим Dreambox'ом." + +#~ msgid "" +#~ "The installation of the default settings is finished. Your can now " +#~ "continue configuring your Dreambox by pressing the OK button on the " +#~ "remote control." +#~ msgstr "" +#~ "Встановлення стандартних параметрів завершено. Ви можете продовжити " +#~ "налаштування Dreambox'а натиснувши OK на пульті." + +#~ msgid "" +#~ "Unable to initialize harddisk.\n" +#~ "Please refer to the user manual.\n" +#~ "Error: " +#~ msgstr "" +#~ "Неможливо визначити HDD.\n" +#~ "\n" +#~ "Будь ласка перегляньте інструкцію.\n" +#~ "Помилка: " + +#~ msgid "VCR Switch" +#~ msgstr "Переключення VCR" + +#~ msgid "You have to wait for" +#~ msgstr "Ви повинні зачекати на" + +#~ msgid "delete" +#~ msgstr "видалити" + +#~ msgid "equal to Socket A" +#~ msgstr "Як і тюнер A" + +#~ msgid "full /etc directory" +#~ msgstr "повністю директорію /etc" + +#~ msgid "loopthrough to socket A" +#~ msgstr "зв'язаний з тюнером A" + +#~ msgid "only /etc/enigma2 directory" +#~ msgstr "тільки директорія /etc/enigma2" + +#~ msgid "play next playlist entry" +#~ msgstr "відтворити наступний запис плейлиста" + +#~ msgid "play previous playlist entry" +#~ msgstr "відтворити попередній запис плейлиста" + +#~ msgid "" +#~ "scan done!\n" +#~ "%d services found!" +#~ msgstr "" +#~ "пошук завершено!\n" +#~ "%d каналів знайдено!." + +#~ msgid "" +#~ "scan done!\n" +#~ "No service found!" +#~ msgstr "" +#~ "пошук завершено!\n" +#~ "Не знайдено жодного каналу!" + +#~ msgid "" +#~ "scan done!\n" +#~ "One service found!" +#~ msgstr "" +#~ "пошук завершено!\n" +#~ "Один канал зайдено!" + +#~ msgid "" +#~ "scan in progress - %d %% done!\n" +#~ "%d services found!" +#~ msgstr "" +#~ "триває пошук - %d %% виконано!\n" +#~ "%d каналів знайдено!" + +#~ msgid "skip backward (self defined)" +#~ msgstr "перескочити назад (визнач. користувачем)" + +#~ msgid "skip forward (self defined)" +#~ msgstr "перескочити вперед (визнач. користувачем)" -- cgit v1.2.3 From eea4ecaf18d01dbdbe1590bc7b6e4c6f9da1fe8b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 17 Nov 2008 00:00:43 +0100 Subject: allows to configure the path for timeshift recordings via gui, by Moritz Venn. closes #64. --- data/menu.xml | 1 + lib/python/Components/UsageConfig.py | 5 ++++- lib/python/Screens/LocationBox.py | 29 +++++++++++++++++++++++++++++ lib/service/servicedvb.cpp | 32 ++++++++++++++++++++++++-------- 4 files changed, 58 insertions(+), 9 deletions(-) (limited to 'lib/python/Components') diff --git a/data/menu.xml b/data/menu.xml index 93455b23..369b20e0 100644 --- a/data/menu.xml +++ b/data/menu.xml @@ -70,6 +70,7 @@ --> + diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index 714d366d..6ed87840 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -1,5 +1,5 @@ from Components.Harddisk import harddiskmanager -from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet +from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations from enigma import Misc_Options, setTunerTypePriorityOrder; from SystemInfo import SystemInfo import os @@ -30,6 +30,9 @@ def InitUsageConfig(): ("standard", _("standard")), ("swap", _("swap PiP and main picture")), ("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ]) + config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"]) + config.usage.timeshift_path = ConfigText(default = "/media/hdd") + config.usage.on_movie_start = ConfigSelection(default = "ask", choices = [ ("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ]) config.usage.on_movie_stop = ConfigSelection(default = "ask", choices = [ diff --git a/lib/python/Screens/LocationBox.py b/lib/python/Screens/LocationBox.py index 7cd6cbf9..68d4f772 100644 --- a/lib/python/Screens/LocationBox.py +++ b/lib/python/Screens/LocationBox.py @@ -503,3 +503,32 @@ class MovieLocationBox(LocationBox): def __init__(self, session, text, dir, minFree = None): inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/lib", "/proc", "/sbin", "/sys", "/usr", "/var"] LocationBox.__init__(self, session, text = text, currDir = dir, bookmarks = config.movielist.videodirs, autoAdd = True, editDir = True, inhibitDirs = inhibitDirs, minFree = minFree) + +class TimeshiftLocationBox(LocationBox): + + skinName = "LocationBox" # XXX: though we could use a custom skin or inherit the hardcoded one we stick with the original :-) + + def __init__(self, session): + inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/lib", "/proc", "/sbin", "/sys", "/usr", "/var"] + LocationBox.__init__( + self, + session, + text = _("Where to save temporary timeshift recordings?"), + currDir = config.usage.timeshift_path.value, + bookmarks = config.usage.allowed_timeshift_paths, + autoAdd = True, + editDir = True, + inhibitDirs = inhibitDirs, + minFree = 1024 # XXX: the same requirement is hardcoded in servicedvb.cpp + ) + + def cancel(self): + config.usage.timeshift_path.cancel() + LocationBox.cancel(self) + + def selectConfirmed(self, ret): + if ret: + config.usage.timeshift_path.value = self.getPreferredFolder() + config.usage.timeshift_path.save() + LocationBox.selectConfirmed(self, ret) + diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 6c1e46f7..4141236a 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -31,8 +31,6 @@ #error no byte order defined! #endif -#define TSPATH "/media/hdd" - class eStaticServiceDVBInformation: public iStaticServiceInformation { DECLARE_REF(eStaticServiceDVBInformation); @@ -1494,9 +1492,16 @@ RESULT eDVBServicePlay::timeshift(ePtr &ptr) { if (!m_timeshift_enabled) { - /* we need enough diskspace */ + /* query config path */ + std::string tspath; + if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){ + eDebug("could not query ts path from config"); + return -4; + } + tspath.append("/"); + /* we need enough diskspace */ struct statfs fs; - if (statfs(TSPATH "/.", &fs) < 0) + if (statfs(tspath.c_str(), &fs) < 0) { eDebug("statfs failed!"); return -2; @@ -2114,12 +2119,23 @@ RESULT eDVBServicePlay::startTimeshift() if (!m_record) return -3; - char templ[]=TSPATH "/timeshift.XXXXXX"; + std::string tspath; + if(ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1){ + eDebug("could not query ts path"); + return -5; + } + tspath.append("/timeshift.XXXXXX"); + char* templ; + templ = new char[tspath.length() + 1]; + strcpy(templ, tspath.c_str()); + m_timeshift_fd = mkstemp(templ); - m_timeshift_file = templ; - + m_timeshift_file = std::string(templ); + eDebug("recording to %s", templ); - + + delete [] templ; + if (m_timeshift_fd < 0) { m_record = 0; -- cgit v1.2.3 From 153e0ed5048c79c600e1acd085b62015b7314ba7 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 17 Nov 2008 00:18:37 +0100 Subject: Patch by Moritz Venn/Anders Holst: the long awaited 'setting tags from timer menu'-patch --- RecordTimer.py | 12 +++- lib/python/Components/MovieList.py | 38 +++++++---- lib/python/Screens/InputBox.py | 4 +- lib/python/Screens/MovieSelection.py | 127 ++++++++++++++++++++++------------- lib/python/Screens/TimerEntry.py | 89 ++++++++++-------------- 5 files changed, 153 insertions(+), 117 deletions(-) (limited to 'lib/python/Components') diff --git a/RecordTimer.py b/RecordTimer.py index 397ff8a7..28b878a1 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -91,7 +91,7 @@ class RecordTimerEntry(timer.TimerEntry, object): Notifications.AddNotification(Screens.Standby.TryQuitMainloop, 1, onSessionOpenCallback=RecordTimerEntry.stopTryQuitMainloop, default_yes = default_yes) ################################################################# - def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None): + def __init__(self, serviceref, begin, end, name, description, eit, disabled = False, justplay = False, afterEvent = AFTEREVENT.NONE, checkOldTimers = False, dirname = None, tags = None): timer.TimerEntry.__init__(self, int(begin), int(end)) if checkOldTimers == True: @@ -117,6 +117,7 @@ class RecordTimerEntry(timer.TimerEntry, object): self.dirname = dirname self.dirnameHadToFallback = False self.autoincrease = False + self.tags = tags or [] self.log_entries = [] self.resetState() @@ -192,6 +193,7 @@ class RecordTimerEntry(timer.TimerEntry, object): f.write(self.name + "\n") f.write(self.description + "\n") f.write(str(self.begin) + "\n") + f.write(' '.join(self.tags)) f.close() except IOError: self.log(4, "failed to write meta information") @@ -368,10 +370,14 @@ def createTimer(xml): location = xml.getAttribute("location").encode("utf-8") else: location = None + if xml.hasAttribute("tags") and xml.getAttribute("tags"): + tags = xml.getAttribute("tags").encode("utf-8").split(' ') + else: + tags = None name = xml.getAttribute("name").encode("utf-8") #filename = xml.getAttribute("filename").encode("utf-8") - entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location) + entry = RecordTimerEntry(serviceref, begin, end, name, description, eit, disabled, justplay, afterevent, dirname = location, tags = tags) entry.repeated = int(repeated) for l in elementsWithTag(xml.childNodes, "log"): @@ -492,6 +498,8 @@ class RecordTimer(timer.Timer): list.append(' eit="' + str(timer.eit) + '"') if timer.dirname is not None: list.append(' location="' + str(stringToXML(timer.dirname)) + '"') + if timer.tags is not None: + list.append(' tags="' + str(stringToXML(' '.join(timer.tags))) + '"') list.append(' disabled="' + str(int(timer.disabled)) + '"') list.append(' justplay="' + str(int(timer.justplay)) + '"') list.append('>\n') diff --git a/lib/python/Components/MovieList.py b/lib/python/Components/MovieList.py index ace36012..8568f3d6 100644 --- a/lib/python/Components/MovieList.py +++ b/lib/python/Components/MovieList.py @@ -103,7 +103,8 @@ class MovieList(GUIComponent): txt = info.getName(serviceref) service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref)) description = info.getInfoString(serviceref, iServiceInformation.sDescription) - + tags = info.getInfoString(serviceref, iServiceInformation.sTags) + begin_string = "" if begin > 0: t = FuzzyTime(begin) @@ -111,23 +112,33 @@ class MovieList(GUIComponent): if self.list_type == MovieList.LISTTYPE_ORIGINAL: res.append(MultiContentEntryText(pos=(0, 0), size=(width-182, 30), font = 0, flags = RT_HALIGN_LEFT, text=txt)) - if service is not None: - res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) + if self.tags: + res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = tags)) + if service is not None: + res.append(MultiContentEntryText(pos=(200, 50), size=(200, 20), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName())) + else: + if service is not None: + res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(0, 30), size=(width, 20), font=1, flags=RT_HALIGN_LEFT, text=description)) - res.append(MultiContentEntryText(pos=(0, 50), size=(width-270, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) - res.append(MultiContentEntryText(pos=(width-200, 50), size=(200, 20), font=1, flags=RT_HALIGN_RIGHT, text=len)) + res.append(MultiContentEntryText(pos=(0, 50), size=(200, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) + res.append(MultiContentEntryText(pos=(width-200, 50), size=(198, 20), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION: res.append(MultiContentEntryText(pos=(0, 0), size=(width-120, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt)) - if service is not None: - res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(0, 20), size=(width-212, 17), font=1, flags=RT_HALIGN_LEFT, text=description)) res.append(MultiContentEntryText(pos=(width-120, 6), size=(120, 20), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) + if service is not None: + res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) res.append(MultiContentEntryText(pos=(width-58, 20), size=(58, 20), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT: res.append(MultiContentEntryText(pos=(0, 0), size=(width-77, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt)) - if service is not None: - res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) - res.append(MultiContentEntryText(pos=(0, 20), size=(width-200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) + if self.tags: + res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = tags)) + if service is not None: + res.append(MultiContentEntryText(pos=(200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName())) + else: + if service is not None: + res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName())) + res.append(MultiContentEntryText(pos=(0, 20), size=(200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) res.append(MultiContentEntryText(pos=(width-75, 0), size=(75, 20), font=0, flags=RT_HALIGN_RIGHT, text=len)) else: assert(self.list_type == MovieList.LISTTYPE_MINIMAL) @@ -212,6 +223,7 @@ class MovieList(GUIComponent): if this_tags == ['']: this_tags = [] this_tags = set(this_tags) + tags |= this_tags # filter_tags is either None (which means no filter at all), or # a set. In this case, all elements of filter_tags must be present, @@ -219,7 +231,6 @@ class MovieList(GUIComponent): if filter_tags is not None and not this_tags.issuperset(filter_tags): continue - tags |= this_tags self.list.append((serviceref, info, begin, -1)) if self.sort_type == MovieList.SORT_ALPHANUMERIC: @@ -243,8 +254,9 @@ class MovieList(GUIComponent): for x in self.list: if x[0] == serviceref: self.instance.moveSelectionTo(count) - break + return True count += 1 - + return False + def moveDown(self): self.instance.moveSelection(self.instance.moveDown) diff --git a/lib/python/Screens/InputBox.py b/lib/python/Screens/InputBox.py index 43b8a8b8..61ce356a 100644 --- a/lib/python/Screens/InputBox.py +++ b/lib/python/Screens/InputBox.py @@ -8,12 +8,14 @@ from Tools.BoundFunction import boundFunction from time import time class InputBox(Screen): - def __init__(self, session, title = "", windowTitle = _("Input"), **kwargs): + def __init__(self, session, title = "", windowTitle = _("Input"), useableChars = None, **kwargs): Screen.__init__(self, session) self["text"] = Label(title) self["input"] = Input(**kwargs) self.onShown.append(boundFunction(self.setTitle, windowTitle)) + if useableChars is not None: + self["input"].setUseableChars(useableChars) self["actions"] = NumberActionMap(["WizardActions", "InputBoxActions", "InputAsciiActions", "KeyboardInputActions"], { diff --git a/lib/python/Screens/MovieSelection.py b/lib/python/Screens/MovieSelection.py index c05f145f..5951653f 100644 --- a/lib/python/Screens/MovieSelection.py +++ b/lib/python/Screens/MovieSelection.py @@ -29,6 +29,28 @@ config.movielist.description = ConfigInteger(default=MovieList.HIDE_DESCRIPTION) config.movielist.last_videodir = ConfigText(default=resolveFilename(SCOPE_HDD)) config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_HDD)) config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)]) +config.movielist.first_tags = ConfigText(default="") +config.movielist.second_tags = ConfigText(default="") + + +def setPreferredTagEditor(te): + global preferredTagEditor + try: + if preferredTagEditor == None: + preferredTagEditor = te + print "Preferred tag editor changed to ", preferredTagEditor + else: + print "Preferred tag editor already set to ", preferredTagEditor + print "ignoring ", te + except: + preferredTagEditor = te + print "Preferred tag editor set to ", preferredTagEditor + +def getPreferredTagEditor(): + global preferredTagEditor + return preferredTagEditor + +setPreferredTagEditor(None) class MovieContextMenu(Screen): def __init__(self, session, csel, service): @@ -71,10 +93,8 @@ class MovieContextMenu(Screen): def sortBy(self, newType): config.movielist.moviesort.value = newType - self.csel.selectedmovie = self.csel.getCurrent() self.csel.setSortType(newType) self.csel.reloadList() - self.csel.moveTo() self.close() def listType(self, newType): @@ -123,7 +143,7 @@ class MovieContextMenu(Screen): self.session.openWithCallback(self.close, MessageBox, _("Delete failed!"), MessageBox.TYPE_ERROR) else: self.csel["list"].removeService(self.service) - self.csel["freeDiskSpace"].update() + self.csel["freeDiskSpace"].update() self.close() class SelectionEventInfo: @@ -149,6 +169,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self.tags = [ ] self.selected_tags = None + self.selected_tags_ele = None self.movemode = False self.bouquet_mark_edit = False @@ -178,7 +199,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): # Need list for init SelectionEventInfo.__init__(self) - self["key_red"] = Button(_("All...")) + self["key_red"] = Button(_("All")) self["key_green"] = Button("") self["key_yellow"] = Button("") self["key_blue"] = Button("") @@ -201,9 +222,9 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self["ColorActions"] = HelpableActionMap(self, "ColorActions", { "red": (self.showAll, _("show all")), - "green": (self.showTagsFirst, _("show first tag")), - "yellow": (self.showTagsSecond, _("show second tag")), - "blue": (self.showTagsMenu, _("show tag menu")), + "green": (self.showTagsFirst, _("show first selected tag")), + "yellow": (self.showTagsSecond, _("show second selected tag")), + "blue": (self.showTagsSelect, _("show tag menu")), }) self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", @@ -246,11 +267,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self.updateDescription() def updateHDDData(self): - self.reloadList() - if self.selectedmovie is not None: - self.moveTo() + self.reloadList(self.selectedmovie) self["waitingtext"].visible = False - self.updateTags() def moveTo(self): self["list"].moveTo(self.selectedmovie) @@ -285,26 +303,29 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): def updateTags(self): # get a list of tags available in this list self.tags = list(self["list"].tags) - - # by default, we do not display any filtering options - self.tag_first = "" - self.tag_second = "" - - # when tags are present, however, the first two are - # directly mapped to the second, third ("green", "yellow") buttons - if len(self.tags) > 0: - self.tag_first = self.getTagDescription(self.tags[0]) - - if len(self.tags) > 1: - self.tag_second = self.getTagDescription(self.tags[1]) - + + if not self.tags: + # by default, we do not display any filtering options + self.tag_first = "" + self.tag_second = "" + else: + tmp = config.movielist.first_tags.value + if tmp in self.tags: + self.tag_first = tmp + else: + self.tag_first = "<"+_("Tag 1")+">" + tmp = config.movielist.second_tags.value + if tmp in self.tags: + self.tag_second = tmp + else: + self.tag_second = "<"+_("Tag 2")+">" self["key_green"].text = self.tag_first self["key_yellow"].text = self.tag_second # the rest is presented in a list, available on the # fourth ("blue") button - if len(self.tags) > 2: - self["key_blue"].text = _("Other...") + if self.tags: + self["key_blue"].text = _("Tags")+"..." else: self["key_blue"].text = "" @@ -317,20 +338,26 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): def setSortType(self, type): self["list"].setSortType(type) - def reloadList(self): + def reloadList(self, sel = None, home = False): if not pathExists(config.movielist.last_videodir.value): path = resolveFilename(SCOPE_HDD) config.movielist.last_videodir.value = path config.movielist.last_videodir.save() self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path) self["freeDiskSpace"].path = path + if sel is None: + sel = self.getCurrent() self["list"].reload(self.current_ref, self.selected_tags) title = _("Recorded files...") - if self.selected_tags is not None: - title += " - " + ','.join(self.selected_tags) if config.usage.setup_level.index >= 2: # expert+ title += " " + config.movielist.last_videodir.value + if self.selected_tags is not None: + title += " - " + ','.join(self.selected_tags) self.setTitle(title) + if not (sel and self["list"].moveTo(sel)): + if home: + self["list"].moveToIndex(0) + self.updateTags() self["freeDiskSpace"].update() def doPathSelect(self): @@ -348,7 +375,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): config.movielist.last_videodir.save() self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res) self["freeDiskSpace"].path = res - self.reloadList() + self.reloadList(home = True) else: self.session.open( MessageBox, @@ -358,35 +385,41 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): ) def showAll(self): + self.selected_tags_ele = None self.selected_tags = None - self.reloadList() + self.reloadList(home = True) - def showTagsN(self, n): - if len(self.tags) < n: + def showTagsN(self, tagele): + if not self.tags: self.showTagWarning() + elif not tagele or self.selected_tags_ele == tagele or not tagele.value in self.tags: + self.showTagsMenu(tagele) else: - print "select tag #%d, %s, %s" % (n, self.tags[n - 1], ','.join(self.tags)) - self.selected_tags = set([self.tags[n - 1]]) - self.reloadList() + self.selected_tags_ele = tagele + self.selected_tags = set([tagele.value]) + self.reloadList(home = True) def showTagsFirst(self): - self.showTagsN(1) + self.showTagsN(config.movielist.first_tags) def showTagsSecond(self): - self.showTagsN(2) + self.showTagsN(config.movielist.second_tags) + + def showTagsSelect(self): + self.showTagsN(None) def tagChosen(self, tag): if tag is not None: self.selected_tags = set([tag[0]]) - self.reloadList() + if self.selected_tags_ele: + self.selected_tags_ele.value = tag[0] + self.selected_tags_ele.save() + self.reloadList(home = True) - def showTagsMenu(self): - if len(self.tags) < 3: - self.showTagWarning() - else: - list = [(tag, self.getTagDescription(tag)) for tag in self.tags ] - self.session.openWithCallback(self.tagChosen, ChoiceBox, title=_("Please select keyword to filter..."), list = list) + def showTagsMenu(self, tagele): + self.selected_tags_ele = tagele + list = [(tag, self.getTagDescription(tag)) for tag in self.tags ] + self.session.openWithCallback(self.tagChosen, ChoiceBox, title=_("Please select tag to filter..."), list = list) def showTagWarning(self): - # TODO - self.session.open(MessageBox, _("You need to define some keywords first!\nPress the menu-key to define keywords.\nDo you want to define keywords now?"), MessageBox.TYPE_ERROR) + self.session.open(MessageBox, _("No tags are set on these movies."), MessageBox.TYPE_ERROR) diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index c4dfff72..1774061d 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -8,6 +8,7 @@ from Components.MenuList import MenuList from Components.Button import Button from Components.Label import Label from Components.Pixmap import Pixmap +from Screens.MovieSelection import getPreferredTagEditor from Screens.LocationBox import MovieLocationBox from Screens.ChoiceBox import ChoiceBox from RecordTimer import AFTEREVENT @@ -21,8 +22,7 @@ class TimerEntry(Screen, ConfigListScreen): Screen.__init__(self, session) self.timer = timer - self.entryStartDate = None - self.entryEndDate = None + self.entryDate = None self.entryService = None self["oktext"] = Label(_("OK")) @@ -88,13 +88,13 @@ class TimerEntry(Screen, ConfigListScreen): self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type) self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False) self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False) + self.timerentry_tags = self.timer.tags + [] + self.timerentry_tagsset = ConfigSelection(choices = [len(self.timerentry_tags) == 0 and "None" or " ".join(self.timerentry_tags)]) self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))]) - self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400) + self.timerentry_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400) self.timerentry_starttime = ConfigClock(default = self.timer.begin) - - self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring = _("%d.%B %Y"), increment = 86400) self.timerentry_endtime = ConfigClock(default = self.timer.end) default = self.timer.dirname or resolveFilename(SCOPE_HDD) @@ -120,19 +120,6 @@ class TimerEntry(Screen, ConfigListScreen): self.timerentry_service_ref = self.timer.service_ref self.timerentry_service = ConfigSelection([servicename]) - self.timerentry_startdate.addNotifier(self.checkDate) - self.timerentry_enddate.addNotifier(self.checkDate) - - def checkDate(self, configElement): - if configElement is self.timerentry_startdate: - if self.timerentry_enddate.value < self.timerentry_startdate.value: - self.timerentry_enddate.value = self.timerentry_startdate.value - self["config"].invalidate(self.entryEndDate) - if configElement is self.timerentry_enddate: - if (self.timerentry_enddate.value < self.timerentry_startdate.value): - self.timerentry_startdate.value = self.timerentry_enddate.value - self["config"].invalidate(self.entryStartDate) - def createSetup(self, widget): self.list = [] self.list.append(getConfigListEntry(_("Name"), self.timerentry_name)) @@ -165,34 +152,24 @@ class TimerEntry(Screen, ConfigListScreen): self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5])) self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6])) - #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate)) -# self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday)) - - self.entryStartDate = getConfigListEntry(_("Start"), self.timerentry_startdate) - if self.timerentry_type.value == "once": - self.list.append(self.entryStartDate) - self.list.append(getConfigListEntry(" ", self.timerentry_starttime)) - else: - self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime)) - - self.entryEndDate = getConfigListEntry(_("End"), self.timerentry_enddate) + self.entryDate = getConfigListEntry(_("Date"), self.timerentry_date) if self.timerentry_type.value == "once": - if self.timerentry_justplay.value != "zap": - self.list.append(self.entryEndDate) - self.list.append(getConfigListEntry(" ", self.timerentry_endtime)) - else: - if self.timerentry_justplay.value != "zap": - self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime)) + self.list.append(self.entryDate) + self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime)) + if self.timerentry_justplay.value != "zap": + self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime)) + self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) + self.list.append(self.channelEntry) + self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname) + self.tagsSet = getConfigListEntry(_("Tags"), self.timerentry_tagsset) if self.timerentry_justplay.value != "zap": if config.usage.setup_level.index >= 2: # expert+ - self.dirname = getConfigListEntry(_("Location"), self.timerentry_dirname) self.list.append(self.dirname) + if getPreferredTagEditor(): + self.list.append(self.tagsSet) self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent)) - self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) - self.list.append(self.channelEntry) - self[widget].list = self.list self[widget].l.setList(self.list) @@ -206,14 +183,14 @@ class TimerEntry(Screen, ConfigListScreen): self.createSetup("config") def keyLeft(self): - if self["config"].getCurrent() is self.channelEntry: + if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]: self.keySelect() else: ConfigListScreen.keyLeft(self) self.newConfig() def keyRight(self): - if self["config"].getCurrent() is self.channelEntry: + if self["config"].getCurrent() in [self.channelEntry, self.tagsSet]: self.keySelect() else: ConfigListScreen.keyRight(self) @@ -235,6 +212,12 @@ class TimerEntry(Screen, ConfigListScreen): self.timerentry_dirname.value, minFree = 100 # We require at least 100MB free space ) + elif getPreferredTagEditor() and cur == self.tagsSet: + self.session.openWithCallback( + self.tagEditFinished, + getPreferredTagEditor(), + self.timerentry_tags + ) else: self.keyGo() @@ -249,24 +232,15 @@ class TimerEntry(Screen, ConfigListScreen): dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1]) return int(mktime(dt.timetuple())) - def buildRepeatedBegin(self, rep_time, start_time): - d = localtime(rep_time) - dt = datetime(d.tm_year, d.tm_mon, d.tm_mday, start_time[0], start_time[1]) - return int(mktime(dt.timetuple())) - def getBeginEnd(self): - enddate = self.timerentry_enddate.value + date = self.timerentry_date.value endtime = self.timerentry_endtime.value - - startdate = self.timerentry_startdate.value starttime = self.timerentry_starttime.value - begin = self.getTimestamp(startdate, starttime) - end = self.getTimestamp(enddate, endtime) + begin = self.getTimestamp(date, starttime) + end = self.getTimestamp(date, endtime) - # because of the dateChecks, startdate can't be < enddate. - # however, the endtime can be less than the starttime. - # in this case, add 1 day. + # if the endtime is less than the starttime, add 1 day. if end < begin: end += 86400 return begin, end @@ -278,6 +252,7 @@ class TimerEntry(Screen, ConfigListScreen): self.timer.resetRepeated() self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value] self.timer.service_ref = self.timerentry_service_ref + self.timer.tags = self.timerentry_tags self.timer.dirname = self.timerentry_dirname.value config.movielist.last_timer_videodir.value = self.timer.dirname @@ -352,6 +327,12 @@ class TimerEntry(Screen, ConfigListScreen): self.timerentry_dirname.setChoices(config.movielist.videodirs.value, default=res) self.timerentry_dirname.value = res + def tagEditFinished(self, ret): + if ret is not None: + self.timerentry_tags = ret + self.timerentry_tagsset.setChoices([len(ret) == 0 and "None" or " ".join(ret)]) + self["config"].invalidate(self.tagsSet) + class TimerLog(Screen): def __init__(self, session, timer): Screen.__init__(self, session) -- cgit v1.2.3