From: acid-burn Date: Wed, 31 Mar 2010 09:10:31 +0000 (+0200) Subject: Merge commit 'origin/translations' into experimental X-Git-Tag: 3.0.0~28^2~66^2~11^2 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/4d7f4836f07bb037bc1c840983e5ef1c99606005?hp=30d3c4ef622c8068112e37d8900b76cd6394db88 Merge commit 'origin/translations' into experimental --- diff --git a/Navigation.py b/Navigation.py index 2ca87f6f..a905da19 100644 --- a/Navigation.py +++ b/Navigation.py @@ -50,10 +50,10 @@ class Navigation: for x in self.record_event: x(rec_service, event) - def playService(self, ref, checkParentalControl = True): + def playService(self, ref, checkParentalControl = True, forceRestart = False): oldref = self.currentlyPlayingServiceReference - if ref and oldref and ref == oldref: - print "ignore request to play already running service" + if ref and oldref and ref == oldref and not forceRestart: + print "ignore request to play already running service(1)" return 0 print "playing", ref and ref.toString() if ref is None: @@ -64,6 +64,10 @@ class Navigation: if not oldref: oldref = eServiceReference() playref = getBestPlayableServiceReference(ref, oldref) + print "playref", playref + if playref and oldref and playref == oldref and not forceRestart: + print "ignore request to play already running service(2)" + return 0 if not playref or (checkParentalControl and not parentalControl.isServicePlayable(playref, boundFunction(self.playService, checkParentalControl = False))): self.stopService() return 0 diff --git a/RecordTimer.py b/RecordTimer.py index 4907f64e..f670417a 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -2,6 +2,7 @@ from enigma import eEPGCache, getBestPlayableServiceReference, \ eServiceReference, iRecordableService, quitMainloop from Components.config import config +from Components.UsageConfig import defaultMoviePath from Components.TimerSanityCheck import TimerSanityCheck from Screens.MessageBox import MessageBox @@ -141,11 +142,13 @@ class RecordTimerEntry(timer.TimerEntry, object): if config.recording.ascii_filenames.value: filename = ASCIItranslit.legacyEncode(filename) - if self.dirname and not Directories.fileExists(self.dirname, 'w'): - self.dirnameHadToFallback = True - self.Filename = Directories.getRecordingFilename(filename, None) + if not self.dirname or not Directories.fileExists(self.dirname, 'w'): + if self.dirname: + self.dirnameHadToFallback = True + dirname = defaultMoviePath() else: - self.Filename = Directories.getRecordingFilename(filename, self.dirname) + dirname = self.dirname + self.Filename = Directories.getRecordingFilename(filename, dirname) self.log(0, "Filename calculated as: '%s'" % self.Filename) #begin_date + " - " + service_name + description) diff --git a/configure.ac b/configure.ac index 5e403deb..d1b1d279 100755 --- a/configure.ac +++ b/configure.ac @@ -90,6 +90,8 @@ data/fonts/Makefile data/countries/Makefile data/defaults/Makefile data/defaults/Dream/Makefile +data/defaults/Dream/hdbouquets/Makefile +data/defaults/Dream/sdbouquets/Makefile data/extensions/Makefile data/skin_default/Makefile data/skin_default/menu/Makefile @@ -155,6 +157,7 @@ lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/meta/Makefile lib/python/Plugins/SystemPlugins/Hotplug/Makefile lib/python/Plugins/SystemPlugins/Hotplug/meta/Makefile lib/python/Plugins/SystemPlugins/Makefile +lib/python/Plugins/SystemPlugins/TempFanControl/Makefile lib/python/Plugins/SystemPlugins/NetworkWizard/Makefile lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile lib/python/Plugins/SystemPlugins/NFIFlash/Makefile @@ -176,6 +179,7 @@ lib/python/Plugins/SystemPlugins/VideoTune/meta/Makefile lib/python/Plugins/SystemPlugins/Videomode/Makefile lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile lib/python/Plugins/SystemPlugins/WirelessLan/Makefile +lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile lib/python/Tools/Makefile lib/service/Makefile lib/components/Makefile diff --git a/data/defaults/Dream/Makefile.am b/data/defaults/Dream/Makefile.am index 113442c0..31ba1c69 100644 --- a/data/defaults/Dream/Makefile.am +++ b/data/defaults/Dream/Makefile.am @@ -1,3 +1,5 @@ +SUBDIRS = hdbouquets sdbouquets + installdir = $(pkgdatadir)/defaults/Dream dist_install_DATA = \ @@ -9,5 +11,4 @@ dist_install_DATA = \ settings.500hd \ settings.7025 \ settings.800 \ - settings.8000 \ - userbouquet.favourites.tv + settings.8000 diff --git a/data/defaults/Dream/dm500hd.info b/data/defaults/Dream/dm500hd.info index fbf7888e..b1b4d53d 100644 --- a/data/defaults/Dream/dm500hd.info +++ b/data/defaults/Dream/dm500hd.info @@ -20,7 +20,7 @@ - + diff --git a/data/defaults/Dream/dm7025.info b/data/defaults/Dream/dm7025.info index 0461b686..a1585cfe 100644 --- a/data/defaults/Dream/dm7025.info +++ b/data/defaults/Dream/dm7025.info @@ -20,7 +20,7 @@ - + diff --git a/data/defaults/Dream/dm800.info b/data/defaults/Dream/dm800.info index 8c68349f..4793bd85 100644 --- a/data/defaults/Dream/dm800.info +++ b/data/defaults/Dream/dm800.info @@ -20,7 +20,7 @@ - + diff --git a/data/defaults/Dream/dm8000.info b/data/defaults/Dream/dm8000.info index 8b11946f..2ef2013a 100644 --- a/data/defaults/Dream/dm8000.info +++ b/data/defaults/Dream/dm8000.info @@ -20,7 +20,7 @@ - + diff --git a/data/defaults/Dream/hdbouquets/Makefile.am b/data/defaults/Dream/hdbouquets/Makefile.am new file mode 100644 index 00000000..843a07d6 --- /dev/null +++ b/data/defaults/Dream/hdbouquets/Makefile.am @@ -0,0 +1,4 @@ +installdir = $(pkgdatadir)/defaults/Dream/hdbouquets + +dist_install_DATA = \ + userbouquet.favourites.tv diff --git a/data/defaults/Dream/userbouquet.favourites.tv b/data/defaults/Dream/hdbouquets/userbouquet.favourites.tv similarity index 91% rename from data/defaults/Dream/userbouquet.favourites.tv rename to data/defaults/Dream/hdbouquets/userbouquet.favourites.tv index f1adaf9e..91536b10 100644 --- a/data/defaults/Dream/userbouquet.favourites.tv +++ b/data/defaults/Dream/hdbouquets/userbouquet.favourites.tv @@ -1,6 +1,6 @@ #NAME Favourites (TV) -#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0: -#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0: +#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0: +#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0: #SERVICE 1:0:1:6DCC:44D:1:C00000:0:0:0: #SERVICE 1:0:1:2EE3:441:1:C00000:0:0:0: #SERVICE 1:0:1:445C:453:1:C00000:0:0:0: @@ -10,10 +10,10 @@ #SERVICE 1:0:1:33:21:85:C00000:0:0:0: #SERVICE 1:0:1:701:5:85:C00000:0:0:0: #SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0: -#SERVICE 1:0:1:7005:436:1:C00000:0:0:0: +#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0: #SERVICE 1:0:1:2FC:5:85:C00000:0:0:0: #SERVICE 1:0:1:F98:454:1:C00000:0:0:0: -#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0: +#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0: #SERVICE 1:0:1:6D67:437:1:C00000:0:0:0: #SERVICE 1:0:1:7031:41B:1:C00000:0:0:0: #SERVICE 1:0:1:7032:41B:1:C00000:0:0:0: @@ -26,11 +26,9 @@ #SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen #DESCRIPTION Doku/Wissen/Themen #SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0: -#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0: #SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0: #SERVICE 1:0:1:2775:444:1:C00000:0:0:0: #SERVICE 1:0:1:293:5:85:C00000:0:0:0: -#SERVICE 1:0:1:3138:459:1:C00000:0:0:0: #SERVICE 1:0:1:6D70:437:1:C00000:0:0:0: #SERVICE 1:0:1:277B:444:1:C00000:0:0:0: #SERVICE 1:0:1:332D:45B:1:C00000:0:0:0: @@ -77,8 +75,6 @@ #SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen #DESCRIPTION Reisen #SERVICE 1:0:1:20:21:85:C00000:0:0:0: -#SERVICE 1:0:1:3339:45B:1:C00000:0:0:0: -#SERVICE 1:0:1:27B9:444:1:C00000:0:0:0: #SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung #DESCRIPTION Beratung #SERVICE 1:0:1:295:21:85:C00000:0:0:0: @@ -92,7 +88,6 @@ #SERVICE 1:0:1:36:7:85:C00000:0:0:0: #SERVICE 1:0:1:307:7:85:C00000:0:0:0: #SERVICE 1:0:1:296:5:85:C00000:0:0:0: -#SERVICE 1:0:1:2791:444:1:C00000:0:0:0: #SERVICE 1:0:1:383:21:85:C00000:0:0:0: #SERVICE 1:0:1:313C:459:1:C00000:0:0:0: #SERVICE 1:0:1:3159:459:1:C00000:0:0:0: @@ -100,13 +95,9 @@ #SERVICE 1:0:1:381:21:85:C00000:0:0:0: #SERVICE 1:64:7:0:0:0:0:0:0:0::High Definition #DESCRIPTION High Definition -#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0: -#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0: -#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0: #SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0: -#SERVICE 1:0:19:1324:3EF:1:C00000:0:0:0: -#SERVICE 1:0:19:1325:3EF:1:C00000:0:0:0: -#SERVICE 1:0:19:2B84:3F3:1:C00000:0:0:0: +#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0: +#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0: #SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen #DESCRIPTION Alternativen #SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0: @@ -131,3 +122,8 @@ #SERVICE 1:0:1:6E97:4B1:1:C00000:0:0:0: #SERVICE 1:0:1:6E96:4B1:1:C00000:0:0:0: #SERVICE 1:0:1:6E95:4B1:1:C00000:0:0:0: +#SERVICE 1:64:8:0:0:0:0:0:0:0::Alternative SD services +#DESCRIPTION Alternative SD services +#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0: +#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0: diff --git a/data/defaults/Dream/sdbouquets/Makefile.am b/data/defaults/Dream/sdbouquets/Makefile.am new file mode 100644 index 00000000..50328e55 --- /dev/null +++ b/data/defaults/Dream/sdbouquets/Makefile.am @@ -0,0 +1,4 @@ +installdir = $(pkgdatadir)/defaults/Dream/sdbouquets + +dist_install_DATA = \ + userbouquet.favourites.tv diff --git a/data/defaults/Dream/sdbouquets/userbouquet.favourites.tv b/data/defaults/Dream/sdbouquets/userbouquet.favourites.tv new file mode 100644 index 00000000..5f89c48a --- /dev/null +++ b/data/defaults/Dream/sdbouquets/userbouquet.favourites.tv @@ -0,0 +1,127 @@ +#NAME Favourites (TV) +#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0: +#SERVICE 1:0:1:6DCC:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:2EE3:441:1:C00000:0:0:0: +#SERVICE 1:0:1:445C:453:1:C00000:0:0:0: +#SERVICE 1:0:1:2EF4:441:1:C00000:0:0:0: +#SERVICE 1:0:1:445D:453:1:C00000:0:0:0: +#SERVICE 1:0:1:445E:453:1:C00000:0:0:0: +#SERVICE 1:0:1:33:21:85:C00000:0:0:0: +#SERVICE 1:0:1:701:5:85:C00000:0:0:0: +#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0: +#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0: +#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0: +#SERVICE 1:0:1:F98:454:1:C00000:0:0:0: +#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0: +#SERVICE 1:0:1:6D67:437:1:C00000:0:0:0: +#SERVICE 1:0:1:7031:41B:1:C00000:0:0:0: +#SERVICE 1:0:1:7032:41B:1:C00000:0:0:0: +#SERVICE 1:0:1:7033:41B:1:C00000:0:0:0: +#SERVICE 1:0:1:6E46:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6DCE:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6DD1:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6DCF:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6E42:431:1:C00000:0:0:0: +#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen +#DESCRIPTION Doku/Wissen/Themen +#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0: +#SERVICE 1:0:1:2775:444:1:C00000:0:0:0: +#SERVICE 1:0:1:293:5:85:C00000:0:0:0: +#SERVICE 1:0:1:6D70:437:1:C00000:0:0:0: +#SERVICE 1:0:1:277B:444:1:C00000:0:0:0: +#SERVICE 1:0:1:332D:45B:1:C00000:0:0:0: +#SERVICE 1:0:1:3139:459:1:C00000:0:0:0: +#SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0: +#SERVICE 1:64:A:0:0:0:0:0:0:0::Sport +#DESCRIPTION Sport +#SERVICE 1:0:1:384:21:85:C00000:0:0:0: +#SERVICE 1:0:1:79E0:443:1:C00000:0:0:0: +#SERVICE 1:64:1:0:0:0:0:0:0:0::Kinder +#DESCRIPTION Kinder +#SERVICE 1:0:1:2F08:441:1:C00000:0:0:0: +#SERVICE 1:0:1:6D68:437:1:C00000:0:0:0: +#SERVICE 1:0:1:7008:436:1:C00000:0:0:0: +#SERVICE 1:0:1:6FE0:443:1:C00000:0:0:0: +#SERVICE 1:64:2:0:0:0:0:0:0:0::Nachrichten +#DESCRIPTION Nachrichten +#SERVICE 1:0:1:2F3A:441:1:C00000:0:0:0: +#SERVICE 1:0:1:445F:453:1:C00000:0:0:0: +#SERVICE 1:0:1:79F4:443:1:C00000:0:0:0: +#SERVICE 1:0:1:2753:402:1:C00000:0:0:0: +#SERVICE 1:0:1:7035:41B:1:C00000:0:0:0: +#SERVICE 1:64:3:0:0:0:0:0:0:0::Regional +#DESCRIPTION Regional +#SERVICE 1:0:1:3146:459:1:C00000:0:0:0: +#SERVICE 1:0:1:300:7:85:C00000:0:0:0: +#SERVICE 1:0:1:2778:444:1:C00000:0:0:0: +#SERVICE 1:0:1:277A:444:1:C00000:0:0:0: +#SERVICE 1:0:1:2779:444:1:C00000:0:0:0: +#SERVICE 1:0:1:2777:444:1:C00000:0:0:0: +#SERVICE 1:0:1:32D6:45D:1:C00000:0:0:0: +#SERVICE 1:0:1:277D:444:1:C00000:0:0:0: +#SERVICE 1:64:4:0:0:0:0:0:0:0::Musik +#DESCRIPTION Musik +#SERVICE 1:0:1:2774:444:1:C00000:0:0:0: +#SERVICE 1:0:1:7004:436:1:C00000:0:0:0: +#SERVICE 1:0:1:7001:436:1:C00000:0:0:0: +#SERVICE 1:0:1:6FE1:443:1:C00000:0:0:0: +#SERVICE 1:0:1:2FD:7:85:C00000:0:0:0: +#SERVICE 1:0:1:32D5:45D:1:C00000:0:0:0: +#SERVICE 1:0:1:332E:45B:1:C00000:0:0:0: +#SERVICE 1:0:1:304:5:85:C00000:0:0:0: +#SERVICE 1:0:1:702:5:85:C00000:0:0:0: +#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen +#DESCRIPTION Reisen +#SERVICE 1:0:1:20:21:85:C00000:0:0:0: +#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung +#DESCRIPTION Beratung +#SERVICE 1:0:1:295:21:85:C00000:0:0:0: +#SERVICE 1:64:6:0:0:0:0:0:0:0::Einkaufen +#DESCRIPTION Einkaufen +#SERVICE 1:0:1:301:7:85:C00000:0:0:0: +#SERVICE 1:0:1:28:21:85:C00000:0:0:0: +#SERVICE 1:0:1:79EA:443:1:C00000:0:0:0: +#SERVICE 1:0:1:2F44:454:1:C00000:0:0:0: +#SERVICE 1:0:1:3148:459:1:C00000:0:0:0: +#SERVICE 1:0:1:36:7:85:C00000:0:0:0: +#SERVICE 1:0:1:307:7:85:C00000:0:0:0: +#SERVICE 1:0:1:296:5:85:C00000:0:0:0: +#SERVICE 1:0:1:383:21:85:C00000:0:0:0: +#SERVICE 1:0:1:313C:459:1:C00000:0:0:0: +#SERVICE 1:0:1:3159:459:1:C00000:0:0:0: +#SERVICE 1:0:1:2E:21:85:C00000:0:0:0: +#SERVICE 1:0:1:381:21:85:C00000:0:0:0: +#SERVICE 1:64:7:0:0:0:0:0:0:0::High Definition +#DESCRIPTION High Definition +#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0: +#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0: +#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0: +#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0: +#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0: +#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0: +#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen +#DESCRIPTION Alternativen +#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0: +#SERVICE 1:0:1:6E44:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6E45:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6E41:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6E40:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6E43:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6EE1:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6E2D:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6E2E:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6F46:445:1:C00000:0:0:0: +#SERVICE 1:0:1:6E47:431:1:C00000:0:0:0: +#SERVICE 1:0:1:6F76:457:1:C00000:0:0:0: +#SERVICE 1:0:1:6E92:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6E93:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6F78:457:1:C00000:0:0:0: +#SERVICE 1:0:1:6F79:457:1:C00000:0:0:0: +#SERVICE 1:0:1:6E94:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6F77:457:1:C00000:0:0:0: +#SERVICE 1:0:1:6EEB:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6E97:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6E96:4B1:1:C00000:0:0:0: +#SERVICE 1:0:1:6E95:4B1:1:C00000:0:0:0: diff --git a/data/encoding.conf b/data/encoding.conf index 14eeaefd..a3cefe6e 100644 --- a/data/encoding.conf +++ b/data/encoding.conf @@ -1,28 +1,36 @@ #Fallback encoding when in dvb-text no encoding table is given #Countycode ISO8859-X or ISO6397 +ara ISO8859-6 tur ISO8859-9 gre ISO8859-7 pol ISO8859-2 rus ISO8859-5 bul ISO8859-5 +cze ISO6397 +ces ISO6397 +slo ISO6397 +slk ISO6397 #Sorry for that.. in DVB Spec this is the default behavior #when no other encoding is given in dvb-texts.. #but this breaks too much providers yet.. #so our default is ISO8859-1 without two char byte encoding #So all transponders which needs this must be listed here #TSID ONID -0x447 0x1 #ASTRA 19.2 UPC Direct -0x427 0x1 #ASTRA 19.2 UPC Direct -0x44b 0x1 #ASTRA 19.2 UPC Direct -0x4ff 0x1 #ASTRA 19.2 UPC Direct -0x407 0x1 #ASTRA 19.2 UPC Direct -0x436 0x1 #ASTRA 19.2 MTV Euro - MTV Networks -0x42a 0x1 #ASTRA 19.2 VH1 Classic - MTV Networks -0xbc6 0x3 #ASTRA 23.5 Cslink, Skylink -0xc85 0x3 #ASTRA 23.5 Cslink, Skylink -0xc89 0x3 #ASTRA 23.5 Cslink, Skylink -0xc8f 0x3 #ASTRA 23.5 Cslink, Skylink -0xbc7 0x3 #ASTRA 23.5 Cslink, Skylink +0x447 0x1 # Astra 19.2°E 12.304 H - UPC Direct +0x427 0x1 # Astra 19.2°E 10.920 H - UPC Direct +0x44b 0x1 # Astra 19.2°E 12.382 H - UPC Direct +0x4ff 0x1 # Astra 19.2°E 11.992 H - UPC Direct +0x407 0x1 # Astra 19.2°E 11.671 H - UPC Direct +0x436 0x1 # Astra 19.2°E 11.973 V - MTV Networks Europe +0x42a 0x1 # Astra 19.2°E 11.739 V - MTV Networks Europe +0xc23 0x3 # Astra 23.5°E 10.803 H - CS Link / SkyLink +0xc85 0x3 # Astra 23.5°E 11.797 H - CS Link / SkyLink +0xc89 0x3 # Astra 23.5°E 11.876 H - CS Link / SkyLink +0xc8f 0x3 # Astra 23.5°E 11.992 H - CS Link / SkyLink +0xc93 0x3 # Astra 23.5°E 12.070 H - CS Link / SkyLink +0xc95 0x3 # Astra 23.5°E 12.109 H - SkyLink +0xbc6 0x3 # Astra 23.5°E 12.525 V - CS Link / SkyLink +0xbc7 0x3 # Astra 23.5°E 12.565 H - SkyLink 400 318 #Hotbird 13.0 Cyfra+ 1000 318 #Hotbird 13.0 Grupa ITI 1500 318 #Hotbird 13.0 Cyfra+ diff --git a/data/keymap.xml b/data/keymap.xml index 25538f87..9461d509 100755 --- a/data/keymap.xml +++ b/data/keymap.xml @@ -98,6 +98,10 @@ + + + + diff --git a/data/menu.xml b/data/menu.xml old mode 100644 new mode 100755 index c7fb8897..b437fbc7 --- a/data/menu.xml +++ b/data/menu.xml @@ -24,7 +24,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -57,30 +57,24 @@ - - + + - + - + - - -from Screens.DefaultWizard import DefaultWizard -self.session.open(DefaultWizard, silent = False) - - from Screens.FactoryReset import FactoryReset @@ -104,6 +98,7 @@ self.session.openWithCallback(msgClosed, FactoryReset) 2 3 - 1 + 1 + 1 diff --git a/data/setup.xml b/data/setup.xml index 9425afda..705eaf33 100644 --- a/data/setup.xml +++ b/data/setup.xml @@ -31,8 +31,10 @@ config.usage.quickzap_bouquet_change config.usage.e1like_radio_mode config.usage.on_long_powerpress + config.usage.on_short_powerpress config.usage.infobar_timeout config.usage.output_12V + config.usage.show_event_progress_in_servicelist config.usage.show_infobar_on_zap config.usage.show_infobar_on_skip config.usage.show_infobar_on_event_change diff --git a/data/skin.xml b/data/skin.xml index d5fe01e6..32adb2be 100755 --- a/data/skin.xml +++ b/data/skin.xml @@ -323,7 +323,7 @@ - Remaining + Remaining,Negate diff --git a/data/skin_default.xml b/data/skin_default.xml index 16504abf..0114349b 100755 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -43,7 +43,9 @@ - + + + @@ -68,8 +70,8 @@ - - + + @@ -248,9 +250,13 @@ self.instance.move(ePoint((720-wsizex)/2, (576-wsizey)/(count > 7 and 2 or 3) - + + + + + @@ -566,9 +572,11 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) + + @@ -618,14 +626,14 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + {"template": [ MultiContentEntryText(pos = (10, 5), size = (360, 30), flags = RT_HALIGN_LEFT, text = 1), # index 1 is the nim name, - MultiContentEntryText(pos = (50, 30), size = (320, 30), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, + MultiContentEntryText(pos = (50, 30), size = (320, 50), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is a description of the nim settings, ], "fonts": [gFont("Regular", 20), gFont("Regular", 15)], - "itemHeight": 70 + "itemHeight": 80 } diff --git a/data/skin_default/Makefile.am b/data/skin_default/Makefile.am old mode 100644 new mode 100755 index e2d2abcc..6038c2e9 --- a/data/skin_default/Makefile.am +++ b/data/skin_default/Makefile.am @@ -15,6 +15,7 @@ dist_install_DATA = \ border_eventinfo.png \ border_info.png \ border_menu_300.png \ + border_menu_350.png \ border_menu.png \ border_multiepg.png \ bottombar.png \ @@ -22,6 +23,7 @@ dist_install_DATA = \ b_tl.png \ b_t.png \ b_tr.png \ + celserviceeventprogressbar.png \ div-h.png \ div-v.png \ epg_more.png \ @@ -31,6 +33,8 @@ dist_install_DATA = \ expanded-plugins.png \ info-bg_mp.png \ info-bg.png \ + lock.png \ + lockBouquet.png \ mediaplayer_bg.png \ mute.png \ nim_active.png \ @@ -50,6 +54,9 @@ dist_install_DATA = \ sleeptimer.png \ timeline-now.png \ timeline.png \ + unhandled-key.png \ + unlock.png \ + unlockBouquet.png \ verticalline-plugins.png \ vkey_backspace.png \ vkey_bg.png \ diff --git a/data/skin_default/border_menu_350.png b/data/skin_default/border_menu_350.png new file mode 100755 index 00000000..4f6f49c2 Binary files /dev/null and b/data/skin_default/border_menu_350.png differ diff --git a/data/skin_default/celserviceeventprogressbar.png b/data/skin_default/celserviceeventprogressbar.png new file mode 100644 index 00000000..7bf5c658 Binary files /dev/null and b/data/skin_default/celserviceeventprogressbar.png differ diff --git a/data/skin_default/div-h.png b/data/skin_default/div-h.png old mode 100644 new mode 100755 index d6fcc7fb..9ab4ff45 Binary files a/data/skin_default/div-h.png and b/data/skin_default/div-h.png differ diff --git a/data/skin_default/icons/dish.png b/data/skin_default/icons/dish.png index f3c6548d..6148e07c 100644 Binary files a/data/skin_default/icons/dish.png and b/data/skin_default/icons/dish.png differ diff --git a/data/skin_default/lock.png b/data/skin_default/lock.png new file mode 100644 index 00000000..d0ae7f64 Binary files /dev/null and b/data/skin_default/lock.png differ diff --git a/data/skin_default/lockBouquet.png b/data/skin_default/lockBouquet.png new file mode 100644 index 00000000..d503dd2b Binary files /dev/null and b/data/skin_default/lockBouquet.png differ diff --git a/data/skin_default/unhandled-key.png b/data/skin_default/unhandled-key.png new file mode 100644 index 00000000..8e543498 Binary files /dev/null and b/data/skin_default/unhandled-key.png differ diff --git a/data/skin_default/unlock.png b/data/skin_default/unlock.png new file mode 100644 index 00000000..bd4486e9 Binary files /dev/null and b/data/skin_default/unlock.png differ diff --git a/data/skin_default/unlockBouquet.png b/data/skin_default/unlockBouquet.png new file mode 100644 index 00000000..c5d146d7 Binary files /dev/null and b/data/skin_default/unlockBouquet.png differ diff --git a/doc/DEFAULTS b/doc/DEFAULTS index b61696f6..669652e8 100644 --- a/doc/DEFAULTS +++ b/doc/DEFAULTS @@ -92,7 +92,7 @@ So this would only install the lamedb.192 file, if you have a DVB-S NIM in your - "image default" An image default is stored in /usr/share/enigma2/defaults. You can have several defaults at the same time, but you should keep in mind, that these defaults are all installed without user interaction. So defaults with contrary contents should be avoided - (e.g. setting a default parameter in one settings file an setting another setting for the same parameter in another could lead + (e.g. setting a default parameter in one settings file and setting another setting for the same parameter in another could lead to unexpected behaviour, since the installation order is undetermined and completely random. so use prerequisites insted) The "image default" is also used to set box specific config elements (for example show the new RC on a dm8000) and install the default bouquets. diff --git a/lib/actions/action.cpp b/lib/actions/action.cpp index 0eb4cdb1..a2d85ffd 100644 --- a/lib/actions/action.cpp +++ b/lib/actions/action.cpp @@ -208,7 +208,7 @@ void eActionMap::keyPressed(const std::string &device, int key, int flags) } } else { - eDebug("wildcard."); +// eDebug("wildcard."); ePyObject pArgs = PyTuple_New(2); PyTuple_SET_ITEM(pArgs, 0, PyInt_FromLong(key)); PyTuple_SET_ITEM(pArgs, 1, PyInt_FromLong(flags)); diff --git a/lib/base/ebase.cpp b/lib/base/ebase.cpp index 313732ab..5bafe732 100644 --- a/lib/base/ebase.cpp +++ b/lib/base/ebase.cpp @@ -225,6 +225,7 @@ int eMainloop::processOneEvent(unsigned int twisted_timeout, PyObject **res, ePy } m_is_idle = 1; + ++m_idle_count; if (this == eApp) { diff --git a/lib/base/ebase.h b/lib/base/ebase.h index 524052bd..c69133f6 100644 --- a/lib/base/ebase.h +++ b/lib/base/ebase.h @@ -195,6 +195,7 @@ class eMainloop int processOneEvent(unsigned int user_timeout, PyObject **res=0, ePyObject additional=ePyObject()); int retval; int m_is_idle; + int m_idle_count; eSocketNotifier *m_inActivate; int m_interrupt_requested; @@ -210,7 +211,7 @@ public: #endif eMainloop() - :app_quit_now(0),loop_level(0),retval(0), m_is_idle(0), m_inActivate(0), m_interrupt_requested(0) + :app_quit_now(0),loop_level(0),retval(0), m_is_idle(0), m_idle_count(0), m_inActivate(0), m_interrupt_requested(0) { existing_loops.push_back(this); } @@ -240,6 +241,7 @@ public: /* m_is_idle needs to be atomic, but it doesn't really matter much, as it's read-only from outside */ int isIdle() { return m_is_idle; } + int idleCount() { return m_idle_count; } }; /** diff --git a/lib/base/elock.h b/lib/base/elock.h index 51582e67..01757182 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -83,9 +83,18 @@ class eSingleLock pthread_mutex_t m_lock; eSingleLock(eSingleLock &); public: - eSingleLock() + eSingleLock(bool recursive=false) { - pthread_mutex_init(&m_lock, 0); + if (recursive) + { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&m_lock, &attr); + pthread_mutexattr_destroy(&attr); + } + else + pthread_mutex_init(&m_lock, 0); } ~eSingleLock() { diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index 3412c84a..91f24ba0 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -37,7 +37,6 @@ void eFilePushThread::thread() size_t written_since_last_sync = 0; - int already_empty = 0; eDebug("FILEPUSH THREAD START"); /* we set the signal to not restart syscalls, so we can detect our signal. */ @@ -186,21 +185,23 @@ void eFilePushThread::thread() if (m_buf_end == 0) { /* on EOF, try COMMITting once. */ - if (m_send_pvr_commit && !already_empty) + if (m_send_pvr_commit) { - eDebug("sending PVR commit"); - struct pollfd pfd; pfd.fd = m_fd_dest; pfd.events = POLLIN; - poll(&pfd, 1, 10000); - sleep(5); /* HACK to allow ES buffer to drain */ - already_empty = 1; -// if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR) -// continue; - eDebug("commit done"); - /* well check again */ - continue; + switch (poll(&pfd, 1, 250)) // wait for 250ms + { + case 0: + eDebug("wait for driver eof timeout"); + continue; + case 1: + eDebug("wait for driver eof ok"); + break; + default: + eDebug("wait for driver eof aborted by signal"); + continue; + } } /* in stream_mode, we are sending EOF events @@ -230,7 +231,6 @@ void eFilePushThread::thread() bytes_read += m_buf_end; if (m_sg) current_span_remaining -= m_buf_end; - already_empty = 0; } // printf("FILEPUSH: read %d bytes\n", m_buf_end); } diff --git a/lib/base/ioprio.cpp b/lib/base/ioprio.cpp index fb257401..3117b5e6 100644 --- a/lib/base/ioprio.cpp +++ b/lib/base/ioprio.cpp @@ -12,23 +12,25 @@ extern "C" int sys_ioprio_set(int, int, int); extern "C" int sys_ioprio_get(int, int); -#if defined(__i386__) -#define __NR_ioprio_set 289 -#define __NR_ioprio_get 290 -#elif defined(__ppc__) || defined(__powerpc__) -#define __NR_ioprio_set 273 -#define __NR_ioprio_get 274 -#elif defined(__x86_64__) -#define __NR_ioprio_set 251 -#define __NR_ioprio_get 252 -#elif defined(__ia64__) -#define __NR_ioprio_set 1274 -#define __NR_ioprio_get 1275 -#elif defined(__mips__) -#define __NR_ioprio_set 4284 -#define __NR_ioprio_get 4285 -#else -#error "Unsupported arch" +#ifndef __NR_ioprio_set + #if defined(__i386__) + #define __NR_ioprio_set 289 + #define __NR_ioprio_get 290 + #elif defined(__ppc__) || defined(__powerpc__) + #define __NR_ioprio_set 273 + #define __NR_ioprio_get 274 + #elif defined(__x86_64__) + #define __NR_ioprio_set 251 + #define __NR_ioprio_get 252 + #elif defined(__ia64__) + #define __NR_ioprio_set 1274 + #define __NR_ioprio_get 1275 + #elif defined(__mips__) + #define __NR_ioprio_set 4284 + #define __NR_ioprio_get 4285 + #else + #error "Unsupported arch" + #endif #endif #if defined(_syscall3) && defined(_syscall2) diff --git a/lib/driver/rc.cpp b/lib/driver/rc.cpp index c7acd113..c1ff13ea 100644 --- a/lib/driver/rc.cpp +++ b/lib/driver/rc.cpp @@ -81,7 +81,6 @@ eRCShortDriver::eRCShortDriver(const char *filename): eRCDriver(eRCInput::getIns { sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read); CONNECT(sn->activated, eRCShortDriver::keyPressed); - eRCInput::getInstance()->setFile(handle); } } @@ -115,7 +114,6 @@ eRCInputEventDriver::eRCInputEventDriver(const char *filename): eRCDriver(eRCInp { sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read); CONNECT(sn->activated, eRCInputEventDriver::keyPressed); - eRCInput::getInstance()->setFile(handle); } } @@ -127,6 +125,19 @@ std::string eRCInputEventDriver::getDeviceName() return name; } +void eRCInputEventDriver::setExclusive(bool b) +{ + if (handle >= 0) + { + long evbits; + int grab = b; + if (::ioctl(handle, EVIOCGBIT(0, EV_MAX+1), &evbits) < 0) + perror("EVIOCGBIT"); + else if ((evbits & (1 << 0x1E)) && ::ioctl(handle, EVIOCGRAB, grab) < 0) + perror("EVIOCGRAB"); + } +} + eRCInputEventDriver::~eRCInputEventDriver() { if (handle>=0) @@ -165,7 +176,6 @@ eRCInput::eRCInput() { ASSERT( !instance); instance=this; - handle = -1; locked = 0; keyboardMode = kmNone; } @@ -183,21 +193,18 @@ bool eRCInput::open() return false; } -int eRCInput::lock() +void eRCInput::lock() { locked=1; - return handle; + for (std::map::iterator i=devices.begin(); i != devices.end(); ++i) + i->second->setExclusive(false); } void eRCInput::unlock() { - if (locked) - locked=0; -} - -void eRCInput::setFile(int newh) -{ - handle=newh; + locked=0; + for (std::map::iterator i=devices.begin(); i != devices.end(); ++i) + i->second->setExclusive(true); } void eRCInput::addDevice(const std::string &id, eRCDevice *dev) @@ -216,7 +223,7 @@ eRCDevice *eRCInput::getDevice(const std::string &id) if (i == devices.end()) { eDebug("failed, possible choices are:"); - for (std::map::iterator i=devices.begin(); i != devices.end(); ++i) + for (std::map::iterator i=devices.begin(); i != devices.end(); ++i) eDebug("%s", i->first.c_str()); return 0; } diff --git a/lib/driver/rc.h b/lib/driver/rc.h index 9708ea7b..52909468 100644 --- a/lib/driver/rc.h +++ b/lib/driver/rc.h @@ -53,6 +53,7 @@ public: * \param key The key to get the description for. * \result User readable description of given key. */ + virtual void setExclusive(bool b) { }; }; /** @@ -89,6 +90,7 @@ public: ~eRCDriver(); void enable(int en) { enabled=en; } + virtual void setExclusive(bool) { } }; class eRCShortDriver: public eRCDriver @@ -112,6 +114,7 @@ public: std::string getDeviceName(); eRCInputEventDriver(const char *filename); ~eRCInputEventDriver(); + void setExclusive(bool b); // in exclusive mode data is not carried to console device }; class eRCKey @@ -173,7 +176,6 @@ public: class eRCInput: public Object { int locked; - int handle; static eRCInput *instance; int keyboardMode; #ifdef SWIG @@ -199,8 +201,6 @@ public: void close(); bool open(); - void setFile(int handle); - /* This is only relevant for "keyboard"-styled input devices, i.e. not plain remote controls. It's up to the input device driver to decide wheter an input device is a keyboard or @@ -237,7 +237,7 @@ public: void setKeyboardMode(int mode) { keyboardMode = mode; } int getKeyboardMode() { return keyboardMode; } static eRCInput *getInstance() { return instance; } - int lock(); + void lock(); void unlock(); int islocked() { return locked; } }; diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp index bcce5601..eb5aee3d 100644 --- a/lib/driver/rcconsole.cpp +++ b/lib/driver/rcconsole.cpp @@ -16,7 +16,6 @@ eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::ge { sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read); CONNECT(sn->activated, eRCConsoleDriver::keyPressed); - eRCInput::getInstance()->setFile(handle); } /* set console mode */ diff --git a/lib/driver/rcinput.cpp b/lib/driver/rcinput.cpp index d10d94f3..2bfeefa1 100644 --- a/lib/driver/rcinput.cpp +++ b/lib/driver/rcinput.cpp @@ -83,8 +83,14 @@ eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver) break; } } + setExclusive(true); eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not "); +} +void eRCDeviceInputDev::setExclusive(bool b) +{ + if (!iskeyboard) + driver->setExclusive(b); } const char *eRCDeviceInputDev::getDescription() const diff --git a/lib/driver/rcinput.h b/lib/driver/rcinput.h index c7f56975..3b4579c5 100644 --- a/lib/driver/rcinput.h +++ b/lib/driver/rcinput.h @@ -10,6 +10,7 @@ public: void handleCode(long code); eRCDeviceInputDev(eRCInputEventDriver *driver); const char *getDescription() const; + void setExclusive(bool); }; #endif diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 90bf19e1..ef8dadc3 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -222,9 +222,6 @@ int eDVBAudio::startPid(int pid, int type) void eDVBAudio::stop() { -#if HAVE_DVB_API_VERSION > 2 - flush(); -#endif eDebugNoNewLine("AUDIO_STOP - "); if (::ioctl(m_fd, AUDIO_STOP) < 0) eDebug("failed (%m)"); @@ -1048,9 +1045,9 @@ int eTSMPEGDecoder::setState() int eTSMPEGDecoder::m_pcm_delay=-1, eTSMPEGDecoder::m_ac3_delay=-1; -RESULT eTSMPEGDecoder::setPCMDelay(int delay) +RESULT eTSMPEGDecoder::setHwPCMDelay(int delay) { - if (m_decoder == 0 && delay != m_pcm_delay ) + if (delay != m_pcm_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w"); if (fp) @@ -1064,9 +1061,9 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay) return -1; } -RESULT eTSMPEGDecoder::setAC3Delay(int delay) +RESULT eTSMPEGDecoder::setHwAC3Delay(int delay) { - if ( m_decoder == 0 && delay != m_ac3_delay ) + if ( delay != m_ac3_delay ) { FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w"); if (fp) @@ -1080,6 +1077,17 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay) return -1; } + +RESULT eTSMPEGDecoder::setPCMDelay(int delay) +{ + return m_decoder == 0 ? setHwPCMDelay(delay) : -1; +} + +RESULT eTSMPEGDecoder::setAC3Delay(int delay) +{ + return m_decoder == 0 ? setHwAC3Delay(delay) : -1; +} + eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder) : m_demux(demux), m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1), diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index b53638b5..3a0fbac1 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -193,6 +193,8 @@ public: int getVideoProgressive(); int getVideoFrameRate(); int getVideoAspect(); + static RESULT setHwPCMDelay(int delay); + static RESULT setHwAC3Delay(int delay); }; #endif diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 894287e8..17712dde 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -1324,16 +1324,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off return; } - m_cue->m_lock.RdLock(); - if (!m_cue->m_decoding_demux) - { - start = current_offset; - size = max; - eDebug("getNextSourceSpan, no decoding demux. forcing normal play"); - m_cue->m_lock.Unlock(); - return; - } - if (m_skipmode_n) { eDebug("skipmode %d:%d (x%d)", m_skipmode_m, m_skipmode_n, m_skipmode_frames); @@ -1341,7 +1331,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off } eDebug("getNextSourceSpan, current offset is %08llx, m_skipmode_m = %d!", current_offset, m_skipmode_m); - int frame_skip_success = 0; if (m_skipmode_m) @@ -1386,6 +1375,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off } } + m_cue->m_lock.RdLock(); + while (!m_cue->m_seek_requests.empty()) { std::pair seek = m_cue->m_seek_requests.front(); @@ -1410,6 +1401,13 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off eDebug("decoder getPTS failed, can't seek relative"); continue; } + if (!m_cue->m_decoding_demux) + { + eDebug("getNextSourceSpan, no decoding demux. couldn't seek to %llx... ignore request!", pts); + start = current_offset; + size = max; + continue; + } if (getCurrentPosition(m_cue->m_decoding_demux, now, 1)) { eDebug("seekTo: getCurrentPosition failed!"); @@ -1462,12 +1460,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off continue; } - size_t iframe_len; - /* try to align to iframe */ - int direction = pts < 0 ? -1 : 1; - m_tstools.findFrame(offset, iframe_len, direction); - - eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx (skipped additional %d frames due to iframe re-align)", relative, pts, offset, direction); + eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset); current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */ } @@ -1771,6 +1764,8 @@ RESULT eDVBChannel::playFile(const char *file) m_pvr_thread->setStreamMode(1); m_pvr_thread->setScatterGather(this); + m_event(this, evtPreStart); + if (m_pvr_thread->start(file, m_pvr_fd_dst)) { delete m_pvr_thread; diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index f80e1775..48cbfbfd 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -254,6 +254,11 @@ void eEPGCache::DVBChannelAdded(eDVBChannel *chan) data->prevChannelState = -1; #ifdef ENABLE_PRIVATE_EPG data->m_PrivatePid = -1; +#endif +#ifdef ENABLE_MHW_EPG + data->m_mhw2_channel_pid = 0x231; // defaults for astra 19.2 D+ + data->m_mhw2_title_pid = 0x234; // defaults for astra 19.2 D+ + data->m_mhw2_summary_pid = 0x236; // defaults for astra 19.2 D+ #endif singleLock s(channel_map_lock); m_knownChannels.insert( std::pair(chan, data) ); @@ -879,6 +884,62 @@ void eEPGCache::gotMessage( const Message &msg ) } break; } +#endif +#ifdef ENABLE_MHW_EPG + case Message::got_mhw2_channel_pid: + { + singleLock s(channel_map_lock); + for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it) + { + eDVBChannel *channel = (eDVBChannel*) it->first; + channel_data *data = it->second; + eDVBChannelID chid = channel->getChannelID(); + if ( chid.transport_stream_id.get() == msg.service.tsid && + chid.original_network_id.get() == msg.service.onid ) + { + data->m_mhw2_channel_pid = msg.pid; + eDebug("[EPGC] got mhw2 channel pid %04x", msg.pid); + break; + } + } + break; + } + case Message::got_mhw2_title_pid: + { + singleLock s(channel_map_lock); + for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it) + { + eDVBChannel *channel = (eDVBChannel*) it->first; + channel_data *data = it->second; + eDVBChannelID chid = channel->getChannelID(); + if ( chid.transport_stream_id.get() == msg.service.tsid && + chid.original_network_id.get() == msg.service.onid ) + { + data->m_mhw2_title_pid = msg.pid; + eDebug("[EPGC] got mhw2 title pid %04x", msg.pid); + break; + } + } + break; + } + case Message::got_mhw2_summary_pid: + { + singleLock s(channel_map_lock); + for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it) + { + eDVBChannel *channel = (eDVBChannel*) it->first; + channel_data *data = it->second; + eDVBChannelID chid = channel->getChannelID(); + if ( chid.transport_stream_id.get() == msg.service.tsid && + chid.original_network_id.get() == msg.service.onid ) + { + data->m_mhw2_summary_pid = msg.pid; + eDebug("[EPGC] got mhw2 summary pid %04x", msg.pid); + break; + } + } + break; + } #endif case Message::timeChanged: cleanLoop(); @@ -1175,7 +1236,7 @@ void eEPGCache::channel_data::startEPG() isRunning |= MHW; memcpy(&m_MHWFilterMask, &mask, sizeof(eDVBSectionFilterMask)); - mask.pid = 0x231; + mask.pid = m_mhw2_channel_pid; mask.data[0] = 0xC8; mask.mask[0] = 0xFF; mask.data[1] = 0; @@ -1186,6 +1247,7 @@ void eEPGCache::channel_data::startEPG() memcpy(&m_MHWFilterMask2, &mask, sizeof(eDVBSectionFilterMask)); mask.data[1] = 0; mask.mask[1] = 0; + m_MHWTimeoutet=false; #endif mask.pid = 0x12; @@ -1717,6 +1779,7 @@ void fillTuple(ePyObject tuple, const char *argstring, int argcount, ePyObject s ++argcount; continue; default: // ignore unknown + tmp = ePyObject(); eDebug("fillTuple unknown '%c'... insert 'None' in result", c); } if (!tmp) @@ -2061,6 +2124,7 @@ void fillTuple2(ePyObject tuple, const char *argstring, int argcount, eventData inc_refcount = true; break; default: // ignore unknown + tmp = ePyObject(); eDebug("fillTuple2 unknown '%c'... insert None in Result", argstring[pos]); } if (!tmp) @@ -2487,6 +2551,50 @@ void eEPGCache::PMTready(eDVBServicePMTHandler *pmthandler) int tmp=0; switch ((*es)->getType()) { + case 0xC1: // user private + for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); + desc != (*es)->getDescriptors()->end(); ++desc) + { + switch ((*desc)->getTag()) + { + case 0xC2: // user defined + if ((*desc)->getLength() == 8) + { + __u8 buffer[10]; + (*desc)->writeToBuffer(buffer); + if (!strncmp((unsigned char*)buffer+2, "EPGDATA", 7)) + { + eServiceReferenceDVB ref; + if (!pmthandler->getServiceReference(ref)) + { + int pid = (*es)->getPid(); + messages.send(Message(Message::got_mhw2_channel_pid, ref, pid)); + } + } + else if(!strncmp((unsigned char*)buffer+2, "FICHAS", 6)) + { + eServiceReferenceDVB ref; + if (!pmthandler->getServiceReference(ref)) + { + int pid = (*es)->getPid(); + messages.send(Message(Message::got_mhw2_summary_pid, ref, pid)); + } + } + else if(!strncmp((unsigned char*)buffer+2, "GENEROS", 7)) + { + eServiceReferenceDVB ref; + if (!pmthandler->getServiceReference(ref)) + { + int pid = (*es)->getPid(); + messages.send(Message(Message::got_mhw2_title_pid, ref, pid)); + } + } + } + break; + default: + break; + } + } case 0x05: // private for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); desc != (*es)->getDescriptors()->end(); ++desc) @@ -2891,7 +2999,7 @@ void eEPGCache::channel_data::storeTitle(std::map<__u32, mhw_title_t>::iterator packet->segment_last_table_id = 0x50; __u8 *title = isMHW2 ? ((__u8*)(itTitle->second.title))-4 : (__u8*)itTitle->second.title; - std::string prog_title = (char *) delimitName( title, name, isMHW2 ? 33 : 23 ); + std::string prog_title = (char *) delimitName( title, name, isMHW2 ? 35 : 23 ); int prog_title_length = prog_title.length(); int packet_length = EIT_SIZE + EIT_LOOP_SIZE + EIT_SHORT_EVENT_DESCRIPTOR_SIZE + @@ -3220,14 +3328,14 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data) { eDebug("[EPGC] mhw2 aborted %d", state); } - else if (m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0) + else if (m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0) // Channels table { - int num_channels = data[119]; + int num_channels = data[120]; m_channels.resize(num_channels); - if(dataLen > 119) + if(dataLen > 120) { - int ptr = 120 + 8 * num_channels; + int ptr = 121 + 8 * num_channels; if( dataLen > ptr ) { for( int chid = 0; chid < num_channels; ++chid ) @@ -3243,7 +3351,7 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data) else goto abort; // data seems consistent... - const __u8 *tmp = data+120; + const __u8 *tmp = data+121; for (int i=0; i < num_channels; ++i) { mhw_channel_name_t channel; @@ -3254,6 +3362,7 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data) channel.channel_id_hi = *(tmp++); channel.channel_id_lo = *(tmp++); m_channels[i]=channel; +// eDebug("%d(%02x) %04x: %02x %02x", i, i, (channel.channel_id_hi << 8) | channel.channel_id_lo, *tmp, *(tmp+1)); tmp+=2; } for (int i=0; i < num_channels; ++i) @@ -3264,83 +3373,86 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data) for (; x < channel_name_len; ++x) channel.name[x]=*(tmp++); channel.name[x+1]=0; +// eDebug("%d(%02x) %s", i, i, channel.name); } haveData |= MHW; eDebug("[EPGC] mhw2 %d channels found", m_channels.size()); } - else if (m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1) + else if (m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1) { // Themes table eDebug("[EPGC] mhw2 themes nyi"); } - else if (m_MHWFilterMask2.pid == 0x234 && m_MHWFilterMask2.data[0] == 0xe6) + else if (m_MHWFilterMask2.pid == m_mhw2_title_pid && m_MHWFilterMask2.data[0] == 0xe6) // Titles table { int pos=18; - bool valid=true; - int len = ((data[1]&0xf)<<8) + data[2] - 16; + bool valid=false; bool finish=false; - if(data[dataLen-1] != 0xff) - return; - while( pos < dataLen ) + +// eDebug("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", +// data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], +// data[11], data[12], data[13], data[14], data[15], data[16], data[17] ); + + while( pos < dataLen && !valid) { - valid = false; - pos += 7; - if( pos < dataLen ) - { - pos += 3; - if( pos < dataLen ) - { - if( data[pos] > 0xc0 ) - { - pos += ( data[pos] - 0xc0 ); - pos += 4; - if( pos < dataLen ) - { - if( data[pos] == 0xff ) - { - ++pos; - valid = true; - } - } - } - } - } - if( !valid ) - { - if (checkTimeout()) - goto start_summary; - return; - } + pos += 18; + pos += (data[pos] & 0x3F) + 4; + if( pos == dataLen ) + valid = true; } + + if (!valid) + { + if (dataLen > 18) + eDebug("mhw2 title table invalid!!"); + if (checkTimeout()) + goto abort; + if (!m_MHWTimeoutTimer->isActive()) + startTimeout(5000); + return; // continue reading + } + // data seems consistent... mhw_title_t title; pos = 18; - while (pos < len) + while (pos < dataLen) { +// eDebugNoNewLine(" [%02x] %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x [%02x %02x %02x %02x %02x %02x %02x] LL - DESCR - ", +// data[pos], data[pos+1], data[pos+2], data[pos+3], data[pos+4], data[pos+5], data[pos+6], data[pos+7], +// data[pos+8], data[pos+9], data[pos+10], data[pos+11], data[pos+12], data[pos+13], data[pos+14], data[pos+15], data[pos+16], data[pos+17]); title.channel_id = data[pos]+1; - title.program_id_ml = data[pos+1]; - title.program_id_lo = data[pos+2]; - title.mhw2_mjd_hi = data[pos+3]; - title.mhw2_mjd_lo = data[pos+4]; - title.mhw2_hours = data[pos+5]; - title.mhw2_minutes = data[pos+6]; - title.mhw2_seconds = data[pos+7]; - int duration = ((data[pos+8] << 8)|data[pos+9]) >> 4; + title.mhw2_mjd_hi = data[pos+11]; + title.mhw2_mjd_lo = data[pos+12]; + title.mhw2_hours = data[pos+13]; + title.mhw2_minutes = data[pos+14]; + title.mhw2_seconds = data[pos+15]; + int duration = ((data[pos+16] << 8)|data[pos+17]) >> 4; title.mhw2_duration_hi = (duration&0xFF00) >> 8; title.mhw2_duration_lo = duration&0xFF; - __u8 slen = data[pos+10] & 0x3f; + + // Create unique key per title + __u32 title_id = (data[pos+7] << 24) | (data[pos+8] << 16) | (data[pos+9] << 8) | data[pos+10]; + + __u8 slen = data[pos+18] & 0x3f; __u8 *dest = ((__u8*)title.title)-4; - memcpy(dest, &data[pos+11], slen>33 ? 33 : slen); - memset(dest+slen, 0, 33-slen); - pos += 11 + slen; + memcpy(dest, &data[pos+19], slen>35 ? 35 : slen); + memset(dest+slen, 0, 35-slen); + pos += 19 + slen; +// eDebug("%02x [%02x %02x]: %s", data[pos], data[pos+1], data[pos+2], dest); + // not used theme id (data[7] & 0x3f) + (data[pos] & 0x3f); __u32 summary_id = (data[pos+1] << 8) | data[pos+2]; - // Create unique key per title - __u32 title_id = (title.channel_id<<16) | (title.program_id_ml<<8) | title.program_id_lo; +// if (title.channel_id > m_channels.size()) +// eDebug("channel_id(%d %02x) to big!!", title.channel_id); + +// eDebug("pos %d prog_id %02x %02x chid %02x summary_id %04x dest %p len %d\n", +// pos, title.program_id_ml, title.program_id_lo, title.channel_id, summary_id, dest, slen); - pos += 4; +// eDebug("title_id %08x -> summary_id %04x\n", title_id, summary_id); + + pos += 3; std::map<__u32, mhw_title_t>::iterator it = m_titles.find( title_id ); if ( it == m_titles.end() ) @@ -3379,7 +3491,7 @@ start_summary: { // Titles table has been read, there are summaries to read. // Start reading summaries, store corresponding titles on the fly. - startMHWReader2(0x236, 0x96); + startMHWReader2(m_mhw2_summary_pid, 0x96); startTimeout(15000); return; } @@ -3387,7 +3499,7 @@ start_summary: else return; } - else if (m_MHWFilterMask2.pid == 0x236 && m_MHWFilterMask2.data[0] == 0x96) + else if (m_MHWFilterMask2.pid == m_mhw2_summary_pid && m_MHWFilterMask2.data[0] == 0x96) // Summaries table { if (!checkTimeout()) @@ -3421,10 +3533,13 @@ start_summary: } else return; // continue reading + if (valid) { // data seems consistent... __u32 summary_id = (data[3]<<8)|data[4]; +// eDebug ("summary id %04x\n", summary_id); +// eDebug("[%02x %02x] %02x %02x %02x %02x %02x %02x %02x %02x XX\n", data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13] ); // ugly workaround to convert const __u8* to char* char *tmp=0; @@ -3442,7 +3557,7 @@ start_summary: len += lenline + 1; } if( len > 0 ) - tmp[pos+len] = 0; + tmp[pos+len] = 0; else tmp[pos+1] = 0; @@ -3458,8 +3573,11 @@ start_summary: startTimeout(15000); std::string the_text = (char *) (data + pos + 1); +// eDebug ("summary id %04x : %s\n", summary_id, data+pos+1); + while( itProgId != m_program_ids.end() && itProgId->first == summary_id ) { +// eDebug("."); // Find corresponding title, store title and summary in epgcache. std::map<__u32, mhw_title_t>::iterator itTitle( m_titles.find( itProgId->second ) ); if ( itTitle != m_titles.end() ) @@ -3479,16 +3597,16 @@ start_summary: } if (isRunning & eEPGCache::MHW) { - if ( m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0) + if ( m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0) { // Channels table has been read, start reading the themes table. - startMHWReader2(0x231, 0xC8, 1); + startMHWReader2(m_mhw2_channel_pid, 0xC8, 1); return; } - else if ( m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1) + else if ( m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1) { // Themes table has been read, start reading the titles table. - startMHWReader2(0x234, 0xe6); + startMHWReader2(m_mhw2_title_pid, 0xe6); return; } else diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h index 7d1b163f..4d45d87e 100644 --- a/lib/dvb/epgcache.h +++ b/lib/dvb/epgcache.h @@ -202,6 +202,7 @@ class eEPGCache: public eMainloop, private eThread, public Object ePtr m_MHWReader, m_MHWReader2; eDVBSectionFilterMask m_MHWFilterMask, m_MHWFilterMask2; ePtr m_MHWTimeoutTimer; + __u16 m_mhw2_channel_pid, m_mhw2_title_pid, m_mhw2_summary_pid; bool m_MHWTimeoutet; void MHWTimeout() { m_MHWTimeoutet=true; } void readMHWData(const __u8 *data); @@ -242,6 +243,9 @@ public: leaveChannel, quit, got_private_pid, + got_mhw2_channel_pid, + got_mhw2_title_pid, + got_mhw2_summary_pid, timeChanged }; int type; diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index c0263fb4..8216eea0 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -455,7 +455,7 @@ int eDVBFrontend::PriorityOrder=0; eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate) :m_simulate(simulate), m_enabled(false), m_type(-1), m_dvbid(fe), m_slotid(fe) - ,m_fd(-1), m_need_rotor_workaround(false), m_can_handle_dvbs2(false) + ,m_fd(-1), m_rotor_mode(false), m_need_rotor_workaround(false), m_can_handle_dvbs2(false) ,m_state(stateClosed), m_timeout(0), m_tuneTimer(0) #if HAVE_DVB_API_VERSION < 3 ,m_secfd(-1) @@ -483,6 +483,13 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate) closeFrontend(); } +void eDVBFrontend::reopenFrontend() +{ + closeFrontend(); + m_type = -1; + openFrontend(); +} + int eDVBFrontend::openFrontend() { if (m_state != stateClosed) @@ -692,7 +699,8 @@ void eDVBFrontend::feEvent(int w) { eDebug("stateLostLock"); state = stateLostLock; - sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc + if (!m_rotor_mode) + sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc } } if (m_state != state) @@ -2343,6 +2351,20 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) res = -EINVAL; goto tune_error; } + if (m_rotor_mode != feparm.no_rotor_command_on_tune && !feparm.no_rotor_command_on_tune) + { + eDVBFrontend *sec_fe = this; + long tmp = m_data[LINKED_PREV_PTR]; + while (tmp != -1) + { + eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*)tmp; + sec_fe = linked_fe->m_frontend; + sec_fe->getData(LINKED_NEXT_PTR, tmp); + } + eDebug("(fe%d) reset diseqc after leave rotor mode!", m_dvbid); + sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = sec_fe->m_data[ROTOR_CMD] = sec_fe->m_data[ROTOR_POS] = -1; // reset diseqc + } + m_rotor_mode = feparm.no_rotor_command_on_tune; if (!m_simulate) m_sec->setRotorMoving(m_slotid, false); res=prepare_sat(feparm, timeout); diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index bac27539..bc31755c 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -75,6 +75,7 @@ private: int m_dvbid; int m_slotid; int m_fd; + bool m_rotor_mode; bool m_need_rotor_workaround; bool m_can_handle_dvbs2; char m_filename[128]; @@ -145,6 +146,7 @@ public: static void setTypePriorityOrder(int val) { PriorityOrder = val; } static int getTypePriorityOrder() { return PriorityOrder; } + void reopenFrontend(); int openFrontend(); int closeFrontend(bool force=false); const char *getDescription() const { return m_description; } diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index cff4dbb9..a3e87e35 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -459,6 +459,7 @@ class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject public: virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0; virtual RESULT tune(const iDVBFrontendParameters &where)=0; + virtual void reopenFrontend()=0; #ifndef SWIG virtual RESULT connectStateChange(const Slot1 &stateChange, ePtr &connection)=0; #endif @@ -522,7 +523,7 @@ public: virtual RESULT getCurrentFrontendParameters(ePtr &)=0; enum { - evtEOF, evtSOF, evtFailed + evtPreStart, evtEOF, evtSOF, evtFailed }; virtual RESULT connectStateChange(const Slot1 &stateChange, ePtr &connection)=0; virtual RESULT connectEvent(const Slot2 &eventChange, ePtr &connection)=0; diff --git a/lib/dvb/lowlevel/mhw.h b/lib/dvb/lowlevel/mhw.h index 0b4904fa..f06c86e8 100644 --- a/lib/dvb/lowlevel/mhw.h +++ b/lib/dvb/lowlevel/mhw.h @@ -78,9 +78,9 @@ typedef struct { u_char ppv_id_ml :8; u_char ppv_id_lo :8; u_char program_id_hi :8; - u_char program_id_mh :8; // mhw2_title end (33chars max) + u_char program_id_mh :8; u_char program_id_ml :8; - u_char program_id_lo :8; + u_char program_id_lo :8; // mhw2_title end (35chars max) u_char mhw2_mjd_hi :8; u_char mhw2_mjd_lo :8; u_char mhw2_duration_hi :8; diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 9bd065b3..ee89a3a4 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -75,6 +75,9 @@ void eDVBServicePMTHandler::channelEvent(iDVBChannel *channel, int event) { switch (event) { + case iDVBChannel::evtPreStart: + serviceEvent(eventPreStart); + break; case iDVBChannel::evtEOF: serviceEvent(eventEOF); break; diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index a9ca23f2..483c06b1 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -123,6 +123,7 @@ public: eventNewProgramInfo, // we just received a PMT eventTuned, // a channel was sucessfully (re-)tuned in, you may start additional filters now + eventPreStart, // before start filepush thread eventSOF, // seek pre start eventEOF, // a file playback did end diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp index 1393bf77..5cdecbd6 100644 --- a/lib/dvb/pvrparse.cpp +++ b/lib/dvb/pvrparse.cpp @@ -244,6 +244,7 @@ off_t eMPEGStreamInformation::getAccessPoint(pts_t ts, int marg) off_t last = 0; off_t last2 = 0; pts_t lastc = 0; + ts += 1; // Add rounding error margin for (std::map::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i) { pts_t delta = getDelta(i->first); diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index fd29617a..b37aa714 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #define SCAN_eDebug(x...) do { if (m_scan_debug) eDebug(x); } while(0) @@ -23,37 +24,118 @@ eDVBScan::eDVBScan(iDVBChannel *channel, bool usePAT, bool debug) :m_channel(channel), m_channel_state(iDVBChannel::state_idle) ,m_ready(0), m_ready_all(usePAT ? (readySDT|readyPAT) : readySDT) ,m_pmt_running(false), m_abort_current_pmt(false), m_flags(0) - ,m_usePAT(usePAT), m_scan_debug(debug) + ,m_usePAT(usePAT), m_scan_debug(debug), m_show_add_tsid_onid_check_failed_msg(true) { if (m_channel->getDemux(m_demux)) SCAN_eDebug("scan: failed to allocate demux!"); m_channel->connectStateChange(slot(*this, &eDVBScan::stateChange), m_stateChanged_connection); + FILE *f = fopen("/etc/enigma2/scan_tp_valid_check.py", "r"); + if (f) + { + char code[16384]; + size_t rd = fread(code, 1, 16383, f); + if (rd) + { + code[rd]=0; + m_additional_tsid_onid_check_func = Py_CompileString(code, "/etc/enigma2/scan_tp_valid_check.py", Py_file_input); + } + fclose(f); + } } eDVBScan::~eDVBScan() { + if (m_additional_tsid_onid_check_func) + Py_DECREF(m_additional_tsid_onid_check_func); } int eDVBScan::isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTransportStreamID tsid) { + int ret; switch (onid.get()) { case 0: case 0x1111: - return 0; + ret=0; + break; case 0x13E: // workaround for 11258H and 11470V on hotbird with same ONID/TSID (0x13E/0x578) - return orbital_position != 130 || tsid != 0x578; + ret = orbital_position != 130 || tsid != 0x578; + break; case 1: - return orbital_position == 192; + ret = orbital_position == 192; + break; case 0x00B1: - return tsid != 0x00B0; + ret = tsid != 0x00B0; + break; case 0x00eb: - return tsid != 0x4321; + ret = tsid != 0x4321; + break; case 0x0002: - return abs(orbital_position-282) < 6; + ret = abs(orbital_position-282) < 6 && tsid != 2019; + // 12070H and 10936V have same tsid/onid.. but even the same services are provided + break; + case 0x2000: + ret = tsid != 0x1000; + break; + case 0x5E: // Sirius 4.8E 12322V and 12226H + ret = abs(orbital_position-48) < 3 && tsid != 1; + break; + case 10100: // Eutelsat W7 36.0E 11644V and 11652V + ret = orbital_position != 360 || tsid != 10187; + break; + case 42: // Tuerksat 42.0E + ret = orbital_position != 420 || ( + tsid != 8 && // 11830V 12729V + tsid != 5 && // 12679V 12685H + tsid != 2 && // 11096V 12015H + tsid != 55); // 11996V 11716V + break; + case 100: // Intelsat 10 68.5E 3808V 3796V 4012V, Amos 4.0W 10723V 11571H + ret = (orbital_position != 685 && orbital_position != 3560) || tsid != 1; + break; + case 70: // Thor 0.8W 11862H 12341V + ret = abs(orbital_position-3592) < 3 && tsid != 46; + break; + case 32: // NSS 806 (40.5W) 4059R, 3774L + ret = orbital_position != 3195 || tsid != 21; + break; default: - return onid.get() < 0xFF00; + ret = onid.get() < 0xFF00; + break; + } + if (ret && m_additional_tsid_onid_check_func) + { + bool failed = true; + ePyObject dict = PyDict_New(); + extern void PutToDict(ePyObject &, const char *, long); + PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins()); + PutToDict(dict, "orbpos", orbital_position); + PutToDict(dict, "tsid", tsid.get()); + PutToDict(dict, "onid", onid.get()); + ePyObject r = PyEval_EvalCode((PyCodeObject*)(PyObject*)m_additional_tsid_onid_check_func, dict, dict); + if (r) + { + ePyObject o = PyDict_GetItemString(dict, "ret"); + if (o) + { + if (PyInt_Check(o)) + { + ret = PyInt_AsLong(o); + failed = false; + } + } + Py_DECREF(r); + } + if (failed && m_show_add_tsid_onid_check_failed_msg) + { + eDebug("execing /etc/enigma2/scan_tp_valid_check failed!\n" + "usable global variables in scan_tp_valid_check.py are 'orbpos', 'tsid', 'onid'\n" + "the return value must be stored in a global var named 'ret'"); + m_show_add_tsid_onid_check_failed_msg=false; + } + Py_DECREF(dict); } + return ret; } eDVBNamespace eDVBScan::buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash) diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h index 2f3ac34a..8f64abe5 100644 --- a/lib/dvb/scan.h +++ b/lib/dvb/scan.h @@ -92,6 +92,8 @@ class eDVBScan: public Object, public iObject int m_flags; bool m_usePAT; bool m_scan_debug; + ePyObject m_additional_tsid_onid_check_func; + bool m_show_add_tsid_onid_check_failed_msg; public: eDVBScan(iDVBChannel *channel, bool usePAT=true, bool debug=true ); ~eDVBScan(); diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index 91246889..0e3e7e0a 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -156,6 +156,11 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite ret = 15000; } + if (sat.no_rotor_command_on_tune && !rotor) { + eSecDebugNoSimulate("no rotor but no_rotor_command_on_tune is set.. ignore lnb %d", idx); + continue; + } + eSecDebugNoSimulate("ret1 %d", ret); if (linked_in_use) @@ -170,21 +175,6 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite else ret += 15; eSecDebugNoSimulate("ret2 %d", ret); - if (ret) // special case when this tuner is linked to a satpos dependent tuner - { - fe->getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satpos_depends_ptr); - if (satpos_depends_ptr != -1) - { - eDVBRegisteredFrontend *satpos_depends_to_fe = (eDVBRegisteredFrontend*) satpos_depends_ptr; - satpos_depends_to_fe->m_frontend->getData(eDVBFrontend::ROTOR_POS, rotor_pos); - if (!rotor || rotor_pos == -1 /* we dont know the rotor position yet */ - || rotor_pos != sat.orbital_position ) // not the same orbital position? - { - ret = 0; - } - } - } - eSecDebugNoSimulate("ret3 %d", ret); } else if (satpos_depends_ptr != -1) { @@ -199,6 +189,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite else ret += 10; } + eSecDebugNoSimulate("ret3 %d", ret); } else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!) { diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index a9eef406..d5ad2494 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -7,6 +7,7 @@ #include eDVBTSTools::eDVBTSTools() + :m_file_lock(true) { m_pid = -1; m_maxrange = 256*1024; @@ -47,6 +48,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo) m_samples_taken = 0; + eSingleLocker l(m_file_lock); if (m_file.open(filename, 1) < 0) return -1; return 0; @@ -54,6 +56,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo) void eDVBTSTools::closeFile() { + eSingleLocker l(m_file_lock); m_file.close(); } @@ -78,7 +81,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) return -1; offset -= offset % 188; - + + eSingleLocker l(m_file_lock); if (m_file.lseek(offset, SEEK_SET) < 0) { eDebug("lseek failed"); @@ -134,7 +138,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) pts |= ((unsigned long long)(packet[ 9]&0xFF)) << 1; pts |= ((unsigned long long)(packet[10]&0x80)) >> 7; offset -= 188; - eDebug("PCR found at %llx: %16llx", offset, pts); + eDebug("PCR %16llx found at %lld pid %02x (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x)", pts, offset, pid, packet[0], packet[1], packet[2], packet[3], packet[4], packet[5], packet[6], packet[7], packet[8], packet[9], packet[10]); if (fixed && fixupPTS(offset, pts)) return -1; return 0; @@ -144,24 +148,83 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) } else payload = packet + 4; - /* if (m_pid >= 0) if (pid != m_pid) continue; */ if (!pusi) continue; - - + /* somehow not a startcode. (this is invalid, since pusi was set.) ignore it. */ if (payload[0] || payload[1] || (payload[2] != 1)) continue; - + + if (payload[3] == 0xFD) + { // stream use extension mechanism defined in ISO 13818-1 Amendment 2 + if (payload[7] & 1) // PES extension flag + { + int offs = 0; + if (payload[7] & 0x80) // pts avail + offs += 5; + if (payload[7] & 0x40) // dts avail + offs += 5; + if (payload[7] & 0x20) // escr avail + offs += 6; + if (payload[7] & 0x10) // es rate + offs += 3; + if (payload[7] & 0x8) // dsm trickmode + offs += 1; + if (payload[7] & 0x4) // additional copy info + offs += 1; + if (payload[7] & 0x2) // crc + offs += 2; + if (payload[8] < offs) + continue; + uint8_t pef = payload[9+offs++]; // pes extension field + if (pef & 1) // pes extension flag 2 + { + if (pef & 0x80) // private data flag + offs += 16; + if (pef & 0x40) // pack header field flag + offs += 1; + if (pef & 0x20) // program packet sequence counter flag + offs += 2; + if (pef & 0x10) // P-STD buffer flag + offs += 2; + if (payload[8] < offs) + continue; + uint8_t stream_id_extension_len = payload[9+offs++] & 0x7F; + if (stream_id_extension_len >= 1) + { + if (payload[8] < (offs + stream_id_extension_len) ) + continue; + if (payload[9+offs] & 0x80) // stream_id_extension_bit (should not set) + continue; + switch (payload[9+offs]) + { + case 0x55 ... 0x5f: // VC-1 + break; + case 0x71: // AC3 / DTS + break; + default: + eDebug("skip unknwn stream_id_extension %02x\n", payload[9+offs]); + continue; + } + } + else + continue; + } + else + continue; + } + else + continue; + } /* drop non-audio, non-video packets because other streams can be non-compliant.*/ - if (((payload[3] & 0xE0) != 0xC0) && // audio - ((payload[3] & 0xF0) != 0xE0)) // video + else if (((payload[3] & 0xE0) != 0xC0) && // audio + ((payload[3] & 0xF0) != 0xE0)) // video continue; - + if (payload[7] & 0x80) /* PTS */ { pts = ((unsigned long long)(payload[ 9]&0xE)) << 29; @@ -171,11 +234,11 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) pts |= ((unsigned long long)(payload[13]&0xFE)) >> 1; offset -= 188; -// eDebug("found pts %08llx at %08llx pid %02x stream: %02x", pts, offset, pid, payload[3]); - + eDebug("PTS %16llx found at %lld pid %02x stream: %02x", pts, offset, pid, payload[3]); + /* convert to zero-based */ if (fixed && fixupPTS(offset, pts)) - return -1; + return -1; return 0; } } @@ -212,10 +275,13 @@ int eDVBTSTools::fixupPTS(const off_t &offset, pts_t &now) now -= pos; return 0; } + eDebug("eDVBTSTools::fixupPTS failed!"); + return -1; } int eDVBTSTools::getOffset(off_t &offset, pts_t &pts, int marg) { + eDebug("getOffset for pts 0x%llx", pts); if (m_use_streaminfo) { if (pts >= m_pts_end && marg > 0 && m_end_valid) @@ -355,7 +421,8 @@ void eDVBTSTools::calcEnd() { if (!m_file.valid()) return; - + + eSingleLocker l(m_file_lock); off_t end = m_file.lseek(0, SEEK_END); if (llabs(end - m_last_filelength) > 1*1024*1024) @@ -440,6 +507,8 @@ void eDVBTSTools::takeSamples() m_samples_taken = 1; m_samples.clear(); pts_t dummy; + int retries=2; + if (calcLen(dummy) == -1) return; @@ -449,21 +518,27 @@ void eDVBTSTools::takeSamples() bytes_per_sample = 40*1024*1024; bytes_per_sample -= bytes_per_sample % 188; - - for (off_t offset = m_offset_begin; offset < m_offset_end; offset += bytes_per_sample) + + eDebug("samples step %lld, pts begin %llx, pts end %llx, offs begin %lld, offs end %lld:", + bytes_per_sample, m_pts_begin, m_pts_end, m_offset_begin, m_offset_end); + + for (off_t offset = m_offset_begin; offset < m_offset_end;) { pts_t p; - takeSample(offset, p); + if (takeSample(offset, p) && retries--) + continue; + retries = 2; + offset += bytes_per_sample; } m_samples[0] = m_offset_begin; m_samples[m_pts_end - m_pts_begin] = m_offset_end; - -// eDebug("begin, end: %llx %llx", m_offset_begin, m_offset_end); } /* returns 0 when a sample was taken. */ int eDVBTSTools::takeSample(off_t off, pts_t &p) { + off_t offset_org = off; + if (!eDVBTSTools::getPTS(off, p, 1)) { /* as we are happily mixing PTS and PCR values (no comment, please), we might @@ -481,18 +556,18 @@ int eDVBTSTools::takeSample(off_t off, pts_t &p) { if ((l->second > off) || (u->second < off)) { - eDebug("ignoring sample %llx %llx %llx (%lld %lld %lld)", + eDebug("ignoring sample %lld %lld %lld (%llx %llx %llx)", l->second, off, u->second, l->first, p, u->first); return 1; } } } - + eDebug("adding sample %lld: pts 0x%llx -> pos %lld (diff %lld bytes)", offset_org, p, off, off-offset_org); m_samples[p] = off; return 0; } - return 1; + return -1; } int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) @@ -504,6 +579,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) return -1; } + eSingleLocker l(m_file_lock); if (m_file.lseek(0, SEEK_SET) < 0) { eDebug("seek failed"); @@ -652,18 +728,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types) { - int nr_frames = 0; + int nr_frames, direction; // eDebug("trying to move %d frames at %llx", distance, offset); frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */ - int direction = distance > 0 ? 0 : -1; - distance = abs(distance); - off_t new_offset = offset; size_t new_len = len; int first = 1; + if (distance > 0) { + direction = 0; + nr_frames = 0; + } else { + direction = -1; + nr_frames = -1; + distance = -distance+1; + } while (distance > 0) { int dir = direction; @@ -677,12 +758,18 @@ int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int // eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset); - if (distance >= 0 || first) + if (distance >= 0 || direction == 0) { first = 0; offset = new_offset; len = new_len; nr_frames += abs(dir); + } + else if (first) { + first = 0; + offset = new_offset; + len = new_len; + nr_frames += abs(dir) + distance; // never jump forward during rewind } } diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h index c230a341..ed8b9241 100644 --- a/lib/dvb/tstools.h +++ b/lib/dvb/tstools.h @@ -4,6 +4,7 @@ #include #include #include +#include /* * Note: we're interested in PTS values, not STC values. @@ -75,9 +76,10 @@ public: private: int m_pid; int m_maxrange; - + + eSingleLock m_file_lock; eRawFile m_file; - + int m_begin_valid, m_end_valid; pts_t m_pts_begin, m_pts_end; off_t m_offset_begin, m_offset_end; diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index 1f1b06a0..dff6b059 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -164,7 +164,13 @@ void *gRC::thread() if (pthread_cond_timedwait(&cond, &mutex, &timeout) == ETIMEDOUT) { if (eApp && !eApp->isIdle()) - idle = 0; + { + int idle_count = eApp->idleCount(); + if (idle_count == m_prev_idle_count) + idle = 0; + else + m_prev_idle_count = idle_count; + } } if (!idle) diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index 5d0106b3..3b8201ad 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -176,6 +176,7 @@ class gRC: public iObject, public Object ePtr m_compositing; + int m_prev_idle_count; public: gRC(); virtual ~gRC(); diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index 4b4b58c1..4465d84c 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -514,7 +514,7 @@ void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update) m_listbox->entryChanged(m_cursor); } -static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid) +static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid, bool clear=true) { if (pbackColor) { @@ -536,10 +536,11 @@ static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, con else if (local_style->m_transparent_background) return; } - painter.clear(); + if (clear) + painter.clear(); } -static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid) +static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid, bool clear=true) { if (pbackColorSelected) { @@ -559,10 +560,11 @@ static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_st return; } } - painter.clear(); + if (clear) + painter.clear(); } -static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid) +static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid, bool clear=true) { if (selected && sel_clip.valid()) { @@ -571,7 +573,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l { painter.clip(part); style.setStyle(painter, eWindowStyle::styleListboxNormal); - clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid); + clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear); painter.clippop(); selected = 0; } @@ -580,7 +582,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l { painter.clip(part); style.setStyle(painter, eWindowStyle::styleListboxSelected); - clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid); + clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear); painter.clippop(); selected = 1; } @@ -588,14 +590,14 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l else if (selected) { style.setStyle(painter, eWindowStyle::styleListboxSelected); - clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid); + clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear); if (local_style && local_style->m_selection) painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST); } else { style.setStyle(painter, eWindowStyle::styleListboxNormal); - clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid); + clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear); } if (selected) @@ -818,7 +820,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c { gRegion rc(rect); - clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid); + bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor); + clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear); } painter.setFont(m_font[fnt]); @@ -921,7 +924,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c { gRegion rc(rect); - clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid); + bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor); + clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear); } // border @@ -995,7 +999,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c { gRegion rc(rect); - clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid); + bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor); + clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear); } painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : (type == TYPE_PIXMAP_ALPHABLEND) ? gPainter::BT_ALPHABLEND : 0); diff --git a/lib/python/Components/About.py b/lib/python/Components/About.py index bb2d7568..8e332e33 100644 --- a/lib/python/Components/About.py +++ b/lib/python/Components/About.py @@ -19,11 +19,21 @@ class About: #0120 2005 11 29 01 16 #0123 4567 89 01 23 45 version = splitted[1] + image_type = version[0] # 0 = release, 1 = experimental + major = version[1] + minor = version[2] + revision = version[3] year = version[4:8] month = version[8:10] day = version[10:12] - - return '-'.join(("dev", year, month, day)) + date = '-'.join((year, month, day)) + if image_type == '0': + image_type = "Release" + version = '.'.join((major, minor, revision)) + return ' '.join((image_type, version, date)) + else: + image_type = "Experimental" + return ' '.join((image_type, date)) file.close() except IOError: pass diff --git a/lib/python/Components/ChoiceList.py b/lib/python/Components/ChoiceList.py old mode 100644 new mode 100755 index fe505c2a..33868d61 --- a/lib/python/Components/ChoiceList.py +++ b/lib/python/Components/ChoiceList.py @@ -1,16 +1,16 @@ from MenuList import MenuList -from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename +from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont from Tools.LoadPixmap import LoadPixmap -def ChoiceEntryComponent(key, text): +def ChoiceEntryComponent(key = "", text = ["--"]): res = [ text ] if text[0] == "--": res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 00, 800, 25, 0, RT_HALIGN_LEFT, "-"*200)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, 45, 00, 800, 25, 0, RT_HALIGN_LEFT, text[0])) - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/key_" + key + ".png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/key_" + key + ".png")) if png is not None: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 35, 25, png)) diff --git a/lib/python/Components/ConfigList.py b/lib/python/Components/ConfigList.py old mode 100644 new mode 100755 index 00949e2f..418a1b67 --- a/lib/python/Components/ConfigList.py +++ b/lib/python/Components/ConfigList.py @@ -1,7 +1,7 @@ from HTMLComponent import HTMLComponent from GUIComponent import GUIComponent -from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement -from Components.ActionMap import NumberActionMap +from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement, ConfigText, ConfigPassword +from Components.ActionMap import NumberActionMap, ActionMap from enigma import eListbox, eListboxPythonConfigContent, eRCInput, eTimer from Screens.MessageBox import MessageBox @@ -66,6 +66,7 @@ class ConfigList(HTMLComponent, GUIComponent, object): self.current = self.getCurrent() if self.current: self.current[1].onSelect(self.session) + for x in self.onSelectionChanged: x() @@ -127,13 +128,52 @@ class ConfigListScreen: "9": self.keyNumberGlobal, "0": self.keyNumberGlobal }, -1) # to prevent left/right overriding the listbox + + self["VirtualKB"] = ActionMap(["VirtualKeyboardActions"], + { + "showVirtualKeyboard": self.KeyText, + }, -2) + self["VirtualKB"].setEnabled(False) self["config"] = ConfigList(list, session = session) + if on_change is not None: self.__changed = on_change else: self.__changed = lambda: None - + + if not self.handleInputHelpers in self["config"].onSelectionChanged: + self["config"].onSelectionChanged.append(self.handleInputHelpers) + + def handleInputHelpers(self): + if self["config"].getCurrent() is not None: + if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword): + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(True) + self["VKeyIcon"].boolean = True + if self.has_key("HelpWindow"): + if self["config"].getCurrent()[1].help_window.instance is not None: + helpwindowpos = self["HelpWindow"].getPosition() + from enigma import ePoint + self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1])) + else: + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(False) + self["VKeyIcon"].boolean = False + else: + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(False) + self["VKeyIcon"].boolean = False + + def KeyText(self): + from Screens.VirtualKeyBoard import VirtualKeyBoard + self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue()) + + def VirtualKeyBoardCallback(self, callback = None): + if callback is not None and len(callback): + self["config"].getCurrent()[1].setValue(callback) + self["config"].invalidate(self["config"].getCurrent()) + def keyOK(self): self["config"].handleKey(KEY_OK) diff --git a/lib/python/Components/Converter/Makefile.am b/lib/python/Components/Converter/Makefile.am index 75c8a08e..3b6fd3e8 100644 --- a/lib/python/Components/Converter/Makefile.am +++ b/lib/python/Components/Converter/Makefile.am @@ -6,4 +6,4 @@ install_PYTHON = \ ConditionalShowHide.py ServicePosition.py ValueRange.py RdsInfo.py Streaming.py \ StaticMultiList.py ServiceTime.py MovieInfo.py MenuEntryCompare.py StringListSelection.py \ ValueBitTest.py TunerInfo.py ConfigEntryTest.py TemplatedMultiContent.py ProgressToText.py \ - Combine.py + Combine.py SensorToText.py diff --git a/lib/python/Components/Converter/SensorToText.py b/lib/python/Components/Converter/SensorToText.py new file mode 100644 index 00000000..fb156faf --- /dev/null +++ b/lib/python/Components/Converter/SensorToText.py @@ -0,0 +1,14 @@ +from Components.Converter.Converter import Converter + +class SensorToText(Converter, object): + def __init__(self, arguments): + Converter.__init__(self, arguments) + + def getText(self): + if self.source.getValue() is None: + return "" + return "%d %s" % (self.source.getValue(), self.source.getUnit()) + + text = property(getText) + + \ No newline at end of file diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py index 5014fde6..fa3518ce 100644 --- a/lib/python/Components/Converter/ServiceInfo.py +++ b/lib/python/Components/Converter/ServiceInfo.py @@ -19,6 +19,7 @@ class ServiceInfo(Converter, object): ONID = 13 SID = 14 FRAMERATE = 15 + TRANSFERBPS = 16 def __init__(self, type): @@ -40,6 +41,7 @@ class ServiceInfo(Converter, object): "OnId": (self.ONID, (iPlayableService.evUpdatedInfo,)), "Sid": (self.SID, (iPlayableService.evUpdatedInfo,)), "Framerate": (self.FRAMERATE, (iPlayableService.evVideoSizeChanged,iPlayableService.evUpdatedInfo,)), + "TransferBPS": (self.TRANSFERBPS, (iPlayableService.evUpdatedInfo,)), }[type] def getServiceInfoString(self, info, what, convert = lambda x: "%d" % x): @@ -112,6 +114,8 @@ class ServiceInfo(Converter, object): return self.getServiceInfoString(info, iServiceInformation.sSID) elif self.type == self.FRAMERATE: return self.getServiceInfoString(info, iServiceInformation.sFrameRate, lambda x: "%d fps" % ((x+500)/1000)) + elif self.type == self.TRANSFERBPS: + return self.getServiceInfoString(info, iServiceInformation.sTransferBPS, lambda x: "%d kB/s" % (x/1024)) return "" text = property(getText) diff --git a/lib/python/Components/Converter/TemplatedMultiContent.py b/lib/python/Components/Converter/TemplatedMultiContent.py old mode 100644 new mode 100755 index b86d94bf..b1d89f55 --- a/lib/python/Components/Converter/TemplatedMultiContent.py +++ b/lib/python/Components/Converter/TemplatedMultiContent.py @@ -10,8 +10,8 @@ class TemplatedMultiContent(StringList): del l["self"] # cleanup locals a bit del l["args"] - self.template = eval(args, {}, l) self.active_style = None + self.template = eval(args, {}, l) assert "fonts" in self.template assert "itemHeight" in self.template assert "template" in self.template or "templates" in self.template @@ -25,7 +25,6 @@ class TemplatedMultiContent(StringList): if not self.content: from enigma import eListboxPythonMultiContent self.content = eListboxPythonMultiContent() - self.setTemplate() # also setup fonts (also given by source) index = 0 @@ -35,30 +34,37 @@ class TemplatedMultiContent(StringList): # if only template changed, don't reload list if what[0] == self.CHANGED_SPECIFIC and what[1] == "style": - self.setTemplate() - return - - if self.source: + pass + elif self.source: self.content.setList(self.source.list) - self.setTemplate() + self.setTemplate() self.downstream_elements.changed(what) def setTemplate(self): if self.source: style = self.source.style + if style == self.active_style: - return # style did not change + return # if skin defined "templates", that means that it defines multiple styles in a dict. template should still be a default templates = self.template.get("templates") template = self.template.get("template") itemheight = self.template["itemHeight"] + selectionEnabled = self.template.get("selectionEnabled", True) + scrollbarMode = self.template.get("scrollbarMode", "showOnDemand") if templates and style and style in templates: # if we have a custom style defined in the source, and different templates in the skin, look it up template = templates[style][1] itemheight = templates[style][0] + if len(templates[style]) > 2: + selectionEnabled = templates[style][2] + if len(templates[style]) > 3: + scrollbarMode = templates[style][3] self.content.setTemplate(template) - self.content.setItemHeight(itemheight) + self.selectionEnabled = selectionEnabled + self.scrollbarMode = scrollbarMode + self.active_style = style diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py old mode 100644 new mode 100755 index 59f92621..41cd1b2c --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -8,7 +8,7 @@ from Tools.LoadPixmap import LoadPixmap from time import localtime, time from ServiceReference import ServiceReference -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN EPG_TYPE_SINGLE = 0 EPG_TYPE_MULTI = 1 @@ -53,11 +53,11 @@ class EPGList(HTMLComponent, GUIComponent): assert(type == EPG_TYPE_SIMILAR) self.l.setBuildFunc(self.buildSimilarEntry) self.epgcache = eEPGCache.getInstance() - self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png')) - self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png')) - self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png')) - self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png')) - self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png')) + self.clock_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png')) + self.clock_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png')) + self.clock_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png')) + self.clock_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png')) + self.clock_prepost_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png')) def getEventFromId(self, service, eventid): event = None diff --git a/lib/python/Components/FanControl.py b/lib/python/Components/FanControl.py new file mode 100644 index 00000000..a993c396 --- /dev/null +++ b/lib/python/Components/FanControl.py @@ -0,0 +1,117 @@ +import os + +from Components.config import config, ConfigSubList, ConfigSubsection, ConfigSlider +from Tools.BoundFunction import boundFunction + +import NavigationInstance +from enigma import iRecordableService + +class FanControl: + # ATM there's only support for one fan + def __init__(self): + if os.path.exists("/proc/stb/fp/fan_vlt") or os.path.exists("/proc/stb/fp/fan_pwm") or os.path.exists("/proc/stb/fp/fan_speed"): + self.fancount = 1 + else: + self.fancount = 0 + self.createConfig() + config.misc.standbyCounter.addNotifier(self.standbyCounterChanged, initial_call = False) + + def setVoltage_PWM(self): + for fanid in range(self.getFanCount()): + cfg = self.getConfig(fanid) + self.setVoltage(fanid, cfg.vlt.value) + self.setPWM(fanid, cfg.pwm.value) + print "[FanControl]: setting fan values: fanid = %d, voltage = %d, pwm = %d" % (fanid, cfg.vlt.value, cfg.pwm.value) + + def setVoltage_PWM_Standby(self): + for fanid in range(self.getFanCount()): + cfg = self.getConfig(fanid) + self.setVoltage(fanid, cfg.vlt_standby.value) + self.setPWM(fanid, cfg.pwm_standby.value) + print "[FanControl]: setting fan values (standby mode): fanid = %d, voltage = %d, pwm = %d" % (fanid, cfg.vlt_standby.value, cfg.pwm_standby.value) + + def getRecordEvent(self, recservice, event): + recordings = len(NavigationInstance.instance.getRecordings()) + if event == iRecordableService.evEnd: + if recordings == 0: + self.setVoltage_PWM_Standby() + elif event == iRecordableService.evStart: + if recordings == 1: + self.setVoltage_PWM() + + def leaveStandby(self): + NavigationInstance.instance.record_event.remove(self.getRecordEvent) + recordings = NavigationInstance.instance.getRecordings() + if not recordings: + self.setVoltage_PWM() + + def standbyCounterChanged(self, configElement): + from Screens.Standby import inStandby + inStandby.onClose.append(self.leaveStandby) + recordings = NavigationInstance.instance.getRecordings() + NavigationInstance.instance.record_event.append(self.getRecordEvent) + if not recordings: + self.setVoltage_PWM_Standby() + + def createConfig(self): + def setVlt(fancontrol, fanid, configElement): + fancontrol.setVoltage(fanid, configElement.value) + def setPWM(fancontrol, fanid, configElement): + fancontrol.setPWM(fanid, configElement.value) + + config.fans = ConfigSubList() + for fanid in range(self.getFanCount()): + fan = ConfigSubsection() + fan.vlt = ConfigSlider(default = 15, increment = 5, limits = (0, 255)) + fan.pwm = ConfigSlider(default = 0, increment = 5, limits = (0, 255)) + fan.vlt_standby = ConfigSlider(default = 5, increment = 5, limits = (0, 255)) + fan.pwm_standby = ConfigSlider(default = 0, increment = 5, limits = (0, 255)) + fan.vlt.addNotifier(boundFunction(setVlt, self, fanid)) + fan.pwm.addNotifier(boundFunction(setPWM, self, fanid)) + config.fans.append(fan) + + def getConfig(self, fanid): + return config.fans[fanid] + + def getFanCount(self): + return self.fancount + + def hasRPMSensor(self, fanid): + return os.path.exists("/proc/stb/fp/fan_speed") + + def hasFanControl(self, fanid): + return os.path.exists("/proc/stb/fp/fan_vlt") or os.path.exists("/proc/stb/fp/fan_pwm") + + def getFanSpeed(self, fanid): + f = open("/proc/stb/fp/fan_speed", "r") + value = int(f.readline().strip()[:-4]) + f.close() + return value + + def getVoltage(self, fanid): + f = open("/proc/stb/fp/fan_vlt", "r") + value = int(f.readline().strip(), 16) + f.close() + return value + + def setVoltage(self, fanid, value): + if value > 255: + return + f = open("/proc/stb/fp/fan_vlt", "w") + f.write("%x" % value) + f.close() + + def getPWM(self, fanid): + f = open("/proc/stb/fp/fan_pwm", "r") + value = int(f.readline().strip(), 16) + f.close() + return value + + def setPWM(self, fanid, value): + if value > 255: + return + f = open("/proc/stb/fp/fan_pwm", "w") + f.write("%x" % value) + f.close() + +fancontrol = FanControl() diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index 38b08547..841a2fe5 100755 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -3,7 +3,7 @@ from os import path as os_path, listdir from MenuList import MenuList from Components.Harddisk import harddiskmanager -from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename +from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename, fileExists from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \ eServiceReference, eServiceCenter, gFont @@ -35,12 +35,12 @@ def FileEntryComponent(name, absolute = None, isDir = False): res = [ (absolute, isDir) ] res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name)) if isDir: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png")) + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png")) else: extension = name.split('.') extension = extension[-1].lower() if EXTENSIONS.has_key(extension): - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png")) else: png = None if png is not None: @@ -160,8 +160,11 @@ class FileList(MenuList): directories.sort() files.sort() else: - if os_path.exists(directory): - files = listdir(directory) + if fileExists(directory): + try: + files = listdir(directory) + except: + files = [] files.sort() tmpfiles = files[:] for x in tmpfiles: @@ -256,12 +259,12 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected res = [ (absolute, isDir, selected, name) ] res.append((eListboxPythonMultiContent.TYPE_TEXT, 55, 1, 470, 20, 0, RT_HALIGN_LEFT, name)) if isDir: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png")) + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png")) else: extension = name.split('.') extension = extension[-1].lower() if EXTENSIONS.has_key(extension): - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png")) else: png = None if png is not None: @@ -269,10 +272,10 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected if not name.startswith('<'): if selected is False: - icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_off.png")) + icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_off.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon)) else: - icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png")) + icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon)) return res @@ -374,8 +377,11 @@ class MultiFileSelectList(FileList): directories.sort() files.sort() else: - if os_path.exists(directory): - files = listdir(directory) + if fileExists(directory): + try: + files = listdir(directory) + except: + files = [] files.sort() tmpfiles = files[:] for x in tmpfiles: diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py index 2efdb68f..e8e612a4 100755 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -166,7 +166,7 @@ class Harddisk: lines = mounts.readlines() mounts.close() - cmd = "/bin/umount" + cmd = "umount" for line in lines: parts = line.strip().split(" ") @@ -177,12 +177,12 @@ class Harddisk: return (res >> 8) def createPartition(self): - cmd = 'printf "0,\n;\n;\n;\ny\n" | /sbin/sfdisk -f ' + self.disk_path + cmd = 'printf "0,\n;\n;\n;\ny\n" | sfdisk -f ' + self.disk_path res = system(cmd) return (res >> 8) def mkfs(self): - cmd = "/sbin/mkfs.ext3 " + cmd = "mkfs.ext3 " if self.diskSize() > 4 * 1024: cmd += "-T largefile " cmd += "-m0 -O dir_index " + self.partitionPath("1") @@ -202,7 +202,7 @@ class Harddisk: for line in lines: parts = line.strip().split(" ") if path.realpath(parts[0]) == self.partitionPath("1"): - cmd = "/bin/mount -t ext3 " + parts[0] + cmd = "mount -t ext3 " + parts[0] res = system(cmd) break @@ -218,7 +218,7 @@ class Harddisk: def fsck(self): # We autocorrect any failures # TODO: we could check if the fs is actually ext3 - cmd = "/sbin/fsck.ext3 -f -p " + self.partitionPath("1") + cmd = "fsck.ext3 -f -p " + self.partitionPath("1") res = system(cmd) return (res >> 8) @@ -226,7 +226,7 @@ class Harddisk: part = self.partitionPath(n) if access(part, 0): - cmd = '/bin/dd bs=512 count=3 if=/dev/zero of=' + part + cmd = 'dd bs=512 count=3 if=/dev/zero of=' + part res = system(cmd) else: res = 0 @@ -290,7 +290,10 @@ class Harddisk: # any access has been made to the disc. If there has been no access over a specifed time, # we set the hdd into standby. def readStats(self): - l = readFile("/sys/block/%s/stat" % self.device) + try: + l = open("/sys/block/%s/stat" % self.device).read() + except IOError: + return -1,-1 (nr_read, _, _, _, nr_write) = l.split()[:5] return int(nr_read), int(nr_write) @@ -319,7 +322,7 @@ class Harddisk: l = sum(stats) print "sum", l, "prev_sum", self.last_stat - if l != self.last_stat: # access + if l != self.last_stat and l >= 0: # access print "hdd was accessed since previous check!" self.last_stat = l self.last_access = t diff --git a/lib/python/Components/Ipkg.py b/lib/python/Components/Ipkg.py index 0ba1165c..71447775 100755 --- a/lib/python/Components/Ipkg.py +++ b/lib/python/Components/Ipkg.py @@ -1,4 +1,5 @@ from enigma import eConsoleAppContainer +from Tools.Directories import fileExists class IpkgComponent: EVENT_INSTALL = 0 @@ -20,7 +21,7 @@ class IpkgComponent: def __init__(self, ipkg = '/usr/bin/ipkg'): self.ipkg = ipkg - + self.opkgAvail = fileExists('/usr/bin/opkg') self.cmd = eConsoleAppContainer() self.cache = None self.callbackList = [] @@ -89,7 +90,10 @@ class IpkgComponent: if data.find('Downloading') == 0: self.callCallbacks(self.EVENT_DOWNLOAD, data.split(' ', 5)[1].strip()) elif data.find('Upgrading') == 0: - self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0]) + if self.opkgAvail: + self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0]) + else: + self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0]) elif data.find('Installing') == 0: self.callCallbacks(self.EVENT_INSTALL, data.split(' ', 1)[1].split(' ')[0]) elif data.find('Removing') == 0: diff --git a/lib/python/Components/Lcd.py b/lib/python/Components/Lcd.py index 0e501237..dde158b6 100644 --- a/lib/python/Components/Lcd.py +++ b/lib/python/Components/Lcd.py @@ -28,6 +28,14 @@ class LCD: def isOled(self): return eDBoxLCD.getInstance().isOled() +def leaveStandby(): + config.lcd.bright.apply() + +def standbyCounterChanged(configElement): + from Screens.Standby import inStandby + inStandby.onClose.append(leaveStandby) + config.lcd.standby.apply() + def InitLcd(): detected = eDBoxLCD.getInstance().detected() SystemInfo["Display"] = detected @@ -42,9 +50,18 @@ def InitLcd(): def setLCDinverted(configElement): ilcd.setInverted(configElement.value); + standby_default = 0 + ilcd = LCD() - config.lcd.standby = ConfigSlider(default=0, limits=(0, 10)) + if not ilcd.isOled(): + config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20)) + config.lcd.contrast.addNotifier(setLCDcontrast); + else: + config.lcd.contrast = ConfigNothing() + standby_default = 1 + + config.lcd.standby = ConfigSlider(default=standby_default, limits=(0, 10)) config.lcd.standby.addNotifier(setLCDbright); config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby) @@ -53,12 +70,6 @@ def InitLcd(): 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)) - config.lcd.contrast.addNotifier(setLCDcontrast); - else: - config.lcd.contrast = ConfigNothing() - config.lcd.invert = ConfigYesNo(default=False) config.lcd.invert.addNotifier(setLCDinverted); else: @@ -69,3 +80,6 @@ def InitLcd(): config.lcd.standby = ConfigNothing() config.lcd.bright.apply = lambda : doNothing() config.lcd.standby.apply = lambda : doNothing() + + config.misc.standbyCounter.addNotifier(standbyCounterChanged, initial_call = False) + diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am index 34710fa1..b5ef0688 100755 --- a/lib/python/Components/Makefile.am +++ b/lib/python/Components/Makefile.am @@ -19,4 +19,4 @@ install_PYTHON = \ Element.py Playlist.py ParentalControl.py ParentalControlList.py \ Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \ Task.py language_cache.py Console.py ResourceManager.py TuneTest.py \ - Keyboard.py + Keyboard.py Sensors.py FanControl.py diff --git a/lib/python/Components/MediaPlayer.py b/lib/python/Components/MediaPlayer.py old mode 100644 new mode 100755 index 12f2727f..5583b22d --- a/lib/python/Components/MediaPlayer.py +++ b/lib/python/Components/MediaPlayer.py @@ -1,6 +1,6 @@ from MenuList import MenuList -from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename +from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename from os import path from enigma import eListboxPythonMultiContent, RT_VALIGN_CENTER, gFont, eServiceCenter @@ -14,11 +14,11 @@ STATE_REWIND = 3 STATE_FORWARD = 4 STATE_NONE = 5 -PlayIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_play.png")) -PauseIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_pause.png")) -StopIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_stop.png")) -RewindIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_rewind.png")) -ForwardIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_forward.png")) +PlayIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_play.png")) +PauseIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_pause.png")) +StopIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_stop.png")) +RewindIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_rewind.png")) +ForwardIcon = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_forward.png")) def PlaylistEntryComponent(serviceref, state): res = [ serviceref ] diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index f65d6090..b9da48d8 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -14,7 +14,7 @@ class Network: self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] - self.ethtool_bin = "/usr/sbin/ethtool" + self.ethtool_bin = "ethtool" self.container = eConsoleAppContainer() self.Console = Console() self.LinkConsole = Console() @@ -24,6 +24,7 @@ class Network: self.activateConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() + self.PingConsole = Console() self.config_ready = None self.getInterfaces() @@ -233,7 +234,7 @@ class Network: self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() - print "read configured interfac:", ifaces + print "read configured interface:", ifaces print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() @@ -424,6 +425,7 @@ class Network: def checkNetworkState(self,statecallback): # www.dream-multimedia-tv.de, www.heise.de, www.google.de + self.NetworkState = 0 cmd1 = "ping -c 1 82.149.226.170" cmd2 = "ping -c 1 193.99.144.85" cmd3 = "ping -c 1 209.85.135.103" @@ -475,10 +477,17 @@ class Network: 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 stopPingConsole(self): + if self.PingConsole is not None: + if len(self.PingConsole.appContainers): + for name in self.PingConsole.appContainers.keys(): + self.PingConsole.kill(name) + def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): @@ -571,11 +580,11 @@ class Network: self.wlanmodule = 'madwifi' if os_path.exists(rt73_dir): rtfiles = listdir(rt73_dir) - if len(rtfiles) == 2: + if len(rtfiles) == 2 or len(rtfiles) == 5: self.wlanmodule = 'ralink' if os_path.exists(zd1211b_dir): zdfiles = listdir(zd1211b_dir) - if len(zdfiles) == 1: + if len(zdfiles) == 1 or len(zdfiles) == 5: self.wlanmodule = 'zydas' return self.wlanmodule diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 05204a74..6af4c52c 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -1,4 +1,5 @@ from Tools.HardwareInfo import HardwareInfo +from Tools.BoundFunction import boundFunction from config import config, ConfigSubsection, ConfigSelection, ConfigFloat, \ ConfigSatlist, ConfigYesNo, ConfigInteger, ConfigSubList, ConfigNothing, \ @@ -13,6 +14,7 @@ from enigma import eDVBSatelliteEquipmentControl as secClass, \ from time import localtime, mktime from datetime import datetime +from Tools.BoundFunction import boundFunction def getConfigSatlist(orbpos, satlist): default_orbpos = None @@ -444,7 +446,7 @@ class SecConfigure: self.update() class NIM(object): - def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None): + def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None, multi_type = {}): self.slot = slot if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", None): @@ -455,6 +457,7 @@ class NIM(object): self.description = description self.has_outputs = has_outputs self.internally_connectable = internally_connectable + self.multi_type = multi_type def isCompatible(self, what): compatible = { @@ -466,6 +469,9 @@ class NIM(object): } return what in compatible[self.type] + def getType(self): + return self.type + def connectableTo(self): connectable = { "DVB-S": ("DVB-S", "DVB-S2"), @@ -491,6 +497,13 @@ class NIM(object): def internallyConnectableTo(self): return self.internally_connectable + + def isMultiType(self): + return (len(self.multi_type) > 0) + + # returns dict {: } + def getMultiTypeList(self): + return self.multi_type slot_id = property(getSlotID) @@ -636,7 +649,15 @@ class NimManager: entries[current_slot]["has_outputs"] = (input == "yes") elif line.strip().startswith("Internally_Connectable:"): input = int(line.strip()[len("Internally_Connectable:") + 1:]) - entries[current_slot]["internally_connectable"] = input + entries[current_slot]["internally_connectable"] = input + elif line.strip().startswith("Mode"): + # "Mode 0: DVB-T" -> ["Mode 0", " DVB-T"] + split = line.strip().split(":") + # "Mode 0" -> ["Mode, "0"] + split2 = split[0].split(" ") + modes = entries[current_slot].get("multi_type", {}) + modes[split2[1]] = split[1].strip() + entries[current_slot]["multi_type"] = modes elif line.strip().startswith("empty"): entries[current_slot]["type"] = None entries[current_slot]["name"] = _("N/A") @@ -650,12 +671,17 @@ class NimManager: entry["has_outputs"] = True if not (entry.has_key("internally_connectable")): entry["internally_connectable"] = None - self.nim_slots.append(NIM(slot = id, description = entry["name"], type = entry["type"], has_outputs = entry["has_outputs"], internally_connectable = entry["internally_connectable"])) + if not (entry.has_key("multi_type")): + entry["multi_type"] = {} + self.nim_slots.append(NIM(slot = id, description = entry["name"], type = entry["type"], has_outputs = entry["has_outputs"], internally_connectable = entry["internally_connectable"], multi_type = entry["multi_type"])) def hasNimType(self, chktype): for slot in self.nim_slots: if slot.isCompatible(chktype): return True + for type in slot.getMultiTypeList().values(): + if chktype == type: + return True return False def getNimType(self, slotid): @@ -663,6 +689,9 @@ class NimManager: def getNimDescription(self, slotid): return self.nim_slots[slotid].friendly_full_description + + def getNimName(self, slotid): + return self.nim_slots[slotid].description def getNimListOfType(self, type, exception = -1): # returns a list of indexes for NIMs compatible to the given type, except for 'exception' @@ -899,7 +928,7 @@ def InitSecParams(): x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER, configElement.value)) config.sec.delay_after_voltage_change_before_measure_idle_inputpower = x - x = ConfigInteger(default=750, limits = (0, 9999)) + x = ConfigInteger(default=900, limits = (0, 9999)) x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_MOTOR_CMD, configElement.value)) config.sec.delay_after_enable_voltage_before_motor_command = x @@ -938,16 +967,22 @@ def InitSecParams(): # the configElement should be only visible when diseqc 1.2 is disabled def InitNimManager(nimmgr): - InitSecParams() hw = HardwareInfo() + addNimConfig = False + try: + config.Nims + except: + addNimConfig = True - config.Nims = ConfigSubList() - for x in range(len(nimmgr.nim_slots)): - config.Nims.append(ConfigSubsection()) + if addNimConfig: + InitSecParams() + config.Nims = ConfigSubList() + for x in range(len(nimmgr.nim_slots)): + config.Nims.append(ConfigSubsection()) lnb_choices = { "universal_lnb": _("Universal LNB"), -# "unicable": _("Unicable"), + "unicable": _("Unicable"), "c_band": _("C-Band"), "user_defined": _("User defined")} @@ -1213,10 +1248,49 @@ def InitNimManager(nimmgr): tmp.lnb = lnb nim.advanced.sat[x] = tmp + def toneAmplitudeChanged(configElement): + fe_id = configElement.fe_id + slot_id = configElement.slot_id + if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2': + open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value) + + def tunerTypeChanged(nimmgr, configElement): + fe_id = configElement.fe_id + print "tunerTypeChanged feid %d to mode %s" % (fe_id, configElement.value) + open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value) + frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend() + frontend.reopenFrontend() + nimmgr.enumerateNIMs() + + empty_slots = 0 for slot in nimmgr.nim_slots: x = slot.slot nim = config.Nims[x] + addMultiType = False + try: + nim.multiType + except: + addMultiType = True + if slot.isMultiType() and addMultiType: + typeList = [] + for id in slot.getMultiTypeList().keys(): + type = slot.getMultiTypeList()[id] + typeList.append((id, type)) + nim.multiType = ConfigSelection(typeList, "0") + + nim.multiType.fe_id = x - empty_slots + nim.multiType.addNotifier(boundFunction(tunerTypeChanged, nimmgr)) + + empty_slots = 0 + for slot in nimmgr.nim_slots: + x = slot.slot + nim = config.Nims[x] + if slot.isCompatible("DVB-S"): + nim.toneAmplitude = ConfigSelection([("9", "600mV"), ("8", "700mV"), ("7", "800mV"), ("6", "900mV"), ("5", "1100mV")], "7") + nim.toneAmplitude.fe_id = x - empty_slots + nim.toneAmplitude.slot_id = x + nim.toneAmplitude.addNotifier(toneAmplitudeChanged) nim.diseqc13V = ConfigYesNo(False) nim.diseqcMode = ConfigSelection(diseqc_mode_choices, "diseqc_a_b") nim.connectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x]) @@ -1306,6 +1380,7 @@ def InitNimManager(nimmgr): nim.terrestrial = ConfigSelection(choices = list) nim.terrestrial_5V = ConfigOnOff() else: + empty_slots += 1 nim.configMode = ConfigSelection(choices = { "nothing": _("disabled") }, default="nothing"); if slot.type is not None: print "pls add support for this frontend type!", slot.type diff --git a/lib/python/Components/ParentalControl.py b/lib/python/Components/ParentalControl.py index d68e01ff..9942bca7 100644 --- a/lib/python/Components/ParentalControl.py +++ b/lib/python/Components/ParentalControl.py @@ -1,19 +1,34 @@ -from Components.config import config, ConfigSubsection, ConfigSelection, ConfigPIN, ConfigYesNo, ConfigSubList, ConfigInteger +from Components.config import config, ConfigSubsection, ConfigSelection, ConfigPIN, ConfigText, ConfigYesNo, ConfigSubList, ConfigInteger +#from Screens.ChannelSelection import service_types_tv from Screens.InputBox import PinInput from Screens.MessageBox import MessageBox from Tools.BoundFunction import boundFunction from ServiceReference import ServiceReference from Tools import Notifications from Tools.Directories import resolveFilename, SCOPE_CONFIG +from enigma import eTimer +import time + +TYPE_SERVICE = "SERVICE" +TYPE_BOUQUETSERVICE = "BOUQUETSERVICE" +TYPE_BOUQUET = "BOUQUET" +LIST_BLACKLIST = "blacklist" +LIST_WHITELIST = "whitelist" + +IMG_WHITESERVICE = LIST_WHITELIST + "-" + TYPE_SERVICE +IMG_WHITEBOUQUET = LIST_WHITELIST + "-" + TYPE_BOUQUET +IMG_BLACKSERVICE = LIST_BLACKLIST + "-" + TYPE_SERVICE +IMG_BLACKBOUQUET = LIST_BLACKLIST + "-" + TYPE_BOUQUET def InitParentalControl(): config.ParentalControl = ConfigSubsection() config.ParentalControl.configured = ConfigYesNo(default = False) config.ParentalControl.mode = ConfigSelection(default = "simple", choices = [("simple", _("simple")), ("complex", _("complex"))]) - config.ParentalControl.storeservicepin = ConfigSelection(default = "never", choices = [("never", _("never")), ("5_minutes", _("5 minutes")), ("30_minutes", _("30 minutes")), ("60_minutes", _("60 minutes")), ("restart", _("until restart"))]) + config.ParentalControl.storeservicepin = ConfigSelection(default = "never", choices = [("never", _("never")), ("5", _("5 minutes")), ("30", _("30 minutes")), ("60", _("60 minutes")), ("standby", _("until standby/restart"))]) + config.ParentalControl.storeservicepincancel = ConfigSelection(default = "never", choices = [("never", _("never")), ("5", _("5 minutes")), ("30", _("30 minutes")), ("60", _("60 minutes")), ("standby", _("until standby/restart"))]) config.ParentalControl.servicepinactive = ConfigYesNo(default = False) config.ParentalControl.setuppinactive = ConfigYesNo(default = False) - config.ParentalControl.type = ConfigSelection(default = "blacklist", choices = [("whitelist", _("whitelist")), ("blacklist", _("blacklist"))]) + config.ParentalControl.type = ConfigSelection(default = "blacklist", choices = [(LIST_WHITELIST, _("whitelist")), (LIST_BLACKLIST, _("blacklist"))]) config.ParentalControl.setuppin = ConfigPIN(default = -1) config.ParentalControl.retries = ConfigSubsection() @@ -39,40 +54,58 @@ def InitParentalControl(): class ParentalControl: def __init__(self): - self.open() + #Do not call open on init, because bouquets are not ready at that moment +# self.open() self.serviceLevel = {} - - def addWhitelistService(self, service): - self.whitelist.append(service) + #Instead: Use Flags to see, if we already initialized config and called open + self.configInitialized = False + self.filesOpened = False + #This is the timer that is used to see, if the time for caching the pin is over + #Of course we could also work without a timer and compare the times every + #time we call isServicePlayable. But this might probably slow down zapping, + #That's why I decided to use a timer + self.sessionPinTimer = eTimer() + self.sessionPinTimer.callback.append(self.resetSessionPin) - def addBlacklistService(self, service): - self.blacklist.append(service) - - def setServiceLevel(self, service, level): - self.serviceLevel[service] = level - - def deleteWhitelistService(self, service): - self.whitelist.remove(service) - if self.serviceLevel.has_key(service): - self.serviceLevel.remove(service) + def serviceMethodWrapper(self, service, method, *args): + #This method is used to call all functions that need a service as Parameter: + #It takes either a Service- Reference or a Bouquet- Reference and passes + #Either the service or all services contained in the bouquet to the method given + #That way all other functions do not need to distinguish between service and bouquet. + if "FROM BOUQUET" in service: + method( service , TYPE_BOUQUET , *args ) + servicelist = self.readServicesFromBouquet(service,"C") + for ref in servicelist: + sRef = str(ref[0]) + method( sRef , TYPE_BOUQUETSERVICE , *args ) + else: + ref = ServiceReference(service) + sRef = str(ref) + method( sRef , TYPE_SERVICE , *args ) - def deleteBlacklistService(self, service): - self.blacklist.remove(service) - if self.serviceLevel.has_key(service): - self.serviceLevel.remove(service) + def setServiceLevel(self, service, type, level): + self.serviceLevel[service] = level def isServicePlayable(self, ref, callback): if not config.ParentalControl.configured.value or not config.ParentalControl.servicepinactive.value: return True - #print "whitelist:", self.whitelist - #print "blacklist:", self.blacklist - #print "config.ParentalControl.type.value:", config.ParentalControl.type.value - #print "not in whitelist:", (service not in self.whitelist) - #print "checking parental control for service:", ref.toString() + #Check if we already read the whitelists and blacklists. If not: call open + if self.filesOpened == False: + self.open() + #Check if configuration has already been read or if the significant values have changed. + #If true: read the configuration + if self.configInitialized == False or self.storeServicePin != config.ParentalControl.storeservicepin.value or self.storeServicePinCancel != config.ParentalControl.storeservicepincancel.value: + self.getConfigValues() service = ref.toCompareString() - if (config.ParentalControl.type.value == "whitelist" and service not in self.whitelist) or (config.ParentalControl.type.value == "blacklist" and service in self.blacklist): + if (config.ParentalControl.type.value == LIST_WHITELIST and not self.whitelist.has_key(service)) or (config.ParentalControl.type.value == LIST_BLACKLIST and self.blacklist.has_key(service)): + #Check if the session pin is cached and return the cached value, if it is. + if self.sessionPinCached == True: + #As we can cache successful pin- entries as well as canceled pin- entries, + #We give back the last action + return self.sessionPinCachedValue self.callback = callback - #print "service:", ServiceReference(service).getServiceName() + #Someone started to implement different levels of protection. Seems they were never completed + #I did not throw out this code, although it is of no use at the moment levelNeeded = 0 if self.serviceLevel.has_key(service): levelNeeded = self.serviceLevel[service] @@ -83,103 +116,217 @@ class ParentalControl: return True def protectService(self, service): - #print "protect" - #print "config.ParentalControl.type.value:", config.ParentalControl.type.value - if config.ParentalControl.type.value == "whitelist": - if service in self.whitelist: - self.deleteWhitelistService(service) + if config.ParentalControl.type.value == LIST_WHITELIST: + if self.whitelist.has_key(service): + self.serviceMethodWrapper(service, self.removeServiceFromList, self.whitelist) + #self.deleteWhitelistService(service) else: # blacklist - if service not in self.blacklist: - self.addBlacklistService(service) + if not self.blacklist.has_key(service): + self.serviceMethodWrapper(service, self.addServiceToList, self.blacklist) + #self.addBlacklistService(service) #print "whitelist:", self.whitelist #print "blacklist:", self.blacklist - def unProtectService(self, service): #print "unprotect" #print "config.ParentalControl.type.value:", config.ParentalControl.type.value - if config.ParentalControl.type.value == "whitelist": - if service not in self.whitelist: - self.addWhitelistService(service) + if config.ParentalControl.type.value == LIST_WHITELIST: + if not self.whitelist.has_key(service): + self.serviceMethodWrapper(service, self.addServiceToList, self.whitelist) + #self.addWhitelistService(service) else: # blacklist - if service in self.blacklist: - self.deleteBlacklistService(service) + if self.blacklist.has_key(service): + self.serviceMethodWrapper(service, self.removeServiceFromList, self.blacklist) + #self.deleteBlacklistService(service) #print "whitelist:", self.whitelist #print "blacklist:", self.blacklist def getProtectionLevel(self, service): - if (config.ParentalControl.type.value == "whitelist" and service not in self.whitelist) or (config.ParentalControl.type.value == "blacklist" and service in self.blacklist): + if (config.ParentalControl.type.value == LIST_WHITELIST and not self.whitelist.has_key(service)) or (config.ParentalControl.type.value == LIST_BLACKLIST and self.blacklist.has_key(service)): if self.serviceLevel.has_key(service): return self.serviceLevel[service] else: return 0 else: return -1 + + def getProtectionType(self, service): + #New method used in ParentalControlList: This method does not only return + #if a service is protected or not, it also returns, why (whitelist or blacklist, service or bouquet) + if self.filesOpened == False: + self.open() + sImage = "" + if (config.ParentalControl.type.value == LIST_WHITELIST): + if self.whitelist.has_key(service): + if TYPE_SERVICE in self.whitelist[service]: + sImage = IMG_WHITESERVICE + else: + sImage = IMG_WHITEBOUQUET + elif (config.ParentalControl.type.value == LIST_BLACKLIST): + if self.blacklist.has_key(service): + if TYPE_SERVICE in self.blacklist[service]: + sImage = IMG_BLACKSERVICE + else: + sImage = IMG_BLACKBOUQUET + bLocked = self.getProtectionLevel(service) != -1 + return (bLocked,sImage) + + def getConfigValues(self): + #Read all values from configuration + self.checkPinInterval = False + self.checkPinIntervalCancel = False + self.checkSessionPin = False + self.checkSessionPinCancel = False + + self.sessionPinCached = False + self.pinIntervalSeconds = 0 + self.pinIntervalSecondsCancel = 0 + + self.storeServicePin = config.ParentalControl.storeservicepin.value + self.storeServicePinCancel = config.ParentalControl.storeservicepincancel.value + + if self.storeServicePin == "never": + pass + elif self.storeServicePin == "standby": + self.checkSessionPin = True + else: + self.checkPinInterval = True + iMinutes = float(self.storeServicePin) + iSeconds = iMinutes*60 + self.pinIntervalSeconds = iSeconds + + if self.storeServicePinCancel == "never": + pass + elif self.storeServicePinCancel == "standby": + self.checkSessionPinCancel = True + else: + self.checkPinIntervalCancel = True + iMinutes = float(self.storeServicePinCancel) + iSeconds = iMinutes*60 + self.pinIntervalSecondsCancel = iSeconds + self.configInitialized = True + # Reset PIN cache on standby: Use StandbyCounter- Config- Callback + config.misc.standbyCounter.addNotifier(self.standbyCounterCallback, initial_call = False) + + def standbyCounterCallback(self, configElement): + self.resetSessionPin() + + def resetSessionPin(self): + #Reset the session pin, stop the timer + self.sessionPinCached = False + self.sessionPinTimer.stop() + + def getCurrentTimeStamp(self): + return time.time() + def getPinList(self): return [ x.value for x in config.ParentalControl.servicepin ] - + def servicePinEntered(self, service, result): -# levelNeeded = 0 - #if self.serviceLevel.has_key(service): - #levelNeeded = self.serviceLevel[service] -# - #print "getPinList():", self.getPinList() - #pinList = self.getPinList()[:levelNeeded + 1] - #print "pinList:", pinList -# -# print "pin entered for service", service, "and pin was", pin - #if pin is not None and int(pin) in pinList: + if result is not None and result: - #print "pin ok, playing service" + #This is the new function of caching the service pin + #save last session and time of last entered pin... + if self.checkSessionPin == True: + self.sessionPinCached = True + self.sessionPinCachedValue = True + if self.checkPinInterval == True: + self.sessionPinCached = True + self.sessionPinCachedValue = True + self.sessionPinTimer.start(self.pinIntervalSeconds*1000,1) self.callback(ref = service) else: + #This is the new function of caching cancelling of service pin if result is not None: Notifications.AddNotification(MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR) - #print "wrong pin entered" + else: + if self.checkSessionPinCancel == True: + self.sessionPinCached = True + self.sessionPinCachedValue = False + if self.checkPinIntervalCancel == True: + self.sessionPinCached = True + self.sessionPinCachedValue = False + self.sessionPinTimer.start(self.pinIntervalSecondsCancel*1000,1) - def saveWhitelist(self): - file = open(resolveFilename(SCOPE_CONFIG, "whitelist"), 'w') - for x in self.whitelist: - file.write(x + "\n") - file.close - - def openWhitelist(self): - self.whitelist = [] - try: - file = open(resolveFilename(SCOPE_CONFIG, "whitelist"), 'r') - lines = file.readlines() - for x in lines: - ref = ServiceReference(x.strip()) - self.whitelist.append(str(ref)) - file.close - except: - pass - - def saveBlacklist(self): - file = open(resolveFilename(SCOPE_CONFIG, "blacklist"), 'w') - for x in self.blacklist: - file.write(x + "\n") + def saveListToFile(self,sWhichList): + #Replaces saveWhiteList and saveBlackList: + #I don't like to have two functions with identical code... + if sWhichList == LIST_BLACKLIST: + vList = self.blacklist + else: + vList = self.whitelist + file = open(resolveFilename(SCOPE_CONFIG, sWhichList), 'w') + for sService,sType in vList.iteritems(): + #Only Services that are selected directly and Bouqets are saved. + #Services that are added by a bouquet are not saved. + #This is the reason for the change in self.whitelist and self.blacklist + if TYPE_SERVICE in sType or TYPE_BOUQUET in sType: + file.write(str(sService) + "\n") file.close - def openBlacklist(self): - self.blacklist = [] + def openListFromFile(self,sWhichList): + #Replaces openWhiteList and openBlackList: + #I don't like to have two functions with identical code... + if sWhichList == LIST_BLACKLIST: + self.blacklist = {} + vList = self.blacklist + else: + self.whitelist = {} + vList = self.whitelist try: - file = open(resolveFilename(SCOPE_CONFIG, "blacklist"), 'r') + file = open(resolveFilename(SCOPE_CONFIG, sWhichList ), 'r') lines = file.readlines() for x in lines: - ref = ServiceReference(x.strip()) - self.blacklist.append(str(ref)) + sPlain = x.strip() + self.serviceMethodWrapper(sPlain, self.addServiceToList, vList) file.close except: pass + + def addServiceToList(self, service, type, vList): + #Replaces addWhitelistService and addBlacklistService + #The lists are not only lists of service references any more. + #They are named lists with the service as key and an array of types as value: + + if vList.has_key(service): + if not type in vList[service]: + vList[service].append(type) + else: + vList[service] = [type] + + def removeServiceFromList(self, service, type, vList): + #Replaces deleteWhitelistService and deleteBlacklistService + if vList.has_key(service): + if type in vList[service]: + vList[service].remove(type) + if not vList[service]: + del vList[service] + if self.serviceLevel.has_key(service): + self.serviceLevel.remove(service) + + def readServicesFromBouquet(self,sBouquetSelection,formatstring): + #This method gives back a list of services for a given bouquet + from enigma import eServiceCenter, eServiceReference + from Screens.ChannelSelection import service_types_tv + serviceHandler = eServiceCenter.getInstance() + refstr = sBouquetSelection + root = eServiceReference(refstr) + list = serviceHandler.list(root) + if list is not None: + services = list.getContent("CN", True) #(servicecomparestring, name) + return services def save(self): - self.saveBlacklist() - self.saveWhitelist() + # we need to open the files in case we havent's read them yet + if not self.filesOpened: + self.open() + self.saveListToFile(LIST_BLACKLIST) + self.saveListToFile(LIST_WHITELIST) def open(self): - self.openBlacklist() - self.openWhitelist() + self.openListFromFile(LIST_BLACKLIST) + self.openListFromFile(LIST_WHITELIST) + self.filesOpened = True parentalControl = ParentalControl() diff --git a/lib/python/Components/ParentalControlList.py b/lib/python/Components/ParentalControlList.py index 128e6d3e..797ea391 100644 --- a/lib/python/Components/ParentalControlList.py +++ b/lib/python/Components/ParentalControlList.py @@ -1,19 +1,28 @@ from MenuList import MenuList -from Components.ParentalControl import parentalControl +from Components.ParentalControl import parentalControl, IMG_WHITESERVICE, IMG_WHITEBOUQUET, IMG_BLACKSERVICE, IMG_BLACKBOUQUET from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT from Tools.LoadPixmap import LoadPixmap -lockPicture = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock.png")) +#Now there is a list of pictures instead of one... +entryPicture = {} -def ParentalControlEntryComponent(service, name, locked = True): +entryPicture[IMG_BLACKSERVICE] = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock.png")) +entryPicture[IMG_BLACKBOUQUET] = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lockBouquet.png")) +entryPicture[IMG_WHITESERVICE] = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/unlock.png")) +entryPicture[IMG_WHITEBOUQUET] = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/unlockBouquet.png")) + +def ParentalControlEntryComponent(service, name, protectionType): + locked = protectionType[0] + sImage = protectionType[1] res = [ (service, name, locked), (eListboxPythonMultiContent.TYPE_TEXT, 80, 5, 300, 50, 0, RT_HALIGN_LEFT, name) ] - if locked: - res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 0, 0, 32, 32, lockPicture)) + #Changed logic: The image is defined by sImage, not by locked anymore + if sImage != "": + res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 0, 0, 32, 32, entryPicture[sImage])) return res class ParentalControlList(MenuList): @@ -25,9 +34,11 @@ class ParentalControlList(MenuList): def toggleSelectedLock(self): print "self.l.getCurrentSelection():", self.l.getCurrentSelection() print "self.l.getCurrentSelectionIndex():", self.l.getCurrentSelectionIndex() - self.list[self.l.getCurrentSelectionIndex()] = ParentalControlEntryComponent(self.l.getCurrentSelection()[0][0], self.l.getCurrentSelection()[0][1], not self.l.getCurrentSelection()[0][2]); - if self.l.getCurrentSelection()[0][2]: - parentalControl.protectService(self.l.getCurrentSelection()[0][0]) + curSel = self.l.getCurrentSelection() + if curSel[0][2]: + parentalControl.unProtectService(self.l.getCurrentSelection()[0][0]) else: - parentalControl.unProtectService(self.l.getCurrentSelection()[0][0]) + parentalControl.protectService(self.l.getCurrentSelection()[0][0]) + #Instead of just negating the locked- flag, now I call the getProtectionType every time... + self.list[self.l.getCurrentSelectionIndex()] = ParentalControlEntryComponent(curSel[0][0], curSel[0][1], parentalControl.getProtectionType(curSel[0][0])) self.l.setList(self.list) diff --git a/lib/python/Components/PluginComponent.py b/lib/python/Components/PluginComponent.py index c91d6ad5..5e439fdf 100755 --- a/lib/python/Components/PluginComponent.py +++ b/lib/python/Components/PluginComponent.py @@ -46,7 +46,7 @@ class PluginComponent: for pluginname in os_listdir(directory_category): path = directory_category + "/" + pluginname if os_path.isdir(path): - if fileExists(path + "/plugin.pyc") or fileExists(path + "/plugin.py"): + if fileExists(path + "/plugin.pyc") or fileExists(path + "/plugin.pyo") or fileExists(path + "/plugin.py"): try: plugin = my_import('.'.join(["Plugins", c, pluginname, "plugin"])) diff --git a/lib/python/Components/Renderer/Listbox.py b/lib/python/Components/Renderer/Listbox.py old mode 100644 new mode 100755 index 7a895330..716fe445 --- a/lib/python/Components/Renderer/Listbox.py +++ b/lib/python/Components/Renderer/Listbox.py @@ -19,6 +19,7 @@ class Listbox(Renderer, object): self.__content = None self.__wrap_around = False self.__selection_enabled = True + self.__scrollbarMode = "showOnDemand" GUI_WIDGET = eListbox @@ -38,6 +39,7 @@ class Listbox(Renderer, object): instance.selectionChanged.get().append(self.selectionChanged) self.wrap_around = self.wrap_around # trigger self.selection_enabled = self.selection_enabled # trigger + self.scrollbarMode = self.scrollbarMode # trigger def preWidgetRemove(self, instance): instance.setContent(None) @@ -76,7 +78,24 @@ class Listbox(Renderer, object): selection_enabled = property(lambda self: self.__selection_enabled, setSelectionEnabled) + def setScrollbarMode(self, mode): + self.__scrollbarMode = mode + if self.instance is not None: + self.instance.setScrollbarMode(int( + { "showOnDemand": 0, + "showAlways": 1, + "showNever": 2, + }[mode])) + + scrollbarMode = property(lambda self: self.__scrollbarMode, setScrollbarMode) + def changed(self, what): + if hasattr(self.source, "selectionEnabled"): + self.selection_enabled = self.source.selectionEnabled + if hasattr(self.source, "scrollbarMode"): + self.scrollbarMode = self.source.scrollbarMode + if len(what) > 1 and isinstance(what[1], str) and what[1] == "style": + return self.content = self.source.content def entry_changed(self, index): diff --git a/lib/python/Components/SelectionList.py b/lib/python/Components/SelectionList.py old mode 100644 new mode 100755 index 08af7d02..1c5423fb --- a/lib/python/Components/SelectionList.py +++ b/lib/python/Components/SelectionList.py @@ -1,9 +1,9 @@ from MenuList import MenuList -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT from Tools.LoadPixmap import LoadPixmap -selectionpng = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/selectioncross.png")) +selectionpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/selectioncross.png")) def SelectionEntryComponent(description, value, index, selected): res = [ diff --git a/lib/python/Components/Sensors.py b/lib/python/Components/Sensors.py new file mode 100644 index 00000000..8898a030 --- /dev/null +++ b/lib/python/Components/Sensors.py @@ -0,0 +1,72 @@ +from Components.FanControl import fancontrol + +class Sensors: + # (type, name, unit, directory) + TYPE_TEMPERATURE = 0 + # (type, name, unit, fanid) + TYPE_FAN_RPM = 1 + + def __init__(self): + # (type, name, unit, sensor_specific_dict/list) + self.sensors_list = [] + self.addSensors() + + def getSensorsCount(self, type = None): + if type is None: + return len(self.sensors_list) + count = 0 + for sensor in self.sensors_list: + if sensor[0] == type: + count += 1 + return count + + # returns a list of sensorids of type "type" + def getSensorsList(self, type = None): + if type is None: + return range(len(self.sensors_list)) + list = [] + for sensorid in range(len(self.sensors_list)): + if self.sensors_list[sensorid][0] == type: + list.append(sensorid) + return list + + + def getSensorType(self, sensorid): + return self.sensors_list[sensorid][0] + + def getSensorName(self, sensorid): + return self.sensors_list[sensorid][1] + + def getSensorValue(self, sensorid): + value = -1 + sensor = self.sensors_list[sensorid] + if sensor[0] == self.TYPE_TEMPERATURE: + f = open("%s/value" % sensor[3], "r") + value = int(f.readline().strip()) + f.close() + elif sensor[0] == self.TYPE_FAN_RPM: + value = fancontrol.getFanSpeed(sensor[3]) + return value + + def getSensorUnit(self, sensorid): + return self.sensors_list[sensorid][2] + + def addSensors(self): + import os + if os.path.exists("/proc/stb/sensors"): + for dirname in os.listdir("/proc/stb/sensors"): + if dirname.find("temp", 0, 4) == 0: + f = open("/proc/stb/sensors/%s/name" % dirname, "r") + name = f.readline().strip() + f.close() + + f = open("/proc/stb/sensors/%s/unit" % dirname, "r") + unit = f.readline().strip() + f.close() + + self.sensors_list.append((self.TYPE_TEMPERATURE, name, unit, "/proc/stb/sensors/%s" % dirname)) + for fanid in range(fancontrol.getFanCount()): + if fancontrol.hasRPMSensor(fanid): + self.sensors_list.append((self.TYPE_FAN_RPM, _("Fan %d") % (fanid + 1), "rpm", fanid)) + +sensors = Sensors() \ No newline at end of file diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py index b0283c11..cd055a82 100644 --- a/lib/python/Components/ServiceList.py +++ b/lib/python/Components/ServiceList.py @@ -5,7 +5,9 @@ from skin import parseColor, parseFont from enigma import eListboxServiceContent, eListbox, eServiceCenter, eServiceReference, gFont, eRect from Tools.LoadPixmap import LoadPixmap -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN + +from Components.config import config class ServiceList(HTMLComponent, GUIComponent): MODE_NORMAL = 0 @@ -15,27 +17,27 @@ class ServiceList(HTMLComponent, GUIComponent): GUIComponent.__init__(self) self.l = eListboxServiceContent() - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/folder.png")) + pic = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) if pic: self.l.setPixmap(self.l.picFolder, pic) - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/marker.png")) + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png")) if pic: self.l.setPixmap(self.l.picMarker, pic) - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_s-fs8.png")) + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png")) if pic: self.l.setPixmap(self.l.picDVB_S, pic) - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_c-fs8.png")) + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png")) if pic: self.l.setPixmap(self.l.picDVB_C, pic) - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_t-fs8.png")) + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png")) if pic: self.l.setPixmap(self.l.picDVB_T, pic) - pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_service_group-fs8.png")) + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png")) if pic: self.l.setPixmap(self.l.picServiceGroup, pic) @@ -62,6 +64,22 @@ class ServiceList(HTMLComponent, GUIComponent): self.l.setColor(eListboxServiceContent.markedBackgroundSelected, parseColor(value)) elif attrib == "foregroundColorServiceNotAvail": self.l.setColor(eListboxServiceContent.serviceNotAvail, parseColor(value)) + elif attrib == "colorEventProgressbar": + self.l.setColor(eListboxServiceContent.serviceEventProgressbarColor, parseColor(value)) + elif attrib == "colorEventProgressbarSelected": + self.l.setColor(eListboxServiceContent.serviceEventProgressbarColorSelected, parseColor(value)) + elif attrib == "colorEventProgressbarBorder": + self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColor, parseColor(value)) + elif attrib == "colorEventProgressbarBorderSelected": + self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColorSelected, parseColor(value)) + elif attrib == "colorServiceDescription": + self.l.setColor(eListboxServiceContent.serviceDescriptionColor, parseColor(value)) + elif attrib == "colorServiceDescriptionSelected": + self.l.setColor(eListboxServiceContent.serviceDescriptionColorSelected, parseColor(value)) + elif attrib == "picServiceEventProgressbar": + pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) + if pic: + self.l.setPixmap(self.l.picServiceEventProgressbar, pic) elif attrib == "serviceItemHeight": self.ItemHeight = int(value) elif attrib == "serviceNameFont": @@ -213,17 +231,24 @@ class ServiceList(HTMLComponent, GUIComponent): def setMode(self, mode): self.mode = mode + self.l.setItemHeight(self.ItemHeight) + self.l.setVisualMode(eListboxServiceContent.visModeComplex) if mode == self.MODE_NORMAL: - self.l.setItemHeight(self.ItemHeight) - self.l.setVisualMode(eListboxServiceContent.visModeComplex) + if config.usage.show_event_progress_in_servicelist.value: + self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 52, self.ItemHeight)) + else: + self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 0, 0)) self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont) self.l.setElementPosition(self.l.celServiceName, eRect(0, 0, self.instance.size().width(), self.ItemHeight)) self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont) else: - self.l.setItemHeight(self.ItemHeight) - self.l.setVisualMode(eListboxServiceContent.visModeComplex) + if config.usage.show_event_progress_in_servicelist.value: + self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 52, self.ItemHeight)) + else: + self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 0, 0)) self.l.setElementFont(self.l.celServiceNumber, self.ServiceNumberFont) self.l.setElementPosition(self.l.celServiceNumber, eRect(0, 0, 50, self.ItemHeight)) self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont) self.l.setElementPosition(self.l.celServiceName, eRect(60, 0, self.instance.size().width()-60, self.ItemHeight)) self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont) + diff --git a/lib/python/Components/Sources/List.py b/lib/python/Components/Sources/List.py index 1eab32b2..6f0670a1 100644 --- a/lib/python/Components/Sources/List.py +++ b/lib/python/Components/Sources/List.py @@ -91,8 +91,9 @@ to generate HTML.""" return self.__style def setStyle(self, style): - self.__style = style - self.changed((self.CHANGED_SPECIFIC, "style")) + if self.__style != style: + self.__style = style + self.changed((self.CHANGED_SPECIFIC, "style")) style = property(getStyle, setStyle) diff --git a/lib/python/Components/Sources/Makefile.am b/lib/python/Components/Sources/Makefile.am index 6ef8cac6..436d31be 100644 --- a/lib/python/Components/Sources/Makefile.am +++ b/lib/python/Components/Sources/Makefile.am @@ -4,4 +4,4 @@ install_PYTHON = \ __init__.py Clock.py EventInfo.py Source.py List.py CurrentService.py \ FrontendStatus.py Boolean.py Config.py ServiceList.py RdsDecoder.py StreamService.py \ StaticText.py CanvasSource.py ServiceEvent.py Event.py FrontendInfo.py TunerInfo.py \ - RecordState.py Progress.py + RecordState.py Progress.py Sensor.py diff --git a/lib/python/Components/Sources/Sensor.py b/lib/python/Components/Sources/Sensor.py new file mode 100644 index 00000000..e927bbf4 --- /dev/null +++ b/lib/python/Components/Sources/Sensor.py @@ -0,0 +1,31 @@ +from Components.Sensors import sensors + +from enigma import eTimer + +from Source import Source + +class SensorSource(Source): + def __init__(self, update_interval = 500, sensorid = None): + self.update_interval = update_interval + self.sensorid = sensorid + Source.__init__(self) + + if sensorid is not None: + self.update_timer = eTimer() + self.update_timer.callback.append(self.updateValue) + self.update_timer.start(self.update_interval) + + def getValue(self): + if self.sensorid is not None: + return sensors.getSensorValue(self.sensorid) + return None + + def getUnit(self): + return sensors.getSensorUnit(self.sensorid) + + def updateValue(self): + self.changed((self.CHANGED_POLL,)) + + def destroy(self): + if self.sensorid is not None: + self.update_timer.callback.remove(self.updateValue) diff --git a/lib/python/Components/SystemInfo.py b/lib/python/Components/SystemInfo.py index d2b405a2..f9c4065f 100644 --- a/lib/python/Components/SystemInfo.py +++ b/lib/python/Components/SystemInfo.py @@ -1,5 +1,6 @@ from enigma import eDVBResourceManager from Tools.Directories import fileExists +from Tools.HardwareInfo import HardwareInfo SystemInfo = { } @@ -27,3 +28,4 @@ def countFrontpanelLEDs(): SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs() SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists("/dev/dbox/lcd0") SystemInfo["FrontpanelDisplayGrayscale"] = fileExists("/dev/dbox/oled0") +SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800" diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index df94f8a6..2e4e757d 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -16,6 +16,7 @@ class Job(object): self.end = 100 self.__progress = 0 self.weightScale = 1 + self.afterEvent = None self.state_changed = CList() @@ -370,12 +371,20 @@ class DiskspacePrecondition(Condition): class ToolExistsPrecondition(Condition): def check(self, task): import os + if task.cmd[0]=='/': - realpath = task.cmd + self.realpath = task.cmd + print "[Task.py][ToolExistsPrecondition] WARNING: usage of absolute paths for tasks should be avoided!" + return os.access(self.realpath, os.X_OK) else: - realpath = task.cwd + '/' + task.cmd - self.realpath = realpath - return os.access(realpath, os.X_OK) + self.realpath = task.cmd + path = os.environ.get('PATH', '').split(os.pathsep) + path.append(task.cwd + '/') + absolutes = filter(lambda file: os.access(file, os.X_OK), map(lambda directory, file = task.cmd: os.path.join(directory, file), path)) + if len(absolutes) > 0: + self.realpath = task.cmd[0] + return True + return False def getErrorMessage(self, task): return _("A required tool (%s) was not found.") % (self.realpath) diff --git a/lib/python/Components/TimerList.py b/lib/python/Components/TimerList.py old mode 100644 new mode 100755 index 44a7eb4f..30097c96 --- a/lib/python/Components/TimerList.py +++ b/lib/python/Components/TimerList.py @@ -7,7 +7,7 @@ from enigma import eListboxPythonMultiContent, eListbox, gFont, \ RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER from Tools.LoadPixmap import LoadPixmap from timer import TimerEntry -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN class TimerList(HTMLComponent, GUIComponent, object): # @@ -33,12 +33,18 @@ class TimerList(HTMLComponent, GUIComponent, object): count += 1 flags = flags >> 1 if timer.justplay: - res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ((" %s "+ _("(ZAP)")) % (FuzzyTime(timer.begin)[1])))) + if timer.end - timer.begin < 4: # rounding differences + res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ((" %s "+ _("(ZAP)")) % (FuzzyTime(timer.begin)[1])))) + else: + res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ((" %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) + _("(ZAP)"))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)))) else: if timer.justplay: - res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (("%s, %s " + _("(ZAP)")) % (FuzzyTime(timer.begin))))) + if timer.end - timer.begin < 4: + res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (("%s, %s " + _("(ZAP)")) % (FuzzyTime(timer.begin))))) + else: + res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (("%s, %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:] + ((timer.end - timer.begin) / 60,))) + _("(ZAP)"))) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, width-150, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (("%s, %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:] + ((timer.end - timer.begin) / 60,))))) @@ -65,7 +71,7 @@ class TimerList(HTMLComponent, GUIComponent, object): res.append((eListboxPythonMultiContent.TYPE_TEXT, width-150, 50, 150, 20, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, state)) if timer.disabled: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/redx.png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/redx.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 490, 5, 40, 40, png)) return res diff --git a/lib/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py index f9ab3edb..44b19091 100644 --- a/lib/python/Components/TuneTest.py +++ b/lib/python/Components/TuneTest.py @@ -1,8 +1,9 @@ from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParameters, eDVBResourceManager, eTimer class Tuner: - def __init__(self, frontend): + def __init__(self, frontend, ignore_rotor=False): self.frontend = frontend + self.ignore_rotor = ignore_rotor # transponder = (frequency, symbolrate, polarisation, fec, inversion, orbpos, system, modulation, rolloff, pilot, tsid, onid) # 0 1 2 3 4 5 6 7 8 9 10 11 @@ -21,7 +22,7 @@ class Tuner: parm.rolloff = transponder[8] parm.pilot = transponder[9] feparm = eDVBFrontendParameters() - feparm.setDVBS(parm) + feparm.setDVBS(parm, self.ignore_rotor) self.lastparm = feparm self.frontend.tune(feparm) diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index 6fcab8bc..b86c1a13 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -1,12 +1,13 @@ from Components.Harddisk import harddiskmanager from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations +from Tools.Directories import resolveFilename, SCOPE_HDD from enigma import Misc_Options, setTunerTypePriorityOrder; from SystemInfo import SystemInfo import os def InitUsageConfig(): config.usage = ConfigSubsection(); - config.usage.showdish = ConfigYesNo(default = False) + config.usage.showdish = ConfigYesNo(default = True) config.usage.multibouquet = ConfigYesNo(default = False) config.usage.quickzap_bouquet_change = ConfigYesNo(default = False) config.usage.e1like_radio_mode = ConfigYesNo(default = False) @@ -30,8 +31,11 @@ def InitUsageConfig(): ("standard", _("standard")), ("swap", _("swap PiP and main picture")), ("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ]) + config.usage.default_path = ConfigText(default = resolveFilename(SCOPE_HDD)) + config.usage.timer_path = ConfigText(default = "") + config.usage.instantrec_path = ConfigText(default = "") + config.usage.timeshift_path = ConfigText(default = "/media/hdd/") 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")) ]) @@ -47,7 +51,14 @@ def InitUsageConfig(): config.usage.on_long_powerpress = ConfigSelection(default = "show_menu", choices = [ ("show_menu", _("show shutdown menu")), - ("shutdown", _("immediate shutdown")) ] ) + ("shutdown", _("immediate shutdown")), + ("standby", _("Standby")) ] ) + + config.usage.on_short_powerpress = ConfigSelection(default = "standby", choices = [ + ("show_menu", _("show shutdown menu")), + ("shutdown", _("immediate shutdown")), + ("standby", _("Standby")) ] ) + config.usage.alternatives_priority = ConfigSelection(default = "0", choices = [ ("0", "DVB-S/-C/-T"), @@ -57,6 +68,8 @@ def InitUsageConfig(): ("4", "DVB-T/-C/-S"), ("5", "DVB-T/-S/-C") ]) + config.usage.show_event_progress_in_servicelist = ConfigYesNo(default = False) + config.usage.blinking_display_clock_during_recording = ConfigYesNo(default = False) config.usage.show_message_when_recording_starts = ConfigYesNo(default = True) @@ -65,19 +78,19 @@ def InitUsageConfig(): def TunerTypePriorityOrderChanged(configElement): setTunerTypePriorityOrder(int(configElement.value)) - config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged) + config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False) def setHDDStandby(configElement): for hdd in harddiskmanager.HDDList(): hdd[1].setIdleTime(int(configElement.value)) - config.usage.hdd_standby.addNotifier(setHDDStandby) + config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False) def set12VOutput(configElement): if configElement.value == "on": Misc_Options.getInstance().set_12V_output(1) elif configElement.value == "off": Misc_Options.getInstance().set_12V_output(0) - config.usage.output_12V.addNotifier(set12VOutput) + config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False) SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output() @@ -128,3 +141,23 @@ def updateChoices(sel, choices): defval = str(x) break sel.setChoices(map(str, choices), defval) + +def preferredPath(path): + if config.usage.setup_level.index < 2 or path == "": + return None # config.usage.default_path.value, but delay lookup until usage + elif path == "": + return config.movielist.last_videodir.value + elif path == "": + return config.movielist.last_timer_videodir.value + else: + return path + +def preferredTimerPath(): + return preferredPath(config.usage.timer_path.value) + +def preferredInstantRecordPath(): + return preferredPath(config.usage.instantrec_path.value) + +def defaultMoviePath(): + return config.usage.default_path.value + diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index 789ec32f..471b59ec 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -1,6 +1,6 @@ from enigma import getPrevAsciiCode from Tools.NumericalTextInput import NumericalTextInput -from Tools.Directories import resolveFilename, SCOPE_CONFIG +from Tools.Directories import resolveFilename, SCOPE_CONFIG, fileExists from Components.Harddisk import harddiskmanager from copy import copy as copy_copy from os import path as os_path @@ -1034,13 +1034,13 @@ class ConfigSelectionNumber(ConfigSelection): step += stepwidth ConfigSelection.__init__(self, choices, default) - + def getValue(self): - return int(self.text) + return int(ConfigSelection.getValue(self)) def setValue(self, val): - self.text = str(val) - + ConfigSelection.setValue(self, str(val)) + def handleKey(self, key): if not self.wraparound: if key == KEY_RIGHT: @@ -1050,8 +1050,6 @@ class ConfigSelectionNumber(ConfigSelection): if self.choices.index(self.value) == 0: return ConfigSelection.handleKey(self, key) - - class ConfigNumber(ConfigText): def __init__(self, default = 0): @@ -1140,6 +1138,9 @@ class ConfigDirectory(ConfigText): else: return ConfigText.getMulti(self, selected) + def onSelect(self, session): + self.allmarked = (self.value != "") + # a slider. class ConfigSlider(ConfigElement): def __init__(self, default = 0, increment = 1, limits = (0, 100)): @@ -1285,7 +1286,6 @@ class ConfigLocations(ConfigElement): self.default = default self.locations = [] self.mountpoints = [] - harddiskmanager.on_partition_list_change.append(self.mountpointsChanged) self.value = default[:] def setValue(self, value): @@ -1322,7 +1322,7 @@ class ConfigLocations(ConfigElement): locations = [[x, None, False, False] for x in tmp] self.refreshMountpoints() for x in locations: - if os_path.exists(x[0]): + if fileExists(x[0]): x[1] = self.getMountpoint(x[0]) x[2] = True self.locations = locations @@ -1341,20 +1341,11 @@ class ConfigLocations(ConfigElement): return False return self.tostring([x[0] for x in locations]) != sv - def mountpointsChanged(self, action, dev): - print "Mounts changed: ", action, dev - mp = dev.mountpoint+"/" - if action == "add": - self.addedMount(mp) - elif action == "remove": - self.removedMount(mp) - self.refreshMountpoints() - def addedMount(self, mp): for x in self.locations: if x[1] == mp: x[2] = True - elif x[1] == None and os_path.exists(x[0]): + elif x[1] == None and fileExists(x[0]): x[1] = self.getMountpoint(x[0]) x[2] = True @@ -1364,7 +1355,7 @@ class ConfigLocations(ConfigElement): x[2] = False def refreshMountpoints(self): - self.mountpoints = [p.mountpoint + "/" for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"] + self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"] self.mountpoints.sort(key = lambda x: -len(x)) def checkChangedMountpoints(self): diff --git a/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml b/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml old mode 100644 new mode 100755 index 23edc8e5..1431caf4 --- a/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml +++ b/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml @@ -8,7 +8,7 @@ enigma2-plugin-extensions-cutlisteditor CutListEditor allows you to edit your movies. CutListEditor allows you to edit your movies.\nSeek to the start of the stuff you want to cut away. Press OK, select 'start cut'.\nThen seek to the end, press OK, select 'end cut'. That's it. - + Dream Multimedia @@ -17,7 +17,7 @@ Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden. Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden.\nSpulen Sie zum Anfang des zu schneidenden Teils der Aufnahme. Drücken Sie dann OK und wählen Sie: 'start cut'.\nDann spulen Sie zum Ende, drücken OK und wählen 'end cut'. Das ist alles. - + diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py index 75663462..0627df3b 100644 --- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py +++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py @@ -7,9 +7,10 @@ from Components.ActionMap import HelpableActionMap from Components.MultiContent import MultiContentEntryText from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase from Components.VideoWindow import VideoWindow +from Components.Label import Label from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport from Components.GUIComponent import GUIComponent -from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService, RT_HALIGN_RIGHT +from enigma import eListboxPythonMultiContent, eListbox, getDesktop, gFont, iPlayableService, RT_HALIGN_RIGHT from Screens.FixedMenu import FixedMenu from Screens.HelpMenu import HelpableScreen from ServiceReference import ServiceReference @@ -119,12 +120,13 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He Name - + Position,Detailed - - - + + + + {"template": [ MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)), @@ -161,8 +163,12 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He self["Timeline"] = ServicePositionGauge(self.session.nav) self["cutlist"] = List(self.getCutlist()) self["cutlist"].onSelectionChanged.append(self.selectionChanged) + self["SeekState"] = Label() + self.onPlayStateChanged.append(self.updateStateLabel) + self.updateStateLabel(self.seekstate) - self["Video"] = VideoWindow(decoder = 0) + desktopSize = getDesktop(0).size() + self["Video"] = VideoWindow(decoder = 0, fb_width=desktopSize.width(), fb_height=desktopSize.height()) self["actions"] = HelpableActionMap(self, "CutListEditorActions", { @@ -184,12 +190,16 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He }) # to track new entries we save the last version of the cutlist - self.last_cuts = [ ] + self.last_cuts = self.getCutlist() self.cut_start = None + self.inhibit_seek = False self.onClose.append(self.__onClose) def __onClose(self): - self.session.nav.playService(self.old_service) + self.session.nav.playService(self.old_service, forceRestart=True) + + def updateStateLabel(self, state): + self["SeekState"].setText(state[3].strip()) def showTutorial(self): if not self.tutorial_seen: @@ -238,44 +248,46 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He return r def selectionChanged(self): - where = self["cutlist"].getCurrent() - if where is None: - print "no selection" - return - pts = where[0][0] - seek = self.getSeek() - if seek is None: - print "no seek" - return - seek.seekTo(pts) + if not self.inhibit_seek: + where = self["cutlist"].getCurrent() + if where is None: + print "no selection" + return + pts = where[0][0] + seek = self.getSeek() + if seek is None: + print "no seek" + return + seek.seekTo(pts) def refillList(self): print "cue sheet changed, refilling" self.downloadCuesheet() - # get the first changed entry, and select it + # get the first changed entry, counted from the end, and select it new_list = self.getCutlist() self["cutlist"].list = new_list - for i in range(min(len(new_list), len(self.last_cuts))): - if new_list[i] != self.last_cuts[i]: - self["cutlist"].setIndex(i) + l1 = len(new_list) + l2 = len(self.last_cuts) + for i in range(min(l1, l2)): + if new_list[l1-i-1] != self.last_cuts[l2-i-1]: + self["cutlist"].setIndex(l1-i-1) break self.last_cuts = new_list def getStateForPosition(self, pos): - state = 0 # in - - # when first point is "in", the beginning is "out" - if len(self.cut_list) and self.cut_list[0][1] == 0: - state = 1 - + state = -1 for (where, what) in self.cut_list: - if where < pos: - if what == 0: # in - state = 0 - elif what == 1: # out + if what in [0, 1]: + if where < pos: + state = what + elif where == pos: state = 1 + elif state == -1: + state = 1 - what + if state == -1: + state = 0 return state def showMenu(self): @@ -329,11 +341,11 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He in_after = None for (where, what) in self.cut_list: - if what == 1 and where < self.context_position: # out + if what == 1 and where <= self.context_position: # out out_before = (where, what) elif what == 0 and where < self.context_position: # in, before out out_before = None - elif what == 0 and where > self.context_position and in_after is None: + elif what == 0 and where >= self.context_position and in_after is None: in_after = (where, what) if out_before is not None: @@ -341,12 +353,16 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He if in_after is not None: self.cut_list.remove(in_after) + self.inhibit_seek = True self.uploadCuesheet() + self.inhibit_seek = False elif result == CutListContextMenu.RET_MARK: self.__addMark() elif result == CutListContextMenu.RET_DELETEMARK: self.cut_list.remove(self.context_nearest_mark) + self.inhibit_seek = True self.uploadCuesheet() + self.inhibit_seek = False elif result == CutListContextMenu.RET_REMOVEBEFORE: # remove in/out marks before current position for (where, what) in self.cut_list[:]: @@ -354,7 +370,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He self.cut_list.remove((where, what)) # add 'in' point bisect.insort(self.cut_list, (self.context_position, 0)) + self.inhibit_seek = True self.uploadCuesheet() + self.inhibit_seek = False elif result == CutListContextMenu.RET_REMOVEAFTER: # remove in/out marks after current position for (where, what) in self.cut_list[:]: @@ -362,7 +380,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He self.cut_list.remove((where, what)) # add 'out' point bisect.insort(self.cut_list, (self.context_position, 1)) + self.inhibit_seek = True self.uploadCuesheet() + self.inhibit_seek = False elif result == CutListContextMenu.RET_GRABFRAME: self.grabFrame() diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py index 83672460..7f755db4 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py @@ -1,5 +1,7 @@ from Tools.Directories import fileExists from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigSubList +import DVDTitle +import xml.dom.minidom class ConfigColor(ConfigSequence): def __init__(self, default = [128,128,128]): @@ -10,7 +12,10 @@ class ConfigFilename(ConfigText): ConfigText.__init__(self, default = "", fixed_size = True, visible_width = False) def getMulti(self, selected): - filename = (self.text.rstrip("/").rsplit("/",1))[1].encode("utf-8")[:40] + " " + if self.text == "": + return ("mtext"[1-selected:], "", 0) + cut_len = min(len(self.text),40) + filename = (self.text.rstrip("/").rsplit("/",1))[1].encode("utf-8")[:cut_len] + " " if self.allmarked: mark = range(0, len(filename)) else: @@ -34,10 +39,11 @@ class DVDProject: self.settings.vmgm = ConfigFilename() self.filekeys = ["vmgm", "isopath", "menutemplate"] self.menutemplate = MenuTemplate() + self.error = "" + self.session = None def addService(self, service): - import DVDTitle - title = DVDTitle.DVDTitle() + title = DVDTitle.DVDTitle(self) title.addService(service) self.titles.append(title) return title @@ -100,47 +106,78 @@ class DVDProject: return ret def loadProject(self, filename): - import xml.dom.minidom - try: + #try: if not fileExists(filename): self.error = "xml file not found!" - raise AttributeError - else: - self.error = "" + #raise AttributeError file = open(filename, "r") data = file.read().decode("utf-8").replace('&',"&").encode("ascii",'xmlcharrefreplace') file.close() projectfiledom = xml.dom.minidom.parseString(data) - for project in projectfiledom.childNodes[0].childNodes: - if project.nodeType == xml.dom.minidom.Element.nodeType: - if project.tagName == 'settings': - i = 0 - if project.attributes.length < len(self.settings.dict())-1: - self.error = "project attributes missing" - raise AttributeError - while i < project.attributes.length: - item = project.attributes.item(i) - key = item.name.encode("utf-8") - try: - val = eval(item.nodeValue) - except (NameError, SyntaxError): - val = item.nodeValue.encode("utf-8") - try: - self.settings.dict()[key].setValue(val) - except (KeyError): - self.error = "unknown attribute '%s'" % (key) - raise AttributeError - i += 1 + for node in projectfiledom.childNodes[0].childNodes: + print "node:", node + if node.nodeType == xml.dom.minidom.Element.nodeType: + if node.tagName == 'settings': + self.xmlAttributesToConfig(node, self.settings) + elif node.tagName == 'titles': + self.xmlGetTitleNodeRecursive(node) + for key in self.filekeys: val = self.settings.dict()[key].getValue() if not fileExists(val): self.error += "\n%s '%s' not found" % (key, val) - if len(self.error): - raise AttributeError + #except AttributeError: + #print "loadProject AttributeError", self.error + #self.error += (" in project '%s'") % (filename) + #return False + return True + + def xmlAttributesToConfig(self, node, config): + try: + i = 0 + #if node.attributes.length < len(config.dict())-1: + #self.error = "project attributes missing" + #raise AttributeError + while i < node.attributes.length: + item = node.attributes.item(i) + key = item.name.encode("utf-8") + try: + val = eval(item.nodeValue) + except (NameError, SyntaxError): + val = item.nodeValue.encode("utf-8") + try: + print "config[%s].setValue(%s)" % (key, val) + config.dict()[key].setValue(val) + except (KeyError): + self.error = "unknown attribute '%s'" % (key) + print "KeyError", self.error + raise AttributeError + i += 1 except AttributeError: - self.error += (" in project '%s'") % (filename) + self.error += (" XML attribute error '%s'") % node.toxml() return False - return True + + def xmlGetTitleNodeRecursive(self, node, title_idx = -1): + print "[xmlGetTitleNodeRecursive]", title_idx, node + print node.childNodes + for subnode in node.childNodes: + print "xmlGetTitleNodeRecursive subnode:", subnode + if subnode.nodeType == xml.dom.minidom.Element.nodeType: + if subnode.tagName == 'title': + title_idx += 1 + title = DVDTitle.DVDTitle(self) + self.titles.append(title) + self.xmlGetTitleNodeRecursive(subnode, title_idx) + if subnode.tagName == 'path': + print "path:", subnode.firstChild.data + filename = subnode.firstChild.data + self.titles[title_idx].addFile(filename.encode("utf-8")) + if subnode.tagName == 'properties': + self.xmlAttributesToConfig(node, self.titles[title_idx].properties) + if subnode.tagName == 'audiotracks': + self.xmlGetTitleNodeRecursive(subnode, title_idx) + if subnode.tagName == 'audiotrack': + print "audiotrack...", subnode.toxml() def getSize(self): totalsize = 0 @@ -187,6 +224,7 @@ class MenuTemplate(DVDProject): self.filekeys = ["menubg", "menuaudio", "fontface_headline", "fontface_title", "fontface_subtitle"] from TitleProperties import languageChoices self.settings.menulang = ConfigSelection(choices = languageChoices.choices, default=languageChoices.choices[1][0]) + self.error = "" def loadTemplate(self, filename): ret = DVDProject.loadProject(self, filename) diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py index 660005e6..6dff00d6 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py @@ -1,4 +1,5 @@ from Components.config import config, ConfigSubsection, ConfigSubList, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigYesNo +import TitleCutter class ConfigFixedText(ConfigText): def __init__(self, text, visible_width=60): @@ -7,17 +8,17 @@ class ConfigFixedText(ConfigText): pass class DVDTitle: - def __init__(self): + def __init__(self, project): self.properties = ConfigSubsection() self.properties.menutitle = ConfigText(fixed_size = False, visible_width = 80) self.properties.menusubtitle = ConfigText(fixed_size = False, visible_width = 80) - self.DVBname = _("Title") - self.DVBdescr = _("Description") - self.DVBchannel = _("Channel") self.properties.aspect = ConfigSelection(choices = [("4:3", _("4:3")), ("16:9", _("16:9"))]) self.properties.widescreen = ConfigSelection(choices = [("nopanscan", "nopanscan"), ("noletterbox", "noletterbox")]) self.properties.autochapter = ConfigInteger(default = 0, limits = (0, 60)) self.properties.audiotracks = ConfigSubList() + self.DVBname = _("Title") + self.DVBdescr = _("Description") + self.DVBchannel = _("Channel") self.cuesheet = [ ] self.source = None self.filesize = 0 @@ -27,6 +28,8 @@ class DVDTitle: self.chaptermarks = [ ] self.timeCreate = None self.VideoType = -1 + self.project = project + self.length = 0 def addService(self, service): from os import path @@ -36,7 +39,7 @@ class DVDTitle: self.source = service serviceHandler = eServiceCenter.getInstance() info = serviceHandler.info(service) - sDescr = info and " " + info.getInfoString(service, iServiceInformation.sDescription) or "" + sDescr = info and info.getInfoString(service, iServiceInformation.sDescription) or "" self.DVBdescr = sDescr sTimeCreate = info.getInfo(service, iServiceInformation.sTimeCreate) if sTimeCreate > 1: @@ -49,9 +52,20 @@ class DVDTitle: self.filesize = path.getsize(self.inputfile) self.estimatedDiskspace = self.filesize self.length = info.getLength(service) + + def addFile(self, filename): + from enigma import eServiceReference + ref = eServiceReference(1, 0, filename) + self.addService(ref) + self.project.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, self) + + def titleEditDone(self, cutlist): + self.initDVDmenuText(len(self.project.titles)) + self.cuesheet = cutlist + self.produceFinalCuesheet() - def initDVDmenuText(self, project, track): - s = project.menutemplate.settings + def initDVDmenuText(self, track): + s = self.project.menutemplate.settings self.properties.menutitle.setValue(self.formatDVDmenuText(s.titleformat.getValue(), track)) self.properties.menusubtitle.setValue(self.formatDVDmenuText(s.subtitleformat.getValue(), track)) diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 44075d64..b64541b6 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -5,7 +5,7 @@ from Screens.MessageBox import MessageBox class png2yuvTask(Task): def __init__(self, job, inputfile, outputfile): Task.__init__(self, job, "Creating menu video") - self.setTool("/usr/bin/png2yuv") + self.setTool("png2yuv") self.args += ["-n1", "-Ip", "-f25", "-j", inputfile] self.dumpFile = outputfile self.weighting = 15 @@ -21,7 +21,7 @@ class png2yuvTask(Task): class mpeg2encTask(Task): def __init__(self, job, inputfile, outputfile): Task.__init__(self, job, "Encoding menu video") - self.setTool("/usr/bin/mpeg2enc") + self.setTool("mpeg2enc") self.args += ["-f8", "-np", "-a2", "-o", outputfile] self.inputFile = inputfile self.weighting = 25 @@ -36,7 +36,7 @@ class mpeg2encTask(Task): class spumuxTask(Task): def __init__(self, job, xmlfile, inputfile, outputfile): Task.__init__(self, job, "Muxing buttons into menu") - self.setTool("/usr/bin/spumux") + self.setTool("spumux") self.args += [xmlfile] self.inputFile = inputfile self.dumpFile = outputfile @@ -54,7 +54,7 @@ class spumuxTask(Task): class MakeFifoNode(Task): def __init__(self, job, number): Task.__init__(self, job, "Make FIFO nodes") - self.setTool("/bin/mknod") + self.setTool("mknod") nodename = self.job.workspace + "/dvd_title_%d" % number + ".mpg" self.args += [nodename, "p"] self.weighting = 10 @@ -62,14 +62,14 @@ class MakeFifoNode(Task): class LinkTS(Task): def __init__(self, job, sourcefile, link_name): Task.__init__(self, job, "Creating symlink for source titles") - self.setTool("/bin/ln") + self.setTool("ln") self.args += ["-s", sourcefile, link_name] self.weighting = 10 class CopyMeta(Task): def __init__(self, job, sourcefile): Task.__init__(self, job, "Copy title meta files") - self.setTool("/bin/cp") + self.setTool("cp") from os import listdir path, filename = sourcefile.rstrip("/").rsplit("/",1) tsfiles = listdir(path) @@ -84,7 +84,7 @@ class DemuxTask(Task): Task.__init__(self, job, "Demux video into ES") title = job.project.titles[job.i] self.global_preconditions.append(DiskspacePrecondition(title.estimatedDiskspace)) - self.setTool("/usr/bin/projectx") + self.setTool("projectx") self.args += [inputfile, "-demux", "-out", self.job.workspace ] self.end = 300 self.prog_state = 0 @@ -194,7 +194,7 @@ class MplexTask(Task): self.weighting = weighting self.demux_task = demux_task self.postconditions.append(MplexTaskPostcondition()) - self.setTool("/usr/bin/mplex") + self.setTool("mplex") self.args += ["-f8", "-o", outputfile, "-v1"] if inputfiles: self.args += inputfiles @@ -222,7 +222,7 @@ class RemoveESFiles(Task): def __init__(self, job, demux_task): Task.__init__(self, job, "Remove temp. files") self.demux_task = demux_task - self.setTool("/bin/rm") + self.setTool("rm") self.weighting = 10 def prepare(self): @@ -234,7 +234,7 @@ class DVDAuthorTask(Task): def __init__(self, job): Task.__init__(self, job, "Authoring DVD") self.weighting = 20 - self.setTool("/usr/bin/dvdauthor") + self.setTool("dvdauthor") self.CWD = self.job.workspace self.args += ["-x", self.job.workspace+"/dvdauthor.xml"] self.menupreview = job.menupreview @@ -255,7 +255,7 @@ class DVDAuthorTask(Task): class DVDAuthorFinalTask(Task): def __init__(self, job): Task.__init__(self, job, "dvdauthor finalize") - self.setTool("/usr/bin/dvdauthor") + self.setTool("dvdauthor") self.args += ["-T", "-o", self.job.workspace + "/dvd"] class WaitForResidentTasks(Task): @@ -264,6 +264,7 @@ class WaitForResidentTasks(Task): def run(self, callback): print "waiting for %d resident task(s) %s to finish..." % (len(self.job.resident_tasks),str(self.job.resident_tasks)) + self.callback = callback if self.job.resident_tasks == 0: callback(self, []) @@ -291,7 +292,7 @@ class BurnTaskPostcondition(Condition): class BurnTask(Task): ERROR_NOTWRITEABLE, ERROR_LOAD, ERROR_SIZE, ERROR_WRITE_FAILED, ERROR_DVDROM, ERROR_ISOFS, ERROR_FILETOOLARGE, ERROR_ISOTOOLARGE, ERROR_MINUSRWBUG, ERROR_UNKNOWN = range(10) - def __init__(self, job, extra_args=[], tool="/bin/growisofs"): + def __init__(self, job, extra_args=[], tool="growisofs"): Task.__init__(self, job, job.name) self.weighting = 500 self.end = 120 # 100 for writing, 10 for buffer flush, 10 for closing disc @@ -356,7 +357,7 @@ class BurnTask(Task): class RemoveDVDFolder(Task): def __init__(self, job): Task.__init__(self, job, "Remove temp. files") - self.setTool("/bin/rm") + self.setTool("rm") self.args += ["-rf", self.job.workspace] self.weighting = 10 @@ -881,13 +882,13 @@ class DVDJob(Job): volName = self.project.settings.name.getValue() if output == "dvd": self.name = _("Burn DVD") - tool = "/bin/growisofs" + tool = "growisofs" burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat" ] if self.project.size/(1024*1024) > self.project.MAX_SL: burnargs += [ "-use-the-force-luke=4gms", "-speed=1", "-R" ] elif output == "iso": self.name = _("Create DVD-ISO") - tool = "/usr/bin/mkisofs" + tool = "genisoimage" isopathfile = getISOfilename(self.project.settings.isopath.getValue(), volName) burnargs = [ "-o", isopathfile ] burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, self.workspace + "/dvd" ] @@ -919,14 +920,14 @@ class DVDdataJob(Job): output = self.project.settings.output.getValue() volName = self.project.settings.name.getValue() - tool = "/bin/growisofs" + tool = "growisofs" if output == "dvd": self.name = _("Burn DVD") burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat" ] if self.project.size/(1024*1024) > self.project.MAX_SL: burnargs += [ "-use-the-force-luke=4gms", "-speed=1", "-R" ] elif output == "iso": - tool = "/usr/bin/mkisofs" + tool = "genisoimage" self.name = _("Create DVD-ISO") isopathfile = getISOfilename(self.project.settings.isopath.getValue(), volName) burnargs = [ "-o", isopathfile ] @@ -958,5 +959,5 @@ class DVDisoJob(Job): if getSize(imagepath)/(1024*1024) > self.project.MAX_SL: burnargs += [ "-use-the-force-luke=4gms", "-speed=1", "-R" ] burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, imagepath ] - tool = "/bin/growisofs" + tool = "growisofs" BurnTask(self, burnargs, tool) diff --git a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py index c4289cb0..39d7277e 100755 --- a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py +++ b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py @@ -8,7 +8,6 @@ from Components.Sources.List import List from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress from Components.FileList import FileList -from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS, SCOPE_HDD from Components.config import config, getConfigListEntry from Components.ConfigList import ConfigListScreen @@ -93,10 +92,10 @@ class ProjectSettings(Screen,ConfigListScreen): - - - - + + + + @@ -234,11 +233,19 @@ class ProjectSettings(Screen,ConfigListScreen): else: self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR) elif scope == "project": - if self.project.loadProject(path): - configRef.setValue(path) - self.initConfigList() + self.path = path + print "len(self.titles)", len(self.project.titles) + if len(self.project.titles): + self.session.openWithCallback(self.askLoadCB, MessageBox,text = _("Your current collection will get lost!") + "\n" + _("Do you want to restore your settings?"), type = MessageBox.TYPE_YESNO) else: - self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR) + self.askLoadCB(True) elif scope: configRef.setValue(path) self.initConfigList() + + def askLoadCB(self, answer): + if answer is not None and answer: + if self.project.loadProject(self.path): + self.initConfigList() + else: + self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR) \ No newline at end of file diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py index 61152e8a..a52fad9f 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py @@ -52,13 +52,35 @@ class TitleCutter(CutListEditor): CutListEditor.grabFrame(self) def exit(self): + if self.t.VideoType == -1: + self.getPMTInfo() self.checkAndGrabThumb() self.session.nav.stopService() self.close(self.cut_list[:]) class CutlistReader(TitleCutter): + skin = """ + + + + + + + {"template": [ + MultiContentEntryText(text = 1), + MultiContentEntryText(text = 2) + ], + "fonts": [gFont("Regular", 18)], + "itemHeight": 20 + } + + + + """ + def __init__(self, session, t): TitleCutter.__init__(self, session, t) + self.skin = CutlistReader.skin def getPMTInfo(self): TitleCutter.getPMTInfo(self) diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py index 928a8b82..ac60906b 100755 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py @@ -10,27 +10,47 @@ from Components.ActionMap import HelpableActionMap, ActionMap from Components.Sources.List import List from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress -from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT +from Components.MultiContent import MultiContentEntryText +from Components.Label import MultiColorLabel +from enigma import gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT from Tools.Directories import resolveFilename, SCOPE_PLUGINS class TitleList(Screen, HelpableScreen): skin = """ - + - - - - + + + + - - - + + + + {"template": [ + MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title, + MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description, + MultiContentEntryText(pos = (418, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 channel, + MultiContentEntryText(pos = (326, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 begin time, + MultiContentEntryText(pos = (480, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 5 duration, + ], + "fonts": [gFont("Regular", 20), gFont("Regular", 14)], + "itemHeight": 37 + } + - - + + + + + + + + + """ def __init__(self, session, project = None): @@ -63,17 +83,19 @@ class TitleList(Screen, HelpableScreen): self["title_label"] = StaticText() self["error_label"] = StaticText() - self["space_label"] = StaticText() - self["space_bar"] = Progress() - + self["space_label_single"] = StaticText() + self["space_label_dual"] = StaticText() + self["hint"] = StaticText(_("Advanced Options")) + self["medium_label"] = MultiColorLabel() + self["space_bar_single"] = Progress() + self["space_bar_dual"] = Progress() + + self["titles"] = List([]) + self.previous_size = 0 if project is not None: self.project = project else: self.newProject() - - self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)]) - self.updateTitleList() - self.previous_size = 0 self.onLayoutFinish.append(self.layoutFinished) def layoutFinished(self): @@ -95,15 +117,16 @@ class TitleList(Screen, HelpableScreen): j = self.backgroundJob menu.append(("%s: %s (%d%%)" % (j.getStatustext(), j.name, int(100*j.progress/float(j.end))), self.showBackgroundJob)) menu.append((_("DVD media toolbox"), self.toolbox)) - menu.append((_("Preview menu"), self.previewMenu)) if self.project.settings.output.getValue() == "dvd": if len(self["titles"].list): menu.append((_("Burn DVD"), self.burnProject)) elif self.project.settings.output.getValue() == "iso": menu.append((_("Create DVD-ISO"), self.burnProject)) menu.append((_("Burn existing image to DVD"), self.selectImage)) - menu.append((_("Edit chapters of current title"), self.editTitle)) - menu.append((_("Reset and renumerate title names"), self.resetTitles)) + if len(self["titles"].list): + menu.append((_("Preview menu"), self.previewMenu)) + menu.append((_("Edit chapters of current title"), self.editTitle)) + menu.append((_("Reset and renumerate title names"), self.resetTitles)) menu.append((_("Exit"), self.leave)) self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) @@ -137,9 +160,9 @@ class TitleList(Screen, HelpableScreen): - - - + + + @@ -185,9 +208,12 @@ class TitleList(Screen, HelpableScreen): self.close(current) self.session.openWithCallback(self.selectedSource, DVDMovieSelection) - def selectedSource(self, source): + def selectedSource(self, source = None): if source is None: return None + if not source.getPath().endswith(".ts"): + self.session.open(MessageBox,text = _("You can only burn Dreambox recordings!"), type = MessageBox.TYPE_ERROR) + return None t = self.project.addService(source) try: editor = source.edit @@ -213,7 +239,7 @@ class TitleList(Screen, HelpableScreen): def settingsCB(self, update=True): if not update: return - self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":" + self.updateTitleList() def loadTemplate(self): filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVD.ddvdp.xml" @@ -256,20 +282,21 @@ class TitleList(Screen, HelpableScreen): job = Process.DVDJob(self.project, menupreview=True) job_manager.in_background = False job_manager.AddJob(job) - + def updateTitleList(self): - res = [ ] + list = [ ] for title in self.project.titles: - a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 5, 500, 25, 0, RT_HALIGN_LEFT, title.properties.menutitle.getValue()) ] - res.append(a) - self["titles"].list = res + list.append((title, title.properties.menutitle.getValue(), title.properties.menusubtitle.getValue(), title.DVBchannel, title.formatDVDmenuText("$D.$M.$Y, $T", 0), title.formatDVDmenuText("$l", 0))) + self["titles"].list = list self.updateSize() - if len(res): + if len(list): self["key_red"].text = _("Remove title") self["key_yellow"].text = _("Title properties") + self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":" else: self["key_red"].text = "" self["key_yellow"].text = "" + self["title_label"].text = _("Please add titles to the compilation") def updateSize(self): size = self.project.size/(1024*1024) @@ -278,20 +305,32 @@ class TitleList(Screen, HelpableScreen): print "updateSize:", size, "MAX_DL:", MAX_DL, "MAX_SL:", MAX_SL if size > MAX_DL: percent = 100 * size / float(MAX_DL) - self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")" - self["space_bar"].value = int(percent) + self["space_label_dual"].text = "%d MB (%.2f%%)" % (size, percent) + self["space_bar_dual"].value = int(percent) + self["space_bar_single"].value = 100 + self["space_label_single"].text = "" + self["medium_label"].setText(_("exceeds dual layer medium!")) + self["medium_label"].setForegroundColorNum(2) if self.previous_size < MAX_DL: self.session.open(MessageBox,text = _("exceeds dual layer medium!"), type = MessageBox.TYPE_ERROR) elif size > MAX_SL: percent = 100 * size / float(MAX_DL) - self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")" - self["space_bar"].value = int(percent) + self["space_label_dual"].text = "%d MB (%.2f%%)" % (size, percent) + self["space_bar_dual"].value = int(percent) + self["space_bar_single"].value = 100 + self["space_label_single"].text = "" + self["medium_label"].setText(_("required medium type:") + " " + _("DUAL LAYER DVD") + ", %d MB " % (MAX_DL - size) + _("free")) + self["medium_label"].setForegroundColorNum(1) if self.previous_size < MAX_SL: - self.session.open(MessageBox,text = _("Your collection exceeds the size of a single layer medium, you will need a blank dual layer DVD!"), type = MessageBox.TYPE_INFO) + self.session.open(MessageBox, text = _("Your collection exceeds the size of a single layer medium, you will need a blank dual layer DVD!"), timeout = 10, type = MessageBox.TYPE_INFO) elif size < MAX_SL: percent = 100 * size / float(MAX_SL) - self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")" - self["space_bar"].value = int(percent) + self["space_label_single"].text = "%d MB (%.2f%%)" % (size, percent) + self["space_bar_single"].value = int(percent) + self["space_bar_dual"].value = 0 + self["space_label_dual"].text = "" + self["medium_label"].setText(_("required medium type:") + " " + _("SINGLE LAYER DVD") + ", %d MB " % (MAX_SL - size) + _("free")) + self["medium_label"].setForegroundColorNum(0) self.previous_size = size def getCurrentTitle(self): @@ -309,9 +348,7 @@ class TitleList(Screen, HelpableScreen): def titleEditDone(self, cutlist): t = self.current_edit_title - t.initDVDmenuText(self.project,len(self.project.titles)) - t.cuesheet = cutlist - t.produceFinalCuesheet() + t.titleEditDone(cutlist) if t.VideoType != 0: self.session.openWithCallback(self.DVDformatCB,MessageBox,text = _("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?"), type = MessageBox.TYPE_YESNO) else: @@ -321,7 +358,7 @@ class TitleList(Screen, HelpableScreen): count = 0 for title in self.project.titles: count += 1 - title.initDVDmenuText(self.project,count) + title.initDVDmenuText(count) self.updateTitleList() def DVDformatCB(self, answer): @@ -332,5 +369,13 @@ class TitleList(Screen, HelpableScreen): else: self.removeTitle(t) - def leave(self): - self.close() + def leave(self, close = False): + if not len(self["titles"].list) or close: + self.close() + else: + self.session.openWithCallback(self.exitCB, MessageBox,text = _("Your current collection will get lost!") + "\n" + _("Do you really want to exit?"), type = MessageBox.TYPE_YESNO) + + def exitCB(self, answer): + print "exitCB", answer + if answer is not None and answer: + self.close() \ No newline at end of file diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py b/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py index 11601cc3..956f054d 100755 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py @@ -9,7 +9,7 @@ from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress from Components.FileList import FileList from Components.Pixmap import Pixmap -from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, ePicLoad +from enigma import ePicLoad from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS, SCOPE_HDD from Components.config import config, getConfigListEntry, ConfigInteger, ConfigSubsection, ConfigSelection from Components.ConfigList import ConfigListScreen @@ -21,10 +21,12 @@ class TitleProperties(Screen,ConfigListScreen): + - - - + + + + @@ -38,7 +40,8 @@ class TitleProperties(Screen,ConfigListScreen): self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("OK")) - self["key_blue"] = StaticText(_("Edit Title")) + self["key_yellow"] = StaticText(_("Edit Title")) + self["key_blue"] = StaticText() self["serviceinfo"] = StaticText() self["thumbnail"] = Pixmap() @@ -57,7 +60,7 @@ class TitleProperties(Screen,ConfigListScreen): { "green": self.exit, "red": self.cancel, - "blue": self.editTitle, + "yellow": self.editTitle, "cancel": self.cancel, "ok": self.ok, }, -2) @@ -164,7 +167,8 @@ class LanguageChoices(): self.choices.sort() self.choices.insert(0,("nolang", ("unspecified"))) self.choices.insert(1,(syslang, self.langdict[syslang])) - self.choices.insert(2,("en", self.langdict["en"])) + if syslang != "en": + self.choices.insert(2,("en", self.langdict["en"])) def getLanguage(self, DVB_lang): DVB_lang = DVB_lang.lower() diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am b/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am index 1899cb71..0b3be7d6 100755 --- a/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am +++ b/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am @@ -1,3 +1,5 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_dvdburn.xml + +EXTRA_DIST = dvdburn_de.jpg dvdburn_en.jpg diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg new file mode 100755 index 00000000..44729712 Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg differ diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg new file mode 100755 index 00000000..509816d0 Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg differ diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml b/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml old mode 100644 new mode 100755 index 79715397..647d1cfd --- a/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml +++ b/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml @@ -9,6 +9,7 @@ enigma2-plugin-extensions-dvdburn With DVDBurn you can burn your recordings to a dvd. With DVDBurn you can burn your recordings to a dvd.\nArchive all your favorite movies to recordable dvds with menus if wanted. + Dream Multimedia @@ -16,6 +17,7 @@ enigma2-plugin-extensions-dvdburn Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD. Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD.\nArchivieren Sie Ihre Liblingsfilme auf DVD mit Menus wenn Sie es wünschen. + diff --git a/lib/python/Plugins/Extensions/DVDBurn/plugin.py b/lib/python/Plugins/Extensions/DVDBurn/plugin.py index 45f438da..bd856b47 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/plugin.py +++ b/lib/python/Plugins/Extensions/DVDBurn/plugin.py @@ -12,6 +12,6 @@ def main_add(session, service, **kwargs): dvdburn.selectedSource(service) def Plugins(**kwargs): - descr = _("Burn to DVD...") + descr = _("Burn to DVD") return [PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_MOVIELIST, fnc=main_add, icon="dvdburn.png"), PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main, icon="dvdburn.png") ] diff --git a/lib/python/Plugins/Extensions/DVDPlayer/Makefile.am b/lib/python/Plugins/Extensions/DVDPlayer/Makefile.am index d1a995ca..71ea7142 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/Makefile.am +++ b/lib/python/Plugins/Extensions/DVDPlayer/Makefile.am @@ -4,7 +4,6 @@ SUBDIRS = src meta installdir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer install_PYTHON = \ - src/servicedvd.so \ __init__.py \ plugin.py \ keymap.xml \ diff --git a/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml b/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml old mode 100644 new mode 100755 index 26581383..1353f7d2 --- a/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml +++ b/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml @@ -8,7 +8,7 @@ enigma2-plugin-extensions-dvdplayer DVDPlayer plays your DVDs on your Dreambox. DVDPlayer plays your DVDs on your Dreambox.\nWith the DVDPlayer you can play your DVDs on your Dreambox from a DVD or even from an iso file or video_ts folder on your harddisc or network. - + Dream Multimedia @@ -17,7 +17,7 @@ Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab. Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab.\nMit dem DVDPlayer können Sie Ihre DVDs auf Ihrer Dreambox abspielen. Dabei ist es egal ob Sie von DVD, iso-Datei oder sogar direkt von einer video_ts Ordnerstruktur von Ihrer Festplatte oder dem Netzwerk abspielen. - + diff --git a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py index e895a141..e092e82f 100755 --- a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py @@ -93,7 +93,7 @@ class DVDSummary(Screen): Name - + Position @@ -736,6 +736,7 @@ def filescan(**kwargs): paths_to_scan = [ ScanPath(path = "video_ts", with_subdirs = False), + ScanPath(path = "VIDEO_TS", with_subdirs = False), ScanPath(path = "", with_subdirs = False), ], name = "DVD", diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am b/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am index 774871e8..27c751cf 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am @@ -2,6 +2,11 @@ OBJS := servicedvd.cpp -include $(OBJS:.cpp=.d) +installdir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer + +install_PYTHON = \ + servicedvd.so + servicedvd.so: $(CXX) $(CPPFLAGS) -MD $(CXXFLAGS) $(DEFS) -I$(top_srcdir)/include \ -Wall -W $(OBJS) -shared -fPIC -Wl,-soname,servicedvd.so -o servicedvd.so \ diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp index 94f2ee38..2ba53927 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp @@ -85,12 +85,9 @@ RESULT eServiceFactoryDVD::offlineOperations(const eServiceReference &, ePtreenigma2-plugin-extensions-graphmultiepg GraphMultiEPG shows a graphical timeline EPG. GraphMultiEPG shows a graphical timeline EPG.\nShows a nice overview of all running und upcoming tv shows. - + Dream Multimedia @@ -18,7 +18,7 @@ Zeigt ein grafisches Zeitlinien-EPG. Zeigt ein grafisches Zeitlinien-EPG.\nZeigt eine grafische Übersicht aller laufenden und kommenden Sendungen. - + diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg old mode 100644 new mode 100755 index 4396161f..41a67c24 Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg differ diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg old mode 100644 new mode 100755 index e1d35751..6bfbbc5e Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg differ diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml b/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml old mode 100644 new mode 100755 index 825793f2..2f9f22bf --- a/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml +++ b/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml @@ -8,7 +8,7 @@ enigma2-plugin-extensions-mediaplayer Mediaplayer plays your favorite music and videos. Mediaplayer plays your favorite music and videos.\nPlay all your favorite music and video files, organize them in playlists, view cover and album information. - + Dream Multimedia @@ -17,7 +17,7 @@ Mediaplayer spielt Ihre Musik und Videos. Mediaplayer spielt Ihre Musik und Videos.\nSie können all Ihre Musik- und Videodateien abspielen, in Playlisten organisieren, Cover und Albuminformationen abrufen. - + diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py old mode 100644 new mode 100755 index 98bc060c..0fc78fb1 --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -19,7 +19,7 @@ from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS from Components.AVSwitch import AVSwitch from Components.Harddisk import harddiskmanager from Components.config import config -from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_SKIN_IMAGE +from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_CURRENT_SKIN from settings import MediaPlayerSettings import random @@ -50,7 +50,7 @@ class MediaPixmap(Pixmap): noCoverFile = value break if noCoverFile is None: - noCoverFile = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png") + noCoverFile = resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/no_coverArt.png") self.noCoverPixmap = LoadPixmap(noCoverFile) return Pixmap.applySkin(self, desktop, screen) @@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB # 'None' is magic to start at the list of mountpoints defaultDir = config.mediaplayer.defaultDir.getValue() - self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") + self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am b/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am index e2aa0e3b..d80b8c27 100755 --- a/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am +++ b/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am @@ -1,3 +1,5 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_mediascanner.xml + +EXTRA_DIST = mediascanner_de.jpg mediascanner_en.jpg diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg new file mode 100755 index 00000000..e6a191cd Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg differ diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg new file mode 100755 index 00000000..b9561c2f Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg differ diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml b/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml old mode 100644 new mode 100755 index d899fdb8..eced924f --- a/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml +++ b/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml @@ -9,6 +9,7 @@ enigma2-plugin-extensions-mediascanner MediaScanner scans devices for playable media files. MediaScanner scans devices for playable media files and displays a menu with possible actions like viewing pictures or playing movies. + Dream Multimedia @@ -17,6 +18,7 @@ MediaScanner durchsucht Geräte nach Mediendateien. MediaScanner durchsucht Geräte nach Mediendateien und bietet Ihnen die dazu passenden Aktionen an wie z.B. Bilder betrachten oder Videos abspielen. + diff --git a/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml b/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml old mode 100644 new mode 100755 index 40e59b6c..faff9785 --- a/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml +++ b/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml @@ -8,7 +8,7 @@ enigma2-plugin-extensions-pictureplayer PicturePlayer displays your photos on the TV. The PicturePlayer displays your photos on the TV.\nYou can view them as thumbnails or slideshow. - + Dream Multimedia @@ -17,7 +17,7 @@ Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an. Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an.\nSie können sich Ihre Bilder als Thumbnails, einzeln oder als Slideshow anzeigen lassen. - + diff --git a/lib/python/Plugins/Extensions/SocketMMI/Makefile.am b/lib/python/Plugins/Extensions/SocketMMI/Makefile.am index 808d8520..2af2c39b 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/Makefile.am +++ b/lib/python/Plugins/Extensions/SocketMMI/Makefile.am @@ -3,7 +3,6 @@ SUBDIRS = src meta installdir = $(pkglibdir)/python/Plugins/Extensions/SocketMMI install_PYTHON = \ - src/socketmmi.so \ __init__.py \ plugin.py \ SocketMMI.py diff --git a/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am b/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am index ad97d672..8e80e183 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am +++ b/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am @@ -2,6 +2,11 @@ OBJS = socket_mmi.cpp -include $(OBJS:.cpp=.d) +installdir = $(pkglibdir)/python/Plugins/Extensions/SocketMMI + +install_PYTHON = \ + socketmmi.so + socketmmi.so: socket_mmi.cpp socket_mmi.h $(CXX) $(CPPFLAGS) -MD $(CXXFLAGS) $(DEFS) -I$(top_srcdir)/include \ -Wall -W $(OBJS) -shared -fPIC -Wl,-soname,socketmmi.so -o socketmmi.so \ diff --git a/lib/python/Plugins/Plugin.py b/lib/python/Plugins/Plugin.py index d7fc6898..5a676cda 100755 --- a/lib/python/Plugins/Plugin.py +++ b/lib/python/Plugins/Plugin.py @@ -52,6 +52,15 @@ class PluginDescriptor: # reason (True: Networkconfig read finished, False: Networkconfig reload initiated ) WHERE_NETWORKCONFIG_READ = 12 + WHERE_AUDIOMENU = 13 + + # fnc 'SoftwareSupported' or 'AdvancedSoftwareSupported' must take a parameter and return None + # if the plugin should not be displayed inside Softwaremanger or return a function which is called with session + # and 'None' as parameter to call the plugin from the Softwaremanager menus. "menuEntryName" and "menuEntryDescription" + # should be provided to name and describe the new menu entry. + WHERE_SOFTWAREMANAGER = 14 + + def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None, wakeupfnc = None, internal = False): self.name = name self.internal = internal diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am index 94be4747..d9d96bcf 100755 --- a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am @@ -1,3 +1,5 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_cleanupwizard.xml + +EXTRA_DIST = cleanupwizard_de.jpg cleanupwizard_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg new file mode 100755 index 00000000..2f086fb8 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg new file mode 100755 index 00000000..d014cb5d Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml index 10ccc73c..99add3d3 100755 --- a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml +++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml @@ -10,6 +10,7 @@ The CleanupWizard informs you when your internal free memory of your dreambox has droppen under 2MB. You can use this wizard to remove some extensions. + Dream Multimedia @@ -19,6 +20,7 @@ Der CleanupWizard informiert Sie, wenn der interne freie Speicher Ihrer Dreambox unter 2MB fällt. Sie können dann einige Erweiterungen deinstallieren um wieder Platz zu schaffen. + diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py b/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py index 6667e3e3..f8677bb2 100755 --- a/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py +++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py @@ -122,7 +122,7 @@ def selSetup(menuid, **kwargs): if menuid != "system": return [ ] - return [(_("Cleanup Wizard settings") + "...", openconfig, "cleanup_config", 71)] + return [(_("Cleanup Wizard settings"), openconfig, "cleanup_config", 71)] def Plugins(**kwargs): list = [] diff --git a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg old mode 100644 new mode 100755 index 120ac827..75771f98 Binary files a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg and b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml old mode 100644 new mode 100755 index bb2bf590..9abc5986 --- a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml +++ b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml @@ -13,7 +13,7 @@ in your Dreambox and assign to each of them dedicated providers/services or caids.\n So it is then possible to watch a scrambled service while recording another one. - + Dream Multimedia @@ -24,7 +24,7 @@ So ist es möglich mit einem CI einen Sender aufzunehmen\n und mit einem anderen einen Sender zu schauen. - + diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am index b619c8c6..aed728db 100755 --- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am @@ -1,3 +1,5 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_crashlogautosubmit.xml + +EXTRA_DIST = crashlogautosubmit_de.jpg crashlogautosubmit_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg new file mode 100755 index 00000000..04894160 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg new file mode 100755 index 00000000..5e5c728b Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml old mode 100644 new mode 100755 index 261eb497..a118ed7f --- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml +++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml @@ -10,6 +10,7 @@ With the CrashlogAutoSubmit extension it is possible to automatically send crashlogs found on your Harddrive to Dream Multimedia + Dream Multimedia @@ -17,8 +18,9 @@ enigma2-plugin-systemplugins-crashlogautosubmit Automatisches versenden von Crashlogs an Dream Multimedia Mit dem CrashlogAutoSubmit Plugin ist es möglich auf Ihrer Festplatte - gefundene Crashlogs automatisch an Dream Multimedia zu versenden. + gefundene Crashlogs automatisch an Dream Multimedia zu versenden. + diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py index cf998a79..25639818 100755 --- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py +++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py @@ -391,7 +391,7 @@ def selSetup(menuid, **kwargs): if menuid != "system": return [ ] - return [(_("Crashlog settings") + "...", openconfig, "crashlog_config", 70)] + return [(_("Crashlog settings"), openconfig, "crashlog_config", 70)] def Plugins(**kwargs): diff --git a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg old mode 100644 new mode 100755 index a0fd3b1c..f4d0a1e2 Binary files a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg and b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml old mode 100644 new mode 100755 index bf0ce253..41d41ed6 --- a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml +++ b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml @@ -10,7 +10,7 @@ Scans default lamedbs sorted by satellite with a connected dish positioner. With the DefaultServicesScanner extension you can scan default lamedbs sorted by satellite with a connected dish positioner. - + Dream Multimedia @@ -19,7 +19,7 @@ Standard Sendersuche nach Satellit mit einem Rotor. Mit der DefaultServicesScanner Erweiterung können Sie eine standard Sendersuche nach Satellit mit einem angeschlossenen Rotor durchführen. - + diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am index 8405ed7a..9b0a2ede 100755 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_diseqctester.xml -EXTRA_DIST = diseqctester.jpg +EXTRA_DIST = diseqctester_de.jpg diseqctester_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg deleted file mode 100644 index c872334c..00000000 Binary files a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg new file mode 100755 index 00000000..5a6e1532 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg new file mode 100755 index 00000000..43dad76c Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml old mode 100644 new mode 100755 index 5415db08..33808b3e --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml @@ -10,7 +10,7 @@ Test your Diseqc equipment. With the DiseqcTester extension you can test your satellite equipment for Diseqc compatibility and errors. - + Dream Multimedia @@ -19,7 +19,7 @@ Testet Ihr Diseqc Equipment. Mit der DiseqcTester Erweiterung können Sie Ihr Satelliten-Equipment nach Diseqc-Kompatibilität und Fehlern überprüfen. - + diff --git a/lib/python/Plugins/SystemPlugins/Makefile.am b/lib/python/Plugins/SystemPlugins/Makefile.am index a8b187dc..9cc538f3 100755 --- a/lib/python/Plugins/SystemPlugins/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Makefile.am @@ -3,7 +3,8 @@ installdir = $(pkglibdir)/python/Plugins/SystemPlugins SUBDIRS = SoftwareManager FrontprocessorUpgrade PositionerSetup Satfinder \ SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug \ DefaultServicesScanner NFIFlash DiseqcTester CommonInterfaceAssignment \ - CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard + CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard \ + TempFanControl install_PYTHON = \ __init__.py diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am index 686bded0..0633e7cf 100755 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_nfiflash.xml -EXTRA_DIST = nfiflash.jpg +EXTRA_DIST = nfiflash_de.jpg nfiflash_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg deleted file mode 100644 index 0a5fa469..00000000 Binary files a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg new file mode 100755 index 00000000..fec93f4b Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg new file mode 100755 index 00000000..32a9967b Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml old mode 100644 new mode 100755 index 2de88f08..c81f4ca5 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml @@ -12,7 +12,7 @@ With the NFIFlash extension it is possible to prepare a USB stick with an Dreambox image.\n It is then possible to flash your Dreambox with the image on that stick. - + Dream Multimedia @@ -22,7 +22,7 @@ Mit der NFIFlash Erweiterung können Sie ein Dreambox Image auf einen USB-Stick laden.\ Mit diesem USB-Stick ist es dann möglich Ihre Dreambox zu flashen. - + diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py old mode 100644 new mode 100755 index 40914e12..28b33305 --- a/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py @@ -1,20 +1,28 @@ +from Plugins.Plugin import PluginDescriptor +from Tools.HardwareInfo import HardwareInfo +from Tools.Directories import fileExists +from downloader import NFIDownload, filescan + +def NFIFlasherMain(session, tmp = None, **kwargs): + session.open(NFIDownload, "/home/root" ) + +def NFICallFnc(tmp = None): + return NFIFlasherMain + def Plugins(**kwargs): - from Plugins.Plugin import PluginDescriptor - from Tools.HardwareInfo import HardwareInfo # currently only available for DM8000 if HardwareInfo().get_device_name() != "dm8000": return [PluginDescriptor()] - from Tools.Directories import fileExists if fileExists("/usr/share/bootlogo-flasher.mvi"): import flasher # started from usb stick # don't try to be intelligent and trick this - it's not possible to rewrite the flash memory with a system currently booted from it return [PluginDescriptor(where = PluginDescriptor.WHERE_WIZARD, fnc = (9,flasher.NFIFlash))] else: # started on real enigma2 - import downloader - return [PluginDescriptor(name="NFI Image Flashing", - description = _("Download .NFI-Files for USB-Flasher"), + return [PluginDescriptor(name=_("NFI Image Flashing"), + description=_("Download .NFI-Files for USB-Flasher"), icon = "flash.png", - where = [PluginDescriptor.WHERE_PLUGINMENU], - fnc = downloader.main), PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = downloader.filescan) - ] + where = PluginDescriptor.WHERE_SOFTWAREMANAGER, + fnc={"SoftwareSupported": NFICallFnc, "menuEntryName": lambda x: _("NFI Image Flashing"), + "menuEntryDescription": lambda x: _("Download .NFI-Files for USB-Flasher")}), + PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)] diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py index 4d361157..a8b34acd 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py @@ -2,18 +2,12 @@ from Screens.Wizard import wizardManager, WizardSummary from Screens.WizardLanguage import WizardLanguage from Screens.Rc import Rc from Screens.MessageBox import MessageBox - from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap +from Components.Sources.Boolean import Boolean from Components.config import config, ConfigBoolean, configfile, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, getConfigListEntry, ConfigSelection, ConfigPassword from Components.Network import iNetwork - -#from Components.Label import Label -#from Components.MenuList import MenuList -#from Components.PluginComponent import plugins -#from Plugins.Plugin import PluginDescriptor from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE -#import time, os, re - +from enigma import eTimer config.misc.firstrun = ConfigBoolean(default = True) list = [] @@ -39,7 +33,7 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl class NetworkWizard(WizardLanguage, Rc): skin = """ - + @@ -52,27 +46,115 @@ class NetworkWizard(WizardLanguage, Rc): + + + + """ - def __init__(self, session): + def __init__(self, session, interface = None): self.xmlfile = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml") WizardLanguage.__init__(self, session, showSteps = False, showStepSlider = False) Rc.__init__(self) self.session = session self["wizard"] = Pixmap() - + self["HelpWindow"] = Pixmap() + self["HelpWindow"].hide() + self["VKeyIcon"] = Boolean(False) + + self.InstalledInterfaceCount = None + self.Adapterlist = None self.InterfaceState = None self.isInterfaceUp = None self.WlanPluginInstalled = None self.ap = None - self.selectedInterface = None + if interface is not None: + self.selectedInterface = interface + else: + self.selectedInterface = None self.NextStep = None - self.myref = None + self.resetRef = None self.checkRef = None self.AdapterRef = None + self.APList = None + self.newAPlist = None self.WlanList = None + self.oldlist = None + self.originalAth0State = None + self.originalEth0State = None + self.originalWlan0State = None + self.originalInterfaceStateChanged = False + self.Text = None + self.rescanTimer = eTimer() + self.rescanTimer.callback.append(self.rescanTimerFired) + self.getInstalledInterfaceCount() self.isWlanPluginInstalled() + + def exitWizardQuestion(self, ret = False): + if (ret): + self.markDone() + self.close() + + def markDone(self): + self.rescanTimer.stop() + del self.rescanTimer + self.checkOldInterfaceState() + pass + + def getInstalledInterfaceCount(self): + self.rescanTimer.stop() + self.Adapterlist = iNetwork.getAdapterList() + self.InstalledInterfaceCount = len(self.Adapterlist) + if self.Adapterlist is not None: + if self.InstalledInterfaceCount == 1 and self.selectedInterface is None: + self.selectedInterface = self.Adapterlist[0] + self.originalAth0State = iNetwork.getAdapterAttribute('ath0', 'up') + self.originalEth0State = iNetwork.getAdapterAttribute('eth0', 'up') + self.originalWlan0State = iNetwork.getAdapterAttribute('wlan0', 'up') + + def selectInterface(self): + self.InterfaceState = None + if self.selectedInterface is None and self.InstalledInterfaceCount <= 1: + if self.selectedInterface == 'eth0': + self.NextStep = 'nwconfig' + else: + self.NextStep = 'scanwlan' + self.checkInterface(self.selectedInterface) + elif self.selectedInterface is not None and self.InstalledInterfaceCount <= 1: + if self.selectedInterface == 'eth0': + self.NextStep = 'nwconfig' + else: + self.NextStep = 'scanwlan' + self.checkInterface(self.selectedInterface) + elif self.selectedInterface is None and self.InstalledInterfaceCount > 1: + self.NextStep = 'selectinterface' + self.currStep = self.getStepWithID(self.NextStep) + self.afterAsyncCode() + elif self.selectedInterface is not None and self.InstalledInterfaceCount > 1: + if self.selectedInterface == 'eth0': + self.NextStep = 'nwconfig' + else: + self.NextStep = 'scanwlan' + self.checkInterface(self.selectedInterface) + else: + self.NextStep = 'selectinterface' + self.currStep = self.getStepWithID(self.NextStep) + self.afterAsyncCode() + + def checkOldInterfaceState(self): + # disable up interface if it was originally down and config is unchanged. + if self.originalAth0State is False and self.originalInterfaceStateChanged is False: + if iNetwork.checkforInterface('ath0') is True: + iNetwork.deactivateInterface('ath0') + if self.originalEth0State is False and self.originalInterfaceStateChanged is False: + if iNetwork.checkforInterface('eth0') is True: + iNetwork.deactivateInterface('eth0') + if self.originalWlan0State is False and self.originalInterfaceStateChanged is False: + if iNetwork.checkforInterface('wlan0') is True: + iNetwork.deactivateInterface('wlan0') def listInterfaces(self): + self.rescanTimer.stop() + self.checkOldInterfaceState() list = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] list.append((_("Exit network wizard"), "end")) return list @@ -93,46 +175,30 @@ class NetworkWizard(WizardLanguage, Rc): self.InterfaceSelect(self.selection) def checkInterface(self,iface): - self.Adapterlist = iNetwork.getAdapterList() + self.rescanTimer.stop() + if self.Adapterlist is None: + self.Adapterlist = iNetwork.getAdapterList() if self.NextStep is not 'end': if len(self.Adapterlist) == 0: #Reset Network to defaults if network broken - iNetwork.resetNetworkConfig('lan', self.checkInterfaceCB) - self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False) - if iface == 'eth0': - if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1: - if iNetwork.getAdapterAttribute(iface, 'up') is True: - self.isInterfaceUp = True - else: - self.isInterfaceUp = False - self.resetfinishedCB(False) - else: - iNetwork.resetNetworkConfig('lan',self.checkInterfaceCB) - self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False) - elif iface == 'wlan0': + iNetwork.resetNetworkConfig('lan', self.resetNetworkConfigCB) + self.resetRef = self.session.openWithCallback(self.resetNetworkConfigFinished, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False) + if iface in ('eth0', 'wlan0', 'ath0'): if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1: if iNetwork.getAdapterAttribute(iface, 'up') is True: self.isInterfaceUp = True else: self.isInterfaceUp = False - self.resetfinishedCB(False) + self.currStep = self.getStepWithID(self.NextStep) + self.afterAsyncCode() else: - iNetwork.resetNetworkConfig('wlan',self.checkInterfaceCB) - self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False) - elif iface == 'ath0': - if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1: - if iNetwork.getAdapterAttribute(iface, 'up') is True: - self.isInterfaceUp = True - else: - self.isInterfaceUp = False - self.resetfinishedCB(False) - else: - iNetwork.resetNetworkConfig('wlan-mpci',self.checkInterfaceCB) - self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False) + self.isInterfaceUp = iNetwork.checkforInterface(iface) + self.currStep = self.getStepWithID(self.NextStep) + self.afterAsyncCode() else: - self.resetfinishedCB(False) + self.resetNetworkConfigFinished(False) - def resetfinishedCB(self,data): + def resetNetworkConfigFinished(self,data): if data is True: self.currStep = self.getStepWithID(self.NextStep) self.afterAsyncCode() @@ -140,33 +206,42 @@ class NetworkWizard(WizardLanguage, Rc): self.currStep = self.getStepWithID(self.NextStep) self.afterAsyncCode() - def checkInterfaceCB(self,callback,iface): + def resetNetworkConfigCB(self,callback,iface): if callback is not None: if callback is True: - iNetwork.getInterfaces(self.getInterfacesDataAvail) + iNetwork.getInterfaces(self.getInterfacesFinished) - - def getInterfacesDataAvail(self, data): + def getInterfacesFinished(self, data): if data is True: if iNetwork.getAdapterAttribute(self.selectedInterface, 'up') is True: self.isInterfaceUp = True else: self.isInterfaceUp = False - self.myref.close(True) + self.resetRef.close(True) + else: + print "we should never come here!" def AdapterSetupEnd(self, iface): + self.originalInterfaceStateChanged = True if iNetwork.getAdapterAttribute(iface, "dhcp") is True: iNetwork.checkNetworkState(self.AdapterSetupEndFinished) self.AdapterRef = self.session.openWithCallback(self.AdapterSetupEndCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False) - else: self.currStep = self.getStepWithID("confdns") self.afterAsyncCode() def AdapterSetupEndCB(self,data): if data is True: - self.currStep = self.getStepWithID("checklanstatusend") - self.afterAsyncCode() + if self.selectedInterface in ('wlan0', 'ath0'): + if self.WlanPluginInstalled == True: + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus + iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB) + else: + self.currStep = self.getStepWithID("checklanstatusend") + self.afterAsyncCode() + else: + self.currStep = self.getStepWithID("checklanstatusend") + self.afterAsyncCode() def AdapterSetupEndFinished(self,data): if data <= 2: @@ -175,66 +250,147 @@ class NetworkWizard(WizardLanguage, Rc): self.InterfaceState = False self.AdapterRef.close(True) + def checkWlanStateCB(self,data,status): + if data is not None: + if data is True: + if status is not None: + text1 = _("Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\n") + text2 = _('Accesspoint:') + "\t" + str(status[self.selectedInterface]["acesspoint"]) + "\n" + text3 = _('SSID:') + "\t" + str(status[self.selectedInterface]["essid"]) + "\n" + text4 = _('Link Quality:') + "\t" + str(status[self.selectedInterface]["quality"])+"%" + "\n" + text5 = _('Signal Strength:') + "\t" + str(status[self.selectedInterface]["signal"]) + "\n" + text6 = _('Bitrate:') + "\t" + str(status[self.selectedInterface]["bitrate"]) + "\n" + text7 = _('Encryption:') + " " + str(status[self.selectedInterface]["encryption"]) + "\n" + text8 = _("Please press OK to continue.") + infotext = text1 + text2 + text3 + text4 + text5 + text7 +"\n" + text8 + self.currStep = self.getStepWithID("checkWlanstatusend") + self.Text = infotext + if str(status[self.selectedInterface]["acesspoint"]) == "Not-Associated": + self.InterfaceState = False + self.afterAsyncCode() + def checkNetwork(self): - iNetwork.checkNetworkState(self.checkNetworkStateFinished) + iNetwork.checkNetworkState(self.checkNetworkStateCB) self.checkRef = self.session.openWithCallback(self.checkNetworkCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False) def checkNetworkCB(self,data): if data is True: - self.currStep = self.getStepWithID("checklanstatusend") - self.afterAsyncCode() + if self.selectedInterface in ('wlan0', 'ath0'): + if self.WlanPluginInstalled == True: + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus + iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB) + else: + self.currStep = self.getStepWithID("checklanstatusend") + self.afterAsyncCode() + else: + self.currStep = self.getStepWithID("checklanstatusend") + self.afterAsyncCode() - def checkNetworkStateFinished(self,data): + def checkNetworkStateCB(self,data): if data <= 2: self.InterfaceState = True else: self.InterfaceState = False self.checkRef.close(True) - def markDone(self): - pass + def rescanTimerFired(self): + self.rescanTimer.stop() + self.updateAPList() - def listModes(self): - list = [] - self.WlanList = [] + def updateAPList(self): + self.oldlist = self.APList + self.newAPlist = [] + newList = [] + newListIndex = None + currentListEntry = None + newList = self.listAccessPoints() + + for oldentry in self.oldlist: + if oldentry not in newList: + newList.append(oldentry) + + for newentry in newList: + if newentry[1] == "hidden...": + continue + self.newAPlist.append(newentry) + + if len(self.newAPlist): + if "hidden..." not in self.newAPlist: + self.newAPlist.append(( _("enter hidden network SSID"), "hidden..." )) + + if (self.wizard[self.currStep].has_key("dynamiclist")): + currentListEntry = self["list"].getCurrent() + idx = 0 + for entry in self.newAPlist: + if entry == currentListEntry: + newListIndex = idx + idx +=1 + self.wizard[self.currStep]["evaluatedlist"] = self.newAPlist + self['list'].setList(self.newAPlist) + self["list"].setIndex(newListIndex) + self["list"].updateList(self.newAPlist) + + def listAccessPoints(self): + self.APList = [] try: from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan except ImportError: - list.append( ( _("No networks found"),_("unavailable") ) ) - self.WlanList.append(_("No networks found")) - return list - else: - self.w = Wlan(self.selectedInterface) - aps = self.w.getNetworkList() - if aps is not None: - print "[NetworkWizard.py] got Accespoints!" - for ap in aps: - a = aps[ap] - if a['active']: - if a['essid'] != "": - #a['essid'] = a['bssid'] - list.append( (a['essid'], a['essid']) ) - self.WlanList.append(a['essid']) - if "hidden..." not in list: - list.append( ( _("enter hidden network SSID"),_("hidden...") ) ) - self.WlanList.append(_("hidden...")) - return list - - def modeSelectionMade(self, index): - self.modeSelect(index) - - def modeSelectionMoved(self): - self.modeSelect(self.selection) - - def modeSelect(self, mode): - self.ap = mode - print "ModeSelected:", mode - - def restartNetwork(self): - iNetwork.restartNetwork() - self.checkNetwork() + self.APList.append( ( _("No networks found"),_("unavailable") ) ) + return self.APList + else: + try: + self.w = Wlan(self.selectedInterface) + aps = self.w.getNetworkList() + except ValueError: + self.APList = [] + self.APList.append( ( _("No networks found"),_("unavailable") ) ) + return self.APList + else: + if aps is not None: + print "[NetworkWizard.py] got Accespoints!" + tmplist = [] + complist = [] + for ap in aps: + a = aps[ap] + if a['active']: + tmplist.append( (a['bssid'], a['essid']) ) + complist.append( (a['bssid'], a['essid']) ) + + for entry in tmplist: + if entry[1] == "": + for compentry in complist: + if compentry[0] == entry[0]: + complist.remove(compentry) + for entry in complist: + self.APList.append( (entry[1], entry[1]) ) - def isWlanPluginInstalled(self): + if "hidden..." not in self.APList: + self.APList.append(( _("enter hidden network SSID"), "hidden..." )) + + self.rescanTimer.start(3000) + return self.APList + + def AccessPointsSelectionMade(self, index): + self.ap = index + self.WlanList = [] + currList = [] + if (self.wizard[self.currStep].has_key("dynamiclist")): + currList = self['list'].list + for entry in currList: + self.WlanList.append( (entry[1], entry[0]) ) + self.AccessPointsSelect(index) + + def AccessPointsSelect(self, index): + self.NextStep = 'wlanconfig' + + def AccessPointsSelectionMoved(self): + self.AccessPointsSelect(self.selection) + + def checkWlanSelection(self): + self.rescanTimer.stop() + self.currStep = self.getStepWithID(self.NextStep) + + def isWlanPluginInstalled(self): try: from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan except ImportError: @@ -242,3 +398,27 @@ class NetworkWizard(WizardLanguage, Rc): else: self.WlanPluginInstalled = True + def listChoices(self): + self.rescanTimer.stop() + list = [] + if self.WlanPluginInstalled == True: + list.append((_("Configure your wireless LAN again"), "scanwlan")) + list.append((_("Configure your internal LAN"), "nwconfig")) + list.append((_("Exit network wizard"), "end")) + return list + + def ChoicesSelectionMade(self, index): + self.ChoicesSelect(index) + + def ChoicesSelect(self, index): + if index == 'end': + self.NextStep = 'end' + elif index == 'nwconfig': + self.selectedInterface = "eth0" + self.NextStep = 'nwconfig' + else: + self.NextStep = 'scanwlan' + + def ChoicesSelectionMoved(self): + pass + diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am index 98dbe80b..e8f738c6 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am @@ -1,3 +1,5 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_networkwizard.xml + +EXTRA_DIST = networkwizard_en.jpg networkwizard_de.jpg diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg new file mode 100755 index 00000000..3999a413 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg new file mode 100755 index 00000000..0a0434a0 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml index 660bbcd2..4d3adcbd 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml @@ -9,6 +9,7 @@ Step by step network configuration With the NetworkWizard you can easy configure your network step by step. + Dream Multimedia @@ -18,6 +19,7 @@ Mit dem NetzwerkWizard können Sie Ihr Netzwerk konfigurieren. Sie werden Schritt für Schritt durch die Konfiguration geleitet. + diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml index 134797a7..c4300436 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml @@ -1,172 +1,199 @@ - - - - + + + + self.clearSelectedKeys() self.selectKey("OK") - - + + +self.selectInterface() + + - - - - - + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") - - + + self.checkInterface(self.selectedInterface) - - - - - - - - + + + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") self.selectKey("LEFT") self.selectKey("RIGHT") - - + + self.AdapterSetupEnd(self.selectedInterface) - - - - - - - - + + + + + + + self.clearSelectedKeys() self.selectKey("OK") - - + + self.checkNetwork() - - - - + + + self.condition = (self.InterfaceState == True ) - - - + + + self.clearSelectedKeys() self.selectKey("OK") - - -currStep = self.numSteps + + +currStep = self.numSteps self.wizard[currStep]["nextstep"] = None self.markDone() self.close() - - - - + + + self.condition = (self.InterfaceState == False ) - - - + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") - - - - - - - - + + + + + + + self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == True) - - - - - + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") self.selectKey("LEFT") self.selectKey("RIGHT") - - - - - + + +self.checkWlanSelection() + + + + self.condition = (self.isInterfaceUp == False and self.WlanPluginInstalled == True) - - - - - - - - - + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") - - - - - + + + + self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == False) - - - - - - - - + + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") - - - - - - - - + + + + + + + self.clearSelectedKeys() self.selectKey("OK") self.selectKey("UP") self.selectKey("DOWN") self.selectKey("LEFT") self.selectKey("RIGHT") - - + + self.AdapterSetupEnd(self.selectedInterface) - - + + + + +self.condition = (self.InterfaceState == True ) + + + + +self.clearSelectedKeys() +self.selectKey("OK") +self["text"].setText(self.Text) + + +currStep = self.numSteps +self.wizard[currStep]["nextstep"] = None +self.markDone() +self.close() + + + + +self.condition = (self.InterfaceState == False ) + + + + +self.clearSelectedKeys() +self.selectKey("OK") +self.selectKey("UP") +self.selectKey("DOWN") + + + + + + - - - + + + self.clearSelectedKeys() self.selectKey("OK") - - + + diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py index dc3becac..49ec7da8 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py @@ -9,7 +9,7 @@ def startSetup(menuid): if menuid != "system": return [ ] - return [(_("Network Wizard") + "...", NetworkWizardMain, "nw_wizard", 40)] + return [(_("Network Wizard"), NetworkWizardMain, "nw_wizard", 40)] def NetworkWizard(*args, **kwargs): from NetworkWizard import NetworkWizard @@ -19,4 +19,4 @@ def Plugins(**kwargs): list = [] if config.misc.firstrun.value: list.append(PluginDescriptor(name=_("Network Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(25, NetworkWizard))) - return list + return list diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml old mode 100644 new mode 100755 index d20b2e68..2cb47c07 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml @@ -10,7 +10,7 @@ PositionerSetup helps you installing a motorized dish. With the PositionerSetup extension it is easy to install and configure a motorized dish. - + Dream Multimedia @@ -20,7 +20,7 @@ Die PositionerSetup Erweiterung unterstützt Sie beim einrichten und konfigurieren einer motorgesteuerten Satellitenantenne. - + diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg old mode 100644 new mode 100755 index 63072137..7f8d8d22 Binary files a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg and b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py index fa533c0b..3cc9e751 100644 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py @@ -77,7 +77,7 @@ class PositionerSetup(Screen): self.frontendStatus = { } self.diseqc = Diseqc(self.frontend) - self.tuner = Tuner(self.frontend) + self.tuner = Tuner(self.frontend, True) #True means we dont like that the normal sec stuff sends commands to the rotor! tp = ( cur.get("frequency", 0) / 1000, cur.get("symbol_rate", 0) / 1000, diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml old mode 100644 new mode 100755 index 8fa36e54..4c0c7af7 --- a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml +++ b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml @@ -11,7 +11,7 @@ SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings. With the SatelliteEquipmentControl extension it is possible to fine-tune DiSEqC-settings. - + Dream Multimedia @@ -20,7 +20,7 @@ Fein-Einstellungen für DiSEqC Die SatelliteEquipmentControl-Erweiterung unterstützt Sie beim Feintuning der DiSEqC Einstellungen. - + diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg old mode 100644 new mode 100755 index b9596a69..703650e2 Binary files a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg and b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml b/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml old mode 100644 new mode 100755 index aaab7e42..e9453deb --- a/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml +++ b/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml @@ -8,10 +8,10 @@ Satfinder enigma2-plugin-systemplugins-satfinder Satfinder helps you to align your dish. - The Satfinder extension helps you to align your dish.\ + The Satfinder extension helps you to align your dish.\n It shows you informations about signal rate and errors. - + Dream Multimedia @@ -21,7 +21,7 @@ Die Satfinder-Erweiterung unterstützt Sie beim Ausrichten ihrer Satellitenanlage.\n Es zeigt Ihnen Daten wie Signalstärke und Fehlerrate an. - + diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg old mode 100644 new mode 100755 index c0bba0c8..44f09811 Binary files a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg and b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am index 689d97ef..d29fb002 100755 --- a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_skinselector.xml -EXTRA_DIST = skinselector.jpg +EXTRA_DIST = skinselector_de.jpg skinselector_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml old mode 100644 new mode 100755 index 4ce7f1b0..717f732b --- a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml +++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml @@ -11,7 +11,7 @@ The SkinSelector shows a menu with selectable skins.\n It's now easy to change the look and feel of your Dreambox. - + Dream Multimedia @@ -21,7 +21,7 @@ Die SkinSelector Erweiterung zeigt Ihnen ein Menu mit auswählbaren Skins.\n Sie können nun einfach das Aussehen der grafischen Oberfläche Ihrer Dreambox verändern. - + diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg deleted file mode 100644 index 74395eaa..00000000 Binary files a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg new file mode 100755 index 00000000..3b40708a Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg new file mode 100755 index 00000000..b9f0bd3e Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py index 871f0a30..dcff3ca2 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py @@ -66,6 +66,7 @@ class BackupScreen(Screen, ConfigListScreen): self.setTitle(_("Backup is running...")) def doBackup(self): + configfile.save() try: if (path.exists(self.backuppath) == False): makedirs(self.backuppath) @@ -251,7 +252,7 @@ class RestoreMenu(Screen): if (self.exe == False) and (self.entry == True): self.sel = self["filelist"].getCurrent() self.val = self.path + "/" + self.sel - self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n" + self.sel + "\nSystem will restart after the restore!")) + self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n") + self.sel + _("\nSystem will restart after the restore!")) def keyCancel(self): self.close() diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am b/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am old mode 100644 new mode 100755 index ee1e56de..2d5e3381 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am @@ -6,7 +6,8 @@ install_PYTHON = \ __init__.py \ plugin.py \ BackupRestore.py \ - ImageWizard.py + ImageWizard.py \ + SoftwareTools.py dist_install_DATA = \ imagewizard.xml \ diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py new file mode 100755 index 00000000..e8cf6dc2 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py @@ -0,0 +1,231 @@ +from enigma import eConsoleAppContainer +from Components.Console import Console +from Components.About import about +from Components.DreamInfoHandler import DreamInfoHandler +from Components.Language import language +from Components.Sources.List import List +from Components.Ipkg import IpkgComponent +from Components.Network import iNetwork +from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR + +from time import time + +class SoftwareTools(DreamInfoHandler): + lastDownloadDate = None + NetworkConnectionAvailable = None + list_updating = False + available_updates = 0 + available_updatelist = [] + available_packetlist = [] + installed_packetlist = {} + + + def __init__(self): + aboutInfo = about.getImageVersionString() + if aboutInfo.startswith("dev-"): + self.ImageVersion = 'Experimental' + else: + self.ImageVersion = 'Stable' + self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" + DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language) + self.directory = resolveFilename(SCOPE_METADIR) + self.list = List([]) + self.NotifierCallback = None + self.Console = Console() + self.UpdateConsole = Console() + self.cmdList = [] + self.unwanted_extensions = ('-dbg', '-dev', '-doc') + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) + + def statusCallback(self, status, progress): + pass + + def startSoftwareTools(self, callback = None): + if callback is not None: + self.NotifierCallback = callback + iNetwork.checkNetworkState(self.checkNetworkCB) + + def checkNetworkCB(self,data): + if data is not None: + if data <= 2: + SoftwareTools.NetworkConnectionAvailable = True + self.getUpdates() + else: + SoftwareTools.NetworkConnectionAvailable = False + self.getUpdates() + + def getUpdates(self, callback = None): + if SoftwareTools.NetworkConnectionAvailable == True: + SoftwareTools.lastDownloadDate = time() + if SoftwareTools.list_updating is False and callback is None: + SoftwareTools.list_updating = True + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + elif SoftwareTools.list_updating is False and callback is not None: + SoftwareTools.list_updating = True + self.NotifierCallback = callback + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + elif SoftwareTools.list_updating is True and callback is not None: + #update info collecting already in progress + self.NotifierCallback = callback + else: + SoftwareTools.list_updating = False + if callback is not None: + callback(False) + elif self.NotifierCallback is not None: + self.NotifierCallback(False) + + def ipkgCallback(self, event, param): + if event == IpkgComponent.EVENT_ERROR: + SoftwareTools.list_updating = False + elif event == IpkgComponent.EVENT_DONE: + if SoftwareTools.list_updating: + self.startIpkgListAvailable() + pass + + def startIpkgListAvailable(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg list" + self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) + + def IpkgListAvailableCB(self, result, retval, extra_args = None): + (callback) = extra_args + if result: + if SoftwareTools.list_updating: + SoftwareTools.available_packetlist = [] + for x in result.splitlines(): + tokens = x.split(' - ') + name = tokens[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + l = len(tokens) + version = l > 1 and tokens[1].strip() or "" + descr = l > 2 and tokens[2].strip() or "" + SoftwareTools.available_packetlist.append([name, version, descr]) + if callback is None: + self.startInstallMetaPackage() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def startInstallMetaPackage(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" + self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) + + def InstallMetaPackageCB(self, result, retval, extra_args = None): + (callback) = extra_args + if result: + self.fillPackagesIndexList() + if callback is None: + self.startIpkgListInstalled() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def startIpkgListInstalled(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg list_installed" + self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) + + def IpkgListInstalledCB(self, result, retval, extra_args = None): + (callback) = extra_args + if result: + SoftwareTools.installed_packetlist = {} + for x in result.splitlines(): + tokens = x.split(' - ') + name = tokens[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + l = len(tokens) + version = l > 1 and tokens[1].strip() or "" + SoftwareTools.installed_packetlist[name] = version + if callback is None: + self.countUpdates() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def countUpdates(self, callback = None): + SoftwareTools.available_updates = 0 + SoftwareTools.available_updatelist = [] + for package in self.packagesIndexlist[:]: + attributes = package[0]["attributes"] + packagename = attributes["packagename"] + for x in SoftwareTools.available_packetlist: + if x[0] == packagename: + if SoftwareTools.installed_packetlist.has_key(packagename): + if SoftwareTools.installed_packetlist[packagename] != x[1]: + SoftwareTools.available_updates +=1 + SoftwareTools.available_updatelist.append([packagename]) + + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(True) + callback = None + elif self.NotifierCallback is not None: + self.NotifierCallback(True) + self.NotifierCallback = None + + def startIpkgUpdate(self, callback = None): + if not self.Console: + self.Console = Console() + cmd = "ipkg update" + self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) + + def IpkgUpdateCB(self, result, retval, extra_args = None): + (callback) = extra_args + if result: + if self.Console: + if len(self.Console.appContainers) == 0: + if callback is not None: + callback(True) + callback = None + + def cleanupSoftwareTools(self): + if self.NotifierCallback is not None: + self.NotifierCallback = None + self.ipkg.stop() + if self.Console is not None: + if len(self.Console.appContainers): + for name in self.Console.appContainers.keys(): + self.Console.kill(name) + if self.UpdateConsole is not None: + if len(self.UpdateConsole.appContainers): + for name in self.UpdateConsole.appContainers.keys(): + self.UpdateConsole.kill(name) + +iSoftwareTools = SoftwareTools() \ No newline at end of file diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am index 341938c5..05a87d5a 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_softwaremanager.xml -EXTRA_DIST = softmanager.jpg +EXTRA_DIST = softwaremanager_en.jpg softwaremanager_de.jpg diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml old mode 100644 new mode 100755 index fa84670e..cd425c33 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml @@ -11,7 +11,7 @@ The SoftwareManager manages your Dreambox software.\n It's easy to update your receiver's software, install or remove extensions or even backup and restore your system settings. - + Dream Multimedia @@ -22,7 +22,7 @@ Sie können nun einfach Ihre Dreambox-Software aktualisieren, neue Erweiterungen installieren oder entfernen, oder ihre Einstellungen sichern und wiederherstellen. - + diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg deleted file mode 100644 index a9d5a629..00000000 Binary files a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg new file mode 100755 index 00000000..54e64196 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg new file mode 100755 index 00000000..0832f0ac Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py index 3a1f835f..4917855f 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py @@ -23,7 +23,8 @@ from Components.About import about from Components.DreamInfoHandler import DreamInfoHandler from Components.Language import language from Components.AVSwitch import AVSwitch -from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_METADIR +from Components.Network import iNetwork +from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_PLUGIN, SCOPE_CURRENT_SKIN, SCOPE_METADIR from Tools.LoadPixmap import LoadPixmap from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad from cPickle import dump, load @@ -36,6 +37,7 @@ from twisted.internet import reactor from ImageWizard import ImageWizard from BackupRestore import BackupSelection, RestoreMenu, BackupScreen, RestoreScreen, getBackupPath, getBackupFilename +from SoftwareTools import iSoftwareTools config.plugins.configurationbackup = ConfigSubsection() config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False) @@ -74,30 +76,31 @@ def load_cache(cache_file): class UpdatePluginMenu(Screen): skin = """ - + - - + + {"template": [ - MultiContentEntryText(pos = (2, 2), size = (290, 22), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText, + MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText, ], - "fonts": [gFont("Regular", 20)], + "fonts": [gFont("Regular", 22)], "itemHeight": 25 } - + {"template": [ MultiContentEntryText(pos = (2, 2), size = (240, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description, ], - "fonts": [gFont("Regular", 20)], + "fonts": [gFont("Regular", 22)], "itemHeight": 300 } + """ def __init__(self, session, args = 0): @@ -106,77 +109,133 @@ class UpdatePluginMenu(Screen): self.menu = args self.list = [] self.oktext = _("\nPress OK on your remote control to continue.") + self.text = "" self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value ) if self.menu == 0: - self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext) ) - #self.list.append(("install-plugins", _("Install extensions"), _("\nInstall new Extensions or Plugins to your dreambox" ) + self.oktext) ) - self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext)) - self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext)) - self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext)) - self.list.append(("ipkg-install", _("Install local extension"), _("\nScan for local packages and install them." ) + self.oktext)) + self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your Dreambox" ) + self.oktext, None)) + self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None)) + self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None)) + self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext, None)) + self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None)) + self.list.append(("ipkg-install", _("Install local extension"), _("\nScan for local extensions and install them." ) + self.oktext, None)) + for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER): + if p.__call__.has_key("SoftwareSupported"): + callFnc = p.__call__["SoftwareSupported"](None) + if callFnc is not None: + if p.__call__.has_key("menuEntryName"): + menuEntryName = p.__call__["menuEntryName"](None) + else: + menuEntryName = _('Extended Software') + if p.__call__.has_key("menuEntryDescription"): + menuEntryDescription = p.__call__["menuEntryDescription"](None) + else: + menuEntryDescription = _('Extended Software Plugin') + self.list.append(('default-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc)) if config.usage.setup_level.index >= 2: # expert+ - self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext)) + self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext, None)) elif self.menu == 1: - self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext)) - self.list.append(("backuplocation", _("Choose backup location"), _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext )) - self.list.append(("backupfiles", _("Choose backup files"), _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext)) + self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext, None)) + self.list.append(("backuplocation", _("Choose backup location"), _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext, None)) + self.list.append(("backupfiles", _("Choose backup files"), _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext, None)) if config.usage.setup_level.index >= 2: # expert+ - self.list.append(("ipkg-manager", _("Packet management"), _("\nView, install and remove available or installed packages." ) + self.oktext)) - self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext)) + self.list.append(("ipkg-manager", _("Packet management"), _("\nView, install and remove available or installed packages." ) + self.oktext, None)) + self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext, None)) + for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER): + if p.__call__.has_key("AdvancedSoftwareSupported"): + callFnc = p.__call__["AdvancedSoftwareSupported"](None) + if callFnc is not None: + if p.__call__.has_key("menuEntryName"): + menuEntryName = p.__call__["menuEntryName"](None) + else: + menuEntryName = _('Advanced Software') + if p.__call__.has_key("menuEntryDescription"): + menuEntryDescription = p.__call__["menuEntryDescription"](None) + else: + menuEntryDescription = _('Advanced Software Plugin') + self.list.append(('advanced-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc)) self["menu"] = List(self.list) self["key_red"] = StaticText(_("Close")) + self["status"] = StaticText("") - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions"], { "ok": self.go, "back": self.close, "red": self.close, }, -1) - self.onLayoutFinish.append(self.layoutFinished) self.backuppath = getBackupPath() self.backupfile = getBackupFilename() self.fullbackupfilename = self.backuppath + "/" + self.backupfile self.onShown.append(self.setWindowTitle) + #self.onClose.append(self.cleanup) def layoutFinished(self): idx = 0 self["menu"].index = idx + #self.getUpdateInfos() def setWindowTitle(self): - self.setTitle(_("Software manager")) + self.setTitle(_("Software management")) + + def cleanup(self): + iNetwork.stopPingConsole() + iSoftwareTools.cleanupSoftwareTools() + + def getUpdateInfos(self): + self.text = "" + if iSoftwareTools.NetworkConnectionAvailable == True: + if iSoftwareTools.list_updating is False: + if iSoftwareTools.available_updates is not 0: + self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.") + else: + self.text = "" #_("There are no updates available.") + else: + if iSoftwareTools.available_updates is not 0: + self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.") + else: + self.text = "" #_("There are no updates available.") + self.text += "\n" + _("A search for available updates is currently in progress.") + else: + self.text = _("No network connection available.") + self["status"].setText(self.text) + def go(self): + #iNetwork.stopPingConsole() current = self["menu"].getCurrent() if current: - current = current[0] + currentEntry = current[0] if self.menu == 0: - if (current == "software-update"): + if (currentEntry == "software-update"): self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?")+"\n"+_("\nAfter pressing OK, please wait!")) - elif (current == "software-restore"): + elif (currentEntry == "software-restore"): self.session.open(ImageWizard) - elif (current == "install-plugins"): + elif (currentEntry == "install-extensions"): self.session.open(PluginManager, self.skin_path) - elif (current == "system-backup"): + elif (currentEntry == "system-backup"): self.session.openWithCallback(self.backupDone,BackupScreen, runBackup = True) - elif (current == "system-restore"): + elif (currentEntry == "system-restore"): if os_path.exists(self.fullbackupfilename): self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore your Enigma2 backup?\nEnigma2 will restart after the restore")) else: self.session.open(MessageBox, _("Sorry no backups found!"), MessageBox.TYPE_INFO, timeout = 10) - elif (current == "ipkg-install"): + elif (currentEntry == "ipkg-install"): try: from Plugins.Extensions.MediaScanner.plugin import main main(self.session) except: self.session.open(MessageBox, _("Sorry MediaScanner is not installed!"), MessageBox.TYPE_INFO, timeout = 10) - elif (current == "advanced"): + elif (currentEntry == "default-plugin"): + self.extended = current[3] + self.extended(self.session, None) + elif (currentEntry == "advanced"): self.session.open(UpdatePluginMenu, 1) elif self.menu == 1: - if (current == "ipkg-manager"): + if (currentEntry == "ipkg-manager"): self.session.open(PacketManager, self.skin_path) - elif (current == "backuplocation"): + elif (currentEntry == "backuplocation"): parts = [ (r.description, r.mountpoint, self.session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)] for x in parts: if not access(x[1], F_OK|R_OK|W_OK) or x[1] == '/': @@ -186,12 +245,15 @@ class UpdatePluginMenu(Screen): parts.remove(x) if len(parts): self.session.openWithCallback(self.backuplocation_choosen, ChoiceBox, title = _("Please select medium to use as backup location"), list = parts) - elif (current == "backupfiles"): + elif (currentEntry == "backupfiles"): self.session.openWithCallback(self.backupfiles_choosen,BackupSelection) - elif (current == "advancedrestore"): + elif (currentEntry == "advancedrestore"): self.session.open(RestoreMenu, self.skin_path) - elif (current == "ipkg-source"): + elif (currentEntry == "ipkg-source"): self.session.open(IPKGMenu, self.skin_path) + elif (currentEntry == "advanced-plugin"): + self.extended = current[3] + self.extended(self.session, None) def backupfiles_choosen(self, ret): self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value ) @@ -228,1262 +290,1215 @@ class UpdatePluginMenu(Screen): self.exe = True self.session.open(RestoreScreen, runRestore = True) -class IPKGMenu(Screen): - skin = """ - - - - - - - """ - - def __init__(self, session, plugin_path): - Screen.__init__(self, session) - self.skin_path = plugin_path - - self["key_red"] = StaticText(_("Close")) - self["key_green"] = StaticText(_("Edit")) - - self.sel = [] - self.val = [] - self.entry = False - self.exe = False - - self.path = "" - - self["actions"] = NumberActionMap(["SetupActions"], - { - "ok": self.KeyOk, - "cancel": self.keyCancel - }, -1) - - self["shortcuts"] = ActionMap(["ShortcutActions"], - { - "red": self.keyCancel, - "green": self.KeyOk, - }) - self.flist = [] - self["filelist"] = MenuList(self.flist) - self.fill_list() - self.onLayoutFinish.append(self.layoutFinished) - - def layoutFinished(self): - self.setWindowTitle() - - def setWindowTitle(self): - self.setTitle(_("Select upgrade source to edit.")) - - def fill_list(self): - self.flist = [] - self.path = '/etc/ipkg/' - if (os_path.exists(self.path) == False): - self.entry = False - return - for file in listdir(self.path): - if (file.endswith(".conf")): - if file != 'arch.conf': - self.flist.append((file)) - self.entry = True - self["filelist"].l.setList(self.flist) - - def KeyOk(self): - if (self.exe == False) and (self.entry == True): - self.sel = self["filelist"].getCurrent() - self.val = self.path + self.sel - self.session.open(IPKGSource, self.val) - - def keyCancel(self): - self.close() - - def Exit(self): - self.close() - - -class IPKGSource(Screen): - skin = """ - - - - - - - """ - - def __init__(self, session, configfile = None): - Screen.__init__(self, session) - self.session = session - self.configfile = configfile - text = "" - if self.configfile: - try: - fp = file(configfile, 'r') - sources = fp.readlines() - if sources: - text = sources[0] - fp.close() - except IOError: - pass - - desk = getDesktop(0) - x= int(desk.size().width()) - y= int(desk.size().height()) - - self["key_red"] = StaticText(_("Cancel")) - self["key_green"] = StaticText(_("Save")) - - if (y>=720): - self["text"] = Input(text, maxSize=False, type=Input.TEXT) - else: - self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT) - - self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"], - { - "ok": self.go, - "back": self.close, - "red": self.close, - "green": self.go, - "left": self.keyLeft, - "right": self.keyRight, - "home": self.keyHome, - "end": self.keyEnd, - "deleteForward": self.keyDeleteForward, - "deleteBackward": self.keyDeleteBackward, - "1": self.keyNumberGlobal, - "2": self.keyNumberGlobal, - "3": self.keyNumberGlobal, - "4": self.keyNumberGlobal, - "5": self.keyNumberGlobal, - "6": self.keyNumberGlobal, - "7": self.keyNumberGlobal, - "8": self.keyNumberGlobal, - "9": self.keyNumberGlobal, - "0": self.keyNumberGlobal - }, -1) - - self.onLayoutFinish.append(self.layoutFinished) - - def layoutFinished(self): - self.setWindowTitle() - self["text"].right() - - def setWindowTitle(self): - self.setTitle(_("Edit upgrade source url.")) - - def go(self): - text = self["text"].getText() - if text: - fp = file(self.configfile, 'w') - fp.write(text) - fp.write("\n") - fp.close() - self.close() - - def keyLeft(self): - self["text"].left() - - def keyRight(self): - self["text"].right() - - def keyHome(self): - self["text"].home() - - def keyEnd(self): - self["text"].end() - - def keyDeleteForward(self): - self["text"].delete() - - def keyDeleteBackward(self): - self["text"].deleteBackward() - - def keyNumberGlobal(self, number): - self["text"].number(number) +class PluginManager(Screen, DreamInfoHandler): -class PacketManager(Screen): skin = """ - + + + - + + + - {"template": [ - MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description - MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap - MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap - ], - "fonts": [gFont("Regular", 22),gFont("Regular", 14)], + {"templates": + {"default": (51,[ + MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description + MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap + ]), + "category": (40,[ + MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description + MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap + ]) + }, + "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)], "itemHeight": 52 - } + } + """ - - def __init__(self, session, plugin_path, args = None): + + def __init__(self, session, plugin_path = None, args = None): Screen.__init__(self, session) self.session = session self.skin_path = plugin_path + if self.skin_path == None: + self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager") - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ], { - "ok": self.go, + "ok": self.handleCurrent, "back": self.exit, "red": self.exit, - "green": self.reload, + "green": self.handleCurrent, + "yellow": self.handleSelected, + "showEventInfo": self.handleSelected, + "displayHelp": self.handleHelp, }, -1) - + self.list = [] self.statuslist = [] + self.selectedFiles = [] + self.categoryList = [] + self.packetlist = [] self["list"] = List(self.list) self["key_red"] = StaticText(_("Close")) - self["key_green"] = StaticText(_("Reload")) + self["key_green"] = StaticText("") + self["key_yellow"] = StaticText("") + self["key_blue"] = StaticText("") + self["status"] = StaticText("") - self.list_updating = True - self.packetlist = [] - self.installed_packetlist = {} - self.Console = Console() self.cmdList = [] - self.cachelist = [] - self.cache_ttl = 86400 #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs) - self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory self.oktext = _("\nAfter pressing OK, please wait!") - self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox') + if not self.selectionChanged in self["list"].onSelectionChanged: + self["list"].onSelectionChanged.append(self.selectionChanged) - self.ipkg = IpkgComponent() - self.ipkg.addCallback(self.ipkgCallback) + self.currList = "" + self.currentSelectedTag = None + self.currentSelectedIndex = None + self.currentSelectedPackage = None + self.saved_currentSelectedPackage = None + self.onShown.append(self.setWindowTitle) - self.onLayoutFinish.append(self.rebuildList) + self.onLayoutFinish.append(self.getUpdateInfos) + + def setWindowTitle(self): + self.setTitle(_("Extensions management")) def exit(self): - self.ipkg.stop() - if self.Console is not None: - if len(self.Console.appContainers): - for name in self.Console.appContainers.keys(): - self.Console.kill(name) - self.close() + if self.currList == "packages": + self.currList = "category" + self.currentSelectedTag = None + self["list"].style = "category" + self['list'].setList(self.categoryList) + self["list"].setIndex(self.currentSelectedIndex) + self["list"].updateList(self.categoryList) + self.selectionChanged() + else: + iSoftwareTools.cleanupSoftwareTools() + self.prepareInstall() + if len(self.cmdList): + self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList) + else: + self.close() - def reload(self): - if (os_path.exists(self.cache_file) == True): - remove(self.cache_file) - self.list_updating = True - self.rebuildList() - - def setWindowTitle(self): - self.setTitle(_("Packet manager")) + def handleHelp(self): + if self.currList != "status": + self.session.open(PluginManagerHelp, self.skin_path) - def setStatus(self,status = None): + def setState(self,status = None): if status: + self.currList = "status" self.statuslist = [] - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) + self["key_green"].setText("") + self["key_blue"].setText("") + self["key_yellow"].setText("") + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) if status == 'update': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) - self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng )) - self['list'].setList(self.statuslist) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png")) + self.statuslist.append(( _("Updating software catalog"), '', _("Searching for available updates. Please wait..." ),'', '', statuspng, divpng, None, '' )) + self["list"].style = "default" + self['list'].setList(self.statuslist) + elif status == 'sync': + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png")) + self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' )) + self["list"].style = "default" + self['list'].setList(self.statuslist) elif status == 'error': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) - self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng )) - self['list'].setList(self.statuslist) - - def rebuildList(self): - self.setStatus('update') - self.inv_cache = 0 - self.vc = valid_cache(self.cache_file, self.cache_ttl) - if self.cache_ttl > 0 and self.vc != 0: - try: - self.buildPacketList() - except: - self.inv_cache = 1 - if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0: - self.run = 0 - self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) - - def go(self, returnValue = None): - cur = self["list"].getCurrent() - if cur: - status = cur[3] - package = cur[0] - self.cmdList = [] - if status == 'installed': - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package })) - if len(self.cmdList): - self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext) - elif status == 'upgradeable': - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package })) - if len(self.cmdList): - self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext) - elif status == "installable": - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package })) - if len(self.cmdList): - self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext) + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png")) + self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' )) + self["list"].style = "default" + self['list'].setList(self.statuslist) - def runRemove(self, result): - if result: - self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList) + def getUpdateInfos(self): + self.setState('update') + iSoftwareTools.startSoftwareTools(self.getUpdateInfosCB) - def runRemoveFinished(self): - self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + def getUpdateInfosCB(self, retval = None): + if retval is not None: + if retval is True: + if iSoftwareTools.available_updates is not 0: + self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")) + else: + self["status"].setText(_("There are no updates available.")) + self.rebuildList() + elif retval is False: + self.setState('error') + self["status"].setText(_("No network connection available.")) - def RemoveReboot(self, result): - if result is None: - return - if result is False: - cur = self["list"].getCurrent() - if cur: - item = self['list'].getIndex() - self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable') - self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable'] - self['list'].setList(self.list) - write_cache(self.cache_file, self.cachelist) - self.reloadPluginlist() - if result: - quitMainloop(3) + def rebuildList(self, retval = None): + if self.currentSelectedTag is None: + self.buildCategoryList() + else: + self.buildPacketList(self.currentSelectedTag) - def runUpgrade(self, result): - if result: - self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList) + def selectionChanged(self): + current = self["list"].getCurrent() + self["status"].setText("") + if current: + if self.currList == "packages": + self["key_red"].setText(_("Back")) + if current[4] == 'installed': + self["key_green"].setText(_("Uninstall")) + elif current[4] == 'installable': + self["key_green"].setText(_("Install")) + elif current[4] == 'remove': + self["key_green"].setText(_("Undo uninstall")) + elif current[4] == 'install': + self["key_green"].setText(_("Undo install")) + self["key_yellow"].setText(_("View details")) + self["key_blue"].setText("") + if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0: + self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")) + elif len(self.selectedFiles) is not 0: + self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) + else: + self["status"].setText(_("There are currently no outstanding actions.")) + elif self.currList == "category": + self["key_red"].setText(_("Close")) + self["key_green"].setText("") + self["key_yellow"].setText("") + self["key_blue"].setText("") + if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0: + self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")) + self["key_yellow"].setText(_("Update")) + elif len(self.selectedFiles) is not 0: + self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) + self["key_yellow"].setText(_("Process")) + else: + self["status"].setText(_("There are currently no outstanding actions.")) - def runUpgradeFinished(self): - self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) - - def UpgradeReboot(self, result): - if result is None: - return - if result is False: - cur = self["list"].getCurrent() - if cur: - item = self['list'].getIndex() - self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed') - self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed'] - self['list'].setList(self.list) - write_cache(self.cache_file, self.cachelist) - self.reloadPluginlist() - if result: - quitMainloop(3) + def getSelectionState(self, detailsFile): + for entry in self.selectedFiles: + if entry[0] == detailsFile: + return True + return False - def ipkgCallback(self, event, param): - if event == IpkgComponent.EVENT_ERROR: - self.list_updating = False - self.setStatus('error') - elif event == IpkgComponent.EVENT_DONE: - if self.list_updating: - self.list_updating = False - if not self.Console: - self.Console = Console() - cmd = "ipkg list" - self.Console.ePopen(cmd, self.IpkgList_Finished) - #print event, "-", param - pass + def handleCurrent(self): + current = self["list"].getCurrent() + if current: + if self.currList == "category": + self.currentSelectedIndex = self["list"].index + selectedTag = current[2] + self.buildPacketList(selectedTag) + elif self.currList == "packages": + if current[7] is not '': + idx = self["list"].getIndex() + detailsFile = self.list[idx][1] + if self.list[idx][7] == True: + for entry in self.selectedFiles: + if entry[0] == detailsFile: + self.selectedFiles.remove(entry) + else: + alreadyinList = False + for entry in self.selectedFiles: + if entry[0] == detailsFile: + alreadyinList = True + if not alreadyinList: + self.selectedFiles.append((detailsFile,current[4],current[3])) + self.currentSelectedPackage = ((detailsFile,current[4],current[3])) + if current[4] == 'installed': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True) + elif current[4] == 'installable': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True) + elif current[4] == 'remove': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False) + elif current[4] == 'install': + self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False) + self["list"].setList(self.list) + self["list"].setIndex(idx) + self["list"].updateList(self.list) + self.selectionChanged() - def IpkgList_Finished(self, result, retval, extra_args = None): - if len(result): - self.packetlist = [] - for x in result.splitlines(): - split = x.split(' - ') #self.blacklisted_packages - if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): - self.packetlist.append([split[0].strip(), split[1].strip(),split[2].strip()]) - if not self.Console: - self.Console = Console() - cmd = "ipkg list_installed" - self.Console.ePopen(cmd, self.IpkgListInstalled_Finished) + def handleSelected(self): + current = self["list"].getCurrent() + if current: + if self.currList == "packages": + if current[7] is not '': + detailsfile = iSoftwareTools.directory[0] + "/" + current[1] + if (os_path.exists(detailsfile) == True): + self.saved_currentSelectedPackage = self.currentSelectedPackage + self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current) + else: + self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10) + elif self.currList == "category": + self.prepareInstall() + if len(self.cmdList): + self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList) - def IpkgListInstalled_Finished(self, result, retval, extra_args = None): - if len(result): - self.installed_packetlist = {} - for x in result.splitlines(): - split = x.split(' - ') - if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): - self.installed_packetlist[split[0].strip()] = split[1].strip() - self.buildPacketList() + def detailsClosed(self, result = None): + if result is not None: + if result is not False: + self.setState('sync') + iSoftwareTools.lastDownloadDate = time() + for entry in self.selectedFiles: + if entry == self.saved_currentSelectedPackage: + self.selectedFiles.remove(entry) + iSoftwareTools.startIpkgListInstalled(self.rebuildList) - def buildEntryComponent(self, name, version, description, state): - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) + def buildEntryComponent(self, name, details, description, packagename, state, selected = False): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png")) + installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png")) + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png")) + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png")) if state == 'installed': - installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) - return((name, version, description, state, installedpng, divpng)) - elif state == 'upgradeable': - upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgradeable.png")) - return((name, version, description, state, upgradeablepng, divpng)) - else: - installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) - return((name, version, description, state, installablepng, divpng)) - - def buildPacketList(self): - self.list = [] - self.cachelist = [] - - if self.cache_ttl > 0 and self.vc != 0: - print 'Loading packagelist cache from ',self.cache_file - try: - self.cachelist = load_cache(self.cache_file) - if len(self.cachelist) > 0: - for x in self.cachelist: - self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3])) - self['list'].setList(self.list) - except: - self.inv_cache = 1 + return((name, details, description, packagename, state, installedpng, divpng, selected)) + elif state == 'installable': + return((name, details, description, packagename, state, installablepng, divpng, selected)) + elif state == 'remove': + return((name, details, description, packagename, state, removepng, divpng, selected)) + elif state == 'install': + return((name, details, description, packagename, state, installpng, divpng, selected)) - if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0: - print 'rebuilding fresh package list' + def buildPacketList(self, categorytag = None): + if categorytag is not None: + self.currList = "packages" + self.currentSelectedTag = categorytag + self.packetlist = [] + for package in iSoftwareTools.packagesIndexlist[:]: + prerequisites = package[0]["prerequisites"] + if prerequisites.has_key("tag"): + for foundtag in prerequisites["tag"]: + if categorytag == foundtag: + attributes = package[0]["attributes"] + if attributes.has_key("packagetype"): + if attributes["packagetype"] == "internal": + continue + self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) + else: + self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) + self.list = [] for x in self.packetlist: status = "" - if self.installed_packetlist.has_key(x[0].strip()): - if self.installed_packetlist[x[0].strip()] == x[1].strip(): - status = "installed" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + name = x[0].strip() + details = x[1].strip() + description = x[2].strip() + packagename = x[3].strip() + selectState = self.getSelectionState(details) + if iSoftwareTools.installed_packetlist.has_key(packagename): + if selectState == True: + status = "remove" else: - status = "upgradeable" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + status = "installed" + self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState)) else: - status = "installable" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) - if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions): - self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status]) - write_cache(self.cache_file, self.cachelist) + if selectState == True: + status = "install" + else: + status = "installable" + self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState)) + if len(self.list): + self.list.sort(key=lambda x: x[0]) + self["list"].style = "default" self['list'].setList(self.list) + self["list"].updateList(self.list) + self.selectionChanged() - def reloadPluginlist(self): - plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) + def buildCategoryList(self): + self.currList = "category" + self.categories = [] + self.categoryList = [] + for package in iSoftwareTools.packagesIndexlist[:]: + prerequisites = package[0]["prerequisites"] + if prerequisites.has_key("tag"): + for foundtag in prerequisites["tag"]: + attributes = package[0]["attributes"] + if foundtag not in self.categories: + self.categories.append(foundtag) + self.categoryList.append(self.buildCategoryComponent(foundtag)) + self.categoryList.sort(key=lambda x: x[0]) + self["list"].style = "category" + self['list'].setList(self.categoryList) + self["list"].updateList(self.categoryList) + self.selectionChanged() + + def buildCategoryComponent(self, tag = None): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + if tag is not None: + if tag == 'System': + return(( _("System"), _("View list of available system extensions" ), tag, divpng )) + elif tag == 'Skin': + return(( _("Skins"), _("View list of available skins" ), tag, divpng )) + elif tag == 'Recording': + return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng )) + elif tag == 'Network': + return(( _("Network"), _("View list of available networking extensions" ), tag, divpng )) + elif tag == 'CI': + return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng )) + elif tag == 'Default': + return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng )) + elif tag == 'SAT': + return(( _("Satellite equipment"), _("View list of available Satellite equipment extensions." ), tag, divpng )) + elif tag == 'Software': + return(( _("Software"), _("View list of available software extensions" ), tag, divpng )) + elif tag == 'Multimedia': + return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng )) + elif tag == 'Display': + return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng )) + elif tag == 'EPG': + return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng )) + elif tag == 'Communication': + return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng )) + else: # dynamically generate non existent tags + return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng )) + + def prepareInstall(self): + self.cmdList = [] + if iSoftwareTools.available_updates > 0: + self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False })) + if self.selectedFiles and len(self.selectedFiles): + for plugin in self.selectedFiles: + detailsfile = iSoftwareTools.directory[0] + "/" + plugin[0] + if (os_path.exists(detailsfile) == True): + iSoftwareTools.fillPackageDetails(plugin[0]) + self.package = iSoftwareTools.packageDetails[0] + if self.package[0].has_key("attributes"): + self.attributes = self.package[0]["attributes"] + if self.attributes.has_key("package"): + self.packagefiles = self.attributes["package"] + if plugin[1] == 'installed': + if self.packagefiles: + for package in self.packagefiles[:]: + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) + else: + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) + else: + if self.packagefiles: + for package in self.packagefiles[:]: + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) + else: + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) + else: + if plugin[1] == 'installed': + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) + else: + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) + def runExecute(self, result = None): + if result is not None: + if result[0] is True: + self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList) + elif result[0] is False: + self.cmdList = result[1] + self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList) + else: + self.close() -class PluginManager(Screen, DreamInfoHandler): + def runExecuteFinished(self): + self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + + def ExecuteReboot(self, result): + if result is None: + return + if result is False: + self.reloadPluginlist() + self.selectedFiles = [] + self.detailsClosed(True) + if result: + quitMainloop(3) + + def reloadPluginlist(self): + plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) - lastDownloadDate = None +class PluginManagerInfo(Screen): skin = """ - + - - - - - + - {"templates": - {"default": (51,[ - MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (30, 25), size = (470, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description - MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap - MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap - ]), - "category": (40,[ - MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (30, 22), size = (500, 16), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description - MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap - ]) - }, - "fonts": [gFont("Regular", 22),gFont("Regular", 16)], - "itemHeight": 52 - } + {"template": [ + MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state + MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap + ], + "fonts": [gFont("Regular", 24),gFont("Regular", 22)], + "itemHeight": 50 + } - + + """ - def __init__(self, session, plugin_path, args = None): + def __init__(self, session, plugin_path, cmdlist = None): Screen.__init__(self, session) self.session = session self.skin_path = plugin_path - aboutInfo = about.getImageVersionString() - if aboutInfo.startswith("dev-"): - self.ImageVersion = 'Experimental' - else: - self.ImageVersion = 'Stable' - self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" - - DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language) - self.directory = resolveFilename(SCOPE_METADIR) + self.cmdlist = cmdlist - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ], + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], { - "ok": self.handleCurrent, + "ok": self.process_all, "back": self.exit, "red": self.exit, - "green": self.handleCurrent, - "yellow": self.handleSelected, - "showEventInfo": self.handleSelected, - "displayHelp": self.handleHelp, + "green": self.process_extensions, }, -1) self.list = [] - self.statuslist = [] - self.selectedFiles = [] - self.categoryList = [] self["list"] = List(self.list) - self["key_red"] = StaticText(_("Close")) - self["key_green"] = StaticText("") - self["key_yellow"] = StaticText("") - self["key_blue"] = StaticText("") - self["status"] = StaticText("") - - self.list_updating = True - self.packetlist = [] - self.installed_packetlist = {} - self.available_packetlist = [] - self.available_updates = 0 - self.Console = Console() - self.cmdList = [] - self.oktext = _("\nAfter pressing OK, please wait!") - self.unwanted_extensions = ('-dbg', '-dev', '-doc') - - self.ipkg = IpkgComponent() - self.ipkg.addCallback(self.ipkgCallback) - if not self.selectionChanged in self["list"].onSelectionChanged: - self["list"].onSelectionChanged.append(self.selectionChanged) - - self.currList = "" - self.currentSelectedTag = None - self.currentSelectedIndex = None + self["key_red"] = StaticText(_("Cancel")) + self["key_green"] = StaticText(_("Only extensions.")) + self["status"] = StaticText(_("Following tasks will be done after you press OK!")) self.onShown.append(self.setWindowTitle) self.onLayoutFinish.append(self.rebuildList) def setWindowTitle(self): - self.setTitle(_("Plugin manager")) + self.setTitle(_("Plugin manager activity information")) - def exit(self): - if self.currList == "packages": - self.currList = "category" - self.currentSelectedTag = None - self["list"].style = "category" - self['list'].setList(self.categoryList) - self["list"].setIndex(self.currentSelectedIndex) - self["list"].updateList(self.categoryList) - self.selectionChanged() + def rebuildList(self): + self.list = [] + if self.cmdlist is not None: + for entry in self.cmdlist: + action = "" + info = "" + cmd = entry[0] + if cmd == 0: + action = 'install' + elif cmd == 2: + action = 'remove' + else: + action = 'upgrade' + args = entry[1] + if cmd == 0: + info = args['package'] + elif cmd == 2: + info = args['package'] + else: + info = _("Dreambox software because updates are available.") + + self.list.append(self.buildEntryComponent(action,info)) + self['list'].setList(self.list) + self['list'].updateList(self.list) + + def buildEntryComponent(self, action,info): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png")) + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png")) + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png")) + if action == 'install': + return(( _('Installing'), info, installpng, divpng)) + elif action == 'remove': + return(( _('Removing'), info, removepng, divpng)) else: - self.ipkg.stop() - if self.Console is not None: - if len(self.Console.appContainers): - for name in self.Console.appContainers.keys(): - self.Console.kill(name) - self.prepareInstall() - if len(self.cmdList): - self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList) - else: - self.close() + return(( _('Upgrading'), info, upgradepng, divpng)) - def handleHelp(self): - if self.currList != "status": - self.session.open(PluginManagerHelp, self.skin_path) + def exit(self): + self.close() - def setState(self,status = None): - if status: - self.currList = "status" - self.statuslist = [] - self["key_green"].setText("") - self["key_blue"].setText("") - self["key_yellow"].setText("") - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - if status == 'update': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) - self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'', '', statuspng, divpng, None, '' )) - self["list"].style = "default" - self['list'].setList(self.statuslist) - elif status == 'sync': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) - self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' )) - self["list"].style = "default" - self['list'].setList(self.statuslist) - elif status == 'error': - statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) - self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' )) - self["list"].style = "default" - self['list'].setList(self.statuslist) + def process_all(self): + self.close((True,None)) - def statusCallback(self, status, progress): - pass + def process_extensions(self): + self.list = [] + if self.cmdlist is not None: + for entry in self.cmdlist: + cmd = entry[0] + if entry[0] in (0,2): + self.list.append((entry)) + self.close((False,self.list)) - def selectionChanged(self): - current = self["list"].getCurrent() - self["status"].setText("") - if current: - if self.currList == "packages": - self["key_red"].setText(_("Back")) - if current[4] == 'installed': - self["key_green"].setText(_("Remove")) - elif current[4] == 'installable': - self["key_green"].setText(_("Install")) - elif current[4] == 'remove': - self["key_green"].setText(_("Undo\nRemove")) - elif current[4] == 'install': - self["key_green"].setText(_("Undo\nInstall")) - self["key_yellow"].setText(_("View details")) - self["key_blue"].setText("") - if len(self.selectedFiles) == 0 and self.available_updates is not 0: - self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available.")) - elif len(self.selectedFiles) is not 0: - self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) - else: - self["status"].setText(_("There is nothing to be done.")) - elif self.currList == "category": - self["key_red"].setText(_("Close")) - self["key_green"].setText("") - self["key_yellow"].setText("") - self["key_blue"].setText("") - if len(self.selectedFiles) == 0 and self.available_updates is not 0: - self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available.")) - self["key_yellow"].setText(_("Update")) - elif len(self.selectedFiles) is not 0: - self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected.")) - self["key_yellow"].setText(_("Process")) - else: - self["status"].setText(_("There is nothing to be done.")) - def getSelectionState(self, detailsFile): - for entry in self.selectedFiles: - if entry[0] == detailsFile: - return True - return False +class PluginManagerHelp(Screen): + skin = """ + + + + + + {"template": [ + MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state + MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap + ], + "fonts": [gFont("Regular", 24),gFont("Regular", 22)], + "itemHeight": 50 + } + + + + + """ + + def __init__(self, session, plugin_path): + Screen.__init__(self, session) + self.session = session + self.skin_path = plugin_path + + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + { + "back": self.exit, + "red": self.exit, + }, -1) + + self.list = [] + self["list"] = List(self.list) + self["key_red"] = StaticText(_("Close")) + self["status"] = StaticText(_("A small overview of the available icon states and actions.")) + + self.onShown.append(self.setWindowTitle) + self.onLayoutFinish.append(self.rebuildList) + + def setWindowTitle(self): + self.setTitle(_("Plugin manager help")) def rebuildList(self): - self.setState('update') - if not PluginManager.lastDownloadDate or (time() - PluginManager.lastDownloadDate) > 3600: - # Only update from internet once per hour - PluginManager.lastDownloadDate = time() - print "last update time > 1h" - self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) - else: - print "last update time < 1h" - self.startIpkgList() + self.list = [] + self.list.append(self.buildEntryComponent('install')) + self.list.append(self.buildEntryComponent('installable')) + self.list.append(self.buildEntryComponent('installed')) + self.list.append(self.buildEntryComponent('remove')) + self['list'].setList(self.list) + self['list'].updateList(self.list) - def ipkgCallback(self, event, param): - if event == IpkgComponent.EVENT_ERROR: - self.list_updating = False - self.setState('error') - elif event == IpkgComponent.EVENT_DONE: - self.startIpkgList() - pass + def buildEntryComponent(self, state): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png")) + installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png")) + removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png")) + installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png")) - def startIpkgList(self): - if self.list_updating: - if not self.Console: - self.Console = Console() - cmd = "ipkg list" - self.Console.ePopen(cmd, self.IpkgList_Finished) + if state == 'installed': + return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng)) + elif state == 'installable': + return(( _('This plugin is not installed.'), _('You can install this plugin.'), installablepng, divpng)) + elif state == 'install': + return(( _('This plugin will be installed.'), _('You can cancel the installation.'), installpng, divpng)) + elif state == 'remove': + return(( _('This plugin will be removed.'), _('You can cancel the removal.'), removepng, divpng)) - def IpkgList_Finished(self, result, retval, extra_args = None): - if len(result): - self.available_packetlist = [] - for x in result.splitlines(): - split = x.split(' - ') - if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): - self.available_packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()]) - self.startInstallMetaPackage() + def exit(self): + self.close() - def startInstallMetaPackage(self): - if self.list_updating: - self.list_updating = False - if not self.Console: - self.Console = Console() - cmd = "ipkg install enigma2-meta" #dummy,will change probably" - self.Console.ePopen(cmd, self.InstallMetaPackage_Finished) - - def InstallMetaPackage_Finished(self, result, retval, extra_args = None): - if len(result): - self.fillPackagesIndexList() - if not self.Console: - self.Console = Console() - self.setState('sync') - cmd = "ipkg list_installed" - self.Console.ePopen(cmd, self.IpkgListInstalled_Finished) - def IpkgListInstalled_Finished(self, result, retval, extra_args = None): - if len(result): - self.installed_packetlist = {} - for x in result.splitlines(): - split = x.split(' - ') - if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions): - self.installed_packetlist[split[0].strip()] = split[1].strip() - self.countUpdates() - if self.currentSelectedTag is None: - self.buildCategoryList() - else: - self.buildPacketList(self.currentSelectedTag) +class PluginDetails(Screen, DreamInfoHandler): + skin = """ + + + + + + + + + + + """ + def __init__(self, session, plugin_path, packagedata = None): + Screen.__init__(self, session) + self.skin_path = plugin_path + self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" + self.attributes = None + self.translatedAttributes = None + DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language) + self.directory = resolveFilename(SCOPE_METADIR) + if packagedata: + self.pluginname = packagedata[0] + self.details = packagedata[1] + self.pluginstate = packagedata[4] + self.statuspicinstance = packagedata[5] + self.divpicinstance = packagedata[6] + self.fillPackageDetails(self.details) - def countUpdates(self): - self.available_updates = 0 - for package in self.packagesIndexlist[:]: - attributes = package[0]["attributes"] - packagename = attributes["packagename"] - for x in self.available_packetlist: - if x[0].strip() == packagename: - if self.installed_packetlist.has_key(packagename): - if self.installed_packetlist[packagename] != x[1].strip(): - self.available_updates +=1 + self.thumbnail = "" - def handleCurrent(self): - current = self["list"].getCurrent() - if current: - if self.currList == "category": - self.currentSelectedIndex = self["list"].index - selectedTag = current[2] - self.buildPacketList(selectedTag) - elif self.currList == "packages": - if current[7] is not '': - idx = self["list"].getIndex() - detailsFile = self.list[idx][1] - if self.list[idx][7] == True: - for entry in self.selectedFiles: - if entry[0] == detailsFile: - self.selectedFiles.remove(entry) - else: - alreadyinList = False - for entry in self.selectedFiles: - if entry[0] == detailsFile: - alreadyinList = True - if not alreadyinList: - self.selectedFiles.append((detailsFile,current[4],current[3])) - if current[4] == 'installed': - self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True) - elif current[4] == 'installable': - self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True) - elif current[4] == 'remove': - self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False) - elif current[4] == 'install': - self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False) - self["list"].setList(self.list) - self["list"].setIndex(idx) - self["list"].updateList(self.list) - self.selectionChanged() + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + { + "back": self.exit, + "red": self.exit, + "green": self.go, + "up": self.pageUp, + "down": self.pageDown, + "left": self.pageUp, + "right": self.pageDown, + }, -1) - def handleSelected(self): - current = self["list"].getCurrent() - if current: - if self.currList == "packages": - if current[7] is not '': - detailsfile = self.directory[0] + "/" + current[1] - if (os_path.exists(detailsfile) == True): - self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current) - else: - self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10) - elif self.currList == "category": - self.prepareInstall() - if len(self.cmdList): - self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList) + self["key_red"] = StaticText(_("Close")) + self["key_green"] = StaticText("") + self["author"] = StaticText() + self["statuspic"] = Pixmap() + self["divpic"] = Pixmap() + self["screenshot"] = Pixmap() + self["detailtext"] = ScrollLabel() - def detailsClosed(self, result): - if result: - if not self.Console: - self.Console = Console() - self.setState('sync') - PluginManager.lastDownloadDate = time() - self.selectedFiles = [] - cmd = "ipkg update" - self.Console.ePopen(cmd, self.InstallMetaPackage_Finished) + self["statuspic"].hide() + self["screenshot"].hide() + self["divpic"].hide() - def buildEntryComponent(self, name, details, description, packagename, state, selected = False): - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - if state == 'installed': - installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) - return((name, details, description, packagename, state, installedpng, divpng, selected)) - elif state == 'installable': - installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) - return((name, details, description, packagename, state, installablepng, divpng, selected)) - elif state == 'remove': - removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) - return((name, details, description, packagename, state, removepng, divpng, selected)) - elif state == 'install': - installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) - return((name, details, description, packagename, state, installpng, divpng, selected)) + self.package = self.packageDetails[0] + if self.package[0].has_key("attributes"): + self.attributes = self.package[0]["attributes"] + if self.package[0].has_key("translation"): + self.translatedAttributes = self.package[0]["translation"] - def buildPacketList(self, categorytag = None): - if categorytag is not None: - self.currList = "packages" - self.currentSelectedTag = categorytag - self.packetlist = [] - for package in self.packagesIndexlist[:]: - prerequisites = package[0]["prerequisites"] - if prerequisites.has_key("tag"): - for foundtag in prerequisites["tag"]: - if categorytag == foundtag: - attributes = package[0]["attributes"] - if attributes.has_key("packagetype"): - if attributes["packagetype"] == "internal": - continue - self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) - else: - self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]]) - self.list = [] - for x in self.packetlist: - status = "" - selectState = self.getSelectionState(x[1].strip()) - if self.installed_packetlist.has_key(x[3].strip()): - if selectState == True: - status = "remove" - else: - status = "installed" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState)) - else: - if selectState == True: - status = "install" - else: - status = "installable" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState)) - if len(self.list): - self.list.sort(key=lambda x: x[0]) - self["list"].style = "default" - self['list'].setList(self.list) - self["list"].updateList(self.list) - self.selectionChanged() + self.cmdList = [] + self.oktext = _("\nAfter pressing OK, please wait!") + self.picload = ePicLoad() + self.picload.PictureData.get().append(self.paintScreenshotPixmapCB) + self.onShown.append(self.setWindowTitle) + self.onLayoutFinish.append(self.setInfos) + + def setWindowTitle(self): + self.setTitle(_("Details for extension: " + self.pluginname)) + + def exit(self): + self.close(False) + + def pageUp(self): + self["detailtext"].pageUp() + + def pageDown(self): + self["detailtext"].pageDown() + + def statusCallback(self, status, progress): + pass + + def setInfos(self): + if self.translatedAttributes.has_key("name"): + self.pluginname = self.translatedAttributes["name"] + elif self.attributes.has_key("name"): + self.pluginname = self.attributes["name"] + else: + self.pluginname = _("unknown") + + if self.translatedAttributes.has_key("author"): + self.author = self.translatedAttributes["author"] + elif self.attributes.has_key("author"): + self.author = self.attributes["author"] + else: + self.author = _("unknown") + + if self.translatedAttributes.has_key("description"): + self.description = self.translatedAttributes["description"] + elif self.attributes.has_key("description"): + self.description = self.attributes["description"] + else: + self.description = _("No description available.") + + if self.translatedAttributes.has_key("screenshot"): + self.loadThumbnail(self.translatedAttributes) + else: + self.loadThumbnail(self.attributes) + + self["author"].setText(_("Author: ") + self.author) + self["detailtext"].setText(self.description.strip()) + if self.pluginstate in ('installable', 'install'): + self["key_green"].setText(_("Install")) + else: + self["key_green"].setText(_("Remove")) + + def loadThumbnail(self, entry): + thumbnailUrl = None + if entry.has_key("screenshot"): + thumbnailUrl = entry["screenshot"] + if thumbnailUrl is not None: + self.thumbnail = "/tmp/" + thumbnailUrl.split('/')[-1] + print "[PluginDetails] downloading screenshot " + thumbnailUrl + " to " + self.thumbnail + client.downloadPage(thumbnailUrl,self.thumbnail).addCallback(self.setThumbnail).addErrback(self.fetchFailed) + else: + self.setThumbnail(noScreenshot = True) + + def setThumbnail(self, noScreenshot = False): + if not noScreenshot: + filename = self.thumbnail + else: + filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png") + + sc = AVSwitch().getFramebufferScale() + self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000")) + self.picload.startDecode(filename) + + if self.statuspicinstance != None: + self["statuspic"].instance.setPixmap(self.statuspicinstance.__deref__()) + self["statuspic"].show() + if self.divpicinstance != None: + self["divpic"].instance.setPixmap(self.divpicinstance.__deref__()) + self["divpic"].show() + + def paintScreenshotPixmapCB(self, picInfo=None): + ptr = self.picload.getData() + if ptr != None: + self["screenshot"].instance.setPixmap(ptr.__deref__()) + self["screenshot"].show() + else: + self.setThumbnail(noScreenshot = True) + + def go(self): + if self.attributes.has_key("package"): + self.packagefiles = self.attributes["package"] + self.cmdList = [] + if self.pluginstate in ('installed', 'remove'): + if self.packagefiles: + for package in self.packagefiles[:]: + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) + if len(self.cmdList): + self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext) + else: + if self.packagefiles: + for package in self.packagefiles[:]: + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) + if len(self.cmdList): + self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext) + + def runUpgrade(self, result): + if result: + self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList) + + def runUpgradeFinished(self): + self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + + def UpgradeReboot(self, result): + if result is None: + return + if result is False: + self.close(True) + if result: + quitMainloop(3) + + def runRemove(self, result): + if result: + self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList) + + def runRemoveFinished(self): + self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + + def RemoveReboot(self, result): + if result is None: + return + if result is False: + self.close(True) + if result: + quitMainloop(3) + + def reloadPluginlist(self): + plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) + + def fetchFailed(self,string): + self.setThumbnail(noScreenshot = True) + print "[PluginDetails] fetch failed " + string.getErrorMessage() + + +class UpdatePlugin(Screen): + skin = """ + + + + + + """ + + def __init__(self, session, args = None): + Screen.__init__(self, session) + + self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 } + + self.slider = Slider(0, 4) + self["slider"] = self.slider + self.activityslider = Slider(0, 100) + self["activityslider"] = self.activityslider + self.status = StaticText(_("Upgrading Dreambox... Please wait")) + self["status"] = self.status + self.package = StaticText() + self["package"] = self.package + + self.packages = 0 + self.error = 0 + + self.activity = 0 + self.activityTimer = eTimer() + self.activityTimer.callback.append(self.doActivityTimer) + self.activityTimer.start(100, False) + + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) + + self.updating = True + self.package.setText(_("Package list update")) + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + + self["actions"] = ActionMap(["WizardActions"], + { + "ok": self.exit, + "back": self.exit + }, -1) + + def doActivityTimer(self): + self.activity += 1 + if self.activity == 100: + self.activity = 0 + self.activityslider.setValue(self.activity) + + def ipkgCallback(self, event, param): + if event == IpkgComponent.EVENT_DOWNLOAD: + self.status.setText(_("Downloading")) + elif event == IpkgComponent.EVENT_UPGRADE: + if self.sliderPackages.has_key(param): + self.slider.setValue(self.sliderPackages[param]) + self.package.setText(param) + self.status.setText(_("Upgrading")) + self.packages += 1 + elif event == IpkgComponent.EVENT_INSTALL: + self.package.setText(param) + self.status.setText(_("Installing")) + self.packages += 1 + elif event == IpkgComponent.EVENT_CONFIGURING: + self.package.setText(param) + self.status.setText(_("Configuring")) + elif event == IpkgComponent.EVENT_MODIFIED: + self.session.openWithCallback( + self.modificationCallback, + MessageBox, + _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param) + ) + elif event == IpkgComponent.EVENT_ERROR: + self.error += 1 + elif event == IpkgComponent.EVENT_DONE: + if self.updating: + self.updating = False + self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False}) + elif self.error == 0: + self.slider.setValue(4) + + self.activityTimer.stop() + self.activityslider.setValue(0) + + self.package.setText("") + self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages) + else: + self.activityTimer.stop() + self.activityslider.setValue(0) + error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.") + if self.packages == 0: + error = _("No packages were upgraded yet. So you can check your network and try again.") + if self.updating: + error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.") + self.status.setText(_("Error") + " - " + error) + #print event, "-", param + pass + + def modificationCallback(self, res): + self.ipkg.write(res and "N" or "Y") + + def exit(self): + if not self.ipkg.isRunning(): + if self.packages != 0 and self.error == 0: + self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?")) + else: + self.close() + + def exitAnswer(self, result): + if result is not None and result: + quitMainloop(2) + self.close() + + + +class IPKGMenu(Screen): + skin = """ + + + + + + + """ + + def __init__(self, session, plugin_path): + Screen.__init__(self, session) + self.skin_path = plugin_path + + self["key_red"] = StaticText(_("Close")) + self["key_green"] = StaticText(_("Edit")) - def buildCategoryList(self): - self.currList = "category" - self.categories = [] - self.categoryList = [] - for package in self.packagesIndexlist[:]: - prerequisites = package[0]["prerequisites"] - if prerequisites.has_key("tag"): - for foundtag in prerequisites["tag"]: - attributes = package[0]["attributes"] - if foundtag not in self.categories: - self.categories.append(foundtag) - self.categoryList.append(self.buildCategoryComponent(foundtag)) - self.categoryList.sort(key=lambda x: x[0]) - self["list"].style = "category" - self['list'].setList(self.categoryList) - self["list"].updateList(self.categoryList) - self.selectionChanged() + self.sel = [] + self.val = [] + self.entry = False + self.exe = False + + self.path = "" - def buildCategoryComponent(self, tag = None): - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - if tag is not None: - if tag == 'System': - return(( _("System"), _("View list of available system extensions" ), tag, divpng )) - elif tag == 'Skin': - return(( _("Skins"), _("View list of available skins" ), tag, divpng )) - elif tag == 'Recording': - return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng )) - elif tag == 'Network': - return(( _("Network"), _("View list of available networking extensions" ), tag, divpng )) - elif tag == 'CI': - return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng )) - elif tag == 'Default': - return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng )) - elif tag == 'SAT': - return(( _("Satteliteequipment"), _("View list of available Satteliteequipment extensions." ), tag, divpng )) - elif tag == 'Software': - return(( _("Software"), _("View list of available software extensions" ), tag, divpng )) - elif tag == 'Multimedia': - return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng )) - elif tag == 'Display': - return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng )) - elif tag == 'EPG': - return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng )) - elif tag == 'Communication': - return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng )) - else: # dynamically generate non existent tags - return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng )) + self["actions"] = NumberActionMap(["SetupActions"], + { + "ok": self.KeyOk, + "cancel": self.keyCancel + }, -1) - def prepareInstall(self): - self.cmdList = [] - if self.available_updates > 0: - self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False })) - if self.selectedFiles and len(self.selectedFiles): - for plugin in self.selectedFiles: - detailsfile = self.directory[0] + "/" + plugin[0] - if (os_path.exists(detailsfile) == True): - self.fillPackageDetails(plugin[0]) - self.package = self.packageDetails[0] - if self.package[0].has_key("attributes"): - self.attributes = self.package[0]["attributes"] - if self.attributes.has_key("package"): - self.packagefiles = self.attributes["package"] - if plugin[1] == 'installed': - if self.packagefiles: - for package in self.packagefiles[:]: - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) - else: - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) - else: - if self.packagefiles: - for package in self.packagefiles[:]: - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) - else: - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) - else: - if plugin[1] == 'installed': - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] })) - else: - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] })) + self["shortcuts"] = ActionMap(["ShortcutActions"], + { + "red": self.keyCancel, + "green": self.KeyOk, + }) + self.flist = [] + self["filelist"] = MenuList(self.flist) + self.fill_list() + self.onLayoutFinish.append(self.layoutFinished) - def runExecute(self, result): - if result: - self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList) - else: - self.close() + def layoutFinished(self): + self.setWindowTitle() - def runExecuteFinished(self): - self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + def setWindowTitle(self): + self.setTitle(_("Select upgrade source to edit.")) - def ExecuteReboot(self, result): - if result is None: + def fill_list(self): + self.flist = [] + self.path = '/etc/ipkg/' + if (os_path.exists(self.path) == False): + self.entry = False return - if result is False: - self.reloadPluginlist() - self.detailsClosed(True) - if result: - quitMainloop(3) + for file in listdir(self.path): + if (file.endswith(".conf")): + if file != 'arch.conf': + self.flist.append((file)) + self.entry = True + self["filelist"].l.setList(self.flist) - def reloadPluginlist(self): - plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) + def KeyOk(self): + if (self.exe == False) and (self.entry == True): + self.sel = self["filelist"].getCurrent() + self.val = self.path + self.sel + self.session.open(IPKGSource, self.val) + def keyCancel(self): + self.close() -class PluginManagerInfo(Screen): + def Exit(self): + self.close() + + +class IPKGSource(Screen): skin = """ - + - - - {"template": [ - MultiContentEntryText(pos = (50, 1), size = (150, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state - MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap - MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap - ], - "fonts": [gFont("Regular", 22),gFont("Regular", 18)], - "itemHeight": 52 - } - - - - + """ - def __init__(self, session, plugin_path, cmdlist = None): + def __init__(self, session, configfile = None): Screen.__init__(self, session) self.session = session - self.skin_path = plugin_path - self.cmdlist = cmdlist + self.configfile = configfile + text = "" + if self.configfile: + try: + fp = file(configfile, 'r') + sources = fp.readlines() + if sources: + text = sources[0] + fp.close() + except IOError: + pass - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], - { - "ok": self.process, - "back": self.exit, - "red": self.exit, - "green": self.process, - }, -1) + desk = getDesktop(0) + x= int(desk.size().width()) + y= int(desk.size().height()) - self.list = [] - self["list"] = List(self.list) self["key_red"] = StaticText(_("Cancel")) - self["key_green"] = StaticText(_("Continue")) - self["status"] = StaticText(_("Following tasks will be done after you press continue!")) + self["key_green"] = StaticText(_("Save")) - self.onShown.append(self.setWindowTitle) - self.onLayoutFinish.append(self.rebuildList) + if (y>=720): + self["text"] = Input(text, maxSize=False, type=Input.TEXT) + else: + self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT) - def setWindowTitle(self): - self.setTitle(_("Plugin manager activity information")) + self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"], + { + "ok": self.go, + "back": self.close, + "red": self.close, + "green": self.go, + "left": self.keyLeft, + "right": self.keyRight, + "home": self.keyHome, + "end": self.keyEnd, + "deleteForward": self.keyDeleteForward, + "deleteBackward": self.keyDeleteBackward, + "1": self.keyNumberGlobal, + "2": self.keyNumberGlobal, + "3": self.keyNumberGlobal, + "4": self.keyNumberGlobal, + "5": self.keyNumberGlobal, + "6": self.keyNumberGlobal, + "7": self.keyNumberGlobal, + "8": self.keyNumberGlobal, + "9": self.keyNumberGlobal, + "0": self.keyNumberGlobal + }, -1) - def rebuildList(self): - self.list = [] - if self.cmdlist is not None: - for entry in self.cmdlist: - action = "" - info = "" - cmd = entry[0] - if cmd == 0: - action = 'install' - elif cmd == 2: - action = 'remove' - else: - action = 'upgrade' - args = entry[1] - if cmd == 0: - info = args['package'] - elif cmd == 2: - info = args['package'] - else: - info = _("Dreambox software because updates are available.") + self.onLayoutFinish.append(self.layoutFinished) - self.list.append(self.buildEntryComponent(action,info)) - self['list'].setList(self.list) - self['list'].updateList(self.list) + def layoutFinished(self): + self.setWindowTitle() + self["text"].right() - def buildEntryComponent(self, action,info): - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png")) - installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) - removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) - if action == 'install': - return(( _('Installing'), info, installpng, divpng)) - elif action == 'remove': - return(( _('Removing'), info, removepng, divpng)) - else: - return(( _('Upgrading'), info, upgradepng, divpng)) + def setWindowTitle(self): + self.setTitle(_("Edit upgrade source url.")) - def exit(self): - self.close(False) + def go(self): + text = self["text"].getText() + if text: + fp = file(self.configfile, 'w') + fp.write(text) + fp.write("\n") + fp.close() + self.close() - def process(self): - self.close(True) + def keyLeft(self): + self["text"].left() + + def keyRight(self): + self["text"].right() + + def keyHome(self): + self["text"].home() + + def keyEnd(self): + self["text"].end() + + def keyDeleteForward(self): + self["text"].delete() + + def keyDeleteBackward(self): + self["text"].deleteBackward() + + def keyNumberGlobal(self, number): + self["text"].number(number) -class PluginManagerHelp(Screen): +class PacketManager(Screen): skin = """ - + + - + + {"template": [ - MultiContentEntryText(pos = (50, 1), size = (540, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name - MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state - MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap - MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap + MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name + MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description + MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap + MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap ], - "fonts": [gFont("Regular", 22),gFont("Regular", 18)], + "fonts": [gFont("Regular", 22),gFont("Regular", 14)], "itemHeight": 52 } - - """ - - def __init__(self, session, plugin_path): + + def __init__(self, session, plugin_path, args = None): Screen.__init__(self, session) self.session = session self.skin_path = plugin_path - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], + self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], { + "ok": self.go, "back": self.exit, "red": self.exit, + "green": self.reload, }, -1) - + self.list = [] + self.statuslist = [] self["list"] = List(self.list) self["key_red"] = StaticText(_("Close")) - self["status"] = StaticText(_("A small overview of the available icon states and actions.")) + self["key_green"] = StaticText(_("Reload")) + + self.list_updating = True + self.packetlist = [] + self.installed_packetlist = {} + self.Console = Console() + self.cmdList = [] + self.cachelist = [] + self.cache_ttl = 86400 #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs) + self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory + self.oktext = _("\nAfter pressing OK, please wait!") + self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox') + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) self.onShown.append(self.setWindowTitle) self.onLayoutFinish.append(self.rebuildList) - def setWindowTitle(self): - self.setTitle(_("Plugin manager help")) - - def rebuildList(self): - self.list = [] - self.list.append(self.buildEntryComponent('install')) - self.list.append(self.buildEntryComponent('installable')) - self.list.append(self.buildEntryComponent('installed')) - self.list.append(self.buildEntryComponent('remove')) - self['list'].setList(self.list) - self['list'].updateList(self.list) - - def buildEntryComponent(self, state): - divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) - installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png")) - installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png")) - removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png")) - installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png")) - - if state == 'installed': - return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng)) - elif state == 'installable': - return(( _('This plugin is not installed.'), _('You can install this plugin.'), installablepng, divpng)) - elif state == 'install': - return(( _('This plugin will be installed.'), _('You can cancel the installation.'), installpng, divpng)) - elif state == 'remove': - return(( _('This plugin will be removed.'), _('You can cancel the removal.'), removepng, divpng)) - def exit(self): + self.ipkg.stop() + if self.Console is not None: + if len(self.Console.appContainers): + for name in self.Console.appContainers.keys(): + self.Console.kill(name) self.close() - -class PluginDetails(Screen, DreamInfoHandler): - skin = """ - - - - - - - - - - - """ - def __init__(self, session, plugin_path, packagedata = None): - Screen.__init__(self, session) - self.skin_path = plugin_path - self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" - self.attributes = None - self.translatedAttributes = None - DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language) - self.directory = resolveFilename(SCOPE_METADIR) - if packagedata: - self.pluginname = packagedata[0] - self.details = packagedata[1] - self.pluginstate = packagedata[4] - self.statuspicinstance = packagedata[5] - self.divpicinstance = packagedata[6] - self.fillPackageDetails(self.details) - - self.thumbnail = "" - - self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], - { - "back": self.exit, - "red": self.exit, - "green": self.go, - "up": self.pageUp, - "down": self.pageDown, - "left": self.pageUp, - "right": self.pageDown, - }, -1) - - self["key_red"] = StaticText(_("Close")) - self["key_green"] = StaticText("") - self["author"] = StaticText() - self["statuspic"] = Pixmap() - self["divpic"] = Pixmap() - self["screenshot"] = Pixmap() - self["detailtext"] = ScrollLabel() - - self["statuspic"].hide() - self["screenshot"].hide() - self["divpic"].hide() - - self.package = self.packageDetails[0] - if self.package[0].has_key("attributes"): - self.attributes = self.package[0]["attributes"] - if self.package[0].has_key("translation"): - self.translatedAttributes = self.package[0]["translation"] - - self.cmdList = [] - self.oktext = _("\nAfter pressing OK, please wait!") - self.picload = ePicLoad() - self.picload.PictureData.get().append(self.paintScreenshotPixmapCB) - self.onShown.append(self.setWindowTitle) - self.onLayoutFinish.append(self.setInfos) - + def reload(self): + if (os_path.exists(self.cache_file) == True): + remove(self.cache_file) + self.list_updating = True + self.rebuildList() + def setWindowTitle(self): - self.setTitle(_("Package details for: " + self.pluginname)) - - def exit(self): - self.close(False) - - def pageUp(self): - self["detailtext"].pageUp() - - def pageDown(self): - self["detailtext"].pageDown() - - def statusCallback(self, status, progress): - pass - - def setInfos(self): - if self.translatedAttributes.has_key("name"): - self.pluginname = self.translatedAttributes["name"] - elif self.attributes.has_key("name"): - self.pluginname = self.attributes["name"] - else: - self.pluginname = _("unknown") - - if self.translatedAttributes.has_key("author"): - self.author = self.translatedAttributes["author"] - elif self.attributes.has_key("author"): - self.author = self.attributes["author"] - else: - self.author = _("unknown") - - if self.translatedAttributes.has_key("description"): - self.description = self.translatedAttributes["description"] - elif self.attributes.has_key("description"): - self.description = self.attributes["description"] - else: - self.description = _("No description available.") - - if self.translatedAttributes.has_key("screenshot"): - self.loadThumbnail(self.translatedAttributes) - else: - self.loadThumbnail(self.attributes) - - self["author"].setText(_("Author: ") + self.author) - self["detailtext"].setText(self.description.strip()) - if self.pluginstate == 'installable': - self["key_green"].setText(_("Install")) - else: - self["key_green"].setText(_("Remove")) - - def loadThumbnail(self, entry): - thumbnailUrl = None - if entry.has_key("screenshot"): - thumbnailUrl = entry["screenshot"] - if thumbnailUrl is not None: - self.thumbnail = "/tmp/" + thumbnailUrl.split('/')[-1] - print "[PluginDetails] downloading screenshot " + thumbnailUrl + " to " + self.thumbnail - client.downloadPage(thumbnailUrl,self.thumbnail).addCallback(self.setThumbnail).addErrback(self.fetchFailed) - else: - self.setThumbnail(noScreenshot = True) - - def setThumbnail(self, noScreenshot = False): - if not noScreenshot: - filename = self.thumbnail - else: - filename = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/noprev.png") - - sc = AVSwitch().getFramebufferScale() - self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000")) - self.picload.startDecode(filename) - - if self.statuspicinstance != None: - self["statuspic"].instance.setPixmap(self.statuspicinstance.__deref__()) - self["statuspic"].show() - if self.divpicinstance != None: - self["divpic"].instance.setPixmap(self.divpicinstance.__deref__()) - self["divpic"].show() - - def paintScreenshotPixmapCB(self, picInfo=None): - ptr = self.picload.getData() - if ptr != None: - self["screenshot"].instance.setPixmap(ptr.__deref__()) - self["screenshot"].show() - else: - self.setThumbnail(noScreenshot = True) - - def go(self): - if self.attributes.has_key("package"): - self.packagefiles = self.attributes["package"] - self.cmdList = [] - if self.pluginstate == 'installed': - if self.packagefiles: - for package in self.packagefiles[:]: - self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] })) - if len(self.cmdList): - self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext) - else: - if self.packagefiles: - for package in self.packagefiles[:]: - self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] })) - if len(self.cmdList): - self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext) - - def runUpgrade(self, result): - if result: - self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList) + self.setTitle(_("Packet manager")) - def runUpgradeFinished(self): - self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + def setStatus(self,status = None): + if status: + self.statuslist = [] + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + if status == 'update': + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png")) + self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng )) + self['list'].setList(self.statuslist) + elif status == 'error': + statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png")) + self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng )) + self['list'].setList(self.statuslist) - def UpgradeReboot(self, result): - if result is None: - return - if result is False: - self.close(True) - if result: - quitMainloop(3) + def rebuildList(self): + self.setStatus('update') + self.inv_cache = 0 + self.vc = valid_cache(self.cache_file, self.cache_ttl) + if self.cache_ttl > 0 and self.vc != 0: + try: + self.buildPacketList() + except: + self.inv_cache = 1 + if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0: + self.run = 0 + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + + def go(self, returnValue = None): + cur = self["list"].getCurrent() + if cur: + status = cur[3] + package = cur[0] + self.cmdList = [] + if status == 'installed': + self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package })) + if len(self.cmdList): + self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext) + elif status == 'upgradeable': + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package })) + if len(self.cmdList): + self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext) + elif status == "installable": + self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package })) + if len(self.cmdList): + self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext) def runRemove(self, result): if result: @@ -1496,131 +1511,129 @@ class PluginDetails(Screen, DreamInfoHandler): if result is None: return if result is False: - self.close(True) + cur = self["list"].getCurrent() + if cur: + item = self['list'].getIndex() + self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable') + self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable'] + self['list'].setList(self.list) + write_cache(self.cache_file, self.cachelist) + self.reloadPluginlist() if result: quitMainloop(3) - def reloadPluginlist(self): - plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) - - def fetchFailed(self,string): - self.setThumbnail(noScreenshot = True) - print "[PluginDetails] fetch failed " + string.getErrorMessage() - - -class UpdatePlugin(Screen): - skin = """ - - - - - - """ - - def __init__(self, session, args = None): - Screen.__init__(self, session) - - self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 } - - self.slider = Slider(0, 4) - self["slider"] = self.slider - self.activityslider = Slider(0, 100) - self["activityslider"] = self.activityslider - self.status = StaticText(_("Upgrading Dreambox... Please wait")) - self["status"] = self.status - self.package = StaticText() - self["package"] = self.package - - self.packages = 0 - self.error = 0 - - self.activity = 0 - self.activityTimer = eTimer() - self.activityTimer.callback.append(self.doActivityTimer) - self.activityTimer.start(100, False) - - self.ipkg = IpkgComponent() - self.ipkg.addCallback(self.ipkgCallback) - - self.updating = True - self.package.setText(_("Package list update")) - self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) - - self["actions"] = ActionMap(["WizardActions"], - { - "ok": self.exit, - "back": self.exit - }, -1) + def runUpgrade(self, result): + if result: + self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList) - def doActivityTimer(self): - self.activity += 1 - if self.activity == 100: - self.activity = 0 - self.activityslider.setValue(self.activity) + def runUpgradeFinished(self): + self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + + def UpgradeReboot(self, result): + if result is None: + return + if result is False: + cur = self["list"].getCurrent() + if cur: + item = self['list'].getIndex() + self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed') + self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed'] + self['list'].setList(self.list) + write_cache(self.cache_file, self.cachelist) + self.reloadPluginlist() + if result: + quitMainloop(3) def ipkgCallback(self, event, param): - if event == IpkgComponent.EVENT_DOWNLOAD: - self.status.setText(_("Downloading")) - elif event == IpkgComponent.EVENT_UPGRADE: - if self.sliderPackages.has_key(param): - self.slider.setValue(self.sliderPackages[param]) - self.package.setText(param) - self.status.setText(_("Upgrading")) - self.packages += 1 - elif event == IpkgComponent.EVENT_INSTALL: - self.package.setText(param) - self.status.setText(_("Installing")) - self.packages += 1 - elif event == IpkgComponent.EVENT_CONFIGURING: - self.package.setText(param) - self.status.setText(_("Configuring")) - elif event == IpkgComponent.EVENT_MODIFIED: - self.session.openWithCallback( - self.modificationCallback, - MessageBox, - _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param) - ) - elif event == IpkgComponent.EVENT_ERROR: - self.error += 1 + if event == IpkgComponent.EVENT_ERROR: + self.list_updating = False + self.setStatus('error') elif event == IpkgComponent.EVENT_DONE: - if self.updating: - self.updating = False - self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False}) - elif self.error == 0: - self.slider.setValue(4) - - self.activityTimer.stop() - self.activityslider.setValue(0) - - self.package.setText("") - self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages) - else: - self.activityTimer.stop() - self.activityslider.setValue(0) - error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.") - if self.packages == 0: - error = _("No packages were upgraded yet. So you can check your network and try again.") - if self.updating: - error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.") - self.status.setText(_("Error") + " - " + error) + if self.list_updating: + self.list_updating = False + if not self.Console: + self.Console = Console() + cmd = "ipkg list" + self.Console.ePopen(cmd, self.IpkgList_Finished) #print event, "-", param pass - def modificationCallback(self, res): - self.ipkg.write(res and "N" or "Y") + def IpkgList_Finished(self, result, retval, extra_args = None): + if result: + self.packetlist = [] + for x in result.splitlines(): + tokens = x.split(' - ') #self.blacklisted_packages + name = tokens[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + l = len(tokens) + version = l > 1 and tokens[1].strip() or "" + descr = l > 2 and tokens[2].strip() or "" + self.packetlist.append([name, version, descr]) + if not self.Console: + self.Console = Console() + cmd = "ipkg list_installed" + self.Console.ePopen(cmd, self.IpkgListInstalled_Finished) - def exit(self): - if not self.ipkg.isRunning(): - if self.packages != 0 and self.error == 0: - self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?")) - else: - self.close() + def IpkgListInstalled_Finished(self, result, retval, extra_args = None): + if result: + self.installed_packetlist = {} + for x in result.splitlines(): + tokens = x.split(' - ') #self.blacklisted_packages + name = tokens[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + l = len(tokens) + version = l > 1 and tokens[1].strip() or "" + self.installed_packetlist[name] = version + self.buildPacketList() - def exitAnswer(self, result): - if result is not None and result: - quitMainloop(2) - self.close() + def buildEntryComponent(self, name, version, description, state): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + if state == 'installed': + installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png")) + return((name, version, description, state, installedpng, divpng)) + elif state == 'upgradeable': + upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png")) + return((name, version, description, state, upgradeablepng, divpng)) + else: + installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png")) + return((name, version, description, state, installablepng, divpng)) + + def buildPacketList(self): + self.list = [] + self.cachelist = [] + + if self.cache_ttl > 0 and self.vc != 0: + print 'Loading packagelist cache from ',self.cache_file + try: + self.cachelist = load_cache(self.cache_file) + if len(self.cachelist) > 0: + for x in self.cachelist: + self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3])) + self['list'].setList(self.list) + except: + self.inv_cache = 1 + + if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0: + print 'rebuilding fresh package list' + for x in self.packetlist: + status = "" + if self.installed_packetlist.has_key(x[0].strip()): + if self.installed_packetlist[x[0].strip()] == x[1].strip(): + status = "installed" + self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + else: + status = "upgradeable" + self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + else: + status = "installable" + self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions): + self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status]) + write_cache(self.cache_file, self.cachelist) + self['list'].setList(self.list) + def reloadPluginlist(self): + plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) class IpkgInstaller(Screen): skin = """ @@ -1687,15 +1700,16 @@ def UpgradeMain(session, **kwargs): def startSetup(menuid): if menuid != "setup": return [ ] - return [(_("Software manager"), UpgradeMain, "software_manager", 50)] + return [(_("Software management"), UpgradeMain, "software_manager", 50)] + def Plugins(path, **kwargs): global plugin_path plugin_path = path list = [ - PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup), + PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup), PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan) ] if config.usage.setup_level.index >= 2: # expert+ - list.append(PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain)) + list.append(PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain)) return list diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am b/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am new file mode 100644 index 00000000..78ff11c3 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/TempFanControl + +install_PYTHON = \ + __init__.py \ + plugin.py diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/__init__.py b/lib/python/Plugins/SystemPlugins/TempFanControl/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py new file mode 100644 index 00000000..c8af9cdd --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py @@ -0,0 +1,169 @@ +from Components.ActionMap import ActionMap +from Components.Sensors import sensors +from Components.Sources.Sensor import SensorSource +from Components.Sources.StaticText import StaticText +from Components.ConfigList import ConfigListScreen +from Components.config import getConfigListEntry + +from Screens.Screen import Screen + +from Plugins.Plugin import PluginDescriptor +from Components.FanControl import fancontrol + +class TempFanControl(Screen, ConfigListScreen): + skin = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + + def __init__(self, session, args = None): + Screen.__init__(self, session) + + templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE) + tempcount = len(templist) + fanlist = sensors.getSensorsList(sensors.TYPE_FAN_RPM) + fancount = len(fanlist) + + self["red"] = StaticText(_("Cancel")) + self["green"] = StaticText(_("OK")) + self["yellow"] = StaticText("") + self["blue"] = StaticText("") + + for count in range(8): + if count < tempcount: + id = templist[count] + self["SensorTempText%d" % count] = StaticText(sensors.getSensorName(id)) + self["SensorTemp%d" % count] = SensorSource(sensorid = id) + else: + self["SensorTempText%d" % count] = StaticText("") + self["SensorTemp%d" % count] = SensorSource() + + if count < fancount: + id = fanlist[count] + self["SensorFanText%d" % count] = StaticText(sensors.getSensorName(id)) + self["SensorFan%d" % count] = SensorSource(sensorid = id) + else: + self["SensorFanText%d" % count] = StaticText("") + self["SensorFan%d" % count] = SensorSource() + + self.list = [] + for count in range(fancontrol.getFanCount()): + self.list.append(getConfigListEntry(_("Fan %d Voltage") % (count + 1), fancontrol.getConfig(count).vlt)) + self.list.append(getConfigListEntry(_("Fan %d PWM") % (count + 1), fancontrol.getConfig(count).pwm)) + self.list.append(getConfigListEntry(_("Standby Fan %d Voltage") % (count + 1), fancontrol.getConfig(count).vlt_standby)) + self.list.append(getConfigListEntry(_("Standby Fan %d PWM") % (count + 1), fancontrol.getConfig(count).pwm_standby)) + + ConfigListScreen.__init__(self, self.list, session = self.session) + #self["config"].list = self.list + #self["config"].setList(self.list) + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], + { + "ok": self.save, + "cancel": self.revert, + "red": self.revert, + "green": self.save + }, -1) + + def save(self): + for count in range(fancontrol.getFanCount()): + fancontrol.getConfig(count).vlt.save() + fancontrol.getConfig(count).pwm.save() + fancontrol.getConfig(count).vlt_standby.save() + fancontrol.getConfig(count).pwm_standby.save() + self.close() + + def revert(self): + for count in range(fancontrol.getFanCount()): + fancontrol.getConfig(count).vlt.load() + fancontrol.getConfig(count).pwm.load() + fancontrol.getConfig(count).vlt_standby.load() + fancontrol.getConfig(count).pwm_standby.load() + self.close() + +def main(session, **kwargs): + session.open(TempFanControl) + +def startMenu(menuid): + if menuid != "system": + return [] + return [(_("Temperature and Fan control"), main, "tempfancontrol", 80)] + +def Plugins(**kwargs): + return PluginDescriptor(name = "Temperature and Fan control", description = _("Temperature and Fan control"), where = PluginDescriptor.WHERE_MENU, fnc = startMenu) + diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am index 9e248084..2e80f306 100755 --- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_videoenhancement.xml -EXTRA_DIST = videoenhancement.jpg +EXTRA_DIST = videoenhancement_en.jpg videoenhancement_de.jpg diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml index 33b222ef..208c7e0c 100755 --- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml +++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml @@ -1,5 +1,8 @@ + + + @@ -9,15 +12,15 @@ enigma2-plugin-systemplugins-videoenhancement VideoEnhancement provides advanced video enhancement settings. The VideoEnhancement extension provides advanced video enhancement settings. - + Dream Multimedia - VideoEnhancement + Erweiterte A/V Einstellungen enigma2-plugin-systemplugins-videoenhancement - Videomode bietet erweiterte Video Konfigurationsoptionen. - Die Videomode-Erweiterung bietet erweiterte Video Konfigurationsoptionen. - + Erweiterte A/V Einstellungen für Ihre Dreambox. + Erweiterte A/V Einstellungen für Ihre Dreambox. + diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg deleted file mode 100755 index 0e0ef6fc..00000000 Binary files a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg new file mode 100755 index 00000000..ecf0161d Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg new file mode 100755 index 00000000..a97a7a34 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml b/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml old mode 100644 new mode 100755 index 75abb90e..c4609433 --- a/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml +++ b/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml @@ -9,7 +9,7 @@ enigma2-plugin-systemplugins-videotune VideoTune helps fine-tuning your tv display. The VideoTune helps fine-tuning your tv display.\nYou can control brightness and contrast of your tv. - + Dream Multimedia - DE @@ -18,7 +18,7 @@ VideoTune hilft beim fein-einstellen des Fernsehers. VideoTune hilf beim fein-einstellen des Fernsehers.\nSie können Kontrast und Helligkeit fein-einstellen. - + diff --git a/lib/python/Plugins/SystemPlugins/Videomode/HDMI.png b/lib/python/Plugins/SystemPlugins/Videomode/HDMI.png new file mode 100644 index 00000000..5aa83047 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/HDMI.png differ diff --git a/lib/python/Plugins/SystemPlugins/Videomode/Makefile.am b/lib/python/Plugins/SystemPlugins/Videomode/Makefile.am index 2ec0b335..1ac1d5dd 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Videomode/Makefile.am @@ -16,4 +16,6 @@ dist_install_DATA = \ LICENSE \ Scart.png \ videowizard.xml \ - YPbPr.png + YPbPr.png \ + HDMI.png \ + lcd_HDMI.png diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py index 3759c21a..15f4d516 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py @@ -84,7 +84,8 @@ class VideoWizard(WizardLanguage, Rc): descr = port if descr == 'DVI' and hw_type == 'dm500hd': descr = 'HDMI' - list.append((descr,port)) + if port != "DVI-PC": + list.append((descr,port)) list.sort(key = lambda x: x[0]) print "listInputChannels:", list return list @@ -98,7 +99,10 @@ class VideoWizard(WizardLanguage, Rc): print "input selection moved:", self.selection self.inputSelect(self.selection) if self["portpic"].instance is not None: - self["portpic"].instance.setPixmapFromFile(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/Videomode/" + self.selection + ".png")) + picname = self.selection + if picname == "DVI" and HardwareInfo().get_device_name() == "dm500hd": + picname = "HDMI" + self["portpic"].instance.setPixmapFromFile(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/Videomode/" + picname + ".png")) def inputSelect(self, port): print "inputSelect:", port @@ -130,8 +134,12 @@ class VideoWizard(WizardLanguage, Rc): def modeSelect(self, mode): ratesList = self.listRates(mode) print "ratesList:", ratesList - self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0]) - + if self.port == "DVI" and mode in ("720p", "1080i"): + self.rate = "multi" + self.hw.setMode(port = self.port, mode = mode, rate = "multi") + else: + self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0]) + def listRates(self, querymode = None): if querymode is None: querymode = self.mode diff --git a/lib/python/Plugins/SystemPlugins/Videomode/lcd_HDMI.png b/lib/python/Plugins/SystemPlugins/Videomode/lcd_HDMI.png new file mode 100644 index 00000000..425da5c3 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/lcd_HDMI.png differ diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am index 6c012e84..ef474435 100755 --- a/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am @@ -2,4 +2,4 @@ installdir = $(datadir)/meta/ dist_install_DATA = plugin_videomode.xml -EXTRA_DIST = videomode.jpg +EXTRA_DIST = videomode_en.jpg videomode_de.jpg diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml b/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml old mode 100644 new mode 100755 index 3891e0b1..fbb6e3f4 --- a/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml +++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml @@ -9,7 +9,7 @@ enigma2-plugin-systemplugins-videomode Videomode provides advanced video modes. The Videomode extension provides advanced video modes. - + Dream Multimedia @@ -17,7 +17,7 @@ enigma2-plugin-systemplugins-videomode Videomode bietet erweiterte Video Einstellungen. Die Videomode-Erweiterung bietet erweiterte Video-Einstellungen. - + diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg deleted file mode 100644 index adb5646b..00000000 Binary files a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg and /dev/null differ diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg new file mode 100755 index 00000000..00b7ac70 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg new file mode 100755 index 00000000..1f4288b9 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py index 733edd6d..39c1131a 100755 --- a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py @@ -218,7 +218,7 @@ def startSetup(menuid): if menuid != "system": return [ ] - return [(_("A/V Settings") + "...", videoSetupMain, "av_setup", 40)] + return [(_("A/V Settings"), videoSetupMain, "av_setup", 40)] def VideoWizard(*args, **kwargs): from VideoWizard import VideoWizard diff --git a/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml b/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml index 29ac4297..5dea661d 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml +++ b/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml @@ -20,7 +20,7 @@ self.selectKey("DOWN") self["portpic"].hide() - + self.condition = (self.port != "DVI" or self.mode == "PC") @@ -33,7 +33,7 @@ self.selectKey("UP") self.selectKey("DOWN") - + self.hw.saveMode(self.port, self.mode, self.rate) diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am index 365372c2..2f362379 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am @@ -1,6 +1,6 @@ installdir = $(pkglibdir)/python/Plugins/SystemPlugins/WirelessLan -#SUBDIRS = meta +SUBDIRS = meta install_PYTHON = \ __init__.py \ diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py index ba1e13d4..1c1471ce 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py @@ -1,7 +1,7 @@ -from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER -from Components.MultiContent import MultiContentEntryText -from Components.GUIComponent import GUIComponent -from Components.HTMLComponent import HTMLComponent +#from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER +#from Components.MultiContent import MultiContentEntryText +#from Components.GUIComponent import GUIComponent +#from Components.HTMLComponent import HTMLComponent from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword from Components.Console import Console @@ -35,13 +35,12 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl class Wlan: def __init__(self, iface): a = ''; b = '' - for i in range(0, 255): - a = a + chr(i) - if i < 32 or i > 127: - b = b + ' ' - else: - b = b + chr(i) + a = a + chr(i) + if i < 32 or i > 127: + b = b + ' ' + else: + b = b + chr(i) self.iface = iface self.wlaniface = {} @@ -245,91 +244,6 @@ class Wlan: return status - -class WlanList(HTMLComponent, GUIComponent): - def __init__(self, session, iface): - - GUIComponent.__init__(self) - self.w = Wlan(iface) - self.iface = iface - - self.length = 0 - self.aplist = None - self.list = None - self.oldlist = None - self.l = None - self.l = eListboxPythonMultiContent() - - self.l.setFont(0, gFont("Regular", 32)) - self.l.setFont(1, gFont("Regular", 18)) - self.l.setFont(2, gFont("Regular", 16)) - self.l.setBuildFunc(self.buildWlanListEntry) - - self.reload() - - def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate, signal): - - res = [ (essid, encrypted, iface) ] - - if essid == "": - essid = bssid - - e = encrypted and _("Yes") or _("No") - res.append( MultiContentEntryText(pos=(0, 0), size=(470, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) ) - res.append( MultiContentEntryText(pos=(425, 0), size=(60, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Signal: "))) - res.append( MultiContentEntryText(pos=(480, 0), size=(70, 35), font=0, flags=RT_HALIGN_RIGHT, text="%s" %signal)) - res.append( MultiContentEntryText(pos=(0, 40), size=(180, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Max. Bitrate: %s") %maxrate )) - res.append( MultiContentEntryText(pos=(190, 40), size=(180, 20), font=1, flags=RT_HALIGN_CENTER, text=_("Encrypted: %s") %e )) - res.append( MultiContentEntryText(pos=(345, 40), size=(190, 20), font=1, flags=RT_HALIGN_RIGHT, text=_("Interface: %s") %iface )) - return res - - - def reload(self): - aps = self.w.getNetworkList() - - self.list = [] - self.aplist = [] - if aps is not None: - print "[Wlan.py] got Accespoints!" - for ap in aps: - a = aps[ap] - if a['active']: - if a['essid'] != '': - # a['essid'] = a['bssid'] - self.list.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) ) - #self.aplist.append( a['essid']) - if self.oldlist is not None: - for entry in self.oldlist: - if entry not in self.list: - self.list.append(entry) - - if len(self.list): - for entry in self.list: - self.aplist.append( entry[0]) - self.length = len(self.list) - self.oldlist = self.list - self.l.setList([]) - self.l.setList(self.list) - - GUI_WIDGET = eListbox - - - def getCurrent(self): - return self.l.getCurrentSelection() - - - def postWidgetCreate(self, instance): - instance.setContent(self.l) - instance.setItemHeight(60) - - - def getLength(self): - return self.length - - def getList(self): - return self.aplist - - class wpaSupplicant: def __init__(self): pass diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am new file mode 100755 index 00000000..6bc4aab0 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(datadir)/meta/ + +dist_install_DATA = plugin_wirelesslan.xml + +EXTRA_DIST = wirelesslan_de.jpg wirelesslan_en.jpg diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml new file mode 100755 index 00000000..1f882b32 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml @@ -0,0 +1,27 @@ + + + + + + + Dream Multimedia + WirelessLan + enigma2-plugin-systemplugins-wirelesslan + Configure your WLAN network interface + The WirelessLan extensions helps you configuring your WLAN network interface. + + + + Dream Multimedia + WirelessLan + enigma2-plugin-systemplugins-wirelesslan + Konfigurieren Sie Ihr WLAN Netzwerk. + Die WirelessLan Erweiterung hilft Ihnen beim konfigurieren Ihres WLAN Netzwerkes.. + + + + + + + + diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg new file mode 100755 index 00000000..38695418 Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg new file mode 100755 index 00000000..fe4fa97d Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg differ diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py index b7a64b9a..2df5814c 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py @@ -4,6 +4,7 @@ from Components.ActionMap import ActionMap, NumberActionMap from Components.Pixmap import Pixmap,MultiPixmap from Components.Label import Label from Components.Sources.StaticText import StaticText +from Components.Sources.List import List from Components.MenuList import MenuList from Components.config import config, getConfigListEntry, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword from Components.ConfigList import ConfigListScreen @@ -11,8 +12,9 @@ from Components.Network import Network, iNetwork from Components.Console import Console from Plugins.Plugin import PluginDescriptor from os import system, path as os_path, listdir -from Wlan import Wlan, WlanList, wpaSupplicant -from Wlan import Status, iStatus +from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE +from Tools.LoadPixmap import LoadPixmap +from Wlan import Wlan, wpaSupplicant, iStatus plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan" @@ -39,37 +41,35 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl class WlanStatus(Screen): skin = """ - - - - - - - - - - - - - - - - - - - - - - - - - """ + + + + + + + + + + + + + + + + + + + + + + + + """ def __init__(self, session, iface): Screen.__init__(self, session) self.session = session self.iface = iface - self.skin = WlanStatus.skin self["LabelBSSID"] = StaticText(_('Accesspoint:')) self["LabelESSID"] = StaticText(_('SSID:')) @@ -114,7 +114,6 @@ class WlanStatus(Screen): self.setTitle(_("Wireless Network State")) def resetList(self): - print "self.iface im resetlist",self.iface iStatus.getDataForInterface(self.iface,self.getInfoCB) def getInfoCB(self,data,status): @@ -131,10 +130,9 @@ class WlanStatus(Screen): def exit(self): self.timer.stop() - self.close() + self.close(True) def updateStatusbar(self): - print "self.iface im updateStatusbar",self.iface self["BSSID"].setText(_("Please wait...")) self["ESSID"].setText(_("Please wait...")) self["quality"].setText(_("Please wait...")) @@ -153,39 +151,58 @@ class WlanStatus(Screen): self["statuspic"].setPixmapNum(0) self["statuspic"].show() + class WlanScan(Screen): skin = """ - - - - - - - - - - - - """ + + + + + + + + + + {"template": [ + MultiContentEntryText(pos = (0, 0), size = (550, 30), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the essid + MultiContentEntryText(pos = (0, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 5), # index 5 is the interface + MultiContentEntryText(pos = (175, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 4), # index 0 is the encryption + MultiContentEntryText(pos = (350, 0), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 0 is the signal + MultiContentEntryText(pos = (350, 30), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 3), # index 0 is the maxrate + MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap + ], + "fonts": [gFont("Regular", 28),gFont("Regular", 18)], + "itemHeight": 54 + } + + + + + """ def __init__(self, session, iface): Screen.__init__(self, session) self.session = session self.iface = iface - self.skin = WlanScan.skin self.skin_path = plugin_path self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") + self.APList = None + self.newAPList = None + self.WlanList = None + self.cleanList = None + self.oldlist = {} + self.listLength = None + self.rescanTimer = eTimer() + self.rescanTimer.callback.append(self.rescanTimerFired) self["info"] = StaticText() - self.list = [] - self["list"] = WlanList(self.session, self.iface) + self.list = [] + self["list"] = List(self.list) - self.setInfo() - self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Connect")) - self["key_yellow"] = StaticText(_("Refresh")) + self["key_yellow"] = StaticText() self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"], { @@ -195,63 +212,165 @@ class WlanScan(Screen): self["shortcuts"] = ActionMap(["ShortcutActions"], { - "red": self.cancel, + "red": self.cancel, "green": self.select, - "yellow": self.rescan, }) self.onLayoutFinish.append(self.layoutFinished) + self.getAccessPoints(refresh = False) def layoutFinished(self): self.setTitle(_("Choose a wireless network")) def select(self): cur = self["list"].getCurrent() - #print "CURRENT",cur if cur is not None: + self.rescanTimer.stop() + del self.rescanTimer if cur[1] is not None: - essid = cur[0] - if essid == '': + if cur[1] == 'hidden...': essid = cur[1] - encrypted = cur[2] - self.close(essid,self["list"].getList()) + else: + essid = cur[0] + self.close(essid,self.getWlanList()) else: self.close(None,None) else: + self.rescanTimer.stop() + del self.rescanTimer self.close(None,None) def WlanSetupClosed(self, *ret): if ret[0] == 2: + self.rescanTimer.stop() + del self.rescanTimer self.close(None) - def rescan(self): - self["list"].reload() - self.setInfo() - def cancel(self): if self.oldInterfaceState is False: + iNetwork.setAdapterAttribute(self.iface, "up", False) iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB) else: + self.rescanTimer.stop() + del self.rescanTimer self.close(None) 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.rescanTimer.stop() + del self.rescanTimer self.close(None) - def setInfo(self): - length = self["list"].getLength() + def rescanTimerFired(self): + self.rescanTimer.stop() + self.updateAPList() + + def buildEntryComponent(self, essid, bssid, encrypted, iface, maxrate, signal): + divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png")) + encryption = encrypted and _("Yes") or _("No") + if bssid == 'hidden...': + return((essid, bssid, None, None, None, None, divpng)) + else: + return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng)) + + def updateAPList(self): + newList = [] + newList = self.getAccessPoints(refresh = True) + self.newAPList = [] + tmpList = [] + newListIndex = None + currentListEntry = None + currentListIndex = None + + for ap in self.oldlist.keys(): + data = self.oldlist[ap]['data'] + if data is not None: + tmpList.append(data) + + if len(tmpList): + if "hidden..." not in tmpList: + tmpList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) ) + + for entry in tmpList: + self.newAPList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] )) + + currentListEntry = self["list"].getCurrent() + idx = 0 + for entry in self.newAPList: + if entry[0] == currentListEntry[0]: + newListIndex = idx + idx +=1 + self['list'].setList(self.newAPList) + self["list"].setIndex(newListIndex) + self["list"].updateList(self.newAPList) + self.listLength = len(self.newAPList) + self.buildWlanList() + self.setInfo() + + def getAccessPoints(self, refresh = False): + self.APList = [] + self.cleanList = [] + self.w = Wlan(self.iface) + aps = self.w.getNetworkList() + if aps is not None: + print "[WirelessLan.py] got Accespoints!" + tmpList = [] + compList = [] + for ap in aps: + a = aps[ap] + if a['active']: + tmpList.append( (a['essid'], a['bssid']) ) + compList.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) ) + + for entry in tmpList: + if entry[0] == "": + for compentry in compList: + if compentry[1] == entry[1]: + compList.remove(compentry) + for entry in compList: + self.cleanList.append( ( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ) ) + if not self.oldlist.has_key(entry[0]): + self.oldlist[entry[0]] = { 'data': entry } + else: + self.oldlist[entry[0]]['data'] = entry + + if "hidden..." not in self.cleanList: + self.cleanList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) ) + + for entry in self.cleanList: + self.APList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] )) - if length == 0: + if refresh is False: + self['list'].setList(self.APList) + self.listLength = len(self.APList) + self.setInfo() + self.rescanTimer.start(5000) + return self.cleanList + + def setInfo(self): + length = self.getLength() + if length <= 1: self["info"].setText(_("No wireless networks found! Please refresh.")) - elif length == 1: + elif length == 2: self["info"].setText(_("1 wireless network found!")) else: - self["info"].setText(str(length)+_(" wireless networks found!")) + self["info"].setText(str(length-1)+_(" wireless networks found!")) + + def buildWlanList(self): + self.WlanList = [] + for entry in self['list'].list: + if entry[1] == "hidden...": + self.WlanList.append(( "hidden...",_("enter hidden network SSID") ))#continue + else: + self.WlanList.append( (entry[0], entry[0]) ) + + def getLength(self): + return self.listLength + + def getWlanList(self): + if self.WlanList is None: + self.buildWlanList() + return self.WlanList def WlanStatusScreenMain(session, iface): @@ -259,13 +378,11 @@ def WlanStatusScreenMain(session, iface): def callFunction(iface): - w = Wlan(iface) i = w.getWirelessInterfaces() if i: if iface in i: return WlanStatusScreenMain - return None @@ -282,4 +399,3 @@ def configStrings(iface): def Plugins(**kwargs): return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."}) - \ No newline at end of file diff --git a/lib/python/Plugins/newplugin.py b/lib/python/Plugins/newplugin.py index 48bb28ea..c1c6f948 100644 --- a/lib/python/Plugins/newplugin.py +++ b/lib/python/Plugins/newplugin.py @@ -101,8 +101,8 @@ for where in targetlist: importlist.append(where[0]) file.write("""from Screens.Screen import Screen -from Plugins.Plugin import PluginDescriptor, %s -""" % ', '.join(importlist)) +from Plugins.Plugin import PluginDescriptor +""") mainlist = [] for count in range(len(targetlist)): diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 0432823b..0895c9c2 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -21,14 +21,16 @@ profile("ChannelSelection.py 2.3") from Components.Input import Input profile("ChannelSelection.py 3") from Components.ParentalControl import parentalControl +from Components.ChoiceList import ChoiceList, ChoiceEntryComponent +from Components.SystemInfo import SystemInfo from Screens.InputBox import InputBox, PinInput from Screens.MessageBox import MessageBox from Screens.ServiceInfo import ServiceInfo profile("ChannelSelection.py 4") +from Screens.PictureInPicture import PictureInPicture from Screens.RdsDisplay import RassInteractive from ServiceReference import ServiceReference from Tools.BoundFunction import boundFunction -from re import compile from os import remove profile("ChannelSelection.py after imports") @@ -69,9 +71,9 @@ OFF = 0 EDIT_BOUQUET = 1 EDIT_ALTERNATIVES = 2 -def append_when_current_valid(current, menu, args, level = 0): +def append_when_current_valid(current, menu, args, level = 0, key = ""): if current and current.valid() and level <= config.usage.setup_level.index: - menu.append(args) + menu.append(ChoiceEntryComponent(key, args)) class ChannelContextMenu(Screen): def __init__(self, session, csel): @@ -80,13 +82,15 @@ class ChannelContextMenu(Screen): self.csel = csel self.bsel = None - self["actions"] = ActionMap(["OkCancelActions"], + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "NumberActions"], { "ok": self.okbuttonClick, - "cancel": self.cancelClick + "cancel": self.cancelClick, + "blue": self.showServiceInPiP }) menu = [ ] + self.pipAvailable = False current = csel.getCurrentSelection() current_root = csel.getRoot() current_sel_path = current.getPath() @@ -122,8 +126,11 @@ class ChannelContextMenu(Screen): append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0) if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0) + if isPlayable and SystemInfo.get("NumVideoDecoders", 1) > 1: + append_when_current_valid(current, menu, (_("Activate Picture in Picture"), self.showServiceInPiP), level = 0, key = "blue") + self.pipAvailable = True else: - menu.append((_("add bouquet"), self.showBouquetInputBox)) + menu.append(ChoiceEntryComponent(text = (_("add bouquet"), self.showBouquetInputBox))) append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0) if inBouquet: # current list is editable? @@ -131,7 +138,7 @@ class ChannelContextMenu(Screen): if not csel.movemode: append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1) if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup): - menu.append((_("add marker"), self.showMarkerInputBox)) + menu.append(ChoiceEntryComponent(text = (_("add marker"), self.showMarkerInputBox))) if haveBouquets: append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0) else: @@ -156,11 +163,11 @@ class ChannelContextMenu(Screen): append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0) append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0) - menu.append((_("back"), self.cancelClick)) - self["menu"] = MenuList(menu) + menu.append(ChoiceEntryComponent(text = (_("back"), self.cancelClick))) + self["menu"] = ChoiceList(menu) def okbuttonClick(self): - self["menu"].getCurrent()[1]() + self["menu"].getCurrent()[0][1]() def cancelClick(self): self.close(False) @@ -189,6 +196,23 @@ class ChannelContextMenu(Screen): self.close() else: self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR) + + def showServiceInPiP(self): + if not self.pipAvailable: + return + if self.session.pipshown: + del self.session.pip + self.session.pip = self.session.instantiateDialog(PictureInPicture) + self.session.pip.show() + newservice = self.csel.servicelist.getCurrent() + if self.session.pip.playService(newservice): + self.session.pipshown = True + self.session.pip.servicePath = self.csel.getCurrentServicePath() + self.close(True) + else: + self.session.pipshown = False + del self.session.pip + self.session.openWithCallback(self.close, MessageBox, _("Could not open Picture in Picture"), MessageBox.TYPE_ERROR) def addServiceToBouquetSelected(self): bouquets = self.csel.getBouquetList() @@ -425,7 +449,7 @@ class ChannelSelectionEdit: if mutableAlternatives: mutableAlternatives.setListName(name) if mutableAlternatives.addService(cur_service.ref): - print "add", cur_service.toString(), "to new alternatives failed" + print "add", cur_service.ref.toString(), "to new alternatives failed" mutableAlternatives.flushChanges() self.servicelist.addService(new_ref.ref, True) self.servicelist.removeCurrent() @@ -648,7 +672,11 @@ class ChannelSelectionEdit: self.entry_marked = True def doContext(self): - self.session.open(ChannelContextMenu, self) + self.session.openWithCallback(self.exitContext, ChannelContextMenu, self) + + def exitContext(self, close = False): + if close: + self.cancel() MODE_TV = 0 MODE_RADIO = 1 @@ -684,6 +712,7 @@ class ChannelSelectionBase(Screen): self.servicePathTV = [ ] self.servicePathRadio = [ ] self.servicePath = [ ] + self.rootChanged = False self.mode = MODE_TV @@ -790,6 +819,7 @@ class ChannelSelectionBase(Screen): else: self.servicelist.setMode(ServiceList.MODE_NORMAL) self.servicelist.setRoot(root, justSet) + self.rootChanged = True self.buildTitleString() def removeModeStr(self, str): @@ -1151,6 +1181,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.servicelist.setPlayableIgnoreService(eServiceReference()) def setMode(self): + self.rootChanged = True self.restoreRoot() lastservice=eServiceReference(self.lastservice.value) if lastservice.valid(): @@ -1274,19 +1305,21 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.lastroot.save() def restoreRoot(self): - self.clearPath() - re = compile('.+?;') - tmp = re.findall(self.lastroot.value) - cnt = 0 - for i in tmp: - self.servicePath.append(eServiceReference(i[:-1])) - cnt += 1 - if cnt: - path = self.servicePath.pop() - self.enterPath(path) - else: - self.showFavourites() - self.saveRoot() + tmp = [x for x in self.lastroot.value.split(';') if x != ''] + current = [x.toString() for x in self.servicePath] + if tmp != current or self.rootChanged: + self.clearPath() + cnt = 0 + for i in tmp: + self.servicePath.append(eServiceReference(i)) + cnt += 1 + if cnt: + path = self.servicePath.pop() + self.enterPath(path) + else: + self.showFavourites() + self.saveRoot() + self.rootChanged = False def preEnterPath(self, refstr): if self.servicePath and self.servicePath[0] != eServiceReference(refstr): @@ -1434,19 +1467,20 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS config.radio.lastroot.save() def restoreRoot(self): - self.clearPath() - re = compile('.+?;') - tmp = re.findall(config.radio.lastroot.value) - cnt = 0 - for i in tmp: - self.servicePathRadio.append(eServiceReference(i[:-1])) - cnt += 1 - if cnt: - path = self.servicePathRadio.pop() - self.enterPath(path) - else: - self.showFavourites() - self.saveRoot() + tmp = [x for x in config.radio.lastroot.value.split(';') if x != ''] + current = [x.toString() for x in self.servicePath] + if tmp != current or self.rootChanged: + cnt = 0 + for i in tmp: + self.servicePathRadio.append(eServiceReference(i)) + cnt += 1 + if cnt: + path = self.servicePathRadio.pop() + self.enterPath(path) + else: + self.showFavourites() + self.saveRoot() + self.rootChanged = False def preEnterPath(self, refstr): if self.servicePathRadio and self.servicePathRadio[0] != eServiceReference(refstr): diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py index 3dde7e22..f8edba11 100644 --- a/lib/python/Screens/EpgSelection.py +++ b/lib/python/Screens/EpgSelection.py @@ -6,6 +6,7 @@ from Components.Label import Label from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI from Components.ActionMap import ActionMap from Components.TimerSanityCheck import TimerSanityCheck +from Components.UsageConfig import preferredTimerPath from Components.Sources.ServiceEvent import ServiceEvent from Components.Sources.Event import Event from Screens.TimerEdit import TimerSanityConflict @@ -235,7 +236,7 @@ class EPGSelection(Screen): self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName()) break else: - newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event)) + newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(event)) self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) def finishedAdd(self, answer): diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py index c1ffb585..cced3ceb 100644 --- a/lib/python/Screens/EventView.py +++ b/lib/python/Screens/EventView.py @@ -6,6 +6,7 @@ from Components.Button import Button from Components.Label import Label from Components.ScrollLabel import ScrollLabel from Components.TimerList import TimerList +from Components.UsageConfig import preferredTimerPath from enigma import eEPGCache, eTimer, eServiceReference from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT from TimerEntry import TimerEntry @@ -85,7 +86,7 @@ class EventViewBase: self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName()) break else: - newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event)) + newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(self.event)) self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry) def finishedAdd(self, answer): diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py index 59cc21d3..5b061245 100644 --- a/lib/python/Screens/InfoBar.py +++ b/lib/python/Screens/InfoBar.py @@ -12,7 +12,7 @@ profile("LOAD:InfoBarGenerics") from Screens.InfoBarGenerics import InfoBarShowHide, \ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \ InfoBarEPG, InfoBarSeek, InfoBarInstantRecord, \ - InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \ + InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey, \ InfoBarSubserviceSelection, InfoBarShowMovies, InfoBarTimeshift, \ InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView, \ InfoBarSummarySupport, InfoBarMoviePlayerSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, \ @@ -29,7 +29,7 @@ from Screens.HelpMenu import HelpableScreen class InfoBar(InfoBarBase, InfoBarShowHide, InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, InfoBarInstantRecord, InfoBarAudioSelection, - HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, + HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey, InfoBarSubserviceSelection, InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarPlugins, InfoBarSubtitleSupport, InfoBarServiceErrorPopupSupport, InfoBarJobman, @@ -52,7 +52,7 @@ class InfoBar(InfoBarBase, InfoBarShowHide, for x in HelpableScreen, \ InfoBarBase, InfoBarShowHide, \ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \ - InfoBarInstantRecord, InfoBarAudioSelection, \ + InfoBarInstantRecord, InfoBarAudioSelection, InfoBarUnhandledKey, \ InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \ InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \ InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarSubtitleSupport, InfoBarJobman, \ @@ -212,7 +212,6 @@ class MoviePlayer(InfoBarBase, InfoBarShowHide, \ return if answer in ("quit", "quitanddeleteconfirmed"): - config.movielist.last_videodir.cancel() self.close() elif answer == "movielist": ref = self.session.nav.getCurrentlyPlayingServiceReference() diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 2cbfeb73..1c577eec 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -10,6 +10,7 @@ from Components.ServiceEventTracker import ServiceEventTracker from Components.Sources.Boolean import Boolean from Components.config import config, ConfigBoolean, ConfigClock from Components.SystemInfo import SystemInfo +from Components.UsageConfig import preferredInstantRecordPath, defaultMoviePath from EpgSelection import EPGSelection from Plugins.Plugin import PluginDescriptor @@ -25,13 +26,14 @@ from Screens.PictureInPicture import PictureInPicture from Screens.SubtitleDisplay import SubtitleDisplay from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive from Screens.TimeDateInput import TimeDateInput +from Screens.UnhandledKey import UnhandledKey from ServiceReference import ServiceReference from Tools import Notifications -from Tools.Directories import SCOPE_HDD, resolveFilename, fileExists +from Tools.Directories import fileExists from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \ - iPlayableService, eServiceReference, eEPGCache + iPlayableService, eServiceReference, eEPGCache, eActionMap from time import time, localtime, strftime from os import stat as os_stat @@ -46,6 +48,39 @@ class InfoBarDish: def __init__(self): self.dishDialog = self.session.instantiateDialog(Dish) +class InfoBarUnhandledKey: + def __init__(self): + self.unhandledKeyDialog = self.session.instantiateDialog(UnhandledKey) + self.hideUnhandledKeySymbolTimer = eTimer() + self.hideUnhandledKeySymbolTimer.callback.append(self.unhandledKeyDialog.hide) + self.checkUnusedTimer = eTimer() + self.checkUnusedTimer.callback.append(self.checkUnused) + self.onLayoutFinish.append(self.unhandledKeyDialog.hide) + eActionMap.getInstance().bindAction('', -0x7FFFFFFF, self.actionA) #highest prio + eActionMap.getInstance().bindAction('', 0x7FFFFFFF, self.actionB) #lowest prio + self.flags = (1<<1); + self.uflags = 0; + + #this function is called on every keypress! + def actionA(self, key, flag): + if flag != 4: + if self.flags & (1<<1): + self.flags = self.uflags = 0 + self.flags |= (1<= int(minspeed) and repeat > 1: - return (0, n * repeat, repeat, ">> %dx" % n) - else: +# minspeed = config.seek.stepwise_minspeed.value +# repeat = int(config.seek.stepwise_repeat.value) +# if minspeed != "Never" and n >= int(minspeed) and repeat > 1: +# return (0, n * repeat, repeat, ">> %dx" % n) +# else: return (0, n, 0, ">> %dx" % n) def makeStateBackward(self, n): - minspeed = config.seek.stepwise_minspeed.value - repeat = int(config.seek.stepwise_repeat.value) - if self.minSpeedBackward and n < self.minSpeedBackward: - r = (self.minSpeedBackward - 1)/ n + 1 - if minspeed != "Never" and n >= int(minspeed) and repeat > 1: - r = max(r, repeat) - return (0, -n * r, r, "<< %dx" % n) - elif minspeed != "Never" and n >= int(minspeed) and repeat > 1: - return (0, -n * repeat, repeat, "<< %dx" % n) - else: +# minspeed = config.seek.stepwise_minspeed.value +# repeat = int(config.seek.stepwise_repeat.value) +# if minspeed != "Never" and n >= int(minspeed) and repeat > 1: +# return (0, -n * repeat, repeat, "<< %dx" % n) +# else: return (0, -n, 0, "<< %dx" % n) def makeStateSlowMotion(self, n): @@ -823,6 +853,7 @@ class InfoBarSeek: # print "seekable" def __serviceStarted(self): + self.fast_winding_hint_message_showed = False self.seekstate = self.SEEK_STATE_PLAY self.__seekableStatusChanged() @@ -876,7 +907,7 @@ class InfoBarSeek: if config.seek.on_pause.value == "play": self.unPauseService() elif config.seek.on_pause.value == "step": - self.doSeekRelative(0) + self.doSeekRelative(1) elif config.seek.on_pause.value == "last": self.setSeekState(self.lastseekstate) self.lastseekstate = self.SEEK_STATE_PLAY @@ -913,6 +944,13 @@ class InfoBarSeek: self.showAfterSeek() def seekFwd(self): + seek = self.getSeek() + if seek and not (seek.isCurrentlySeekable() & 2): + if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): + self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) + self.fast_winding_hint_message_showed = True + return + return 0 # trade as unhandled action if self.seekstate == self.SEEK_STATE_PLAY: self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value))) elif self.seekstate == self.SEEK_STATE_PAUSE: @@ -942,6 +980,13 @@ class InfoBarSeek: self.setSeekState(self.makeStateSlowMotion(speed)) def seekBack(self): + seek = self.getSeek() + if seek and not (seek.isCurrentlySeekable() & 2): + if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1): + self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10) + self.fast_winding_hint_message_showed = True + return + return 0 # trade as unhandled action seekstate = self.seekstate if seekstate == self.SEEK_STATE_PLAY: self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) @@ -949,7 +994,7 @@ class InfoBarSeek: self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) self.doSeekRelative(-6) elif seekstate == self.SEEK_STATE_PAUSE: - self.doSeekRelative(-3) + self.doSeekRelative(-1) elif self.isStateForward(seekstate): speed = seekstate[1] if seekstate[2]: @@ -1066,15 +1111,21 @@ class InfoBarPVRState: self.pvrStateDialog.hide() else: self._mayShow() - class InfoBarTimeshiftState(InfoBarPVRState): def __init__(self): InfoBarPVRState.__init__(self, screen=TimeshiftState, force_show = True) + self.__hideTimer = eTimer() + self.__hideTimer.callback.append(self.__hideTimeshiftState) def _mayShow(self): - if self.execing and self.timeshift_enabled and self.seekstate != self.SEEK_STATE_PLAY: + if self.execing and self.timeshift_enabled: self.pvrStateDialog.show() + if self.seekstate == self.SEEK_STATE_PLAY and not self.shown: + self.__hideTimer.start(5*1000, True) + + def __hideTimeshiftState(self): + self.pvrStateDialog.hide() class InfoBarShowMovies: @@ -1212,10 +1263,7 @@ class InfoBarTimeshift: self.setSeekState(self.SEEK_STATE_PAUSE) if back: - self.doSeek(-5) # seek some gops before end self.ts_rewind_timer.start(200, 1) - else: - self.doSeek(-1) # seek 1 gop before end def rewindService(self): self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) @@ -1484,7 +1532,7 @@ class InfoBarInstantRecord: if isinstance(serviceref, eServiceReference): serviceref = ServiceReference(serviceref) - recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = config.movielist.last_videodir.value) + recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath()) recording.dontSave = True if event is None or limitEvent == False: @@ -1585,9 +1633,9 @@ class InfoBarInstantRecord: self.session.nav.RecordTimer.timeChanged(entry) def instantRecord(self): - dir = config.movielist.last_videodir.value - if not fileExists(dir, 'w'): - dir = resolveFilename(SCOPE_HDD) + dir = preferredInstantRecordPath() + if not dir or not fileExists(dir, 'w'): + dir = defaultMoviePath() try: stat = os_stat(dir) except: @@ -1669,17 +1717,46 @@ class InfoBarAudioSelection: else: break + availableKeys = [] + usedKeys = [] + if SystemInfo["CanDownmixAC3"]: - tlist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix), - ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), - ("--", "")] + tlist - keys = [ "red", "green", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n - selection += 3 - else: - tlist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist - keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n + flist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix), + ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")] + usedKeys.extend(["red", "green"]) + availableKeys.extend(["yellow", "blue"]) selection += 2 - self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection") + else: + flist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")] + usedKeys.extend(["red"]) + availableKeys.extend(["green", "yellow", "blue"]) + selection += 1 + + if hasattr(self, "runPlugin"): + class PluginCaller: + def __init__(self, fnc, *args): + self.fnc = fnc + self.args = args + def __call__(self, *args, **kwargs): + self.fnc(*self.args) + + Plugins = [ (p.name, PluginCaller(self.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ] + + for p in Plugins: + selection += 1 + flist.append((p[0], "CALLFUNC", p[1])) + if availableKeys: + usedKeys.append(availableKeys[0]) + del availableKeys[0] + else: + usedKeys.append("") + + flist.append(("--", "")) + usedKeys.append("") + selection += 1 + + keys = usedKeys + [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ] + [""] * n + self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = flist + tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection") else: del self.audioTracks @@ -1944,8 +2021,10 @@ class InfoBarCueSheetSupport: if last is not None: self.resume_point = last + + l = last / 90000 if config.usage.on_movie_start.value == "ask": - Notifications.AddNotificationWithCallback(self.playLastCB, MessageBox, _("Do you want to resume this playback?"), timeout=10) + Notifications.AddNotificationWithCallback(self.playLastCB, MessageBox, _("Do you want to resume this playback?") + "\n" + (_("Resume position at %s") % ("%d:%02d:%02d" % (l/3600, l%3600/60, l%60))), timeout=10) elif config.usage.on_movie_start.value == "resume": # TRANSLATORS: The string "Resuming playback" flashes for a moment # TRANSLATORS: at the start of a movie, when the user has selected diff --git a/lib/python/Screens/LanguageSelection.py b/lib/python/Screens/LanguageSelection.py old mode 100644 new mode 100755 index 082daa55..fce10ac5 --- a/lib/python/Screens/LanguageSelection.py +++ b/lib/python/Screens/LanguageSelection.py @@ -13,14 +13,14 @@ def _cached(x): from Screens.Rc import Rc -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN from Tools.LoadPixmap import LoadPixmap def LanguageEntryComponent(file, name, index): - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/" + file + ".png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/" + file + ".png")) if png == None: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/missing.png")) + png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/missing.png")) res = (index, name, png) return res diff --git a/lib/python/Screens/LocationBox.py b/lib/python/Screens/LocationBox.py index 61d7105d..29d94f55 100644 --- a/lib/python/Screens/LocationBox.py +++ b/lib/python/Screens/LocationBox.py @@ -289,6 +289,11 @@ class LocationBox(Screen, NumericalTextInput, HelpableScreen): else: self["filelist"].refresh() self.removeBookmark(name, True) + val = self.realBookmarks and self.realBookmarks.value + if val and name in val: + val.remove(name) + self.realBookmarks.value = val + self.realBookmarks.save() def up(self): self[self.currList].up() diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am index 44994b86..d96b491e 100755 --- a/lib/python/Screens/Makefile.am +++ b/lib/python/Screens/Makefile.am @@ -14,5 +14,5 @@ install_PYTHON = \ 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 VirtualKeyBoard.py \ - TextBox.py FactoryReset.py + TextBox.py FactoryReset.py RecordPaths.py UnhandledKey.py ServiceStopScreen.py diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py old mode 100644 new mode 100755 index 5f2032f1..2a8801ca --- a/lib/python/Screens/Menu.py +++ b/lib/python/Screens/Menu.py @@ -97,8 +97,12 @@ class Menu(Screen): def addMenu(self, destList, node): requires = node.get("requires") - if requires and not SystemInfo.get(requires, False): - return + if requires: + if requires[0] == '!': + if SystemInfo.get(requires[1:], False): + return + elif not SystemInfo.get(requires, False): + return MenuTitle = _(node.get("text", "??").encode("UTF-8")) entryID = node.get("entryID", "undefined") weight = node.get("weight", 50) @@ -120,8 +124,12 @@ class Menu(Screen): def addItem(self, destList, node): requires = node.get("requires") - if requires and not SystemInfo.get(requires, False): - return + if requires: + if requires[0] == '!': + if SystemInfo.get(requires[1:], False): + return + elif not SystemInfo.get(requires, False): + return item_text = node.get("text", "").encode("UTF-8") entryID = node.get("entryID", "undefined") weight = node.get("weight", 50) @@ -152,7 +160,7 @@ class Menu(Screen): elif x.tag == 'setup': id = x.get("id") if item_text == "": - item_text = _(getSetupTitle(id)) + "..." + item_text = _(getSetupTitle(id)) else: item_text = _(item_text) destList.append((item_text, boundFunction(self.openSetup, id), entryID, weight)) @@ -237,7 +245,7 @@ class Menu(Screen): # Calculate index number -= 1 - if len(self["menu"].list) > number: + if len(self["menu"].list) > number: self["menu"].setIndex(number) self.okbuttonClick() diff --git a/lib/python/Screens/MessageBox.py b/lib/python/Screens/MessageBox.py index 86bf07d3..f3538b7b 100644 --- a/lib/python/Screens/MessageBox.py +++ b/lib/python/Screens/MessageBox.py @@ -12,9 +12,11 @@ class MessageBox(Screen): TYPE_WARNING = 2 TYPE_ERROR = 3 - def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True): + def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True, msgBoxID = None): self.type = type Screen.__init__(self, session) + + self.msgBoxID = msgBoxID self["text"] = Label(text) self["Text"] = StaticText(text) diff --git a/lib/python/Screens/MovieSelection.py b/lib/python/Screens/MovieSelection.py index 174a4f07..0468f8a0 100644 --- a/lib/python/Screens/MovieSelection.py +++ b/lib/python/Screens/MovieSelection.py @@ -7,8 +7,9 @@ from Components.DiskInfo import DiskInfo from Components.Pixmap import Pixmap from Components.Label import Label from Components.PluginComponent import plugins -from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations +from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations, ConfigSet from Components.Sources.ServiceEvent import ServiceEvent +from Components.UsageConfig import defaultMoviePath from Plugins.Plugin import PluginDescriptor @@ -31,6 +32,7 @@ config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_ config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)]) config.movielist.first_tags = ConfigText(default="") config.movielist.second_tags = ConfigText(default="") +config.movielist.last_selected_tags = ConfigSet([], default=[]) def setPreferredTagEditor(te): @@ -168,7 +170,10 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): HelpableScreen.__init__(self) self.tags = [ ] - self.selected_tags = None + if selectedmovie: + self.selected_tags = config.movielist.last_selected_tags.value + else: + self.selected_tags = None self.selected_tags_ele = None self.movemode = False @@ -183,8 +188,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self["DescriptionBorder"] = Pixmap() self["DescriptionBorder"].hide() - if not pathExists(config.movielist.last_videodir.value): - config.movielist.last_videodir.value = resolveFilename(SCOPE_HDD) + if not fileExists(config.movielist.last_videodir.value): + config.movielist.last_videodir.value = defaultMoviePath() config.movielist.last_videodir.save() self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value) @@ -292,6 +297,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self.close(None) def saveconfig(self): + config.movielist.last_selected_tags.value = self.selected_tags config.movielist.moviesort.save() config.movielist.listtype.save() config.movielist.description.save() @@ -339,8 +345,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): self["list"].setSortType(type) def reloadList(self, sel = None, home = False): - if not pathExists(config.movielist.last_videodir.value): - path = resolveFilename(SCOPE_HDD) + if not fileExists(config.movielist.last_videodir.value): + path = defaultMoviePath() 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) @@ -370,7 +376,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): def gotFilename(self, res): if res is not None and res is not config.movielist.last_videodir.value: - if pathExists(res): + if fileExists(res): config.movielist.last_videodir.value = res config.movielist.last_videodir.save() self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res) @@ -392,7 +398,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo): 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: + elif not tagele or (self.selected_tags and tagele.value in self.selected_tags) or not tagele.value in self.tags: self.showTagsMenu(tagele) else: self.selected_tags_ele = tagele diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index ec2bafe5..c0037f81 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -6,6 +6,7 @@ from Screens.VirtualKeyBoard import VirtualKeyBoard from Screens.HelpMenu import HelpableScreen from Components.Network import iNetwork from Components.Sources.StaticText import StaticText +from Components.Sources.Boolean import Boolean from Components.Label import Label,MultiColorLabel from Components.Pixmap import Pixmap,MultiPixmap from Components.MenuList import MenuList @@ -14,7 +15,7 @@ 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.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN from Tools.LoadPixmap import LoadPixmap from Plugins.Plugin import PluginDescriptor from enigma import eTimer, ePoint, eSize, RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont @@ -36,14 +37,14 @@ def InterfaceEntryComponent(index,name,default,active ): 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")) + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png")) if default is False: - png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png")) + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "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")) + png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png")) if active is False: - png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_error.png")) + png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_error.png")) res.append(MultiContentEntryPixmapAlphaTest(pos=(40, 1), size=(25, 25), png = png2)) return res @@ -63,6 +64,7 @@ class NetworkAdapterSelection(Screen,HelpableScreen): self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Select")) self["key_yellow"] = StaticText("") + self["key_blue"] = StaticText("") self["introduction"] = StaticText(self.edittext) self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] @@ -80,6 +82,7 @@ class NetworkAdapterSelection(Screen,HelpableScreen): { "red": (self.close, _("exit network interface list")), "green": (self.okbuttonClick, _("select interface")), + "blue": (self.openNetworkWizard, _("Use the Networkwizard to configure selected network adapter")), }) self["DefaultInterfaceAction"] = HelpableActionMap(self, "ColorActions", @@ -131,7 +134,9 @@ class NetworkAdapterSelection(Screen,HelpableScreen): else: active_int = False self.list.append(InterfaceEntryComponent(index = x[1],name = _(x[0]),default=default_int,active=active_int )) - + + if os_path.exists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")): + self["key_blue"].setText(_("NetworkWizard")) self["list"].l.setList(self.list) def setDefaultInterface(self): @@ -201,6 +206,16 @@ class NetworkAdapterSelection(Screen,HelpableScreen): self.updateList() self.session.open(MessageBox, _("Finished configuring your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False) + def openNetworkWizard(self): + if os_path.exists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")): + try: + from Plugins.SystemPlugins.NetworkWizard.NetworkWizard import NetworkWizard + except ImportError: + self.session.open(MessageBox, _("The NetworkWizard extension is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + else: + selection = self["list"].getCurrent() + if selection is not None: + self.session.openWithCallback(self.AdapterSetupClosed, NetworkWizard, selection[0]) class NameserverSetup(Screen, ConfigListScreen, HelpableScreen): @@ -278,7 +293,6 @@ class NameserverSetup(Screen, ConfigListScreen, HelpableScreen): def remove(self): print "currentIndex:", self["config"].getCurrentIndex() - index = self["config"].getCurrentIndex() if index < len(self.nameservers): iNetwork.removeNameserver(self.nameservers[index]) @@ -309,24 +323,19 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { - "cancel": (self.cancel, _("exit network adapter setup menu")), - "ok": (self.ok, _("select menu entry")), + "cancel": (self.keyCancel, _("exit network adapter configuration")), + "ok": (self.keySave, _("activate network adapter configuration")), }) self["ColorActions"] = HelpableActionMap(self, "ColorActions", { - "red": (self.cancel, _("exit network adapter configuration")), + "red": (self.keyCancel, _("exit network adapter configuration")), "blue": (self.KeyBlue, _("open nameserver configuration")), }) - self["VirtualKB"] = HelpableActionMap(self, "VirtualKeyboardActions", - { - "showVirtualKeyboard": (self.KeyText, [_("open virtual keyboard input help"),_("* Only available when entering hidden SSID or network key")] ), - }) - self["actions"] = NumberActionMap(["SetupActions"], { - "ok": self.ok, + "ok": self.keySave, }, -2) self.list = [] @@ -355,9 +364,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self["key_red"] = StaticText(_("Cancel")) self["key_blue"] = StaticText(_("Edit DNS")) - self["VKeyIcon"] = Pixmap() + self["VKeyIcon"] = Boolean(False) self["HelpWindow"] = Pixmap() - + self["HelpWindow"].hide() + def layoutFinished(self): self["DNS1"].setText(self.primaryDNS.getText()) self["DNS2"].setText(self.secondaryDNS.getText()) @@ -386,9 +396,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self["Gateway"].setText("") self["Gatewaytext"].setText("") self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface)) - self["VKeyIcon"].hide() - self["VirtualKB"].setEnabled(False) - self["HelpWindow"].hide() def createConfig(self): self.InterfaceEntry = None @@ -426,7 +433,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): try: self.aps = self.w.getNetworkList() if self.aps is not None: - print "[NetworkSetup.py] got Accespoints!" for ap in self.aps: a = self.aps[ap] if a['active']: @@ -443,7 +449,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.default = self.wsconfig['ssid'] if "hidden..." not in self.nwlist: - self.nwlist.append(("hidden...",_("hidden network"))) + self.nwlist.append(("hidden...",_("enter hidden network SSID"))) if self.default not in self.nwlist: self.nwlist.append((self.default,self.default)) config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default )) @@ -518,30 +524,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): 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 KeyText(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 network name/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.setValue(callback) - self["config"].invalidate(self.hiddenSSID) - - def VirtualKeyBoardKeyCallback(self, callback = None): - if callback is not None and len(callback): - config.plugins.wlan.encryption.psk.setValue(callback) - self["config"].invalidate(self.encryptionKey) - def newConfig(self): if self["config"].getCurrent() == self.InterfaceEntry: self.createSetup() @@ -564,34 +550,41 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def keyRight(self): ConfigListScreen.keyRight(self) self.newConfig() + + def keySave(self): + self.hideInputHelp() + if self["config"].isChanged(): + self.session.openWithCallback(self.keySaveConfirm, MessageBox, (_("Are you sure you want to activate this network configuration?\n\n") + self.oktext ) ) + else: + if self.finished_cb: + self.finished_cb() + else: + self.close('cancel') - 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["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["VKeyIcon"].show() - self["VirtualKB"].setEnabled(True) + def keySaveConfirm(self, ret = False): + if (ret == True): + num_configured_if = len(iNetwork.getConfiguredAdapters()) + if num_configured_if >= 1: + if num_configured_if == 1 and self.iface in iNetwork.getConfiguredAdapters(): + self.applyConfig(True) + else: + self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("A second configured interface has been found.\n\nDo you want to disable the second network interface?"), default = True) + else: + self.applyConfig(True) else: - self["VKeyIcon"].hide() - self["VirtualKB"].setEnabled(False) + self.keyCancel() - def ok(self): - 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 secondIfaceFoundCB(self,data): + if data is False: + self.applyConfig(True) + else: + configuredInterfaces = iNetwork.getConfiguredAdapters() + for interface in configuredInterfaces: + if interface == self.iface: + continue + iNetwork.setAdapterAttribute(interface, "up", False) + iNetwork.deactivateInterface(interface) + self.applyConfig(True) def applyConfig(self, ret = False): if (ret == True): @@ -612,7 +605,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): iNetwork.restartNetwork(self.applyConfigDataAvail) self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait for activation of your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False) else: - self.cancel() + self.keyCancel() def applyConfigDataAvail(self, data): if data is True: @@ -624,46 +617,39 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): 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 network interface?"), default = True) + if self.finished_cb: + self.session.openWithCallback(lambda x : self.finished_cb(), MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10) else: - if self.finished_cb: - self.session.openWithCallback(lambda x : 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 = iNetwork.getConfiguredAdapters() - for interface in configuredInterfaces: - if interface == self.iface: - continue - iNetwork.setAdapterAttribute(interface, "up", False) - iNetwork.deactivateInterface(interface) - self.applyConfig(True) + self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10) def ConfigfinishedCB(self,data): if data is not None: if data is True: self.close('ok') - def cancel(self): + def keyCancelConfirm(self, result): + if not result: + return if self.oldInterfaceState is False: - iNetwork.deactivateInterface(self.iface,self.cancelCB) + iNetwork.deactivateInterface(self.iface,self.keyCancelCB) + else: + self.close('cancel') + + def keyCancel(self): + self.hideInputHelp() + if self["config"].isChanged(): + self.session.openWithCallback(self.keyCancelConfirm, MessageBox, _("Really close without saving settings?")) else: self.close('cancel') - def cancelCB(self,data): + def keyCancelCB(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() + self.keySave() def NameserverSetupClosed(self, *ret): iNetwork.loadNameserverConfig() @@ -675,6 +661,15 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() + + def hideInputHelp(self): + 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() class AdapterSetupConfiguration(Screen, HelpableScreen): @@ -684,6 +679,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.session = session self.iface = iface self.restartLanRef = None + self.LinkState = None self.mainmenu = self.genMainMenu() self["menulist"] = MenuList(self.mainmenu) self["key_red"] = StaticText(_("Close")) @@ -733,6 +729,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.onClose.append(self.cleanup) def ok(self): + self.cleanup() if self["menulist"].getCurrent()[1] == 'edit': if self.iface == 'wlan0' or self.iface == 'ath0': try: @@ -786,7 +783,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.session.openWithCallback(self.restartLan, MessageBox, (_("Are you sure you want to restart your network interfaces?\n\n") + self.oktext ) ) if self["menulist"].getCurrent()[1] == 'openwizard': from Plugins.SystemPlugins.NetworkWizard.NetworkWizard import NetworkWizard - self.session.openWithCallback(self.AdapterSetupClosed, NetworkWizard) + self.session.openWithCallback(self.AdapterSetupClosed, NetworkWizard, self.iface) if self["menulist"].getCurrent()[1][0] == 'extendedSetup': self.extended = self["menulist"].getCurrent()[1][2] self.extended(self.session, self.iface) @@ -813,7 +810,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): 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': @@ -832,16 +828,18 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self["description"].setText(_(self["menulist"].getCurrent()[1][1]) + self.oktext ) def updateStatusbar(self, data = None): + self.mainmenu = self.genMainMenu() + self["menulist"].l.setList(self.mainmenu) self["IFtext"].setText(_("Network:")) self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface)) self["Statustext"].setText(_("Link:")) if self.iface == 'wlan0' or self.iface == 'ath0': try: - from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus except: - self["statuspic"].setPixmapNum(1) - self["statuspic"].show() + self["statuspic"].setPixmapNum(1) + self["statuspic"].show() else: iStatus.getDataForInterface(self.iface,self.getInfoCB) else: @@ -863,7 +861,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): callFnc = p.__call__["ifaceSupported"](self.iface) if callFnc is not None: self.extended = callFnc - print p.__call__ if p.__call__.has_key("WlanPluginEntry"): # internally used only for WLAN Plugin menu.append((_("Scan Wireless Networks"), "scanwlan")) if iNetwork.getAdapterAttribute(self.iface, "up"): @@ -902,20 +899,14 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): # Display Wlan not available Message self.showErrorMessage() else: - self.mainmenu = self.genMainMenu() - self["menulist"].l.setList(self.mainmenu) self.updateStatusbar() else: - self.mainmenu = self.genMainMenu() - self["menulist"].l.setList(self.mainmenu) 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) self.updateStatusbar() def WlanScanClosed(self,*ret): @@ -924,8 +915,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): else: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status iStatus.stopWlanConsole() - self.mainmenu = self.genMainMenu() - self["menulist"].l.setList(self.mainmenu) self.updateStatusbar() def restartLan(self, ret = False): @@ -947,15 +936,19 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.session.open(MessageBox, _("Finished restarting your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False) 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) - self["statuspic"].show() + self.LinkState = None + for line in data.splitlines(): + line = line.strip() + if 'Link detected:' in line: + if "yes" in line: + self.LinkState = True + else: + self.LinkState = False + if self.LinkState == True: + iNetwork.checkNetworkState(self.checkNetworkCB) + else: + self["statuspic"].setPixmapNum(1) + self["statuspic"].show() def showErrorMessage(self): self.session.open(MessageBox, self.errortext, type = MessageBox.TYPE_INFO,timeout = 10 ) @@ -963,22 +956,42 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() iNetwork.stopDeactivateInterfaceConsole() + iNetwork.stopPingConsole() try: - from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status + from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus except ImportError: pass else: iStatus.stopWlanConsole() def getInfoCB(self,data,status): + self.LinkState = None 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.LinkState = False self["statuspic"].setPixmapNum(1) + self["statuspic"].show() else: - self["statuspic"].setPixmapNum(0) - self["statuspic"].show() + self.LinkState = True + iNetwork.checkNetworkState(self.checkNetworkCB) + + def checkNetworkCB(self,data): + if iNetwork.getAdapterAttribute(self.iface, "up") is True: + if self.LinkState is True: + if data <= 2: + self["statuspic"].setPixmapNum(0) + else: + self["statuspic"].setPixmapNum(1) + self["statuspic"].show() + else: + self["statuspic"].setPixmapNum(1) + self["statuspic"].show() + else: + self["statuspic"].setPixmapNum(1) + self["statuspic"].show() + class NetworkAdapterTest(Screen): def __init__(self, session,iface): @@ -1397,4 +1410,4 @@ class NetworkAdapterTest(Screen): pass else: iStatus.stopWlanConsole() - + diff --git a/lib/python/Screens/ParentalControlSetup.py b/lib/python/Screens/ParentalControlSetup.py old mode 100755 new mode 100644 index a123d2d3..eae12da4 --- a/lib/python/Screens/ParentalControlSetup.py +++ b/lib/python/Screens/ParentalControlSetup.py @@ -16,7 +16,7 @@ from operator import itemgetter class ProtectedScreen: def __init__(self): if self.isProtected(): - self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], triesEntry = self.getTriesEntry(), title = self.getPinText(), windowTitle = _("Change pin code"))) + self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], triesEntry = self.getTriesEntry(), title = self.getPinText(), windowTitle = _("Enter pin code"))) def getTriesEntry(self): return config.ParentalControl.retries.setuppin @@ -48,11 +48,11 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): self.list = [] ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry) self.createSetup() - + self["actions"] = NumberActionMap(["SetupActions"], { - "cancel": self.keyCancel, - "save": self.keyCancel + "cancel": self.keyCancel, + "save": self.keyCancel }, -2) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("OK")) @@ -63,15 +63,17 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): def isProtected(self): return config.ParentalControl.setuppinactive.value and config.ParentalControl.configured.value - + def createSetup(self): self.editListEntry = None self.changePin = None self.changeSetupPin = None - + self.list = [] self.list.append(getConfigListEntry(_("Enable parental control"), config.ParentalControl.configured)) print "config.ParentalControl.configured.value", config.ParentalControl.configured.value + self.editBouquetListEntry = -1 + self.reloadLists = -1 if config.ParentalControl.configured.value: #self.list.append(getConfigListEntry(_("Configuration mode"), config.ParentalControl.mode)) self.list.append(getConfigListEntry(_("Protect setup"), config.ParentalControl.setuppinactive)) @@ -87,10 +89,19 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): elif config.ParentalControl.mode.value == "simple": self.changePin = getConfigListEntry(_("Change service pin"), NoSave(ConfigNothing())) self.list.append(self.changePin) - #self.list.append(getConfigListEntry(_("Remember service pin"), config.ParentalControl.storeservicepin)) + #Added Option to remember the service pin + self.list.append(getConfigListEntry(_("Remember service pin"), config.ParentalControl.storeservicepin)) + #Added Option to remember the cancellation of service pin entry + self.list.append(getConfigListEntry(_("Remember service pin cancel"), config.ParentalControl.storeservicepincancel)) self.editListEntry = getConfigListEntry(_("Edit services list"), NoSave(ConfigNothing())) self.list.append(self.editListEntry) - + #New funtion: Possibility to add Bouquets to whitelist / blacklist + self.editBouquetListEntry = getConfigListEntry(_("Edit bouquets list"), NoSave(ConfigNothing())) + self.list.append(self.editBouquetListEntry) + #New option to reload service lists (for example if bouquets have changed) + self.reloadLists = getConfigListEntry(_("Reload Black-/Whitelists"), NoSave(ConfigNothing())) + self.list.append(self.reloadLists) + self["config"].list = self.list self["config"].setList(self.list) @@ -98,6 +109,8 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): print "self[\"config\"].l.getCurrentSelection()", self["config"].l.getCurrentSelection() if self["config"].l.getCurrentSelection() == self.editListEntry: self.session.open(ParentalControlEditor) + elif self["config"].l.getCurrentSelection() == self.editBouquetListEntry: + self.session.open(ParentalControlBouquetEditor) elif self["config"].l.getCurrentSelection() == self.changePin: if config.ParentalControl.mode.value == "complex": pass @@ -105,6 +118,8 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): self.session.open(ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service pin")) elif self["config"].l.getCurrentSelection() == self.changeSetupPin: self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup pin")) + elif self["config"].l.getCurrentSelection() == self.reloadLists: + parentalControl.open() else: ConfigListScreen.keyRight(self) print "current selection:", self["config"].l.getCurrentSelection() @@ -149,6 +164,7 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): def keyNumberGlobal(self, number): pass + # for summary: def changedEntry(self): for x in self.onChangedEntry: @@ -224,13 +240,13 @@ class ParentalControlEditor(Screen): if not self.servicesList.has_key(key): self.servicesList[key] = [] self.servicesList[key].append(s) - + def chooseLetter(self): print "choose letter" mylist = [] for x in self.servicesList.keys(): if x == chr(SPECIAL_CHAR): - x = ("special characters", x) + x = (_("special characters"), x) else: x = (x, x) mylist.append(x) @@ -242,12 +258,51 @@ class ParentalControlEditor(Screen): if result is not None: print "result:", result self.currentLetter = result[1] - self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionLevel(x[0]) != -1) for x in self.servicesList[result[1]]] + #Replace getProtectionLevel by new getProtectionType + self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.servicesList[result[1]]] self.servicelist.setList(self.list) else: parentalControl.save() self.close() +class ParentalControlBouquetEditor(Screen): + #This new class allows adding complete bouquets to black- and whitelists + #The servicereference that is stored for bouquets is their refstr as listed in bouquets.tv + def __init__(self, session): + Screen.__init__(self, session) + self.skinName = "ParentalControlEditor" + self.list = [] + self.bouquetslist = ParentalControlList(self.list) + self["servicelist"] = self.bouquetslist; + self.readBouquetList() + self.onLayoutFinish.append(self.selectBouquet) + + self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"], + { + "ok": self.select, + "cancel": self.cancel + }, -1) + + def cancel(self): + parentalControl.save() + self.close() + + def select(self): + self.bouquetslist.toggleSelectedLock() + + def readBouquetList(self): + serviceHandler = eServiceCenter.getInstance() + refstr = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"bouquets.tv\" ORDER BY bouquet' + bouquetroot = eServiceReference(refstr) + self.bouquetlist = {} + list = serviceHandler.list(bouquetroot) + if list is not None: + self.bouquetlist = list.getContent("CN", True) + + def selectBouquet(self): + self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.bouquetlist] + self.bouquetslist.setList(self.list) + class ParentalControlChangePin(Screen, ConfigListScreen, ProtectedScreen): def __init__(self, session, pin, pinname): Screen.__init__(self, session) @@ -264,12 +319,12 @@ class ParentalControlChangePin(Screen, ConfigListScreen, ProtectedScreen): self.pin2.addEndNotifier(boundFunction(self.valueChanged, 2)) self.list.append(getConfigListEntry(_("New pin"), NoSave(self.pin1))) self.list.append(getConfigListEntry(_("Reenter new pin"), NoSave(self.pin2))) - ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry) + ConfigListScreen.__init__(self, self.list) # print "old pin:", pin #if pin.value != "aaaa": #self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.pin.value], title = _("please enter the old pin"), windowTitle = _("Change pin code"))) ProtectedScreen.__init__(self) - + self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"], { "cancel": self.cancel, diff --git a/lib/python/Screens/PluginBrowser.py b/lib/python/Screens/PluginBrowser.py index 3a7df9fb..69bf80f7 100755 --- a/lib/python/Screens/PluginBrowser.py +++ b/lib/python/Screens/PluginBrowser.py @@ -1,5 +1,5 @@ from Screen import Screen - +from Components.Language import language from enigma import eConsoleAppContainer from Components.ActionMap import ActionMap @@ -9,28 +9,41 @@ from Components.Label import Label from Screens.MessageBox import MessageBox from Screens.Console import Console from Plugins.Plugin import PluginDescriptor -from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, fileExists, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE from Tools.LoadPixmap import LoadPixmap from time import time +def languageChanged(): + plugins.clearPluginList() + plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) + class PluginBrowser(Screen): def __init__(self, session): Screen.__init__(self, session) - self["red"] = Label(_("Remove Plugins")) - self["green"] = Label(_("Download Plugins")) + self["red"] = Label() + self["green"] = Label() self.list = [] self["list"] = PluginList(self.list) - self["actions"] = ActionMap(["WizardActions", "ColorActions"], + self["actions"] = ActionMap(["WizardActions"], { "ok": self.save, "back": self.close, + }) + self["PluginDownloadActions"] = ActionMap(["ColorActions"], + { "red": self.delete, "green": self.download }) + self["SoftwareActions"] = ActionMap(["ColorActions"], + { + "red": self.openExtensionmanager + }) + self["PluginDownloadActions"].setEnabled(False) + self["SoftwareActions"].setEnabled(False) self.onFirstExecBegin.append(self.checkWarnings) self.onShown.append(self.updateList) @@ -43,7 +56,6 @@ class PluginBrowser(Screen): self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING) def save(self): - #self.close() self.run() def run(self): @@ -54,7 +66,17 @@ class PluginBrowser(Screen): self.pluginlist = plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU) self.list = [PluginEntryComponent(plugin) for plugin in self.pluginlist] self["list"].l.setList(self.list) - + if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")): + self["red"].setText(_("Manage extensions")) + self["green"].setText("") + self["SoftwareActions"].setEnabled(True) + self["PluginDownloadActions"].setEnabled(False) + else: + self["red"].setText(_("Remove Plugins")) + self["green"].setText(_("Download Plugins")) + self["SoftwareActions"].setEnabled(False) + self["PluginDownloadActions"].setEnabled(True) + def delete(self): self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE) @@ -65,6 +87,14 @@ class PluginBrowser(Screen): self.updateList() self.checkWarnings() + def openExtensionmanager(self): + if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")): + try: + from Plugins.SystemPlugins.SoftwareManager.plugin import PluginManager + except ImportError: + self.session.open(MessageBox, _("The Softwaremanagement extension is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + else: + self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginManager) class PluginDownloadBrowser(Screen): DOWNLOAD = 0 @@ -226,3 +256,4 @@ class PluginDownloadBrowser(Screen): self.list = list self["list"].l.setList(list) +language.addCallback(languageChanged) \ No newline at end of file diff --git a/lib/python/Screens/RdsDisplay.py b/lib/python/Screens/RdsDisplay.py old mode 100644 new mode 100755 index 36d45908..0b99584f --- a/lib/python/Screens/RdsDisplay.py +++ b/lib/python/Screens/RdsDisplay.py @@ -4,7 +4,7 @@ from Components.ActionMap import NumberActionMap from Components.ServiceEventTracker import ServiceEventTracker from Components.Pixmap import Pixmap from Components.Label import Label -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN from Tools.LoadPixmap import LoadPixmap class RdsInfoDisplay(Screen): @@ -122,10 +122,10 @@ class RassInteractive(Screen): 9 : self["subpages_9"] } self.subpage_png = { - 1 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page1.png")), - 2 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page2.png")), - 3 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page3.png")), - 4 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page4.png")) } + 1 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page1.png")), + 2 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page2.png")), + 3 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page3.png")), + 4 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page4.png")) } self.current_page=0; self.current_subpage=0; diff --git a/lib/python/Screens/RecordPaths.py b/lib/python/Screens/RecordPaths.py new file mode 100644 index 00000000..22ca9fcf --- /dev/null +++ b/lib/python/Screens/RecordPaths.py @@ -0,0 +1,194 @@ +from Screens.Screen import Screen +from Screens.LocationBox import MovieLocationBox, TimeshiftLocationBox +from Screens.MessageBox import MessageBox +from Components.Label import Label +from Components.config import config, ConfigSelection, getConfigListEntry, configfile +from Components.ConfigList import ConfigListScreen +from Components.ActionMap import ActionMap +from Tools.Directories import fileExists +from Components.UsageConfig import preferredPath + +class RecordPathsSettings(Screen,ConfigListScreen): + skin = """ + + + + + + + """ + + def __init__(self, session): + from Components.Sources.StaticText import StaticText + Screen.__init__(self, session) + self["key_red"] = StaticText(_("Cancel")) + self["key_green"] = StaticText(_("Save")) + + ConfigListScreen.__init__(self, []) + self.initConfigList() + + self["setupActions"] = ActionMap(["SetupActions", "ColorActions"], + { + "green": self.save, + "red": self.cancel, + "cancel": self.cancel, + "ok": self.ok, + }, -2) + + def checkReadWriteDir(self, configele): + print "checkReadWrite: ", configele.value + if configele.value in [x[0] for x in self.styles] or fileExists(configele.value, "w"): + configele.last_value = configele.value + return True + else: + dir = configele.value + configele.value = configele.last_value + self.session.open( + MessageBox, + _("The directory %s is not writable.\nMake sure you select a writable directory instead.")%dir, + type = MessageBox.TYPE_ERROR + ) + return False + + def initConfigList(self): + self.styles = [ ("", _("")), ("", _("")), ("", _("")) ] + styles_keys = [x[0] for x in self.styles] + tmp = config.movielist.videodirs.value + default = config.usage.default_path.value + if default not in tmp: + tmp = tmp[:] + tmp.append(default) + print "DefaultPath: ", default, tmp + self.default_dirname = ConfigSelection(default = default, choices = tmp) + tmp = config.movielist.videodirs.value + default = config.usage.timer_path.value + if default not in tmp and default not in styles_keys: + tmp = tmp[:] + tmp.append(default) + print "TimerPath: ", default, tmp + self.timer_dirname = ConfigSelection(default = default, choices = self.styles+tmp) + tmp = config.movielist.videodirs.value + default = config.usage.instantrec_path.value + if default not in tmp and default not in styles_keys: + tmp = tmp[:] + tmp.append(default) + print "InstantrecPath: ", default, tmp + self.instantrec_dirname = ConfigSelection(default = default, choices = self.styles+tmp) + default = config.usage.timeshift_path.value + tmp = config.usage.allowed_timeshift_paths.value + if default not in tmp: + tmp = tmp[:] + tmp.append(default) + print "TimeshiftPath: ", default, tmp + self.timeshift_dirname = ConfigSelection(default = default, choices = tmp) + self.default_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False) + self.timer_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False) + self.instantrec_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False) + self.timeshift_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False) + + self.list = [] + if config.usage.setup_level.index >= 2: + self.default_entry = getConfigListEntry(_("Default movie location"), self.default_dirname) + self.list.append(self.default_entry) + self.timer_entry = getConfigListEntry(_("Timer record location"), self.timer_dirname) + self.list.append(self.timer_entry) + self.instantrec_entry = getConfigListEntry(_("Instant record location"), self.instantrec_dirname) + self.list.append(self.instantrec_entry) + else: + self.default_entry = getConfigListEntry(_("Movie location"), self.default_dirname) + self.list.append(self.default_entry) + self.timeshift_entry = getConfigListEntry(_("Timeshift location"), self.timeshift_dirname) + self.list.append(self.timeshift_entry) + self["config"].setList(self.list) + + def ok(self): + currentry = self["config"].getCurrent() + self.lastvideodirs = config.movielist.videodirs.value + self.lasttimeshiftdirs = config.usage.allowed_timeshift_paths.value + if config.usage.setup_level.index >= 2: + txt = _("Default movie location") + else: + txt = _("Movie location") + if currentry == self.default_entry: + self.entrydirname = self.default_dirname + self.session.openWithCallback( + self.dirnameSelected, + MovieLocationBox, + txt, + preferredPath(self.default_dirname.value) + ) + elif currentry == self.timer_entry: + self.entrydirname = self.timer_dirname + self.session.openWithCallback( + self.dirnameSelected, + MovieLocationBox, + _("Initial location in new timers"), + preferredPath(self.timer_dirname.value) + ) + elif currentry == self.instantrec_entry: + self.entrydirname = self.instantrec_dirname + self.session.openWithCallback( + self.dirnameSelected, + MovieLocationBox, + _("Location for instant recordings"), + preferredPath(self.instantrec_dirname.value) + ) + elif currentry == self.timeshift_entry: + self.entrydirname = self.timeshift_dirname + config.usage.timeshift_path.value = self.timeshift_dirname.value + self.session.openWithCallback( + self.dirnameSelected, + TimeshiftLocationBox + ) + + def dirnameSelected(self, res): + if res is not None: + self.entrydirname.value = res + if config.movielist.videodirs.value != self.lastvideodirs: + styles_keys = [x[0] for x in self.styles] + tmp = config.movielist.videodirs.value + default = self.default_dirname.value + if default not in tmp: + tmp = tmp[:] + tmp.append(default) + self.default_dirname.setChoices(tmp, default=default) + tmp = config.movielist.videodirs.value + default = self.timer_dirname.value + if default not in tmp and default not in styles_keys: + tmp = tmp[:] + tmp.append(default) + self.timer_dirname.setChoices(self.styles+tmp, default=default) + tmp = config.movielist.videodirs.value + default = self.instantrec_dirname.value + if default not in tmp and default not in styles_keys: + tmp = tmp[:] + tmp.append(default) + self.instantrec_dirname.setChoices(self.styles+tmp, default=default) + self.entrydirname.value = res + if config.usage.allowed_timeshift_paths.value != self.lasttimeshiftdirs: + tmp = config.usage.allowed_timeshift_paths.value + default = self.instantrec_dirname.value + if default not in tmp: + tmp = tmp[:] + tmp.append(default) + self.timeshift_dirname.setChoices(tmp, default=default) + self.entrydirname.value = res + if self.entrydirname.last_value != res: + self.checkReadWriteDir(self.entrydirname) + + def save(self): + currentry = self["config"].getCurrent() + if self.checkReadWriteDir(currentry[1]): + config.usage.default_path.value = self.default_dirname.value + config.usage.timer_path.value = self.timer_dirname.value + config.usage.instantrec_path.value = self.instantrec_dirname.value + config.usage.timeshift_path.value = self.timeshift_dirname.value + config.usage.default_path.save() + config.usage.timer_path.save() + config.usage.instantrec_path.save() + config.usage.timeshift_path.save() + self.close() + + def cancel(self): + self.close() + diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py index 8b5089a3..87d65e54 100644 --- a/lib/python/Screens/Satconfig.py +++ b/lib/python/Screens/Satconfig.py @@ -5,14 +5,17 @@ from Components.ActionMap import ActionMap from Components.ConfigList import ConfigListScreen from Components.MenuList import MenuList from Components.NimManager import nimmanager -from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, updateConfigElement +from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, updateConfigElement,\ + ConfigSatlist from Components.Sources.List import List from Screens.MessageBox import MessageBox +from Screens.ChoiceBox import ChoiceBox +from Screens.ServiceStopScreen import ServiceStopScreen from time import mktime, localtime from datetime import datetime -class NimSetup(Screen, ConfigListScreen): +class NimSetup(Screen, ConfigListScreen, ServiceStopScreen): def createSimpleSetup(self, list, mode): nim = self.nimConfig if mode == "single": @@ -55,7 +58,7 @@ class NimSetup(Screen, ConfigListScreen): def createConfigMode(self): if self.nim.isCompatible("DVB-S"): - choices = { "nothing": _("nothing connected"), + choices = { "nothing": _("not configured"), "simple": _("simple"), "advanced": _("advanced")} #if len(nimmanager.getNimListOfType(nimmanager.getNimType(self.slotid), exception = x)) > 0: @@ -73,6 +76,7 @@ class NimSetup(Screen, ConfigListScreen): print "Creating setup" self.list = [ ] + self.multiType = None self.configMode = None self.diseqcModeEntry = None self.advancedSatsEntry = None @@ -91,6 +95,11 @@ class NimSetup(Screen, ConfigListScreen): self.advancedType = None self.advancedManufacturer = None self.advancedSCR = None + + if self.nim.isMultiType(): + multiType = self.nimConfig.multiType + self.multiType = getConfigListEntry(_("Tuner type"), multiType) + self.list.append(self.multiType) if self.nim.isCompatible("DVB-S"): self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode) @@ -144,6 +153,8 @@ class NimSetup(Screen, ConfigListScreen): currSat = self.nimConfig.advanced.sat[cur_orb_pos] self.fillListWithAdvancedSatEntrys(currSat) self.have_advanced = True + if self.nim.description == "Alps BSBE2" and config.usage.setup_level.index >= 2: # expert + self.list.append(getConfigListEntry(_("Tone Amplitude"), self.nimConfig.toneAmplitude)) elif self.nim.isCompatible("DVB-C"): self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode) self.list.append(self.configMode) @@ -195,10 +206,17 @@ class NimSetup(Screen, ConfigListScreen): self.advancedLnbsEntry, self.advancedDiseqcMode, self.advancedUsalsEntry, \ self.advancedLof, self.advancedPowerMeasurement, self.turningSpeed, \ self.advancedType, self.advancedSCR, self.advancedManufacturer, self.advancedUnicable, \ - self.uncommittedDiseqcCommand, self.cableScanType) + self.uncommittedDiseqcCommand, self.cableScanType, self.multiType) + if self["config"].getCurrent() == self.multiType: + from Components.NimManager import InitNimManager + InitNimManager(nimmanager) + self.nim = nimmanager.nim_slots[self.slotid] + self.nimConfig = self.nim.config + for x in checkList: if self["config"].getCurrent() == x: self.createSetup() + break def run(self): if self.have_advanced and self.nim.config_mode == "advanced": @@ -342,10 +360,11 @@ class NimSetup(Screen, ConfigListScreen): new_configured_sats = nimmanager.getConfiguredSats() self.unconfed_sats = old_configured_sats - new_configured_sats self.satpos_to_remove = None - self.deleteConfirmed(False) + self.restoreService(_("Zap back to service before tuner setup?")) + self.deleteConfirmed((None, "no")) def deleteConfirmed(self, confirmed): - if confirmed: + if confirmed[1] == "yes" or confirmed[1] == "yestoall": eDVBDB.getInstance().removeServices(-1, -1, -1, self.satpos_to_remove) if self.satpos_to_remove is not None: @@ -365,21 +384,27 @@ class NimSetup(Screen, ConfigListScreen): else: h = _("E") sat_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10) - self.session.openWithCallback(self.deleteConfirmed, MessageBox, _("Delete no more configured satellite\n%s?") %(sat_name)) + + if confirmed[1] == "yes" or confirmed[1] == "no": + self.session.openWithCallback(self.deleteConfirmed, ChoiceBox, _("Delete no more configured satellite\n%s?") %(sat_name), [(_("Yes"), "yes"), (_("No"), "no"), (_("Yes to all"), "yestoall"), (_("No to all"), "notoall")]) + if confirmed[1] == "yestoall" or confirmed[1] == "notoall": + self.deleteConfirmed(confirmed) break - if not self.satpos_to_remove: - self.close() - + def __init__(self, session, slotid): Screen.__init__(self, session) self.list = [ ] + + ServiceStopScreen.__init__(self) + self.stopService() ConfigListScreen.__init__(self, self.list) - self["actions"] = ActionMap(["SetupActions"], + self["actions"] = ActionMap(["SetupActions", "SatlistShortcutAction"], { "ok": self.keySave, "cancel": self.keyCancel, + "nothingconnected": self.nothingConnectedShortcut }, -2) self.slotid = slotid @@ -396,6 +421,12 @@ class NimSetup(Screen, ConfigListScreen): ConfigListScreen.keyRight(self) self.newConfig() + def keyCancel(self): + if self["config"].isChanged(): + self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?")) + else: + self.restoreService(_("Zap back to service before tuner setup?")) + def saveAll(self): if self.nim.isCompatible("DVB-S"): # reset connectedTo to all choices to properly store the default value @@ -415,7 +446,12 @@ class NimSetup(Screen, ConfigListScreen): x[1].cancel() # we need to call saveAll to reset the connectedTo choices self.saveAll() - self.close() + self.restoreService(_("Zap back to service before tuner setup?")) + + def nothingConnectedShortcut(self): + if type(self["config"].getCurrent()[1]) is ConfigSatlist: + self["config"].getCurrent()[1].setValue("3601") + self["config"].invalidateCurrent() class NimSelection(Screen): def __init__(self, session): @@ -459,20 +495,28 @@ class NimSelection(Screen): "satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value] text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)] elif nimConfig.configMode.value == "nothing": - text = _("nothing connected") + text = _("not configured") elif nimConfig.configMode.value == "simple": if nimConfig.diseqcMode.value in ("single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"): - text = _("Sats") + ": " + text = {"single": _("Single"), "toneburst_a_b": _("Toneburst A/B"), "diseqc_a_b": _("DiSEqC A/B"), "diseqc_a_b_c_d": _("DiSEqC A/B/C/D")}[nimConfig.diseqcMode.value] + "\n" + text += _("Sats") + ": " + satnames = [] if nimConfig.diseqcA.orbital_position != 3601: - text += nimmanager.getSatName(int(nimConfig.diseqcA.value)) + satnames.append(nimmanager.getSatName(int(nimConfig.diseqcA.value))) if nimConfig.diseqcMode.value in ("toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"): if nimConfig.diseqcB.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcB.value)) + satnames.append(nimmanager.getSatName(int(nimConfig.diseqcB.value))) if nimConfig.diseqcMode.value == "diseqc_a_b_c_d": if nimConfig.diseqcC.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcC.value)) + satnames.append(nimmanager.getSatName(int(nimConfig.diseqcC.value))) if nimConfig.diseqcD.orbital_position != 3601: - text += "," + nimmanager.getSatName(int(nimConfig.diseqcD.value)) + satnames.append(nimmanager.getSatName(int(nimConfig.diseqcD.value))) + if len(satnames) <= 2: + text += ", ".join(satnames) + elif len(satnames) > 2: + # we need a newline here, since multi content lists don't support automtic line wrapping + text += ", ".join(satnames[:2]) + ",\n" + text += " " + ", ".join(satnames[2:]) elif nimConfig.diseqcMode.value == "positioner": text = _("Positioner") + ":" if nimConfig.positionerMode.value == "usals": @@ -488,6 +532,8 @@ class NimSelection(Screen): text = _("nothing connected") elif nimConfig.configMode.value == "enabled": text = _("enabled") + if x.isMultiType(): + text = _("Switchable tuner types:") + "(" + ','.join(x.getMultiTypeList().values()) + ")" + "\n" + text self.list.append((slotid, x.friendly_full_description, text, x)) self["nimlist"].setList(self.list) diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index bea08724..960b7f10 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -138,7 +138,8 @@ class CableTransponderSearchSupport: "QAM128" : parm.Modulation_QAM128, "QAM256" : parm.Modulation_QAM256 } inv = { "INVERSION_OFF" : parm.Inversion_Off, - "INVERSION_ON" : parm.Inversion_On } + "INVERSION_ON" : parm.Inversion_On, + "INVERSION_AUTO" : parm.Inversion_Unknown } fec = { "FEC_AUTO" : parm.FEC_Auto, "FEC_1_2" : parm.FEC_1_2, "FEC_2_3" : parm.FEC_2_3, @@ -175,7 +176,11 @@ class CableTransponderSearchSupport: self.cable_search_container.appClosed.append(self.cableTransponderSearchClosed) self.cable_search_container.dataAvail.append(self.getCableTransponderData) cableConfig = config.Nims[nim_idx].cable - cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus " + tunername = nimmanager.getNimName(nim_idx) + if tunername == "CXD1981": + cmd = "cxd1978 --init --scan --verbose --wakeup --inv 2 --bus " + else: + cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus " #FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 if nim_idx < 2: cmd += str(nim_idx) @@ -524,6 +529,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): for n in nimmanager.nim_slots: if n.config_mode == "nothing": continue + if n.config_mode == "advanced" and len(nimmanager.getSatListForNim(n.slot)) < 1: + continue if n.config_mode in ("loopthrough", "satposdepends"): root_id = nimmanager.sec.getRoot(n.slot_id, int(n.config.connectedTo.value)) if n.type == nimmanager.nim_slots[root_id].type: # check if connected from a DVB-S to DVB-S2 Nim or vice versa diff --git a/lib/python/Screens/Scart.py b/lib/python/Screens/Scart.py index dc511448..00e78593 100644 --- a/lib/python/Screens/Scart.py +++ b/lib/python/Screens/Scart.py @@ -1,10 +1,13 @@ from Screen import Screen from MessageBox import MessageBox from Components.AVSwitch import AVSwitch +from Tools import Notifications class Scart(Screen): def __init__(self, session, start_visible=True): Screen.__init__(self, session) + self.msgBox = None + self.notificationVisible = None self.avswitch = AVSwitch() @@ -22,7 +25,11 @@ class Scart(Screen): if not self.msgVisible: self.msgVisible = True self.avswitch.setInput("SCART") - self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR) + if not self.session.in_exec: + self.notificationVisible = True + Notifications.AddNotificationWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR, msgBoxID = "scart_msgbox") + else: + self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR) def MsgBoxClosed(self, *val): self.msgBox = None @@ -35,3 +42,13 @@ class Scart(Screen): return self.avswitch.setInput("ENCODER") self.msgVisible = False + if self.notificationVisible: + self.avswitch.setInput("ENCODER") + self.notificationVisible = False + for notification in Notifications.current_notifications: + try: + if notification[1].msgBoxID == "scart_msgbox": + notification[1].close() + except: + print "other notification is open. try another one." + \ No newline at end of file diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py index 7ac7841c..f0bf773d 100644 --- a/lib/python/Screens/Screen.py +++ b/lib/python/Screens/Screen.py @@ -15,6 +15,7 @@ class Screen(dict, GUISkin): global_screen = None def __init__(self, session, parent = None): + dict.__init__(self) self.skinName = self.__class__.__name__ self.session = session self.parent = parent diff --git a/lib/python/Screens/ServiceStopScreen.py b/lib/python/Screens/ServiceStopScreen.py new file mode 100644 index 00000000..628a93a5 --- /dev/null +++ b/lib/python/Screens/ServiceStopScreen.py @@ -0,0 +1,42 @@ +from Screens.MessageBox import MessageBox + +class ServiceStopScreen: + def __init__(self): + try: + self.session + except: + print "[ServiceStopScreen] ERROR: no self.session set" + + self.oldref = None + self.onClose.append(self.__onClose) + + def pipAvailable(self): + # pip isn't available in every state of e2 + try: + self.session.pipshown + pipavailable = True + except: + pipavailable = False + return pipavailable + + def stopService(self): + self.oldref = self.session.nav.getCurrentlyPlayingServiceReference() + self.session.nav.stopService() + if self.pipAvailable(): + if self.session.pipshown: # try to disable pip + self.session.pipshown = False + del self.session.pip + + def __onClose(self): + self.session.nav.playService(self.oldref) + + def restoreService(self, msg = _("Zap back to previously tuned service?")): + if self.oldref: + self.session.openWithCallback(self.restartPrevService, MessageBox, msg, MessageBox.TYPE_YESNO) + else: + self.restartPrevService(False) + + def restartPrevService(self, yesno): + if not yesno: + self.oldref=None + self.close() \ No newline at end of file diff --git a/lib/python/Screens/SleepTimerEdit.py b/lib/python/Screens/SleepTimerEdit.py index ff061d88..e5e7af4e 100644 --- a/lib/python/Screens/SleepTimerEdit.py +++ b/lib/python/Screens/SleepTimerEdit.py @@ -5,6 +5,7 @@ from Components.Input import Input from Components.Label import Label from Components.Pixmap import Pixmap from Components.config import config, ConfigInteger +from Components.SystemInfo import SystemInfo from enigma import eEPGCache from SleepTimer import SleepTimer from time import time @@ -77,7 +78,11 @@ class SleepTimerEdit(Screen): self["red_text"].setText(_("Action:") + " " + _("Disable timer")) if config.SleepTimer.action.value == "shutdown": - self["green_text"].setText(_("Sleep timer action:") + " " + _("Deep Standby")) + if SystemInfo["DeepstandbySupport"]: + shutdownString = _("Deep Standby") + else: + shutdownString = _("Shutdown") + self["green_text"].setText(_("Sleep timer action:") + " " + shutdownString) elif config.SleepTimer.action.value == "standby": self["green_text"].setText(_("Sleep timer action:") + " " + _("Standby")) diff --git a/lib/python/Screens/Standby.py b/lib/python/Screens/Standby.py index c598b545..406b87cb 100644 --- a/lib/python/Screens/Standby.py +++ b/lib/python/Screens/Standby.py @@ -15,8 +15,6 @@ class Standby(Screen): #restart last played service #unmute adc self.leaveMute() - #set brightness of lcd - config.lcd.bright.apply() #kill me self.close(True) @@ -63,8 +61,6 @@ class Standby(Screen): self.avswitch.setInput("SCART") else: self.avswitch.setInput("AUX") - #set lcd brightness to standby value - config.lcd.standby.apply() self.onFirstExecBegin.append(self.__onFirstExecBegin) self.onClose.append(self.__onClose) diff --git a/lib/python/Screens/TaskView.py b/lib/python/Screens/TaskView.py index 1453c05f..9907e2fb 100644 --- a/lib/python/Screens/TaskView.py +++ b/lib/python/Screens/TaskView.py @@ -1,12 +1,13 @@ from Screen import Screen from Components.ConfigList import ConfigListScreen from Components.config import config, ConfigSubsection, ConfigSelection, getConfigListEntry +from Components.SystemInfo import SystemInfo from InfoBarGenerics import InfoBarNotifications import Screens.Standby from Tools import Notifications class JobView(InfoBarNotifications, Screen, ConfigListScreen): - def __init__(self, session, job, parent=None, cancelable = True, backgroundable = True, afterEvent = 0): + def __init__(self, session, job, parent=None, cancelable = True, backgroundable = True): from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress from Components.Sources.Boolean import Boolean @@ -42,15 +43,20 @@ class JobView(InfoBarNotifications, Screen, ConfigListScreen): "ok": self.ok, }, -2) - self.afterevents = [ "nothing", "standby", "deepstandby", "close" ] self.settings = ConfigSubsection() - self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = self.afterevents[afterEvent]) + if SystemInfo["DeepstandbySupport"]: + shutdownString = _("go to deep standby") + else: + shutdownString = _("shut down") + self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", shutdownString)], default = self.job.afterEvent or "nothing") + self.job.afterEvent = self.settings.afterEvent.getValue() self.setupList() self.state_changed() def setupList(self): self["config"].setList( [ getConfigListEntry(_("After event"), self.settings.afterEvent) ]) - + self.job.afterEvent = self.settings.afterEvent.getValue() + def keyLeft(self): ConfigListScreen.keyLeft(self) self.setupList() diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index caaf8c95..54354987 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -4,6 +4,7 @@ from Components.config import config from Components.MenuList import MenuList from Components.TimerList import TimerList from Components.TimerSanityCheck import TimerSanityCheck +from Components.UsageConfig import preferredTimerPath from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT from Screen import Screen from Screens.ChoiceBox import ChoiceBox @@ -243,7 +244,7 @@ class TimerEditList(Screen): else: data = parseEvent(event, description = False) - self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = config.movielist.last_timer_videodir.value, *data)) + self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *data)) def addTimer(self, timer): self.session.openWithCallback(self.finishedAdd, TimerEntry, timer) diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index edd19685..64fa9f19 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -8,11 +8,12 @@ from Components.MenuList import MenuList from Components.Button import Button from Components.Label import Label from Components.Pixmap import Pixmap +from Components.SystemInfo import SystemInfo +from Components.UsageConfig import defaultMoviePath from Screens.MovieSelection import getPreferredTagEditor from Screens.LocationBox import MovieLocationBox from Screens.ChoiceBox import ChoiceBox from RecordTimer import AFTEREVENT -from Tools.Directories import resolveFilename, SCOPE_HDD from enigma import eEPGCache from time import localtime, mktime, time, strftime from datetime import datetime @@ -93,7 +94,11 @@ class TimerEntry(Screen, ConfigListScreen): day[weekday] = 1 self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay]) - self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent) + if SystemInfo["DeepstandbySupport"]: + shutdownString = _("go to deep standby") + else: + shutdownString = _("shut down") + self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default = afterevent) 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) @@ -101,12 +106,13 @@ class TimerEntry(Screen, ConfigListScreen): self.timerentry_tagsset = ConfigSelection(choices = [not self.timerentry_tags 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_date = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400) self.timerentry_starttime = ConfigClock(default = self.timer.begin) self.timerentry_endtime = ConfigClock(default = self.timer.end) + self.timerentry_showendtime = ConfigSelection(default = ((self.timer.end - self.timer.begin) > 4), choices = [(True, _("yes")), (False, _("no"))]) - default = self.timer.dirname or resolveFilename(SCOPE_HDD) + default = self.timer.dirname or defaultMoviePath() tmp = config.movielist.videodirs.value if default not in tmp: tmp.append(default) @@ -167,11 +173,14 @@ class TimerEntry(Screen, ConfigListScreen): self.entryStartTime = getConfigListEntry(_("StartTime"), self.timerentry_starttime) self.list.append(self.entryStartTime) - if self.timerentry_justplay.value != "zap": - self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime) + + self.entryShowEndTime = getConfigListEntry(_("Set End Time"), self.timerentry_showendtime) + if self.timerentry_justplay.value == "zap": + self.list.append(self.entryShowEndTime) + self.entryEndTime = getConfigListEntry(_("EndTime"), self.timerentry_endtime) + if self.timerentry_justplay.value != "zap" or self.timerentry_showendtime.value: self.list.append(self.entryEndTime) - else: - self.entryEndTime = None + self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service) self.list.append(self.channelEntry) @@ -189,11 +198,7 @@ class TimerEntry(Screen, ConfigListScreen): def newConfig(self): print "newConfig", self["config"].getCurrent() - if self["config"].getCurrent() == self.timerTypeEntry: - self.createSetup("config") - if self["config"].getCurrent() == self.timerJustplayEntry: - self.createSetup("config") - if self["config"].getCurrent() == self.frequencyEntry: + if self["config"].getCurrent() in (self.timerTypeEntry, self.timerJustplayEntry, self.frequencyEntry, self.entryShowEndTime): self.createSetup("config") def keyLeft(self): @@ -263,6 +268,9 @@ class TimerEntry(Screen, ConfigListScreen): self.timer.name = self.timerentry_name.value self.timer.description = self.timerentry_description.value self.timer.justplay = self.timerentry_justplay.value == "zap" + if self.timerentry_justplay.value == "zap": + if not self.timerentry_showendtime.value: + self.timerentry_endtime.value = self.timerentry_starttime.value self.timer.resetRepeated() self.timer.afterEvent = { "nothing": AFTEREVENT.NONE, @@ -273,9 +281,10 @@ class TimerEntry(Screen, ConfigListScreen): 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 - config.movielist.last_timer_videodir.save() + if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath(): + self.timer.dirname = self.timerentry_dirname.value + config.movielist.last_timer_videodir.value = self.timer.dirname + config.movielist.last_timer_videodir.save() if self.timerentry_type.value == "once": self.timer.begin, self.timer.end = self.getBeginEnd() diff --git a/lib/python/Screens/UnhandledKey.py b/lib/python/Screens/UnhandledKey.py new file mode 100644 index 00000000..63bfed5b --- /dev/null +++ b/lib/python/Screens/UnhandledKey.py @@ -0,0 +1,7 @@ +from Screen import Screen +from Components.Pixmap import Pixmap + +class UnhandledKey(Screen): + def __init__(self, session): + Screen.__init__(self, session) + self["UnhandledKeyPixmap"] = Pixmap() diff --git a/lib/python/Screens/VirtualKeyBoard.py b/lib/python/Screens/VirtualKeyBoard.py index 19500ed7..7846e4b8 100755 --- a/lib/python/Screens/VirtualKeyBoard.py +++ b/lib/python/Screens/VirtualKeyBoard.py @@ -7,26 +7,25 @@ from Components.MenuList import MenuList from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER from Screen import Screen -from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE +from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN from Tools.LoadPixmap import LoadPixmap class VirtualKeyBoardList(MenuList): def __init__(self, list, enableWrapAround=False): MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) - self.l.setFont(0, gFont("Regular", 22)) + self.l.setFont(0, gFont("Regular", 28)) self.l.setItemHeight(45) def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False): - key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_backspace.png")) - key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_bg.png")) - key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_clr.png")) - key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_esc.png")) - key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_ok.png")) - key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_sel.png")) - key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift.png")) - key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift_sel.png")) - key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_space.png")) - + key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png")) + key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png")) + key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png")) + key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png")) + key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png")) + key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png")) + key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png")) + key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png")) + key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png")) res = [ (keys) ] x = 0 @@ -36,33 +35,45 @@ def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False): else: shiftkey_png = key_shift for key in keys: + width = None if key == "EXIT": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_esc)) + width = key_esc.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_esc)) elif key == "BACKSPACE": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_backspace)) + width = key_backspace.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_backspace)) elif key == "CLEAR": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_clr)) + width = key_clr.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_clr)) elif key == "SHIFT": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=shiftkey_png)) + width = shiftkey_png.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=shiftkey_png)) elif key == "SPACE": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_space)) + width = key_space.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_space)) elif key == "OK": - res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_ok)) + width = key_ok.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 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: + width = key_bg.size().width() res.extend(( - MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_bg), - MultiContentEntryText(pos=(x, 0), size=(45, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER) + MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg), + MultiContentEntryText(pos=(x, 0), size=(width, 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 + width = key_sel.size().width() + res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel)) + + if width is not None: + x += width + else: + x += 45 count += 1 return res diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index 74219eb1..1bff0284 100755 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -1,16 +1,15 @@ from Screen import Screen - from Screens.HelpMenu import HelpableScreen from Screens.MessageBox import MessageBox -from Components.config import config, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS +from Components.config import config, ConfigText, ConfigPassword, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS from Components.Label import Label +from Components.Sources.StaticText import StaticText from Components.Slider import Slider from Components.ActionMap import NumberActionMap from Components.MenuList import MenuList from Components.ConfigList import ConfigList from Components.Sources.List import List - from enigma import eTimer from xml.sax import make_parser @@ -19,8 +18,8 @@ from xml.sax.handler import ContentHandler class WizardSummary(Screen): skin = """ - - + + """ @@ -36,7 +35,7 @@ class WizardSummary(Screen): #self.skinName.append("Wizard") #print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName # - self["text"] = Label("") + self["text"] = StaticText("") self.onShow.append(self.setCallback) def setCallback(self): @@ -214,12 +213,13 @@ class Wizard(Screen): self.onShown.append(self.updateValues) self.configInstance = None + self.currentConfigIndex = None self.lcdCallbacks = [] self.disableKeys = False - self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions"], + self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions", "KeyboardInputActions"], { "gotAsciiCode": self.keyGotAscii, "ok": self.ok, @@ -245,6 +245,13 @@ class Wizard(Screen): "9": self.keyNumberGlobal, "0": self.keyNumberGlobal }, -1) + + self["VirtualKB"] = NumberActionMap(["VirtualKeyboardActions"], + { + "showVirtualKeyboard": self.KeyText, + }, -2) + + self["VirtualKB"].setEnabled(False) def red(self): print "red" @@ -405,6 +412,7 @@ class Wizard(Screen): self.resetCounter() if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None or self.wizard[self.currStep]["config"]["type"] == "dynamic"): self["config"].instance.moveSelection(self["config"].instance.moveUp) + self.handleInputHelpers() elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0): self["list"].selectPrevious() if self.wizard[self.currStep].has_key("onselect"): @@ -418,6 +426,7 @@ class Wizard(Screen): self.resetCounter() if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None or self.wizard[self.currStep]["config"]["type"] == "dynamic"): self["config"].instance.moveSelection(self["config"].instance.moveDown) + self.handleInputHelpers() elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0): #self["list"].instance.moveSelection(self["list"].instance.moveDown) self["list"].selectNext() @@ -598,6 +607,9 @@ class Wizard(Screen): print "clearConfigList", self.configInstance["config"], self["config"] else: self["config"].l.setList([]) + self.handleInputHelpers() + + else: if self.has_key("config"): self["config"].hide() @@ -614,6 +626,45 @@ class Wizard(Screen): self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"]) self.updateText() + def handleInputHelpers(self): + if self["config"].getCurrent() is not None: + if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword): + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(True) + self["VKeyIcon"].boolean = True + if self.has_key("HelpWindow"): + if self["config"].getCurrent()[1].help_window.instance is not None: + helpwindowpos = self["HelpWindow"].getPosition() + from enigma import ePoint + self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1])) + else: + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(False) + self["VKeyIcon"].boolean = False + else: + if self.has_key("VKeyIcon"): + self["VirtualKB"].setEnabled(False) + self["VKeyIcon"].boolean = False + + def KeyText(self): + from Screens.VirtualKeyBoard import VirtualKeyBoard + self.currentConfigIndex = self["config"].getCurrentIndex() + self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue()) + + def VirtualKeyBoardCallback(self, callback = None): + if callback is not None and len(callback): + if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword): + if self.has_key("HelpWindow"): + if self["config"].getCurrent()[1].help_window.instance is not None: + helpwindowpos = self["HelpWindow"].getPosition() + from enigma import ePoint + self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1])) + self["config"].instance.moveSelectionTo(self.currentConfigIndex) + self["config"].setCurrentIndex(self.currentConfigIndex) + self["config"].getCurrent()[1].setValue(callback) + self["config"].invalidate(self["config"].getCurrent()) + + class WizardManager: def __init__(self): self.wizards = [] diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py index 681bc049..8ed2c8a4 100755 --- a/lib/python/Tools/Directories.py +++ b/lib/python/Tools/Directories.py @@ -33,6 +33,7 @@ SCOPE_DEFAULTDIR = 13 SCOPE_DEFAULTPARTITION = 14 SCOPE_DEFAULTPARTITIONMOUNTDIR = 15 SCOPE_METADIR = 16 +SCOPE_CURRENT_PLUGIN = 17 PATH_CREATE = 0 PATH_DONTCREATE = 1 @@ -85,7 +86,27 @@ def resolveFilename(scope, base = "", path_prefix = None): tmp = defaultPaths[SCOPE_SKIN] pos = config.skin.primary_skin.value.rfind('/') if pos != -1: - path = tmp[0]+config.skin.primary_skin.value[:pos+1] + #if basefile is not available use default skin path as fallback + tmpfile = tmp[0]+config.skin.primary_skin.value[:pos+1] + base + if fileExists(tmpfile): + path = tmp[0]+config.skin.primary_skin.value[:pos+1] + else: + path = tmp[0] + else: + path = tmp[0] + + elif scope == SCOPE_CURRENT_PLUGIN: + tmp = defaultPaths[SCOPE_PLUGINS] + from Components.config import config + skintmp = defaultPaths[SCOPE_SKIN] + pos = config.skin.primary_skin.value.rfind('/') + if pos != -1: + #if basefile is not available inside current skin path, use the original provided file as fallback + skintmpfile = skintmp[0]+config.skin.primary_skin.value[:pos+1] + base + if fileExists(skintmpfile): + path = skintmp[0]+config.skin.primary_skin.value[:pos+1] + else: + path = tmp[0] else: path = tmp[0] else: diff --git a/lib/python/Tools/HardwareInfo.py b/lib/python/Tools/HardwareInfo.py index 612a565f..e72d2912 100644 --- a/lib/python/Tools/HardwareInfo.py +++ b/lib/python/Tools/HardwareInfo.py @@ -3,7 +3,7 @@ class HardwareInfo: def __init__(self): if HardwareInfo.device_name is not None: - print "using cached result" +# print "using cached result" return HardwareInfo.device_name = "unknown" diff --git a/lib/service/iservice.h b/lib/service/iservice.h index c477f11d..2ba7cb46 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -356,6 +356,8 @@ public: sTagCRC, sTagChannelMode, + sTransferBPS, + sUser = 0x100 }; enum { @@ -593,7 +595,8 @@ class iTimeshiftService: public iObject #endif public: virtual RESULT startTimeshift()=0; - virtual RESULT stopTimeshift()=0; + virtual RESULT stopTimeshift(bool swToLive=true)=0; + virtual RESULT setNextPlaybackFile(const char *fn)=0; // not needed by our internal timeshift.. but external plugin... virtual int isTimeshiftActive()=0; /* this essentially seeks to the relative end of the timeshift buffer */ diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp index 05aaf731..cc8c32b5 100644 --- a/lib/service/listboxservice.cpp +++ b/lib/service/listboxservice.cpp @@ -526,7 +526,12 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const ePtr service_info; m_service_center->info(*m_cursor, service_info); eServiceReference ref = *m_cursor; - bool isPlayable = !(ref.flags & eServiceReference::isDirectory || ref.flags & eServiceReference::isMarker); + bool isMarker = ref.flags & eServiceReference::isMarker; + bool isPlayable = !(ref.flags & eServiceReference::isDirectory || isMarker); + bool paintProgress = false; + ePtr evt; + + bool serviceAvail = true; if (!marked && isPlayable && service_info && m_is_playable_ignore.valid() && !service_info->isPlayable(*m_cursor, m_is_playable_ignore)) { @@ -534,12 +539,13 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const painter.setForegroundColor(m_color[serviceNotAvail]); else painter.setForegroundColor(gRGB(0xbbbbbb)); + serviceAvail = false; } if (selected && local_style && local_style->m_selection) painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST); - int xoffset=0; // used as offset when painting the folder/marker symbol + int xoffset=0; // used as offset when painting the folder/marker symbol or the serviceevent progress for (int e = 0; e < celElements; ++e) { @@ -583,13 +589,19 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const } case celServiceInfo: { - ePtr evt; - if ( isPlayable && service_info && !service_info->getEvent(*m_cursor, evt) ) + if ( isPlayable && !service_info->getEvent(*m_cursor, evt) ) { std::string name = evt->getEventName(); if (!name.length()) continue; text = '(' + evt->getEventName() + ')'; + if (serviceAvail) + { + if (!selected && m_color_set[serviceDescriptionColor]) + painter.setForegroundColor(m_color[serviceDescriptionColor]); + else if (selected && m_color_set[serviceDescriptionColorSelected]) + painter.setForegroundColor(m_color[serviceDescriptionColorSelected]); + } } else continue; @@ -608,9 +620,9 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const { eRect bbox = para->getBoundBox(); int name_width = bbox.width()+8; - m_element_position[celServiceInfo].setLeft(area.left()+name_width); + m_element_position[celServiceInfo].setLeft(area.left()+name_width+xoffs); m_element_position[celServiceInfo].setTop(area.top()); - m_element_position[celServiceInfo].setWidth(area.width()-name_width); + m_element_position[celServiceInfo].setWidth(area.width()-(name_width+xoffs)); m_element_position[celServiceInfo].setHeight(area.height()); } @@ -678,12 +690,62 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const painter.clippop(); } } + else if (e == celServiceEventProgressbar) + { + eRect area = m_element_position[celServiceEventProgressbar]; + if (area.width() > 0 && (isPlayable || isMarker)) + { + // we schedule it to paint it as last element.. so we dont need to reset fore/background color + paintProgress = isPlayable; + xoffset = area.width() + 10; + } + } } - if (selected && (!local_style || !local_style->m_selection)) style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry); + if (paintProgress && evt) + { + eRect area = m_element_position[celServiceEventProgressbar]; + if (!selected && m_color_set[serviceEventProgressbarBorderColor]) + painter.setForegroundColor(m_color[serviceEventProgressbarBorderColor]); + else if (selected && m_color_set[serviceEventProgressbarBorderColorSelected]) + painter.setForegroundColor(m_color[serviceEventProgressbarBorderColorSelected]); + + int border = 1; + int progressH = 6; + int progressX = area.left() + offset.x(); + int progressW = area.width() - 2 * border; + int progressT = offset.y() + (m_itemsize.height() - progressH - 2*border) / 2; + + // paint progressbar frame + painter.fill(eRect(progressX, progressT, area.width(), border)); + painter.fill(eRect(progressX, progressT + border, border, progressH)); + painter.fill(eRect(progressX, progressT + progressH + border, area.width(), border)); + painter.fill(eRect(progressX + area.width() - border, progressT + border, border, progressH)); + + // calculate value + time_t now = time(0); + int value = progressW * (now - evt->getBeginTime()) / evt->getDuration(); + + eRect tmp = eRect(progressX + border, progressT + border, value, progressH); + ePtr &pixmap = m_pixmaps[picServiceEventProgressbar]; + if (pixmap) + { + area.moveBy(offset); + painter.clip(area); + painter.blit(pixmap, ePoint(progressX + border, progressT + border), tmp, gPainter::BT_ALPHATEST); + painter.clippop(); + } + else + { + if (!selected && m_color_set[serviceEventProgressbarColor]) + painter.setForegroundColor(m_color[serviceEventProgressbarColor]); + else if (selected && m_color_set[serviceEventProgressbarColorSelected]) + painter.setForegroundColor(m_color[serviceEventProgressbarColorSelected]); + painter.fill(tmp); + } + } } - painter.clippop(); } diff --git a/lib/service/listboxservice.h b/lib/service/listboxservice.h index 5228a2f2..589afba6 100644 --- a/lib/service/listboxservice.h +++ b/lib/service/listboxservice.h @@ -49,6 +49,7 @@ public: celServiceNumber, celMarkerPixmap, celFolderPixmap, + celServiceEventProgressbar, celServiceName, celServiceTypePixmap, celServiceInfo, // "now" event @@ -62,6 +63,7 @@ public: picServiceGroup, picFolder, picMarker, + picServiceEventProgressbar, picElements }; @@ -84,6 +86,12 @@ public: markedBackground, markedBackgroundSelected, serviceNotAvail, + serviceEventProgressbarColor, + serviceEventProgressbarColorSelected, + serviceEventProgressbarBorderColor, + serviceEventProgressbarBorderColorSelected, + serviceDescriptionColor, + serviceDescriptionColorSelected, colorElements }; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 1a28fbdd..e498dd42 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -910,14 +910,14 @@ RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServ return 0; } -eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): +eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0) { m_is_primary = 1; m_is_pvr = !m_reference.path.empty(); m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0; - m_skipmode = 0; + m_skipmode = m_fastforward = m_slowmotion = 0; CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent); CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift); @@ -1021,14 +1021,18 @@ void eDVBServicePlay::serviceEvent(int event) updateTimeshiftPids(); if (!m_timeshift_active) updateDecoder(); - if (m_first_program_info && m_is_pvr) + if (m_first_program_info & 1 && m_is_pvr) { - m_first_program_info = 0; + m_first_program_info &= ~1; seekTo(0); } - m_event((iPlayableService*)this, evUpdatedInfo); + if (!m_timeshift_active) + m_event((iPlayableService*)this, evUpdatedInfo); break; } + case eDVBServicePMTHandler::eventPreStart: + loadCuesheet(); + break; case eDVBServicePMTHandler::eventEOF: m_event((iPlayableService*)this, evEOF); break; @@ -1043,17 +1047,85 @@ void eDVBServicePlay::serviceEventTimeshift(int event) switch (event) { case eDVBServicePMTHandler::eventNewProgramInfo: + eDebug("eventNewProgramInfo TS"); if (m_timeshift_active) + { updateDecoder(); + if (m_first_program_info & 2) + { + if (m_slowmotion) + { + eDebug("re-apply slowmotion after timeshift file change"); + m_decoder->setSlowMotion(m_slowmotion); + } + if (m_fastforward) + { + eDebug("re-apply skip %d, ratio %d after timeshift file change", m_skipmode, m_fastforward); + if (m_skipmode) + m_cue->setSkipmode(m_skipmode * 90000); /* convert to 90000 per second */ + if (m_fastforward != 1) + m_decoder->setFastForward(m_fastforward); + else + m_decoder->setTrickmode(); + } + else + seekTo(0); + m_first_program_info &= ~2; + } + m_event((iPlayableService*)this, evUpdatedInfo); + } break; case eDVBServicePMTHandler::eventSOF: - m_event((iPlayableService*)this, evSOF); +#if 0 + if (!m_timeshift_file_next.empty()) + { + eDebug("timeshift SOF, switch to next file"); + m_decoder->pause(); + + m_first_program_info |= 2; + + eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; + r.path = m_timeshift_file_next; + + /* free the timeshift service handler, we need the resources */ + m_service_handler_timeshift.free(); + resetTimeshift(1); + + if (m_skipmode < 0) + m_cue->seekTo(0, -1000); + m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + m_event((iPlayableService*)this, evUser+1); + } + else +#endif + m_event((iPlayableService*)this, evSOF); break; case eDVBServicePMTHandler::eventEOF: if ((!m_is_paused) && (m_skipmode >= 0)) { - eDebug("timeshift EOF, so let's go live"); - switchToLive(); + if (m_timeshift_file_next.empty()) + { + eDebug("timeshift EOF, so let's go live"); + switchToLive(); + } + else + { + eDebug("timeshift EOF, switch to next file"); + + m_first_program_info |= 2; + + eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; + r.path = m_timeshift_file_next; + + /* free the timeshift service handler, we need the resources */ + m_service_handler_timeshift.free(); + resetTimeshift(1); + + m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + m_event((iPlayableService*)this, evUser+1); + } } break; } @@ -1095,7 +1167,6 @@ RESULT eDVBServicePlay::start() m_event_handler.inject(event, 0); m_event_handler.inject(empty, 1); } - loadCuesheet(); m_event(this, evStart); } return 0; @@ -1126,11 +1197,7 @@ RESULT eDVBServicePlay::stop() if (length) { - int perc = play_position * 100LL / length; - - /* only store last play position when between 1% and 99% */ - if ((1 < perc) && (perc < 99)) - m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */ + m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */ } m_cuesheet_changed = 1; } @@ -1185,7 +1252,10 @@ RESULT eDVBServicePlay::setSlowMotion(int ratio) eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio); setFastForward_internal(0); if (m_decoder) + { + m_slowmotion = ratio; return m_decoder->setSlowMotion(ratio); + } else return -1; } @@ -1197,10 +1267,11 @@ RESULT eDVBServicePlay::setFastForward(int ratio) return setFastForward_internal(ratio); } -RESULT eDVBServicePlay::setFastForward_internal(int ratio) +RESULT eDVBServicePlay::setFastForward_internal(int ratio, bool final_seek) { - int skipmode, ffratio; - + int skipmode, ffratio, ret = 0; + pts_t pos=0; + if (ratio > 8) { skipmode = ratio; @@ -1225,19 +1296,28 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio) if (m_cue) m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */ } - + m_skipmode = skipmode; - + + if (final_seek) + eDebug("trickplay stopped .. ret %d, pos %lld", getPlayPosition(pos), pos); + + m_fastforward = ffratio; + if (!m_decoder) return -1; - + if (ffratio == 0) ; /* return m_decoder->play(); is done in caller*/ else if (ffratio != 1) - return m_decoder->setFastForward(ffratio); + ret = m_decoder->setFastForward(ffratio); else - return m_decoder->setTrickmode(); - return 0; + ret = m_decoder->setTrickmode(); + + if (pos) + eDebug("final seek after trickplay ret %d", seekTo(pos)); + + return ret; } RESULT eDVBServicePlay::seek(ePtr &ptr) @@ -1266,9 +1346,10 @@ RESULT eDVBServicePlay::getLength(pts_t &len) RESULT eDVBServicePlay::pause() { eDebug("eDVBServicePlay::pause"); - setFastForward_internal(0); + setFastForward_internal(0, m_slowmotion || m_fastforward > 1); if (m_decoder) { + m_slowmotion = 0; m_is_paused = 1; return m_decoder->pause(); } else @@ -1278,9 +1359,10 @@ RESULT eDVBServicePlay::pause() RESULT eDVBServicePlay::unpause() { eDebug("eDVBServicePlay::unpause"); - setFastForward_internal(0); + setFastForward_internal(0, m_slowmotion || m_fastforward > 1); if (m_decoder) { + m_slowmotion = 0; m_is_paused = 0; return m_decoder->play(); } else @@ -1370,7 +1452,14 @@ RESULT eDVBServicePlay::setTrickmode(int trick) RESULT eDVBServicePlay::isCurrentlySeekable() { - return m_is_pvr || m_timeshift_active; + int ret = 0; + if (m_decoder) + { + ret = (m_is_pvr || m_timeshift_active) ? 3 : 0; // fast forward/backward possible and seeking possible + if (m_decoder->getVideoProgressive() == -1) + ret &= ~2; + } + return ret; } RESULT eDVBServicePlay::frontendInfo(ePtr &ptr) @@ -1728,6 +1817,7 @@ int eDVBServicePlay::selectAudioStream(int i) { eDVBServicePMTHandler::program program; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; + pts_t position = -1; if (h.getProgramInfo(program)) return -1; @@ -1750,6 +1840,9 @@ int eDVBServicePlay::selectAudioStream(int i) apidtype = program.audioStreams[stream].type; } + if (i != -1 && apid != m_current_audio_pid && (m_is_pvr || m_timeshift_active)) + eDebug("getPlayPosition ret %d, pos %lld in selectAudioStream", getPlayPosition(position), position); + m_current_audio_pid = apid; if (m_is_primary && m_decoder->setAudioPID(apid, apidtype)) @@ -1758,6 +1851,9 @@ int eDVBServicePlay::selectAudioStream(int i) return -4; } + if (position != -1) + eDebug("seekTo ret %d", seekTo(position)); + int rdsPid = apid; /* if we are not in PVR mode, timeshift is not active and we are not in pip mode, check if we need to enable the rds reader */ @@ -2058,12 +2154,13 @@ RESULT eDVBServicePlay::startTimeshift() return 0; } -RESULT eDVBServicePlay::stopTimeshift() +RESULT eDVBServicePlay::stopTimeshift(bool swToLive) { if (!m_timeshift_enabled) return -1; - switchToLive(); + if (swToLive) + switchToLive(); m_timeshift_enabled = 0; @@ -2212,33 +2309,51 @@ void eDVBServicePlay::updateTimeshiftPids() } } +RESULT eDVBServicePlay::setNextPlaybackFile(const char *f) +{ + m_timeshift_file_next = f; + return 0; +} + void eDVBServicePlay::switchToLive() { if (!m_timeshift_active) return; - + eDebug("SwitchToLive"); - + + resetTimeshift(0); + + m_is_paused = m_skipmode = m_fastforward = m_slowmotion = 0; /* not supported in live mode */ + + /* free the timeshift service handler, we need the resources */ + m_service_handler_timeshift.free(); + + updateDecoder(true); +} + +void eDVBServicePlay::resetTimeshift(int start) +{ m_cue = 0; - m_decoder = 0; m_decode_demux = 0; + m_decoder = 0; m_teletext_parser = 0; m_rds_decoder = 0; m_subtitle_parser = 0; - m_new_dvb_subtitle_page_connection = 0; m_new_subtitle_page_connection = 0; + m_new_dvb_subtitle_page_connection = 0; m_rds_decoder_event_connection = 0; m_video_event_connection = 0; - m_is_paused = m_skipmode = 0; /* not supported in live mode */ - - /* free the timeshift service handler, we need the resources */ - m_service_handler_timeshift.free(); - m_timeshift_active = 0; m_timeshift_changed = 1; + m_timeshift_file_next.clear(); - m_event((iPlayableService*)this, evSeekableStatusChanged); - - updateDecoder(); + if (start) + { + m_cue = new eCueSheet(); + m_timeshift_active = 1; + } + else + m_timeshift_active = 0; } void eDVBServicePlay::switchToTimeshift() @@ -2246,35 +2361,23 @@ void eDVBServicePlay::switchToTimeshift() if (m_timeshift_active) return; - m_decode_demux = 0; - m_decoder = 0; - m_teletext_parser = 0; - m_rds_decoder = 0; - m_subtitle_parser = 0; - m_new_subtitle_page_connection = 0; - m_new_dvb_subtitle_page_connection = 0; - m_rds_decoder_event_connection = 0; - m_video_event_connection = 0; - - m_timeshift_active = 1; - m_timeshift_changed = 1; + resetTimeshift(1); eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference; r.path = m_timeshift_file; - m_cue = new eCueSheet(); + m_cue->seekTo(0, -1000); m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now."); pause(); - updateDecoder(); /* mainly to switch off PCR, and to set pause */ - - m_event((iPlayableService*)this, evSeekableStatusChanged); + updateDecoder(true); /* mainly to switch off PCR, and to set pause */ } -void eDVBServicePlay::updateDecoder() +void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) { int vpid = -1, vpidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1; + bool mustPlay = false; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; @@ -2325,8 +2428,6 @@ void eDVBServicePlay::updateDecoder() if (!m_decoder) { h.getDecodeDemux(m_decode_demux); - if (m_timeshift_changed) - m_decoder = 0; if (m_decode_demux) { m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary); @@ -2355,17 +2456,17 @@ void eDVBServicePlay::updateDecoder() Py_DECREF(subs); } } - m_decoder->play(); /* pids will be set later */ } if (m_cue) m_cue->setDecodingDemux(m_decode_demux, m_decoder); - m_decoder->play(); /* pids will be set later. */ + mustPlay = true; } m_timeshift_changed = 0; if (m_decoder) { + bool wasSeekable = m_decoder->getVideoProgressive() != -1; if (m_dvb_service) { achannel = m_dvb_service->getCacheEntry(eDVBService::cACHANNEL); @@ -2398,17 +2499,8 @@ void eDVBServicePlay::updateDecoder() } } - std::string config_delay; - int config_delay_int = 0; - if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0) - config_delay_int = atoi(config_delay.c_str()); - m_decoder->setAC3Delay(ac3_delay == -1 ? config_delay_int : ac3_delay + config_delay_int); - - if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0) - config_delay_int = atoi(config_delay.c_str()); - else - config_delay_int = 0; - m_decoder->setPCMDelay(pcm_delay == -1 ? config_delay_int : pcm_delay + config_delay_int); + setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay); + setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); selectAudioStream(); @@ -2433,7 +2525,11 @@ void eDVBServicePlay::updateDecoder() m_decoder->setRadioPic(radio_pic); } - m_decoder->set(); + if (mustPlay) + m_decoder->play(); + else + m_decoder->set(); + m_decoder->setAudioChannel(achannel); /* don't worry about non-existing services, nor pvr services */ @@ -2445,8 +2541,13 @@ void eDVBServicePlay::updateDecoder() m_dvb_service->setCacheEntry(eDVBService::cPCRPID, pcrpid); m_dvb_service->setCacheEntry(eDVBService::cTPID, tpid); } + if (!sendSeekableStateChanged && (m_decoder->getVideoProgressive() != -1) != wasSeekable) + sendSeekableStateChanged = true; } m_have_video_pid = (vpid > 0 && vpid < 0x2000); + + if (sendSeekableStateChanged) + m_event((iPlayableService*)this, evSeekableStatusChanged); } void eDVBServicePlay::loadCuesheet() @@ -2547,7 +2648,7 @@ void eDVBServicePlay::cutlistToCuesheet() { if (i == m_cue_entries.end()) { - if (!have_any_span) + if (!have_any_span && !in) break; out = length; } else { @@ -2577,6 +2678,7 @@ void eDVBServicePlay::cutlistToCuesheet() { have_any_span = 1; m_cue->addSourceSpan(in, out); + in = out = 0; } in = length; @@ -2932,16 +3034,28 @@ void eDVBServicePlay::setAC3Delay(int delay) { if (m_dvb_service) m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1); - if (m_decoder) - m_decoder->setAC3Delay(delay); + if (m_decoder) { + std::string config_delay; + int config_delay_int = 0; + if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0) + config_delay_int = atoi(config_delay.c_str()); + m_decoder->setAC3Delay(delay + config_delay_int); + } } void eDVBServicePlay::setPCMDelay(int delay) { if (m_dvb_service) m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1); - if (m_decoder) - m_decoder->setPCMDelay(delay); + if (m_decoder) { + std::string config_delay; + int config_delay_int = 0; + if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0) + config_delay_int = atoi(config_delay.c_str()); + else + config_delay_int = 0; + m_decoder->setPCMDelay(delay + config_delay_int); + } } void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event) diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index b4d0f196..dafaf35d 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -159,9 +159,10 @@ public: // iTimeshiftService RESULT startTimeshift(); - RESULT stopTimeshift(); + RESULT stopTimeshift(bool swToLive=true); int isTimeshiftActive(); RESULT activateTimeshift(); + RESULT setNextPlaybackFile(const char *fn); // iCueSheet PyObject *getCutList(); @@ -213,14 +214,13 @@ private: int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active, m_timeshift_changed; int m_first_program_info; - std::string m_timeshift_file; + std::string m_timeshift_file, m_timeshift_file_next; int m_timeshift_fd; - ePtr m_decode_demux; int m_current_audio_stream; int selectAudioStream(int n = -1); - RESULT setFastForward_internal(int ratio); + RESULT setFastForward_internal(int ratio, bool final_seek=false); /* timeshift */ ePtr m_record; @@ -228,11 +228,15 @@ private: void updateTimeshiftPids(); void switchToLive(); + + void resetTimeshift(int start); void switchToTimeshift(); - - void updateDecoder(); + + void updateDecoder(bool sendSeekableStateChanged=false); int m_skipmode; + int m_fastforward; + int m_slowmotion; /* cuesheet */ diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 34d09363..0b2ac9d4 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -2,20 +2,23 @@ /* note: this requires gstreamer 0.10.x and a big list of plugins. */ /* it's currently hardcoded to use a big-endian alsasink as sink. */ +#include #include +#include +#include +#include #include -#include -#include +#include +#include +#include #include #include -#include -#include -#include + +#include + #include #include #include -/* for subtitles */ -#include // eServiceFactoryMP3 @@ -43,6 +46,7 @@ eServiceFactoryMP3::eServiceFactoryMP3() extensions.push_back("mp4"); extensions.push_back("mov"); extensions.push_back("m4a"); + extensions.push_back("m2ts"); sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions); } @@ -186,7 +190,28 @@ int eStaticServiceMP3Info::getLength(const eServiceReference &ref) return -1; } +int eStaticServiceMP3Info::getInfo(const eServiceReference &ref, int w) +{ + switch (w) + { + case iServiceInformation::sTimeCreate: + { + struct stat s; + if(stat(ref.path.c_str(), &s) == 0) + { + return s.st_mtime; + } + return iServiceInformation::resNA; + } + default: break; + } + return iServiceInformation::resNA; +} + + // eServiceMP3 +int eServiceMP3::ac3_delay, + eServiceMP3::pcm_delay; eServiceMP3::eServiceMP3(eServiceReference ref) :m_ref(ref), m_pump(eApp, 1) @@ -278,11 +303,11 @@ eServiceMP3::eServiceMP3(eServiceReference ref) if ( ret == -1 ) // this is a "REAL" VCD uri = g_strdup_printf ("vcd://"); else - uri = g_strdup_printf ("file://%s", filename); + uri = g_filename_to_uri(filename, NULL, NULL); } else - uri = g_strdup_printf ("file://%s", filename); + uri = g_filename_to_uri(filename, NULL, NULL); eDebug("eServiceMP3::playbin2 uri=%s", uri); @@ -316,9 +341,8 @@ eServiceMP3::eServiceMP3(eServiceReference ref) struct stat buffer; if (stat(srt_filename, &buffer) == 0) { - std::string suburi = "file://" + (std::string)srt_filename; - eDebug("eServiceMP3::subtitle uri: %s",suburi.c_str()); - g_object_set (G_OBJECT (m_gst_playbin), "suburi", suburi.c_str(), NULL); + eDebug("eServiceMP3::subtitle uri: %s", g_filename_to_uri(srt_filename, NULL, NULL)); + g_object_set (G_OBJECT (m_gst_playbin), "suburi", g_filename_to_uri(srt_filename, NULL, NULL), NULL); subtitleStream subs; subs.type = stSRT; subs.language_code = std::string("und"); @@ -635,7 +659,31 @@ RESULT eServiceMP3::setTrickmode(int trick) RESULT eServiceMP3::isCurrentlySeekable() { - return 1; + int ret = 3; // seeking and fast/slow winding possible + GstElement *sink; + + if (!m_gst_playbin) + return 0; + if (m_state != stRunning) + return 0; + + g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL); + + // disable fast winding yet when a dvbvideosink or dvbaudiosink is used + // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2) + if (sink) { + ret &= ~2; // only seeking possible + gst_object_unref(sink); + } + else { + g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL); + if (sink) { + ret &= ~2; // only seeking possible + gst_object_unref(sink); + } + } + + return ret; } RESULT eServiceMP3::info(ePtr&i) @@ -659,7 +707,6 @@ RESULT eServiceMP3::getName(std::string &name) return 0; } - int eServiceMP3::getInfo(int w) { const gchar *tag = 0; @@ -955,6 +1002,12 @@ RESULT eServiceMP3::subtitle(ePtr &ptr) return 0; } +RESULT eServiceMP3::audioDelay(ePtr &ptr) +{ + ptr = this; + return 0; +} + int eServiceMP3::getNumberOfTracks() { return m_audioStreams.size(); @@ -1093,6 +1146,8 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL); gst_object_unref(sink); } + setAC3Delay(ac3_delay); + setPCMDelay(pcm_delay); } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { @@ -1579,6 +1634,96 @@ int eServiceMP3::setBufferSize(int size) return 0; } +int eServiceMP3::getAC3Delay() +{ + return ac3_delay; +} + +int eServiceMP3::getPCMDelay() +{ + return pcm_delay; +} + +void eServiceMP3::setAC3Delay(int delay) +{ + ac3_delay = delay; + if (!m_gst_playbin || m_state != stRunning) + return; + else + { + GstElement *sink; + int config_delay_int = delay; + g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL); + + if (sink) + { + std::string config_delay; + if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0) + config_delay_int += atoi(config_delay.c_str()); + gst_object_unref(sink); + } + else + { + eDebug("dont apply ac3 delay when no video is running!"); + config_delay_int = 0; + } + + g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL); + + if (sink) + { + gchar *name = gst_element_get_name(sink); + if (strstr(name, "dvbaudiosink")) + eTSMPEGDecoder::setHwAC3Delay(config_delay_int); + g_free(name); + gst_object_unref(sink); + } + } +} + +void eServiceMP3::setPCMDelay(int delay) +{ + pcm_delay = delay; + if (!m_gst_playbin || m_state != stRunning) + return; + else + { + GstElement *sink; + int config_delay_int = delay; + g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL); + + if (sink) + { + std::string config_delay; + if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0) + config_delay_int += atoi(config_delay.c_str()); + gst_object_unref(sink); + } + else + { + eDebug("dont apply pcm delay when no video is running!"); + config_delay_int = 0; + } + + g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL); + + if (sink) + { + gchar *name = gst_element_get_name(sink); + if (strstr(name, "dvbaudiosink")) + eTSMPEGDecoder::setHwPCMDelay(config_delay_int); + else + { + // this is realy untested..and not used yet + gint64 offset = config_delay_int; + offset *= 1000000; // milli to nano + g_object_set (G_OBJECT (m_gst_playbin), "ts-offset", offset, NULL); + } + g_free(name); + gst_object_unref(sink); + } + } +} #else #warning gstreamer not available, not building media player diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 15ed0b07..56a068b9 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -41,6 +41,7 @@ class eStaticServiceMP3Info: public iStaticServiceInformation public: RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); + int getInfo(const eServiceReference &ref, int w); }; typedef struct _GstElement GstElement; @@ -49,8 +50,9 @@ typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFL typedef enum { stPlainText, stSSA, stSRT } subtype_t; typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t; -class eServiceMP3: public iPlayableService, public iPauseableService, - public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object +class eServiceMP3: public iPlayableService, public iPauseableService, + public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, + public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object { DECLARE_REF(eServiceMP3); public: @@ -70,13 +72,14 @@ public: RESULT audioTracks(ePtr &ptr); RESULT audioChannel(ePtr &ptr); RESULT subtitle(ePtr &ptr); + RESULT audioDelay(ePtr &ptr); // not implemented (yet) RESULT frontendInfo(ePtr &ptr) { ptr = 0; return -1; } RESULT subServices(ePtr &ptr) { ptr = 0; return -1; } RESULT timeshift(ePtr &ptr) { ptr = 0; return -1; } RESULT cueSheet(ePtr &ptr) { ptr = 0; return -1; } - RESULT audioDelay(ePtr &ptr) { ptr = 0; return -1; } + RESULT rdsDecoder(ePtr &ptr) { ptr = 0; return -1; } RESULT keys(ePtr &ptr) { ptr = 0; return -1; } RESULT stream(ePtr &ptr) { ptr = 0; return -1; } @@ -122,6 +125,12 @@ public: PyObject *getBufferCharge(); int setBufferSize(int size); + // iAudioDelay + int getAC3Delay(); + int getPCMDelay(); + void setAC3Delay(int); + void setPCMDelay(int); + struct audioStream { GstPad* pad; @@ -166,6 +175,8 @@ public: } }; private: + static int pcm_delay; + static int ac3_delay; int m_currentAudioStream; int m_currentSubtitleStream; int selectAudioStream(int i); diff --git a/lib/service/servicexine.cpp b/lib/service/servicexine.cpp index 44e6a6e0..6b9adfb9 100644 --- a/lib/service/servicexine.cpp +++ b/lib/service/servicexine.cpp @@ -315,7 +315,7 @@ RESULT eServiceXine::setTrickmode(int trick) RESULT eServiceXine::isCurrentlySeekable() { - return 1; + return 3; } RESULT eServiceXine::info(ePtr&i) diff --git a/main/Makefile.am b/main/Makefile.am index a37289ae..4f26387e 100644 --- a/main/Makefile.am +++ b/main/Makefile.am @@ -27,7 +27,17 @@ entries: .svn/entries version.h: entries > version.h - if [ -d .svn ]; then echo "#define ENIGMA2_CHECKOUT_TAG \"D`svn info | grep 'Last Changed Date:' | sed -e 's/[^:]*: \(....\)-\(..\)-\(..\) \(..\):\(..\):\(..\).*+.*$$/\1.\2.\3.\4.\5.\6/'`\"" >> version.h; fi + @if [ -d .svn ]; then \ + echo "#define ENIGMA2_LAST_CHANGE_DATE \"`LANG="en" svn info | grep 'Last Changed Date:' | cut -d' ' -f4`\"" >> version.h; \ + elif [ -d ../.git ]; then \ + if [ -f ../.git/last_commit_info ]; then \ + echo "#define ENIGMA2_LAST_CHANGE_DATE \"`cat ../.git/last_commit_info | grep 'Date:' | cut -d' ' -f4`\"" >> version.h; \ + echo "#define ENIGMA2_BRANCH \"`cat ../.git/branch`\"" >> version.h; \ + else \ + echo "#define ENIGMA2_LAST_CHANGE_DATE \"`LANG="en" git log --max-count=1 --date=short | grep 'Date:' | cut -d' ' -f4`\"" >> version.h; \ + echo "#define ENIGMA2_BRANCH \"`LANG="en" git branch | grep '* ' | cut -d' ' -f2`\"" >> version.h; \ + fi; \ + fi; enigma2_LDADD_WHOLE = \ $(top_builddir)/lib/actions/libenigma_actions.a \ diff --git a/main/enigma.cpp b/main/enigma.cpp index be9d9a53..3f420b4b 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -309,14 +309,21 @@ void quitMainloop(int exitCode) const char *getEnigmaVersionString() { - return -#ifdef ENIGMA2_CHECKOUT_TAG - ENIGMA2_CHECKOUT_TAG + std::string date = +#ifdef ENIGMA2_LAST_CHANGE_DATE + ENIGMA2_LAST_CHANGE_DATE; #else - "HEAD" + __DATE__; #endif - "-" __DATE__; + std::string branch = +#ifdef ENIGMA2_BRANCH + ENIGMA2_BRANCH; +#else + "HEAD"; +#endif + return std::string(date + '-' + branch).c_str(); } + #include void dump_malloc_stats(void) diff --git a/mytest.py b/mytest.py index e42c1003..4b687e05 100755 --- a/mytest.py +++ b/mytest.py @@ -41,14 +41,14 @@ profile("LOAD:skin") from skin import readSkin profile("LOAD:Tools") -from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE +from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN from Components.config import config, configfile, ConfigText, ConfigYesNo, ConfigInteger, NoSave InitFallbackFiles() profile("ReloadProfiles") eDVBDB.getInstance().reloadBouquets() -config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_SKIN_IMAGE)+"radio.mvi") +config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_CURRENT_SKIN, "radio.mvi")) config.misc.isNextRecordTimerAfterEventActionAuto = ConfigYesNo(default=False) config.misc.useTransponderTime = ConfigYesNo(default=True) config.misc.startCounter = ConfigInteger(default=0) # number of e2 starts... @@ -363,9 +363,10 @@ class PowerKey: def powerlong(self): if Screens.Standby.inTryQuitMainloop or (self.session.current_dialog and not self.session.current_dialog.ALLOW_SUSPEND): return + self.doAction(action = config.usage.on_long_powerpress.value) + def doAction(self, action): self.standbyblocked = 1 - action = config.usage.on_long_powerpress.value if action == "shutdown": self.shutdown() elif action == "show_menu": @@ -380,14 +381,15 @@ class PowerKey: menu_screen = self.session.openWithCallback(self.MenuClosed, MainMenu, x) menu_screen.setTitle(_("Standby / Restart")) return + elif action == "standby": + self.standby() def powerdown(self): self.standbyblocked = 0 def powerup(self): if self.standbyblocked == 0: - self.standbyblocked = 1 - self.standby() + self.doAction(action = config.usage.on_short_powerpress.value) def standby(self): if not Screens.Standby.inStandby and self.session.current_dialog and self.session.current_dialog.ALLOW_SUSPEND and self.session.in_exec: diff --git a/po/Makefile.am b/po/Makefile.am index 2319b7fb..ba044409 100755 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -9,11 +9,13 @@ LANGS := $(shell cat $(srcdir)/LINGUAS) LANGPO := $(foreach LANG, $(LANGS),$(LANG).po) LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo) -default: enigma2.pot $(LANGPO) merge $(LANGMO) +default: enigma2.pot $(LANGMO) for lang in $(LANGS); do \ mkdir -p $$lang/LC_MESSAGES; \ cp $$lang.mo $$lang/LC_MESSAGES/enigma2.mo; \ done + +rebuild: clean cleanall enigma2.pot $(LANGPO) merge default merge: for lang in $(LANGS); do \ @@ -33,14 +35,10 @@ enigma2.pot: ./xml2po.py ../lib/python/Plugins/SystemPlugins/SoftwareManager/ >> enigma2.pot ./xml2po.py ../lib/python/Plugins/SystemPlugins/CleanupWizard/ >> enigma2.pot ./xml2po.py ../lib/python/Plugins/SystemPlugins/NetworkWizard/ >> enigma2.pot - cat enigma2_rel25.pot | tail -n +19 >> enigma2.pot msguniq --no-location -o enigma2uniq.pot enigma2.pot $(RM) enigma2.pot mv enigma2uniq.pot enigma2.pot -.PHONY: enigma2.pot - - %.mo: %.po $(MSGFMT) -o $@ $< @@ -49,6 +47,9 @@ enigma2.pot: CLEANFILES = $(foreach LANG, $(LANGS),$(LANG).mo) +cleanall: + $(RM) enigma2.pot + clean-local: $(RM) -r $(LANGS) diff --git a/po/enigma2_rel25.pot b/po/enigma2_rel25.pot deleted file mode 100644 index f7f66eb6..00000000 --- a/po/enigma2_rel25.pot +++ /dev/null @@ -1,6606 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#: ../lib/python/Screens/About.py:63 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:416 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:417 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:418 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:419 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:527 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:528 -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-09 13:11+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../lib/python/Components/NimManager.py:948 -#: ../lib/python/Components/NimManager.py:949 -#: ../lib/python/Components/NimManager.py:1043 -#: ../lib/python/Components/NimManager.py:1045 -msgid "%H:%M" -msgstr "" - -#: ../lib/python/Screens/Standby.py:130 -#, python-format -msgid "%d jobs are running in the background!" -msgstr "" - -#: ../lib/python/Screens/EventView.py:149 -#, python-format -msgid "%d min" -msgstr "" - -#: ../lib/python/Components/ServiceScan.py:33 -#: ../lib/python/Components/ServiceScan.py:96 -#: ../lib/python/Components/ServiceScan.py:98 -#, python-format -msgid "%d services found!" -msgstr "" - -#: ../lib/python/Screens/TimeDateInput.py:40 -#: ../lib/python/Screens/TimerEntry.py:105 -#: ../lib/python/Screens/TimerEntry.py:115 -msgid "%d.%B %Y" -msgstr "" - -#: ../lib/python/Screens/About.py:38 -#, python-format -msgid "" -"%s\n" -"(%s, %d MB free)" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:41 -#, python-format -msgid "%s (%s)\n" -msgstr "" - -#: ../lib/python/Components/TimerList.py:36 -#: ../lib/python/Components/TimerList.py:41 -msgid "(ZAP)" -msgstr "" - -#: ../lib/python/Components/NimManager.py:483 -msgid "(empty)" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:326 -msgid "(show optional DVD audio menu)" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:81 -msgid "* Only available if more than one interface is active." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:315 -msgid "* Only available when entering hidden SSID or network key" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:416 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:419 -msgid ".NFI Download failed:" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:465 -msgid "" -".NFI file passed md5sum signature check. You can safely flash this image!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:107 -msgid "/usr/share/enigma2 directory" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:107 -msgid "/var directory" -msgstr "" - -#: ../lib/python/Components/NimManager.py:928 -msgid "1.0" -msgstr "" - -#: ../lib/python/Components/NimManager.py:928 -msgid "1.1" -msgstr "" - -#: ../lib/python/Components/NimManager.py:927 -#: ../lib/python/Components/NimManager.py:928 -msgid "1.2" -msgstr "" - -#: ../lib/python/Components/NimManager.py:924 -msgid "13 V" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:89 -msgid "16:10" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:81 -msgid "16:10 Letterbox" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:82 -msgid "16:10 PanScan" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:79 -#: ../lib/python/Components/AVSwitch.py:88 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:17 -msgid "16:9" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:83 -msgid "16:9 Letterbox" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:80 -msgid "16:9 always" -msgstr "" - -#: ../lib/python/Components/NimManager.py:924 -msgid "18 V" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:13 -msgid "30 minutes" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:87 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:17 -msgid "4:3" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:77 -msgid "4:3 Letterbox" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:78 -msgid "4:3 PanScan" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:13 -msgid "5 minutes" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:13 -msgid "60 minutes" -msgstr "" - -#: ../lib/python/Components/TimerList.py:58 -msgid "" -msgstr "" - -#: ../lib/python/Screens/Menu.py:150 ../lib/python/Screens/Menu.py:153 -msgid "??" -msgstr "" - -#: ../lib/python/Components/NimManager.py:926 ../data/ -msgid "A" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:104 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:313 -#, python-format -msgid "" -"A configuration file (%s) was modified since Installation.\n" -"Do you want to keep your version?" -msgstr "" - -#: ../RecordTimer.py:282 -msgid "" -"A finished record timer wants to set your\n" -"Dreambox to standby. Do that now?" -msgstr "" - -#: ../RecordTimer.py:288 -msgid "" -"A finished record timer wants to shut down\n" -"your Dreambox. Shutdown now?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:96 -msgid "A graphical EPG for all services of an specific bouquet" -msgstr "" - -#: ../RecordTimer.py:363 -#, python-format -msgid "" -"A record has been started:\n" -"%s" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1522 -msgid "" -"A recording is currently running.\n" -"What do you want to do?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:589 -msgid "" -"A recording is currently running. Please stop the recording before trying to " -"configure the positioner." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:264 -msgid "" -"A recording is currently running. Please stop the recording before trying to " -"start the satfinder." -msgstr "" - -#: ../lib/python/Components/Task.py:381 -#, python-format -msgid "A required tool (%s) was not found." -msgstr "" - -#: ../lib/python/Screens/TaskView.py:118 ../SleepTimer.py:34 -msgid "" -"A sleep timer wants to set your\n" -"Dreambox to standby. Do that now?" -msgstr "" - -#: ../lib/python/Screens/TaskView.py:115 ../SleepTimer.py:29 -msgid "" -"A sleep timer wants to shut down\n" -"your Dreambox. Shutdown now?" -msgstr "" - -#: ../RecordTimer.py:232 -msgid "" -"A timer failed to record!\n" -"Disable TV and try again?\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:34 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:211 ../data/ -msgid "A/V Settings" -msgstr "" - -#: ../lib/python/Components/NimManager.py:902 -msgid "AA" -msgstr "" - -#: ../lib/python/Components/NimManager.py:902 -msgid "AB" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:95 ../data/ -msgid "AC3 default" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1595 -#: ../lib/python/Screens/InfoBarGenerics.py:1613 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:97 ../data/ -msgid "AC3 downmix" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:270 -msgid "Abort" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:86 ../data/ -msgid "About..." -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:73 -#: ../lib/python/Screens/SleepTimerEdit.py:75 -msgid "Action:" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1306 -msgid "Activate Picture in Picture" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:857 -msgid "Adapter settings" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:205 -#: ../lib/python/Screens/TimerEdit.py:43 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:138 -msgid "Add" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:199 -msgid "Add Bookmark" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:127 -msgid "Add WLAN configuration?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:204 -msgid "Add a mark" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:43 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:141 -msgid "Add a new title" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:126 -msgid "Add network configuration?" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:74 -#: ../lib/python/Screens/EpgSelection.py:221 -#: ../lib/python/Screens/EpgSelection.py:256 -#: ../lib/python/Screens/EpgSelection.py:372 -#: ../lib/python/Screens/EventView.py:39 ../lib/python/Screens/EventView.py:70 -#: ../lib/python/Screens/EventView.py:106 -#: ../lib/python/Screens/EventView.py:166 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:576 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:611 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:662 -msgid "Add timer" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:43 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:61 -msgid "Add title" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1715 -msgid "Add to bouquet" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1717 -msgid "Add to favourites" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:180 -msgid "" -"Adds enigma2 settings and dreambox model informations like SN, rev... if " -"enabled." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:183 -msgid "Adds network configuration if enabled." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:186 -msgid "Adds wlan configuration if enabled." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:205 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:34 -msgid "Advanced" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:220 -msgid "Advanced Video Setup" -msgstr "" - -#: ../lib/python/Screens/TaskView.py:52 -#: ../lib/python/Screens/TimerEntry.py:185 -msgid "After event" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:129 -msgid "Album" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:660 -#: ../lib/python/Screens/ChannelSelection.py:800 -#: ../lib/python/Screens/MovieSelection.py:202 -msgid "All" -msgstr "" - -#: ../lib/python/Components/NimManager.py:921 -#: ../lib/python/Components/NimManager.py:922 -msgid "All Satellites" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:19 -msgid "Always ask before sending" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:384 -msgid "An empty filename is illegal." -msgstr "" - -#: ../lib/python/Components/Task.py:347 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:168 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:289 -msgid "An unknown error occured!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:125 -msgid "Anonymize crashlog?" -msgstr "" - -#: ../lib/python/Components/Language.py:18 -msgid "Arabic" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:593 -msgid "" -"Are you sure you want to activate this network configuration?\n" -"\n" -msgstr "" - -#: ../lib/python/Screens/Wizard.py:291 -msgid "Are you sure you want to exit this wizard?" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:788 -msgid "" -"Are you sure you want to restart your network interfaces?\n" -"\n" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:125 -msgid "Artist" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:83 -#: ../lib/python/Screens/SleepTimerEdit.py:85 -msgid "Ask before shutdown:" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:37 -#: ../lib/python/Components/UsageConfig.py:39 -#: ../lib/python/Components/UsageConfig.py:41 -msgid "Ask user" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:83 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:77 ../data/ -msgid "Aspect Ratio" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1546 -msgid "Audio Options..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:140 -msgid "Authoring mode" -msgstr "" - -#: ../lib/python/Screens/Ci.py:25 ../lib/python/Screens/ScanSetup.py:550 -#: ../lib/python/Screens/ScanSetup.py:558 -#: ../lib/python/Screens/ScanSetup.py:585 -#: ../lib/python/Screens/ScanSetup.py:592 -#: ../lib/python/Screens/ScanSetup.py:600 -#: ../lib/python/Screens/ScanSetup.py:615 -#: ../lib/python/Screens/ScanSetup.py:628 -#: ../lib/python/Screens/ScanSetup.py:635 -#: ../lib/python/Screens/ScanSetup.py:640 -#: ../lib/python/Screens/ScanSetup.py:644 -#: ../lib/python/Screens/ScanSetup.py:650 -#: ../lib/python/Screens/ScanSetup.py:656 -#: ../lib/python/Tools/Transponder.py:10 ../lib/python/Tools/Transponder.py:15 -#: ../lib/python/Tools/Transponder.py:26 ../lib/python/Tools/Transponder.py:44 -#: ../lib/python/Tools/Transponder.py:50 ../lib/python/Tools/Transponder.py:57 -#: ../lib/python/Tools/Transponder.py:62 ../lib/python/Tools/Transponder.py:72 -#: ../lib/python/Tools/Transponder.py:77 ../lib/python/Tools/Transponder.py:84 -#: ../lib/python/Tools/Transponder.py:91 ../lib/python/Tools/Transponder.py:96 -#: ../lib/python/Tools/Transponder.py:100 -#: ../lib/python/Tools/Transponder.py:106 -#: ../lib/python/Tools/Transponder.py:112 -msgid "Auto" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:89 -msgid "Auto chapter split every ? minutes (0=never)" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:92 ../data/ -msgid "Auto scart switching" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:90 -msgid "Automatic" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:905 ../data/ -msgid "Automatic Scan" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "Available format variables" -msgstr "" - -#: ../lib/python/Components/NimManager.py:926 ../data/ -msgid "B" -msgstr "" - -#: ../lib/python/Components/NimManager.py:902 -msgid "BA" -msgstr "" - -#: ../lib/python/Components/NimManager.py:902 -msgid "BB" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1221 -#: ../lib/python/Screens/NetworkSetup.py:1226 -#: ../lib/python/Screens/NetworkSetup.py:1231 -#: ../lib/python/Screens/NetworkSetup.py:1236 -#: ../lib/python/Screens/NetworkSetup.py:1241 -msgid "Back" -msgstr "" - -#: ../lib/python/Screens/TaskView.py:31 -msgid "Background" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:73 -msgid "Backup" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:110 -msgid "Backup Location" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:109 -msgid "Backup Mode" -msgstr "" - -#: ../lib/python/Components/NimManager.py:925 -msgid "Band" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:390 -#: ../lib/python/Screens/ServiceInfo.py:142 -msgid "Bandwidth" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:47 -#: ../lib/python/Screens/Satconfig.py:270 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 -msgid "Begin time" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:71 -msgid "Bookmarks" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:85 ../data/ -msgid "Brightness" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:30 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:883 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:924 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:945 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:47 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:98 -msgid "Burn DVD" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:101 -msgid "Burn existing image to DVD" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/plugin.py:15 -#: ../lib/python/Plugins/Extensions/DVDBurn/plugin.py:16 -msgid "Burn to DVD..." -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:49 -msgid "Bus: " -msgstr "" - -#: ../lib/python/Components/NimManager.py:897 -msgid "C-Band" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:108 -msgid "CF Drive" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:73 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:173 -msgid "CI assignment" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:69 -msgid "CVBS" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:916 -#: ../lib/python/Components/ServiceScan.py:69 -#: ../lib/python/Tools/Transponder.py:48 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:474 -msgid "Cable" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:172 -msgid "Cache Thumbnails" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:33 -msgid "Call monitoring" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:94 -#: ../lib/python/Screens/LocationBox.py:128 ../lib/python/Screens/Setup.py:88 -#: ../lib/python/Screens/TimeDateInput.py:14 -#: ../lib/python/Screens/TimerEntry.py:29 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:101 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:39 -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:30 -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:69 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:34 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:366 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:72 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:160 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:226 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:37 ../data/ -msgid "Cancel" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:354 -msgid "Cannot parse feed directory" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:48 -msgid "Capacity: " -msgstr "" - -#: ../lib/python/Components/Harddisk.py:365 -msgid "Card" -msgstr "" - -#: ../lib/python/Components/Language.py:19 -msgid "Catalan" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:236 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:272 -msgid "Change dir." -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:184 -#: ../lib/python/Screens/ParentalControlSetup.py:18 ../data/ -msgid "Change pin code" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:75 -msgid "Change service pin" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:72 -msgid "Change service pins" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:66 -msgid "Change setup pin" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:175 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:16 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 ../data/ -msgid "Channel" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:334 -msgid "Channel not in services list" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:153 -msgid "Channel:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:408 -msgid "Chap." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:409 -msgid "Chapter" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:144 -msgid "Chapter:" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:55 -msgid "Check" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:29 -msgid "Checking Filesystem..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:36 -msgid "Choose source" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:225 -msgid "Choose target folder" -msgstr "" - -#: ../lib/python/Tools/Transponder.py:33 -msgid "Circular left" -msgstr "" - -#: ../lib/python/Tools/Transponder.py:34 -msgid "Circular right" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:165 -msgid "Cleanup" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:398 -#: ../lib/python/Screens/ScanSetup.py:896 -msgid "Clear before scan" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:389 -msgid "Clear log" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:60 -#: ../lib/python/Screens/NetworkSetup.py:207 -#: ../lib/python/Screens/NetworkSetup.py:350 -#: ../lib/python/Screens/NetworkSetup.py:697 -#: ../lib/python/Screens/NetworkSetup.py:1048 -#: ../lib/python/Screens/NetworkSetup.py:1308 -#: ../lib/python/Screens/TaskView.py:47 -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:79 -msgid "Close" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:391 -msgid "Code rate high" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:392 -msgid "Code rate low" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:149 -msgid "Coderate HP" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:148 -msgid "Coderate LP" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:139 -msgid "Collection name" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:46 -msgid "Collection settings" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:88 ../data/ -msgid "Color Format" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:241 -#: ../lib/python/Screens/Satconfig.py:253 -msgid "Command order" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:237 -msgid "Committed DiSEqC command" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:633 -msgid "Common Interface Assignment" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:366 -msgid "Compact Flash" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:515 -#: ../lib/python/Screens/ScanSetup.py:516 -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:581 -msgid "Complete" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:29 -msgid "Complex (allows mixing audio tracks and aspects)" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:35 -msgid "Config" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:92 -#: ../lib/python/Screens/Satconfig.py:144 -#: ../lib/python/Screens/Satconfig.py:178 -#: ../lib/python/Screens/Satconfig.py:289 ../data/ -msgid "Configuration Mode" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:95 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:308 -msgid "Configuring" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:330 -msgid "Conflicting timer" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:274 -msgid "Connect" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:128 -msgid "Connected to" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:99 -msgid "Connected to Fritz!Box!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:163 -msgid "Connected!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:96 -msgid "Connecting to Fritz!Box..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:109 -#, python-format -msgid "" -"Connection to Fritz!Box\n" -"failed! (%s)\n" -"retrying..." -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:150 -msgid "Constellation" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:283 -msgid "Content does not fit on DVD!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:504 -msgid "Continue playing" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:145 ../data/ -msgid "Contrast" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:326 -msgid "Could not connect to Dreambox .NFI Image Feed Server:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:282 -msgid "Could not load Medium! No disc inserted?" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1429 -#, python-format -msgid "Couldn't record due to conflicting timer %s" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:398 -msgid "Crashlog settings" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:403 -msgid "CrashlogAutoSubmit" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:403 -msgid "CrashlogAutoSubmit settings" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:92 -msgid "CrashlogAutoSubmit settings..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:342 -msgid "" -"Crashlogs found!\n" -"Send them to Dream Multimedia ?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:30 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:889 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:930 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:100 -msgid "Create DVD-ISO" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Create movie folder failed" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:250 -#, python-format -msgid "Creating directory %s failed." -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Creating partition failed" -msgstr "" - -#: ../lib/python/Components/Language.py:20 -msgid "Croatian" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:937 -msgid "Current Transponder" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:335 -msgid "Current settings:" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:35 -msgid "Current version:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:81 -msgid "Cut" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:421 -msgid "Cutlist editor..." -msgstr "" - -#: ../lib/python/Components/Language.py:21 -msgid "Czech" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1287 -msgid "DHCP" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:544 -msgid "DVB-S" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:545 -msgid "DVB-S2" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:694 -msgid "DVD Player" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:151 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:94 -msgid "DVD media toolbox" -msgstr "" - -#: ../lib/python/Components/Language.py:22 -msgid "Danish" -msgstr "" - -#: ../lib/python/Screens/TimeDateInput.py:46 -#: ../lib/python/Screens/TimerEntry.py:164 -msgid "Date" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:163 -msgid "Decide what should be done when crashlogs are found." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:166 -msgid "Decide what should happen to the crashlogs after submission." -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:78 ../data/ -msgid "Deep Standby" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:206 -#: ../lib/python/Screens/TimerEdit.py:131 -msgid "Delete" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -msgid "Delete crashlogs" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:386 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:492 -msgid "Delete entry" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:143 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:653 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:712 -msgid "Delete failed!" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:327 -#, python-format -msgid "" -"Delete no more configured satellite\n" -"%s?" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:135 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:15 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:74 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 -msgid "Description" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:270 -msgid "Destination directory" -msgstr "" - -#: ../lib/python/Screens/About.py:34 -msgid "Detected HDD:" -msgstr "" - -#: ../lib/python/Screens/About.py:17 -msgid "Detected NIMs:" -msgstr "" - -#: ../lib/python/Components/NimManager.py:909 -msgid "DiSEqC A/B" -msgstr "" - -#: ../lib/python/Components/NimManager.py:909 -msgid "DiSEqC A/B/C/D" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:233 -msgid "DiSEqC mode" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:256 -msgid "DiSEqC repeats" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:189 -msgid "Dialing:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:28 -msgid "Direct playback of linked titles without menu" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:382 -#, python-format -msgid "Directory %s nonexistent." -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:144 -#: ../lib/python/Screens/TimerEdit.py:417 -#: ../lib/python/Screens/TimerEdit.py:437 -msgid "Disable" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1304 -msgid "Disable Picture in Picture" -msgstr "" - -#: ../lib/python/Screens/Subtitles.py:36 -msgid "Disable Subtitles" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:19 -msgid "Disable crashlog reporting" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:75 -msgid "Disable timer" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:29 -msgid "Disabled" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:268 -msgid "Disconnect" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:105 -#, python-format -msgid "" -"Disconnected from\n" -"Fritz!Box! (%s)\n" -"retrying..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:83 -msgid "Display 16:9 content as" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:80 -msgid "Display 4:3 content as" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:81 -msgid "Display >16:9 content as" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:123 -#, python-format -msgid "" -"Do you really want to REMOVE\n" -"the plugin \"%s\"?" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:84 -msgid "" -"Do you really want to check the filesystem?\n" -"This could take lots of time!" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:235 -#: ../lib/python/Screens/EventView.py:85 ../lib/python/Screens/InfoBar.py:195 -#: ../lib/python/Screens/MovieSelection.py:126 -#: ../lib/python/Screens/TimerEdit.py:206 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:590 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:645 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:698 -#, python-format -msgid "Do you really want to delete %s?" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:121 -#, python-format -msgid "" -"Do you really want to download\n" -"the plugin \"%s\"?" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:82 -msgid "" -"Do you really want to initialize the harddisk?\n" -"All data on the disk will be lost!" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:269 -#, python-format -msgid "Do you really want to remove directory %s from the disk?" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:224 -#, python-format -msgid "Do you really want to remove your bookmark of %s?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:120 -msgid "" -"Do you want to backup now?\n" -"After pressing OK, please wait!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:423 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:202 -msgid "Do you want to burn this collection to DVD medium?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:587 -msgid "Do you want to play DVD in drive?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:407 -msgid "Do you want to preview this DVD before burning?" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1864 -msgid "Do you want to resume this playback?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:169 -msgid "" -"Do you want to submit your email address and name so that we can contact you " -"if needed?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:37 -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:136 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:53 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:222 -msgid "" -"Do you want to update your Dreambox?\n" -"After pressing OK, please wait!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:19 -msgid "Don't ask, just send" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:101 -msgid "Don't stop current event but disable coming events" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:328 -#, python-format -msgid "Done - Installed or upgraded %d packages" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:57 -#, python-format -msgid "Done - Installed or upgraded %d packages with %d errors" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:234 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:365 -msgid "Download" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:726 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:16 -msgid "Download .NFI-Files for USB-Flasher" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:22 -msgid "Download Plugins" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:505 -msgid "Download of USB flasher boot image failed: " -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:134 -msgid "Downloadable new plugins" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:82 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:295 -msgid "Downloading" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:92 -msgid "Downloading plugin information. Please wait..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:28 -msgid "Dreambox format data DVD (HDTV compatible)" -msgstr "" - -#: ../lib/python/Components/Language.py:23 -msgid "Dutch" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:924 -#: ../lib/python/Screens/Satconfig.py:325 -#: ../lib/python/Components/ServiceScan.py:51 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:482 -msgid "E" -msgstr "" - -#: ../lib/python/Components/ServiceScan.py:101 -#, python-format -msgid "ERROR - failed to scan (%s)!" -msgstr "" - -#: ../lib/python/Components/NimManager.py:916 -msgid "East" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:425 -msgid "Edit" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:352 -msgid "Edit DNS" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:41 -msgid "Edit Title" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:102 -msgid "Edit chapters of current title" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:78 -msgid "Edit services list" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1305 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:500 -msgid "Edit settings" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:824 -msgid "Edit the Nameserver configuration of your Dreambox.\n" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:820 -msgid "Edit the network configuration of your Dreambox.\n" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:137 -msgid "Edit title" -msgstr "" - -#: ../lib/python/Screens/Subtitles.py:44 -#: ../lib/python/Screens/TimerEdit.py:136 -#: ../lib/python/Screens/TimerEdit.py:409 -#: ../lib/python/Screens/TimerEdit.py:429 -msgid "Enable" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:183 -msgid "Enable 5V for active antenna" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:60 -msgid "Enable parental control" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:73 -msgid "Enable timer" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:27 -msgid "Enabled" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:501 -msgid "Encryption" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:509 -#: ../lib/python/Screens/NetworkSetup.py:512 -msgid "Encryption Key" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:508 -msgid "Encryption Keytype" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:505 -msgid "Encryption Type" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:48 -#: ../lib/python/Screens/Satconfig.py:271 -msgid "End time" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:171 -msgid "EndTime" -msgstr "" - -#: ../lib/python/Components/Language.py:16 -msgid "English" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:85 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:528 -msgid "Enter WLAN network name/SSID:" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:530 -msgid "Enter WLAN passphrase/key:" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:345 -msgid "Enter main menu..." -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:184 -msgid "Enter the service pin" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:172 -msgid "Enter your email address so that we can contact you if needed." -msgstr "" - -#: ../lib/python/Components/Task.py:284 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:213 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:337 -msgid "Error" -msgstr "" - -#: ../lib/python/Plugins/Extensions/TuxboxPlugins/pluginrunner.py:34 -msgid "Error executing plugin" -msgstr "" - -#: ../lib/python/Components/Task.py:282 -#, python-format -msgid "" -"Error: %s\n" -"Retry?" -msgstr "" - -#: ../lib/python/Components/Language.py:24 -msgid "Estonian" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Everything is fine" -msgstr "" - -#: ../lib/python/Screens/Console.py:44 -msgid "Execution Progress:" -msgstr "" - -#: ../lib/python/Screens/Console.py:56 -msgid "Execution finished!!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:61 -msgid "Exif" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:34 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:104 -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:504 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:232 -msgid "Exit" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:206 -msgid "Exit editor" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:46 -msgid "Expert" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:881 -msgid "Extended Networksetup Plugin..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:877 -msgid "Extended Setup..." -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:356 -#: ../lib/python/Screens/ScanSetup.py:358 -#: ../lib/python/Screens/ScanSetup.py:385 -#: ../lib/python/Screens/ServiceInfo.py:147 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:447 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:449 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:85 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:87 -msgid "FEC" -msgstr "" - -#: ../lib/python/Components/Task.py:41 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:447 -msgid "Failed" -msgstr "" - -#: ../lib/python/Components/NimManager.py:918 -msgid "Fast" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:238 -msgid "Fast DiSEqC" -msgstr "" - -#: ../lib/python/Components/NimManager.py:918 -msgid "Fast epoch" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:663 -msgid "Favourites" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Filesystem contains uncorrectable errors" -msgstr "" - -#: ../lib/python/Components/Task.py:41 -msgid "Finished" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:195 -msgid "Finished configuring your network" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:949 -msgid "Finished restarting your network" -msgstr "" - -#: ../lib/python/Components/Language.py:25 -msgid "Finnish" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:484 -msgid "" -"First we need to download the latest boot environment for the USB flasher." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:144 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:251 -msgid "Flash" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:247 -msgid "Flashing failed" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:123 -msgid "Format" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:174 -msgid "Frame size in full view" -msgstr "" - -#: ../lib/python/Components/Language.py:26 -msgid "French" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:351 -#: ../lib/python/Screens/ScanSetup.py:381 -#: ../lib/python/Screens/ScanSetup.py:388 -#: ../lib/python/Screens/ServiceInfo.py:140 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:442 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:80 -msgid "Frequency" -msgstr "" - -#: ../lib/python/Components/NimManager.py:1071 -msgid "Frequency bands" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:166 -msgid "Frequency scan step size(khz)" -msgstr "" - -#: ../lib/python/Components/NimManager.py:1071 -msgid "Frequency steps" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Fri" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:160 -msgid "Friday" -msgstr "" - -#: ../lib/python/Components/Language.py:44 -msgid "Frisian" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:34 -msgid "Fritz!Box FON IP address" -msgstr "" - -#: ../lib/python/Screens/About.py:23 -#, python-format -msgid "Frontprocessor version: %d" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Fsck failed" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:62 -msgid "Function not yet implemented" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:107 -msgid "" -"GUI needs a restart to apply a new skin\n" -"Do you want to Restart the GUI now?" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:339 -#: ../lib/python/Screens/NetworkSetup.py:481 ../data/ -msgid "Gateway" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:133 -msgid "Genre" -msgstr "" - -#: ../lib/python/Components/Language.py:17 -msgid "German" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:94 -msgid "Getting plugin information. Please wait..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:195 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:253 -msgid "Goto 0" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:250 -msgid "Goto position" -msgstr "" - -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:95 -msgid "Graphical Multi EPG" -msgstr "" - -#: ../lib/python/Components/Language.py:27 -msgid "Greek" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:152 -msgid "Guard Interval" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:395 -msgid "Guard interval mode" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:364 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:108 -#: ../data/ -msgid "Harddisk" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:496 -msgid "Hidden network SSID" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:153 -msgid "Hierarchy Information" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:396 -msgid "Hierarchy mode" -msgstr "" - -#: ../lib/python/Screens/Ci.py:335 -msgid "High bitrate support" -msgstr "" - -#: ../lib/python/Tools/Transponder.py:31 -msgid "Horizontal" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1498 -msgid "How many minutes do you want to record?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:120 -msgid "How to handle found crashlogs?" -msgstr "" - -#: ../lib/python/Components/Language.py:28 -msgid "Hungarian" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:337 -#: ../lib/python/Screens/NetworkSetup.py:476 -#: ../lib/python/Screens/NetworkSetup.py:1293 ../data/ -msgid "IP Address" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:288 -msgid "ISO file is too large for this filesystem!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:143 -msgid "ISO path" -msgstr "" - -#: ../lib/python/Components/Language.py:31 -msgid "Icelandic" -msgstr "" - -#: ../lib/python/Screens/Scart.py:25 -msgid "" -"If you see this, something is wrong with\n" -"your scart connection. Press OK to return." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:87 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:52 -msgid "Image flash utility" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:32 -msgid "Image-Upgrade" -msgstr "" - -#: ../lib/python/Components/Task.py:41 -msgid "In Progress" -msgstr "" - -#: ../RecordTimer.py:235 -msgid "" -"In order to record a timer, the TV was switched to the recording service!\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:122 -msgid "Include your email and name (optional) in the mail?" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:285 -msgid "Increased voltage" -msgstr "" - -#: ../lib/python/Screens/Ci.py:322 -msgid "Init" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:53 -msgid "Initialize" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:26 -msgid "Initializing Harddisk..." -msgstr "" - -#: ../lib/python/Screens/InputBox.py:11 ../data/ -msgid "Input" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:91 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:304 -msgid "Installing" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1364 -msgid "Instant Record..." -msgstr "" - -#: ../lib/python/Components/Network.py:313 -msgid "Integrated Ethernet" -msgstr "" - -#: ../lib/python/Components/Network.py:315 -msgid "Integrated Wireless" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:45 -msgid "Intermediate" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:371 -msgid "Internal Flash" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:396 -msgid "Invalid Location" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:275 -#, python-format -msgid "Invalid directory selected: %s" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:352 -#: ../lib/python/Screens/ScanSetup.py:382 -#: ../lib/python/Screens/ScanSetup.py:389 -#: ../lib/python/Screens/ServiceInfo.py:144 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:443 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:81 -msgid "Inversion" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:135 -msgid "Is this videomode ok?" -msgstr "" - -#: ../lib/python/Components/Language.py:32 -msgid "Italian" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: display as fullscreen, even if this breaks the aspect) -#: ../lib/python/Components/AVSwitch.py:98 -#: ../lib/python/Components/AVSwitch.py:108 -msgid "Just Scale" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1271 -msgid "LAN Adapter" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:229 -msgid "LNB" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:278 -msgid "LOF" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:282 -msgid "LOF/H" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:281 -msgid "LOF/L" -msgstr "" - -#: ../lib/python/Components/Language.py:98 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:150 ../data/ -msgid "Language selection" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:100 -msgid "Last speed" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:37 -#: ../lib/python/Screens/Satconfig.py:260 ../data/ -msgid "Latitude" -msgstr "" - -#: ../lib/python/Components/Language.py:30 -msgid "Latvian" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:511 -msgid "Leave DVD Player?" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1596 -#: ../lib/python/Screens/InfoBarGenerics.py:1601 -msgid "Left" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term. -#: ../lib/python/Components/AVSwitch.py:94 -msgid "Letterbox" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:245 -msgid "Limit east" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:244 -msgid "Limit west" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:243 -msgid "Limits off" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:246 -msgid "Limits on" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:839 -msgid "Link:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:28 -msgid "Linked titles with a DVD menu" -msgstr "" - -#: ../lib/python/Components/FileList.py:173 -#: ../lib/python/Components/config.py:951 -msgid "List of Storage Devices" -msgstr "" - -#: ../lib/python/Components/Language.py:29 -msgid "Lithuanian" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:103 -msgid "Load" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1280 -msgid "Local Network" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:178 -msgid "Location" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:595 -msgid "Log results to harddisk" -msgstr "" - -#: ../lib/python/Screens/HelpMenu.py:36 -msgid "Long Keypress" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:35 -#: ../lib/python/Screens/Satconfig.py:258 ../data/ -msgid "Longitude" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:367 -msgid "MMC Card" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:201 -msgid "Make this mark an 'in' point" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:202 -msgid "Make this mark an 'out' point" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:203 -msgid "Make this mark just a mark" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:469 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -msgid "Manual transponder" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:949 -msgid "Media player" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:137 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:167 -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:281 -msgid "Medium is not a writeable DVD!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:286 -msgid "Medium is not empty!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:145 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:147 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:148 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:149 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:150 ../data/ -msgid "Menu" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Mkfs failed" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:96 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:61 -msgid "Mode" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:47 -msgid "Model: " -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:359 -#: ../lib/python/Screens/ScanSetup.py:384 -#: ../lib/python/Screens/ScanSetup.py:393 -#: ../lib/python/Screens/ServiceInfo.py:138 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:450 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:88 -msgid "Modulation" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Mon" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:103 -msgid "Mon-Fri" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:156 -msgid "Monday" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Mount failed" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1312 -msgid "Move Picture in Picture" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:236 -msgid "Move east" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:233 -msgid "Move west" -msgstr "" - -#: ../lib/python/Screens/EventView.py:212 -msgid "Multi EPG" -msgstr "" - -#: ../lib/python/Screens/Ci.py:333 -msgid "Multiple service support" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:514 -msgid "Multisat" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:362 -#: ../lib/python/Screens/NetworkSetup.py:366 -#: ../lib/python/Screens/NetworkSetup.py:369 -#: ../lib/python/Screens/NetworkSetup.py:373 -#: ../lib/python/Screens/NetworkSetup.py:376 -#: ../lib/python/Components/NimManager.py:605 -#: ../lib/python/Components/NimManager.py:610 -#: ../lib/python/Components/NimManager.py:729 -msgid "N/A" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:242 -msgid "NFI image flashing completed. Press Yellow to Reboot!" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:110 -msgid "NTSC" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:134 -msgid "Name" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1299 ../data/ -msgid "Nameserver" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:244 -#, python-format -msgid "Nameserver %d" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:858 -msgid "Nameserver settings" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:338 -#: ../lib/python/Screens/NetworkSetup.py:477 ../data/ -msgid "Netmask" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:368 -msgid "Network Mount" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:494 -#: ../lib/python/Screens/NetworkSetup.py:499 -msgid "Network SSID" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:397 -msgid "Network scan" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:859 -msgid "Network test" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:346 -#: ../lib/python/Screens/NetworkSetup.py:837 -msgid "Network:" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:886 -msgid "NetworkWizard" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:908 -msgid "New" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:235 -msgid "New pin" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:36 -msgid "New version:" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:60 -msgid "Next" -msgstr "" - -#: ../lib/python/Screens/Ci.py:25 ../lib/python/Screens/Ci.py:27 -#: ../lib/python/Screens/InfoBar.py:167 ../data/ -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "No" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:285 -msgid "No (supported) DVDROM found!" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1517 -msgid "No HDD found or HDD not initialized!" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:433 -msgid "No Networks found" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2174 -msgid "" -"No data on transponder!\n" -"(Timeout reading PAT)" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:375 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:390 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:155 -msgid "No details for this image file" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1404 -msgid "No event info found, recording indefinitely." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2172 -msgid "No free tuner!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:334 -msgid "" -"No packages were upgraded yet. So you can check your network and try again." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:586 -msgid "No positioner capable frontend found." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:261 -msgid "No satellite frontend found!!" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:425 -msgid "No tags are set on these movies." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:601 -msgid "No tuner is configured for use with a diseqc positioner!" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:720 -msgid "" -"No tuner is enabled!\n" -"Please setup your tuner settings before you start a service scan." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:564 -msgid "No useable USB stick found" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:131 -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 "" - -#: ../lib/python/Screens/ParentalControlSetup.py:129 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:54 -msgid "" -"No working local network adapter found.\n" -"Please verify that you have attached a network cable and your network is " -"configured correctly." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:53 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:701 -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 "" - -#: ../lib/python/Screens/InfoBar.py:169 -msgid "No, but restart from begin" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:281 -msgid "No, not now" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:282 -msgid "No, send them never" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:564 -#: ../lib/python/Screens/ScanSetup.py:607 -#: ../lib/python/Screens/ScanSetup.py:652 -#: ../lib/python/Components/NimManager.py:902 -#: ../lib/python/Components/NimManager.py:905 -#: ../lib/python/Components/NimManager.py:926 -#: ../lib/python/Components/NimManager.py:928 -#: ../lib/python/Components/NimManager.py:934 -#: ../lib/python/Tools/Transponder.py:14 ../lib/python/Tools/Transponder.py:61 -#: ../lib/python/Tools/Transponder.py:107 -msgid "None" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: display as fullscreen, with stretching the left/right) -#: ../lib/python/Components/AVSwitch.py:106 -msgid "Nonlinear" -msgstr "" - -#: ../lib/python/Components/NimManager.py:917 -msgid "North" -msgstr "" - -#: ../lib/python/Components/Language.py:33 -msgid "Norwegian" -msgstr "" - -#: ../lib/python/Components/Task.py:368 -#, python-format -msgid "" -"Not enough diskspace. Please free up some diskspace and try again. (%d MB " -"required, %d MB available)" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:835 -#: ../lib/python/Screens/ScanSetup.py:837 -#: ../lib/python/Screens/ScanSetup.py:981 -#: ../lib/python/Screens/ScanSetup.py:983 -#: ../lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py:90 -msgid "" -"Nothing to scan!\n" -"Please setup your tuner settings before you start a service scan." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:147 -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 "" - -#: ../lib/python/Screens/LocationBox.py:91 ../lib/python/Screens/Setup.py:87 -#: ../lib/python/Screens/TimeDateInput.py:13 -#: ../lib/python/Screens/TimerEntry.py:28 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:102 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:210 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:40 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:71 -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:36 ../data/ -msgid "OK" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:100 -msgid "OSD visibility" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1595 -#: ../lib/python/Screens/InfoBarGenerics.py:1613 -#: ../lib/python/Components/NimManager.py:925 -#: ../lib/python/Tools/Transponder.py:12 ../lib/python/Tools/Transponder.py:46 -#: ../lib/python/Tools/Transponder.py:59 -#: ../lib/python/Tools/Transponder.py:114 -msgid "Off" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1595 -#: ../lib/python/Screens/InfoBarGenerics.py:1613 -#: ../lib/python/Components/NimManager.py:925 -#: ../lib/python/Tools/Transponder.py:11 ../lib/python/Tools/Transponder.py:45 -#: ../lib/python/Tools/Transponder.py:58 -#: ../lib/python/Tools/Transponder.py:113 -msgid "On" -msgstr "" - -#: ../lib/python/Components/NimManager.py:934 -msgid "One" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:33 -msgid "Online-Upgrade" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:399 -msgid "Only Free scan" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:176 -msgid "Optionally enter your name if you want to." -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:139 -msgid "Orbital Position" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:110 -msgid "PAL" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:87 -msgid "PIDs" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:278 -msgid "Package list update" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:37 -msgid "Packet management" -msgstr "" - -#: ../lib/python/Screens/Subtitles.py:52 ../lib/python/Screens/Subtitles.py:55 -#: ../lib/python/Screens/Subtitles.py:57 -msgid "Page" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term -#: ../lib/python/Components/AVSwitch.py:96 -#: ../lib/python/Components/AVSwitch.py:104 -msgid "Pan&Scan" -msgstr "" - -#: ../lib/python/Components/FileList.py:175 -msgid "Parent Directory" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:80 ../data/ -msgid "Parental control" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:70 -msgid "Parental control type" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:113 -msgid "Password" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:41 -msgid "Pause movie at end" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:114 -msgid "Phone number" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:595 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:596 -msgid "PicturePlayer" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term. -#: ../lib/python/Components/AVSwitch.py:102 -msgid "Pillarbox" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:362 -#: ../lib/python/Screens/ServiceInfo.py:145 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:453 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:91 -msgid "Pilot" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:98 -msgid "Play" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:480 -msgid "Play Audio-CD..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:510 -msgid "Play DVD" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:45 -msgid "Play recorded movies..." -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Please Reboot" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaScanner/plugin.py:48 -msgid "Please Select Medium to be Scanned" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1483 -msgid "Please change recording endtime" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:326 -msgid "Please check your network settings!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:266 -msgid "Please choose .NFI image file from feed server to download" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:498 -#: ../lib/python/Screens/InfoBarGenerics.py:1228 -msgid "Please choose an extension..." -msgstr "" - -#: ../lib/python/Screens/DefaultWizard.py:95 -msgid "Please choose he package..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:538 -msgid "" -"Please disconnect all USB devices from your Dreambox and (re-)attach the " -"target USB stick (minimum size is 64 MB) now!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:56 -msgid "Please do not change any values unless you know what you are doing!" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:172 -msgid "Please enter a name for the new bouquet" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:229 -msgid "Please enter a name for the new marker" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:372 -msgid "Please enter a new filename" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:598 -msgid "Please enter filename (empty = use current date)" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:239 -msgid "Please enter name of the new directory" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:24 -msgid "Please enter the correct pin code" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:255 -msgid "Please enter the old pin code" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:104 -msgid "Please enter your email address here:" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:106 -msgid "Please enter your name here (optional):" -msgstr "" - -#: ../RecordTimer.py:365 -msgid "" -"Please note that the previously selected media could not be accessed and " -"therefore the default directory is being used instead." -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:264 -msgid "Please press OK to continue." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:21 -msgid "Please press OK!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:53 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:87 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:203 -msgid "Please select .NFI flash image file from medium" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:640 -msgid "Please select a playlist to delete..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:619 -msgid "Please select a playlist..." -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:325 -msgid "Please select a subservice to record..." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1724 -#: ../lib/python/Screens/SubservicesQuickzap.py:106 -msgid "Please select a subservice..." -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:422 -msgid "Please select tag to filter..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:256 -msgid "Please select target directory or medium" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:367 -msgid "Please select the movie path..." -msgstr "" - -#: ../lib/python/Screens/PiPSetup.py:34 -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 "" - -#: ../lib/python/Components/Language.py:97 -msgid "" -"Please use the UP and DOWN keys to select your language. Afterwards press " -"the OK button." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:612 -msgid "Please wait for activation of your network configuration..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:235 -msgid "Please wait while scanning is in progress..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:182 -msgid "Please wait while we configure your network..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:936 -msgid "Please wait while your network is restarting..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1150 -#: ../lib/python/Screens/NetworkSetup.py:1173 -#: ../lib/python/Screens/NetworkSetup.py:1180 -msgid "Please wait..." -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:180 -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:67 -msgid "Please wait... Loading list..." -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:354 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:445 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:83 -msgid "Polarity" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:143 -#: ../lib/python/Components/NimManager.py:924 -msgid "Polarization" -msgstr "" - -#: ../lib/python/Components/Language.py:34 -msgid "Polish" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:22 -msgid "Port A" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:25 -msgid "Port B" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:27 -msgid "Port C" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:28 -msgid "Port D" -msgstr "" - -#: ../lib/python/Components/Language.py:35 -msgid "Portuguese" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:436 -#: ../lib/python/Components/NimManager.py:910 -msgid "Positioner" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:192 -msgid "Positioner fine movement" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:191 -msgid "Positioner movement" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:605 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:611 -msgid "Positioner setup" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:194 -msgid "Positioner storage" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:43 -#: ../lib/python/Screens/Satconfig.py:266 -msgid "Power threshold in mA" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:470 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -msgid "Predefined transponder" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:21 -msgid "Preparing... Please wait" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:55 -#: ../lib/python/Screens/NetworkSetup.py:296 -#: ../lib/python/Screens/NetworkSetup.py:699 -msgid "Press OK on your remote control to continue." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:208 -#: ../lib/python/Screens/NetworkSetup.py:348 -msgid "Press OK to activate the settings." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:61 -msgid "Press OK to edit the settings." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:559 -#, python-format -msgid "Press OK to get further details for %s" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:906 -msgid "Press OK to scan" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:300 -msgid "Press OK to start the scan" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:391 -msgid "Press OK to view full changelog" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:59 -msgid "Prev" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:95 -msgid "Preview menu" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:330 -msgid "Primary DNS" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:44 -msgid "Properties of current title" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:68 -msgid "Protect services" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:64 -msgid "Protect setup" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:662 -#: ../lib/python/Screens/ChannelSelection.py:796 -#: ../lib/python/Components/NimManager.py:1073 -msgid "Provider" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:150 -msgid "Provider to scan" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:906 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:468 -msgid "Providers" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:581 -msgid "Quick" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1715 -#: ../lib/python/Screens/InfoBarGenerics.py:1717 -#: ../lib/python/Screens/InfoBarGenerics.py:1720 -msgid "Quickzap" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:69 -msgid "RGB" -msgstr "" - -#: ../lib/python/Plugins/Extensions/SimpleRSS/plugin.py:45 -msgid "RSS Feed URI" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:369 -msgid "Ram Disk" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:581 -msgid "Random" -msgstr "" - -#: ../lib/python/Components/ConfigList.py:196 -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:225 -msgid "Really close without saving settings?" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:193 -msgid "Really delete done timers?" -msgstr "" - -#: ../lib/python/Screens/SubservicesQuickzap.py:117 -msgid "Really exit the subservices quickzap?" -msgstr "" - -#: ../lib/python/Screens/Standby.py:135 -msgid "Really reboot now?" -msgstr "" - -#: ../lib/python/Screens/Standby.py:139 -msgid "Really restart now?" -msgstr "" - -#: ../lib/python/Screens/Standby.py:133 -msgid "Really shutdown now?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:243 -msgid "Reboot" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 ../data/ -msgid "Record" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1427 -#, python-format -msgid "Record time limited due to conflicting timer %s" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:351 -msgid "Recorded files..." -msgstr "" - -#: ../lib/python/Screens/EventView.py:116 -msgid "Recording" -msgstr "" - -#: ../lib/python/Screens/Standby.py:124 -msgid "Recording(s) are in progress or coming up in few seconds!" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:236 -msgid "Reenter new pin" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:65 -msgid "Refresh Rate" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:93 -#: ../lib/python/Screens/LocationBox.py:206 -msgid "Remove Bookmark" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:21 -msgid "Remove Plugins" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:205 -msgid "Remove a mark" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:45 -msgid "Remove currently selected title" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:136 -msgid "Remove plugins" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:468 -msgid "Remove the broken .NFI file?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:416 -msgid "Remove the incomplete .NFI file?" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:253 -#: ../lib/python/Screens/EpgSelection.py:369 -#: ../lib/python/Screens/EventView.py:103 -#: ../lib/python/Screens/EventView.py:163 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:608 -#: ../lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:659 -msgid "Remove timer" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:45 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:241 -msgid "Remove title" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:285 -#, python-format -msgid "Removing directory %s failed. (Maybe not empty.)" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:92 -msgid "Rename" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -msgid "Rename crashlogs" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:138 -msgid "Repeat Type" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:102 -msgid "Repeating event currently recording... What do you want to do?" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:144 -msgid "Repeats" -msgstr "" - -#: ../lib/python/Screens/Ci.py:321 -msgid "Reset" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:103 -msgid "Reset and renumerate title names" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:63 -msgid "Resolution" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:108 -msgid "Restart GUI now?" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:860 -msgid "Restart network" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1250 -#: ../lib/python/Screens/NetworkSetup.py:1379 -msgid "Restart test" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:830 -msgid "Restart your network connection and interfaces.\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:74 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:161 -msgid "Restore" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:37 -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.) -#: ../lib/python/Screens/InfoBarGenerics.py:1873 -msgid "Resuming playback" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:506 -msgid "Return to file browser" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:39 -#: ../lib/python/Components/UsageConfig.py:41 -msgid "Return to movie list" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:39 -#: ../lib/python/Components/UsageConfig.py:41 -msgid "Return to previous service" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1596 -#: ../lib/python/Screens/InfoBarGenerics.py:1601 -msgid "Right" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:361 -#: ../lib/python/Screens/ServiceInfo.py:146 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:452 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:90 -msgid "Rolloff" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:44 -#: ../lib/python/Screens/Satconfig.py:267 -msgid "Rotor turning speed" -msgstr "" - -#: ../lib/python/Screens/Subtitles.py:42 -msgid "Running" -msgstr "" - -#: ../lib/python/Components/Language.py:36 -msgid "Russian" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:69 -msgid "S-Video" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Sat" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:19 -#: ../lib/python/Screens/Satconfig.py:133 -#: ../lib/python/Screens/Satconfig.py:291 -#: ../lib/python/Screens/ScanSetup.py:350 -#: ../lib/python/Screens/ScanSetup.py:366 -#: ../lib/python/Components/ServiceScan.py:40 -#: ../lib/python/Tools/Transponder.py:8 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:430 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:67 -msgid "Satellite" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:68 -#: ../lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:74 -msgid "Satellite Equipment Setup" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:661 -#: ../lib/python/Screens/ChannelSelection.py:798 -msgid "Satellites" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:273 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:279 ../data/ -msgid "Satfinder" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:424 -msgid "Sats" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:161 -msgid "Saturday" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:105 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:210 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:213 -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:70 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:367 -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:80 -msgid "Save" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:598 -msgid "Save Playlist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:171 -msgid "Scaling Mode" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:902 -msgid "Scan " -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:170 -msgid "Scan QAM128" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:167 -msgid "Scan QAM16" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:171 -msgid "Scan QAM256" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:168 -msgid "Scan QAM32" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:169 -msgid "Scan QAM64" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:173 -msgid "Scan SR6875" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:172 -msgid "Scan SR6900" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:870 -msgid "Scan Wireless Networks" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:174 -#: ../lib/python/Screens/Satconfig.py:175 -msgid "Scan additional SR" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:159 -msgid "Scan band EU HYPER" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:154 -msgid "Scan band EU MID" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:158 -msgid "Scan band EU SUPER" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:156 -msgid "Scan band EU UHF IV" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:157 -msgid "Scan band EU UHF V" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:153 -msgid "Scan band EU VHF I" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:155 -msgid "Scan band EU VHF III" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:162 -msgid "Scan band US HIGH" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:164 -msgid "Scan band US HYPER" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:160 -msgid "Scan band US LOW" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:161 -msgid "Scan band US MID" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:163 -msgid "Scan band US SUPER" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:826 -msgid "" -"Scan your network for wireless Access Points and connect to them using your " -"WLAN USB Stick\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py:137 -msgid "" -"Scans default lamedbs sorted by satellite with a connected dish positioner" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:235 -msgid "Search east" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:234 -msgid "Search west" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:331 -msgid "Secondary DNS" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:51 -msgid "Select Location" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1628 -msgid "Select audio mode" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1604 -msgid "Select audio track" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:219 -msgid "Select channel to record from" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:238 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:262 -msgid "Select image" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:426 -msgid "Select provider to add..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:532 -msgid "Select service to add..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:260 -msgid "Selected source image" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:20 -msgid "Send DiSEqC" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:31 -msgid "Send DiSEqC only on satellite change" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:28 -msgid "Seperate titles with a main menu" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:239 -msgid "Sequence repeat" -msgstr "" - -#: ../lib/python/Components/Language.py:37 -msgid "Serbian" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1748 -msgid "Service has been added to the favourites." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1754 -msgid "Service has been added to the selected bouquet." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2176 -msgid "" -"Service invalid!\n" -"(Timeout reading PMT)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2175 -msgid "" -"Service not found!\n" -"(SID not found in PAT)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2181 -msgid "" -"Service unavailable!\n" -"Check tuner configuration!" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:86 ../data/ -msgid "Serviceinfo" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:910 -msgid "Services" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:30 -msgid "Set Voltage and 22KHz" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:58 -msgid "Set as default Interface" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:81 -msgid "Set interface as default Interface" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:193 -msgid "Set limits" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:86 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:46 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:63 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:38 -msgid "Settings" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:62 ../data/ -msgid "Setup" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1274 -#: ../lib/python/Screens/NetworkSetup.py:1284 -#: ../lib/python/Screens/NetworkSetup.py:1290 -#: ../lib/python/Screens/NetworkSetup.py:1296 -#: ../lib/python/Screens/NetworkSetup.py:1302 -msgid "Show Info" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:872 -msgid "Show WLAN Status" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:212 -msgid "Show services beginning with" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:46 -msgid "Show the radio player..." -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:47 -msgid "Show the tv player..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:828 -msgid "Shows the state of your wireless LAN connection.\n" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:41 -msgid "Shutdown Dreambox after" -msgstr "" - -#: ../lib/python/Screens/EventView.py:191 -msgid "Similar" -msgstr "" - -#: ../lib/python/Screens/EventView.py:185 -msgid "Similar broadcasts:" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:44 -msgid "Simple" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:29 -msgid "Simple titleset (compatibility for legacy players)" -msgstr "" - -#: ../lib/python/Components/NimManager.py:908 -msgid "Single" -msgstr "" - -#: ../lib/python/Screens/EventView.py:211 -msgid "Single EPG" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:514 -msgid "Single satellite" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:514 -#: ../lib/python/Screens/ScanSetup.py:515 -#: ../lib/python/Screens/ScanSetup.py:516 -msgid "Single transponder" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:99 -msgid "Singlestep (GOP)" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:134 -msgid "Skin..." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1282 ../data/ -msgid "Sleep Timer" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:78 -#: ../lib/python/Screens/SleepTimerEdit.py:80 -msgid "Sleep timer action:" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:170 -msgid "Slideshow Interval (sec.)" -msgstr "" - -#: ../lib/python/Screens/Ci.py:300 ../lib/python/Screens/Ci.py:304 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:59 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:61 -#, python-format -msgid "Slot %d" -msgstr "" - -#: ../lib/python/Components/Language.py:38 -msgid "Slovakian" -msgstr "" - -#: ../lib/python/Components/Language.py:39 -msgid "Slovenian" -msgstr "" - -#: ../lib/python/Components/NimManager.py:918 -msgid "Slow" -msgstr "" - -#: ../lib/python/Screens/PluginBrowser.py:39 -msgid "Some plugins are not available:\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:143 -msgid "" -"Sorry your Backup destination does not exist\n" -"\n" -"Please choose an other one." -msgstr "" - -#. TRANSLATORS: This must fit into the header button in the EPG-List -#: ../lib/python/Screens/EpgSelection.py:212 -msgid "Sort A-Z" -msgstr "" - -#. TRANSLATORS: This must fit into the header button in the EPG-List -#: ../lib/python/Screens/EpgSelection.py:209 -msgid "Sort Time" -msgstr "" - -#: ../lib/python/Components/NimManager.py:917 -msgid "South" -msgstr "" - -#: ../lib/python/Components/Language.py:40 -msgid "Spanish" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:80 ../data/ -msgid "Standby" -msgstr "" - -#: ../mytest.py:363 ../data/ -msgid "Standby / Restart" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:37 -msgid "Start from the beginning" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1533 -msgid "Start recording?" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1311 -msgid "Start test" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:168 -msgid "StartTime" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:146 -msgid "Starting on" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:240 -msgid "Step east" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:239 -msgid "Step west" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1596 -#: ../lib/python/Screens/InfoBarGenerics.py:1601 -msgid "Stereo" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:228 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:229 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:230 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:231 -msgid "Stop" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1099 -msgid "Stop Timeshift?" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:100 -msgid "Stop current event and disable coming events" -msgstr "" - -#: ../lib/python/Screens/TimerEdit.py:99 -msgid "Stop current event but not coming events" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:172 -msgid "Stop playing this movie?" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1314 -msgid "Stop test" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:586 -msgid "Stop testing plane after # failed transponders" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:590 -msgid "Stop testing plane after # successful transponders" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:249 -msgid "Store position" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:226 -msgid "Stored position" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1646 -msgid "Subservice list..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:173 ../data/ -msgid "Subtitle selection" -msgstr "" - -#: ../lib/python/Screens/Subtitles.py:61 ../lib/python/Screens/Subtitles.py:64 -#: ../lib/python/Screens/Subtitles.py:66 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:148 ../data/ -msgid "Subtitles" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Sun" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:162 -msgid "Sunday" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1309 -msgid "Swap Services" -msgstr "" - -#: ../lib/python/Components/Language.py:41 -msgid "Swedish" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1651 -msgid "Switch to next subservice" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1652 -msgid "Switch to previous subservice" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:353 -#: ../lib/python/Screens/ScanSetup.py:383 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:444 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:82 -msgid "Symbol Rate" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:141 -msgid "Symbolrate" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:345 -#: ../lib/python/Screens/ServiceInfo.py:137 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:437 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:75 ../data/ -msgid "System" -msgstr "" - -#. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline) -#: ../lib/python/Screens/About.py:58 -msgid "TRANSLATOR_INFO" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:287 -msgid "TS file is too large for ISO9660 level 1!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:188 -msgid "Table of content for collection" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:316 -msgid "Tag 1" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:321 -msgid "Tag 2" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:328 -#: ../lib/python/Screens/TimerEntry.py:179 -msgid "Tags" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:918 -#: ../lib/python/Components/ServiceScan.py:81 -#: ../lib/python/Tools/Transponder.py:70 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:476 -msgid "Terrestrial" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:182 -msgid "Terrestrial provider" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:656 -msgid "Test DiSEqC settings" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:582 -msgid "Test Type" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:822 -msgid "Test the network configuration of your Dreambox.\n" -msgstr "" - -#: ../lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py:47 -msgid "Test-Messagebox?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:289 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:653 -msgid "" -"The USB stick is now bootable. Do you want to download the latest image from " -"the feed server and save it on the stick?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:566 -#, 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 "" - -#: ../lib/python/Screens/ScanSetup.py:264 -msgid "The installation of the default services lists is finished." -msgstr "" - -#: ../lib/python/Screens/DefaultWizard.py:40 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:197 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:468 -msgid "" -"The md5sum validation failed, the file may be downloaded incompletely or be " -"corrupted!" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:258 -#, python-format -msgid "The path %s already exists." -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:274 -msgid "The pin code has been changed successfully." -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:191 -#: ../lib/python/Screens/ParentalControlSetup.py:36 -#: ../lib/python/Components/ParentalControl.py:141 -msgid "The pin code you entered is wrong." -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:276 -msgid "The pin codes you entered are different." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:527 -#, python-format -msgid "The results have been written to %s." -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:98 -msgid "The sleep timer has been activated." -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:101 -msgid "The sleep timer has been disabled." -msgstr "" - -#: ../RecordTimer.py:483 -msgid "The timer file (timers.xml) is corrupt and could not be loaded." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:744 -#: ../lib/python/Screens/NetworkSetup.py:764 -#: ../lib/python/Screens/NetworkSetup.py:778 -#: ../lib/python/Screens/NetworkSetup.py:897 -msgid "" -"The wireless LAN plugin is not installed!\n" -"Please install it." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:676 ../data/ -msgid "" -"The wizard can backup your current settings. Do you want to do a backup now?" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:359 -msgid "" -"There might not be enough Space on the selected Partition.\n" -"Do you really want to continue?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:188 -#, python-format -msgid "This .NFI file does not contain a valid %s image!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:186 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:195 -msgid "" -"This .NFI file has a valid md5 signature. Continue programming this image to " -"flash memory?" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:166 -msgid "" -"This DVD RW medium is already formatted - reformatting will erase all " -"content on the disc." -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:276 -#, python-format -msgid "This Dreambox can't decode %s video streams!" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1238 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:1223 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:1233 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:1228 -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 "" - -#: ../lib/python/Screens/NetworkSetup.py:1218 -msgid "This test detects your configured LAN-Adapter." -msgstr "" - -#: ../lib/python/Components/NimManager.py:934 -msgid "Three" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:283 -msgid "Threshold" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Thu" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:59 -msgid "Thumbnails" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:159 -msgid "Thursday" -msgstr "" - -#: ../lib/python/Screens/TimeDateInput.py:47 -msgid "Time" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:136 -msgid "Timer Type" -msgstr "" - -#: ../RecordTimer.py:505 -msgid "" -"Timer overlap in timers.xml detected!\n" -"Please recheck it!" -msgstr "" - -#: ../lib/python/Screens/SleepTimerEdit.py:27 -#: ../lib/python/Screens/SleepTimerEdit.py:29 -msgid "Timer status:" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1069 -msgid "Timeshift not possible!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:14 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:147 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:73 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:410 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:127 -msgid "Title" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:44 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:242 -msgid "Title properties" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:160 -msgid "Titleset mode" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:698 -msgid "" -"To update your Dreambox firmware, please follow these steps:\n" -"1) Turn off your box with the rear power switch and plug in the bootable USB " -"stick.\n" -"2) Turn mains back on and hold the DOWN button on the front panel pressed " -"for 10 seconds.\n" -"3) Wait for bootup and follow instructions of the wizard." -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:335 -#: ../lib/python/Tools/FuzzyDate.py:10 -msgid "Today" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:220 -msgid "Tone mode" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:236 -msgid "Toneburst" -msgstr "" - -#: ../lib/python/Components/NimManager.py:908 -msgid "Toneburst A/B" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:72 -msgid "Track" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:151 -msgid "Transmission Mode" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:394 -msgid "Transmission mode" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:88 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:455 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:93 -msgid "Transponder" -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:136 -msgid "Transponder Type" -msgstr "" - -#: ../lib/python/Screens/InputBox.py:175 -msgid "Tries left:" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:156 -msgid "Try to find used Transponders in cable network.. please wait..." -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:243 -msgid "Try to find used transponders in cable network.. please wait..." -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Tue" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:157 -msgid "Tuesday" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:190 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:222 -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:428 -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:65 -msgid "Tune" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2173 -msgid "Tune failed!" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:110 -#: ../lib/python/Screens/Satconfig.py:119 -#: ../lib/python/Screens/Satconfig.py:419 -#: ../lib/python/Screens/ScanSetup.py:320 -#: ../lib/python/Components/ServiceScan.py:137 -msgid "Tuner" -msgstr "" - -#: ../lib/python/Components/NimManager.py:453 -msgid "Tuner " -msgstr "" - -#: ../lib/python/Screens/ServiceInfo.py:89 -msgid "Tuner status" -msgstr "" - -#: ../lib/python/Components/Language.py:42 -msgid "Turkish" -msgstr "" - -#: ../lib/python/Components/NimManager.py:934 -msgid "Two" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:331 -#: ../lib/python/Screens/ScanSetup.py:334 -#: ../lib/python/Screens/ScanSetup.py:337 -msgid "Type of scan" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:438 -#: ../lib/python/Components/NimManager.py:912 -msgid "USALS" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:370 -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:108 -msgid "USB Stick" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:239 -msgid "USB stick wizard" -msgstr "" - -#: ../lib/python/Components/Language.py:43 -msgid "Ukrainian" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:75 -msgid "" -"Unable to complete filesystem check.\n" -"Error: " -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:73 -msgid "" -"Unable to initialize harddisk.\n" -"Error: " -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:254 -msgid "Uncommitted DiSEqC command" -msgstr "" - -#: ../lib/python/Components/NimManager.py:896 -msgid "Universal LNB" -msgstr "" - -#: ../lib/python/Components/Harddisk.py:182 -msgid "Unmount failed" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:35 -msgid "Update" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:360 -msgid "Updates your receiver's software" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:46 -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:145 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:231 -msgid "Updating finished. Here is the result:" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:52 -#: ../lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:151 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:237 -msgid "Updating... Please wait... This can take some minutes..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:69 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:347 -msgid "Upgrade finished. Do you want to reboot your Dreambox?" -msgstr "" - -#: ../lib/python/Screens/Ipkg.py:87 -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:300 -msgid "Upgrading" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:261 -msgid "Upgrading Dreambox... Please wait" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:31 -msgid "Use" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:473 ../data/ -msgid "Use DHCP" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:469 -msgid "Use Interface" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:40 -#: ../lib/python/Screens/Satconfig.py:263 -msgid "Use Power Measurement" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:478 -msgid "Use a gateway" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:832 -msgid "Use the Networkwizard to configure your Network\n" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:223 -msgid "Use usals for this sat" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:147 -msgid "Used service scan type" -msgstr "" - -#: ../lib/python/Components/NimManager.py:898 -msgid "User defined" -msgstr "" - -#: ../lib/python/Plugins/Extensions/Modem/plugin.py:112 -msgid "Username" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:162 -msgid "VMGM (intro trailer)" -msgstr "" - -#: ../lib/python/Tools/Transponder.py:32 -msgid "Vertical" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:33 -#: ../lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -msgid "Video Fine-Tuning" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:38 -msgid "Video Fine-Tuning Wizard" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:56 -msgid "Video Output" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:220 -msgid "Video Setup" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:223 -msgid "Video Wizard" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:1378 -msgid "View Rass interactive..." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:2086 -msgid "View teletext..." -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:219 -msgid "Voltage mode" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:922 -#: ../lib/python/Screens/Satconfig.py:323 -#: ../lib/python/Components/ServiceScan.py:49 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:480 -msgid "W" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:408 -msgid "WEP" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:409 -msgid "WPA" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:411 -msgid "WPA or WPA2" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:410 -msgid "WPA2" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/plugin.py:90 ../data/ -msgid "WSS on 4:3" -msgstr "" - -#: ../lib/python/Components/Task.py:41 -msgid "Waiting" -msgstr "" - -#: ../lib/python/Screens/EpgSelection.py:325 -#: ../lib/python/Components/EpgList.py:38 -#: ../lib/python/Components/TimerList.py:24 -#: ../lib/python/Tools/FuzzyDate.py:13 -msgid "Wed" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:117 -#: ../lib/python/Screens/TimerEntry.py:158 -msgid "Wednesday" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:153 -msgid "Weekday" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:229 -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 "" - -#: ../lib/python/Components/NimManager.py:916 -msgid "West" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:121 -msgid "What to do with submitted crashlogs?" -msgstr "" - -#: ../lib/python/Screens/FactoryReset.py:5 -msgid "" -"When you do a factory reset, you will lose ALL your configuration data\n" -"(including bouquets, services, satellite data ...)\n" -"After completion of factory reset, your receiver will restart " -"automatically!\n" -"\n" -"Really do a factory reset?" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:516 -msgid "Where to save temporary timeshift recordings?" -msgstr "" - -#: ../lib/python/Components/Network.py:314 -msgid "Wireless" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1278 -msgid "Wireless Network" -msgstr "" - -#: ../RecordTimer.py:358 -msgid "Write error while recording. Disk full?\n" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:284 -msgid "Write failed!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:241 -msgid "Writing NFI image file to flash completed" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:73 -msgid "YPbPr" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:131 -msgid "Year" -msgstr "" - -#: ../lib/python/Screens/Ci.py:25 ../lib/python/Screens/Ci.py:27 -#: ../lib/python/Screens/InfoBar.py:162 -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:279 -#: ../data/ ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Yes" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:166 -msgid "Yes, and delete this movie" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:280 -msgid "Yes, and don't ask again" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:164 -msgid "Yes, returning to movie list" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:202 -#: ../lib/python/Screens/MovieSelection.py:128 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:700 -msgid "You cannot delete this!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:483 -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 "" - -#: ../lib/python/Screens/InputBox.py:104 -#, python-format -msgid "You have to wait %s!" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:700 -msgid "Your Dreambox will restart after pressing OK on your remote control." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:263 -msgid "" -"Your collection exceeds the size of a single layer medium, you will need a " -"blank dual layer DVD!" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:336 -msgid "" -"Your dreambox isn't connected to the internet properly. Please check it and " -"try again." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:123 -msgid "Your email address:" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:34 -msgid "" -"Your frontprocessor firmware must be upgraded.\n" -"Press OK to start upgrade." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:124 -msgid "Your name (optional):" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:631 -#: ../lib/python/Screens/NetworkSetup.py:633 -msgid "Your network configuration has been activated." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:628 -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 "" - -#: ../lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:158 -msgid "Zap back to service before positioner setup?" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:217 -msgid "Zap back to service before satfinder?" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:521 -msgid "[alternative edit]" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:525 -msgid "[bouquet edit]" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:527 -msgid "[favourite edit]" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:619 -msgid "[move mode]" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:644 -msgid "a gui to assign services/providers to common interface modules" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:640 -msgid "a gui to assign services/providers/caids to common interface modules" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:157 -msgid "abort alternatives edit" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:151 -msgid "abort bouquet edit" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:154 -msgid "abort favourites edit" -msgstr "" - -#: ../lib/python/Components/TimerList.py:49 -msgid "about to start" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:214 -msgid "activate current configuration" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:131 -msgid "add Provider" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:130 -msgid "add Service" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:220 -msgid "add a nameserver entry" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:144 -msgid "add alternatives" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:403 -msgid "add bookmark" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:126 -msgid "add bouquet" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:483 -msgid "add directory to playlist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:154 -msgid "add file to playlist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:485 -msgid "add files to playlist" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:134 -msgid "add marker" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1524 -#: ../lib/python/Screens/InfoBarGenerics.py:1535 -msgid "add recording (enter recording duration)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1525 -#: ../lib/python/Screens/InfoBarGenerics.py:1536 -msgid "add recording (enter recording endtime)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1526 -#: ../lib/python/Screens/InfoBarGenerics.py:1537 -msgid "add recording (indefinitely)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1523 -#: ../lib/python/Screens/InfoBarGenerics.py:1534 -msgid "add recording (stop after current event)" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:110 -msgid "add service to bouquet" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:112 -msgid "add service to favourites" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:106 -msgid "add to parental protection" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:60 -#: ../lib/python/Screens/Satconfig.py:444 -#: ../lib/python/Components/NimManager.py:1047 -msgid "advanced" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:75 -msgid "alphabetic sort" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:202 -msgid "" -"are you sure you want to restore\n" -"following backup:\n" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:133 -msgid "assigned CAIds" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:134 -msgid "assigned Services/Provider" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:80 -#, python-format -msgid "audio track (%s) format" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:81 -#, python-format -msgid "audio track (%s) language" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "audio tracks" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:96 -msgid "auto" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:159 -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:53 -msgid "back" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:149 -msgid "background image" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:176 -msgid "backgroundcolor" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:24 -msgid "better" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:30 -msgid "black" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:16 -msgid "blacklist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:30 -msgid "blue" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:78 -#, python-format -msgid "burn audio track (%s)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1527 -msgid "change recording (duration)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1528 -msgid "change recording (endtime)" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:94 -msgid "chapters" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:257 -msgid "choose destination directory" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:555 -msgid "circular left" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:556 -msgid "circular right" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:171 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:491 -msgid "clear playlist" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:12 -msgid "complex" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1352 -#: ../lib/python/Screens/NetworkSetup.py:1366 -msgid "confirmed" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1341 -#: ../lib/python/Screens/NetworkSetup.py:1398 -msgid "connected" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:650 -msgid "continue" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:118 -msgid "copy to bouquets" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:405 -msgid "create directory" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:103 -msgid "daily" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "day" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:129 -msgid "delete" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:66 -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:68 -msgid "delete cut" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:488 -msgid "delete file" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:170 -msgid "delete playlist entry" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:499 -msgid "delete saved playlist" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:67 -msgid "delete..." -msgstr "" - -#: ../lib/python/Components/config.py:322 -msgid "disable" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:146 -msgid "disable move mode" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1164 -#: ../lib/python/Components/NimManager.py:1113 -#: ../lib/python/Components/TimerList.py:63 -msgid "disabled" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1326 -#: ../lib/python/Screens/NetworkSetup.py:1345 -#: ../lib/python/Screens/NetworkSetup.py:1393 -msgid "disconnected" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:27 -msgid "do not change" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1530 -#: ../lib/python/Screens/TaskView.py:47 ../lib/python/Screens/TimerEntry.py:96 -msgid "do nothing" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1538 -msgid "don't record" -msgstr "" - -#: ../lib/python/Components/TimerList.py:56 -#: ../lib/python/Components/TimerList.py:60 -msgid "done!" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:140 -msgid "edit alternatives" -msgstr "" - -#: ../lib/python/Components/NimManager.py:474 -msgid "empty" -msgstr "" - -#: ../lib/python/Components/config.py:322 -msgid "enable" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:136 -msgid "enable bouquet edit" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:138 -msgid "enable favourite edit" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:132 -msgid "enable move mode" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1160 -#: ../lib/python/Screens/Satconfig.py:449 -#: ../lib/python/Components/NimManager.py:1061 -#: ../lib/python/Components/NimManager.py:1101 -msgid "enabled" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:156 -msgid "end alternatives edit" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:150 -msgid "end bouquet edit" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:61 -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:63 -msgid "end cut here" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:153 -msgid "end favourites edit" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/ConfigurationBackup/plugin.py:107 -msgid "enigma2 and network" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:65 -#: ../lib/python/Screens/Satconfig.py:417 -#: ../lib/python/Components/NimManager.py:1049 -msgid "equal to" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:254 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:257 -msgid "exceeds dual layer medium!" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:325 -msgid "exit DVD player or return to file browser" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:155 -msgid "exit mediaplayer" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:232 -msgid "exit movielist" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:213 -#: ../lib/python/Screens/NetworkSetup.py:219 -msgid "exit nameserver configuration" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:309 -msgid "exit network adapter configuration" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:303 -msgid "exit network adapter setup menu" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:70 -#: ../lib/python/Screens/NetworkSetup.py:76 -msgid "exit network interface list" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:713 -#: ../lib/python/Screens/NetworkSetup.py:719 -msgid "exit networkadapter setup menu" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:604 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:628 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:644 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:656 -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:246 -msgid "failed" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:595 -msgid "fileformats (BMP, PNG, JPG, GIF)" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:206 -msgid "filename" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -msgid "fine-tune your display" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:321 -msgid "forward to the next chapter" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:254 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:260 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:266 -msgid "free" -msgstr "" - -#: ../lib/python/Components/DiskInfo.py:30 -msgid "free diskspace" -msgstr "" - -#: ../lib/python/Screens/TaskView.py:47 ../lib/python/Screens/TimerEntry.py:96 -msgid "go to deep standby" -msgstr "" - -#: ../lib/python/Screens/TaskView.py:47 ../lib/python/Screens/TimerEntry.py:96 -msgid "go to standby" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:30 -msgid "green" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:61 -msgid "hear radio..." -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:442 -msgid "hidden network" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:83 -msgid "hide extended description" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:495 -msgid "hide player" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:553 -msgid "horizontal" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:24 -msgid "hour" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:24 -#: ../lib/python/Components/UsageConfig.py:25 -msgid "hours" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:50 -msgid "immediate shutdown" -msgstr "" - -#: ../lib/python/Plugins/Extensions/FritzCall/plugin.py:77 -#, python-format -msgid "" -"incoming call!\n" -"%s calls on %s!" -msgstr "" - -#: ../lib/python/Screens/Ci.py:327 ../lib/python/Screens/Ci.py:351 -msgid "init module" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:59 -msgid "init modules" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:76 -msgid "insert mark here" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:324 -msgid "jump back to the previous title" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:323 -msgid "jump forward to the next title" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:166 -msgid "jump to listbegin" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:167 -msgid "jump to listend" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1837 -msgid "jump to next marked position" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1836 -msgid "jump to previous marked position" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:139 -msgid "leave movie player..." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1627 -msgid "left" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "length" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:79 -msgid "list style compact" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:78 -msgid "list style compact with description" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:77 -msgid "list style default" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:80 -msgid "list style single line" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:496 -msgid "load playlist" -msgstr "" - -#: ../lib/python/Components/TunerInfo.py:77 -msgid "locked" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:69 -#: ../lib/python/Screens/Satconfig.py:416 -#: ../lib/python/Components/NimManager.py:1052 -msgid "loopthrough to" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:440 -#: ../lib/python/Components/NimManager.py:912 -msgid "manual" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:147 -#: ../lib/python/Screens/MovieSelection.py:218 -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:207 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:52 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:165 -msgid "menu" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:834 -msgid "menulist" -msgstr "" - -#: ../lib/python/Components/TimerList.py:38 -#: ../lib/python/Components/TimerList.py:43 -msgid "mins" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:22 -msgid "minute" -msgstr "" - -#: ../lib/python/Screens/InputBox.py:104 -#: ../lib/python/Screens/SleepTimerEdit.py:42 -#: ../lib/python/Components/UsageConfig.py:22 -#: ../lib/python/Components/UsageConfig.py:23 -#: ../lib/python/Components/UsageConfig.py:24 -msgid "minutes" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "month" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:31 -msgid "move PiP to main picture" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:708 -msgid "move down to last entry" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:706 -msgid "move down to next entry" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:707 -msgid "move up to first entry" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:705 -msgid "move up to previous entry" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1004 -#: ../lib/python/Screens/InfoBarGenerics.py:1005 -#: ../lib/python/Screens/InfoBarGenerics.py:1006 -msgid "movie list" -msgstr "" - -#: ../lib/python/Components/AVSwitch.py:110 -msgid "multinorm" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:13 -msgid "never" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:265 -msgid "next channel" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:267 -msgid "next channel in history" -msgstr "" - -#: ../lib/python/Screens/MessageBox.py:42 -#: ../lib/python/Screens/MessageBox.py:44 -#: ../lib/python/Screens/ScanSetup.py:517 -#: ../lib/python/Screens/ScanSetup.py:895 -#: ../lib/python/Screens/SleepTimerEdit.py:85 -#: ../lib/python/Components/config.py:314 -msgid "no" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:158 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:231 -msgid "no CAId selected" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:64 -msgid "no CI slots found" -msgstr "" - -#: ../lib/python/Screens/HarddiskSetup.py:100 -msgid "no HDD found" -msgstr "" - -#: ../lib/python/Screens/Ci.py:325 ../lib/python/Screens/Ci.py:349 -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -msgid "no module found" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:21 -msgid "no standby" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:14 -msgid "no timeout" -msgstr "" - -#: ../lib/python/Screens/About.py:40 -msgid "none" -msgstr "" - -#: ../lib/python/Components/TunerInfo.py:79 -msgid "not locked" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:58 -#: ../lib/python/Screens/Satconfig.py:421 -#: ../lib/python/Screens/Satconfig.py:447 -#: ../lib/python/Components/NimManager.py:914 -#: ../lib/python/Components/NimManager.py:1046 -#: ../lib/python/Components/NimManager.py:1062 -#: ../lib/python/Components/NimManager.py:1102 -msgid "nothing connected" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:128 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:260 -msgid "of a DUAL layer medium used." -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:131 -#: ../lib/python/Plugins/Extensions/DVDBurn/TitleList.py:266 -msgid "of a SINGLE layer medium used." -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:548 -#: ../lib/python/Screens/ScanSetup.py:583 -#: ../lib/python/Screens/ScanSetup.py:590 -#: ../lib/python/Screens/ScanSetup.py:613 -#: ../lib/python/Components/UsageConfig.py:27 -#: ../lib/python/Components/config.py:318 -msgid "off" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:549 -#: ../lib/python/Screens/ScanSetup.py:584 -#: ../lib/python/Screens/ScanSetup.py:591 -#: ../lib/python/Screens/ScanSetup.py:614 -#: ../lib/python/Components/UsageConfig.py:27 -#: ../lib/python/Components/config.py:318 -msgid "on" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:134 -msgid "on READ ONLY medium." -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:97 -msgid "once" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:310 -msgid "open nameserver configuration" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:268 -msgid "open servicelist" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:263 -msgid "open servicelist(down)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:262 -msgid "open servicelist(up)" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:315 -msgid "open virtual keyboard input help" -msgstr "" - -#: ../lib/python/Components/ServiceScan.py:137 -msgid "pass" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:649 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:161 -msgid "pause" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:160 -msgid "play entry" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:164 -msgid "play from next mark or playlist entry" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:163 -msgid "play from previous mark or playlist entry" -msgstr "" - -#: ../lib/python/Screens/Ci.py:93 -msgid "please press OK when ready" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/Process.py:451 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:440 -msgid "please wait, loading picture..." -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:264 -msgid "previous channel" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:266 -msgid "previous channel in history" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:95 -msgid "record" -msgstr "" - -#: ../lib/python/Components/TimerList.py:54 -msgid "recording..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:30 -msgid "red" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:221 -msgid "remove a nameserver entry" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:71 -msgid "remove after this position" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:142 -msgid "remove all alternatives" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:120 -msgid "remove all new found flags" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:70 -msgid "remove before this position" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:409 -msgid "remove bookmark" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:406 -msgid "remove directory" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:122 -#: ../lib/python/Screens/ChannelSelection.py:127 -msgid "remove entry" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:108 -msgid "remove from parental protection" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:124 -msgid "remove new found flag" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:115 -msgid "remove selected satellite" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:78 -msgid "remove this mark" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:89 -msgid "repeat playlist" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:97 -msgid "repeated" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:322 -msgid "rewind to the previous chapter" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1627 -msgid "right" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:91 -msgid "save last directory on exit" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:498 -msgid "save playlist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:90 -msgid "save playlist on exit" -msgstr "" - -#: ../lib/python/Components/ServiceScan.py:96 -#: ../lib/python/Components/ServiceScan.py:98 -msgid "scan done!" -msgstr "" - -#: ../lib/python/Components/ServiceScan.py:33 -#, python-format -msgid "scan in progress - %d%% done!" -msgstr "" - -#: ../lib/python/Screens/ServiceScan.py:48 -msgid "scan state" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:14 -msgid "second" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:67 -#: ../lib/python/Screens/Satconfig.py:418 -#: ../lib/python/Components/NimManager.py:1050 -msgid "second cable of motorized LNB" -msgstr "" - -#: ../lib/python/Screens/InputBox.py:104 -#: ../lib/python/Components/UsageConfig.py:14 -#: ../lib/python/Components/UsageConfig.py:15 -#: ../lib/python/Components/UsageConfig.py:16 -#: ../lib/python/Components/UsageConfig.py:21 -msgid "seconds" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:127 -msgid "select" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:88 -msgid "select .NFI flash file" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:132 -msgid "select CAId" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:379 -msgid "select CAId's" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:267 -msgid "select image from server" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:71 -msgid "select interface" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:304 -#: ../lib/python/Screens/NetworkSetup.py:714 -msgid "select menu entry" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:233 -msgid "select movie" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:212 -msgid "select the movie path" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:92 -#: ../lib/python/Screens/ParentalControlSetup.py:119 -msgid "service pin" -msgstr "" - -#: ../lib/python/Screens/ParentalControlSetup.py:94 -#: ../lib/python/Screens/ParentalControlSetup.py:112 -msgid "setup pin" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:319 -msgid "show DVD main menu" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:406 -msgid "show EPG..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:173 -msgid "show Infoline" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:224 -msgid "show all" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:141 -msgid "show alternatives" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:368 -#: ../lib/python/Screens/MovieSelection.py:219 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:178 -msgid "show event details" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:85 -msgid "show extended description" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:225 -msgid "show first selected tag" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:226 -msgid "show second selected tag" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:49 -msgid "show shutdown menu" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:407 -#: ../lib/python/Screens/InfoBarGenerics.py:497 -msgid "show single service EPG..." -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:227 -msgid "show tag menu" -msgstr "" - -#: ../lib/python/Screens/ChannelSelection.py:99 -msgid "show transponder info" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:172 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:494 -msgid "shuffle playlist" -msgstr "" - -#: ../SleepTimer.py:14 -msgid "shutdown" -msgstr "" - -#: ../lib/python/Screens/Satconfig.py:59 -#: ../lib/python/Screens/Satconfig.py:442 -#: ../lib/python/Components/NimManager.py:1047 -#: ../lib/python/Components/ParentalControl.py:12 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:24 -msgid "simple" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:654 -msgid "skip backward" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:655 -msgid "skip backward (enter time)" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:652 -msgid "skip forward" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:653 -msgid "skip forward (enter time)" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:175 -msgid "slide picture in loop" -msgstr "" - -#: ../lib/python/Screens/MovieSelection.py:73 -msgid "sort by date" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:30 -msgid "standard" -msgstr "" - -#: ../SleepTimer.py:14 -msgid "standby" -msgstr "" - -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:56 -#: ../lib/python/Plugins/Extensions/CutListEditor/plugin.py:58 -msgid "start cut here" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/settings.py:93 -msgid "start directory" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1041 -msgid "start timeshift" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1627 -msgid "stereo" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:31 -msgid "stop PiP" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:162 -msgid "stop entry" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1529 -msgid "stop recording" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1042 -msgid "stop timeshift" -msgstr "" - -#: ../lib/python/Components/UsageConfig.py:30 -msgid "swap PiP and main picture" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:141 -#: ../lib/python/Screens/LocationBox.py:402 -msgid "switch to bookmarks" -msgstr "" - -#: ../lib/python/Screens/LocationBox.py:142 -#: ../lib/python/Screens/LocationBox.py:408 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:169 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:490 -msgid "switch to filelist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:168 -#: ../lib/python/Plugins/Extensions/MediaPlayer/plugin.py:486 -msgid "switch to playlist" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:329 -msgid "switch to the next angle" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:327 -msgid "switch to the next audio track" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:328 -msgid "switch to the next subtitle language" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:145 -msgid "template file" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:177 -msgid "textcolor" -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:191 -#: ../lib/python/Screens/MovieSelection.py:119 -msgid "this recording" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:80 -msgid "this service is protected by a parental control pin" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1838 -msgid "toggle a cut mark at the current position" -msgstr "" - -#: ../lib/python/Plugins/Extensions/DVDPlayer/plugin.py:320 -msgid "toggle time, chapter, audio, subtitle info" -msgstr "" - -#: ../lib/python/Screens/NetworkSetup.py:1356 -#: ../lib/python/Screens/NetworkSetup.py:1370 -msgid "unconfirmed" -msgstr "" - -#: ../lib/python/Screens/EventView.py:122 -msgid "unknown service" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:13 -msgid "until restart" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:103 -msgid "user defined" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:554 -msgid "vertical" -msgstr "" - -#: ../lib/python/Screens/InfoBarGenerics.py:1176 -msgid "view extensions..." -msgstr "" - -#: ../lib/python/Screens/InfoBar.py:60 -msgid "view recordings..." -msgstr "" - -#: ../lib/python/Screens/Ci.py:32 -msgid "wait for ci..." -msgstr "" - -#: ../lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:21 -#: ../lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:28 -msgid "wait for mmi..." -msgstr "" - -#: ../lib/python/Components/TimerList.py:47 -msgid "waiting" -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:103 -msgid "weekly" -msgstr "" - -#: ../lib/python/Components/ParentalControl.py:16 -msgid "whitelist" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:260 -msgid "working" -msgstr "" - -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../lib/python/Plugins/Extensions/PicturePlayer/plugin.py:30 -msgid "yellow" -msgstr "" - -#: ../lib/python/Screens/MessageBox.py:42 -#: ../lib/python/Screens/MessageBox.py:44 -#: ../lib/python/Screens/ScanSetup.py:517 -#: ../lib/python/Screens/ScanSetup.py:895 -#: ../lib/python/Screens/SleepTimerEdit.py:83 -#: ../lib/python/Components/config.py:314 -msgid "yes" -msgstr "" - -#: ../lib/python/Screens/ScanSetup.py:517 -#: ../lib/python/Screens/ScanSetup.py:895 -msgid "yes (keep feeds)" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py:332 -msgid "" -"your dreambox might be unusable now. Please consult the manual for further " -"assistance before rebooting your dreambox." -msgstr "" - -#: ../lib/python/Screens/TimerEntry.py:95 -msgid "zap" -msgstr "" - -#: ../lib/python/Components/TimerList.py:52 -msgid "zapped" -msgstr "" - -#: ../data/ -msgid " " -msgstr "" - -#: ../data/ -msgid "#000000" -msgstr "" - -#: ../data/ -msgid "#0064c7" -msgstr "" - -#: ../data/ -msgid "#25062748" -msgstr "" - -#: ../data/ -msgid "#389416" -msgstr "" - -#: ../data/ -msgid "#80000000" -msgstr "" - -#: ../data/ -msgid "#80ffffff" -msgstr "" - -#: ../data/ -msgid "#bab329" -msgstr "" - -#: ../data/ -msgid "#f23d21" -msgstr "" - -#: ../data/ -msgid "#ffffff" -msgstr "" - -#: ../data/ -msgid "#ffffffff" -msgstr "" - -#: ../data/ -msgid "0" -msgstr "" - -#: ../data/ -msgid "1" -msgstr "" - -#: ../data/ -msgid "12V output" -msgstr "" - -#: ../data/ -msgid "2" -msgstr "" - -#: ../data/ -msgid "3" -msgstr "" - -#: ../data/ -msgid "4" -msgstr "" - -#: ../data/ -msgid "5" -msgstr "" - -#: ../data/ -msgid "6" -msgstr "" - -#: ../data/ -msgid "7" -msgstr "" - -#: ../data/ -msgid "8" -msgstr "" - -#: ../data/ -msgid "9" -msgstr "" - -#: ../data/ -msgid "About" -msgstr "" - -#: ../data/ -msgid "Action on long powerbutton press" -msgstr "" - -#: ../data/ -msgid "Activate network settings" -msgstr "" - -#: ../data/ -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 "" - -#: ../data/ -msgid "Alpha" -msgstr "" - -#: ../data/ -msgid "Alternative radio mode" -msgstr "" - -#: ../data/ -msgid "Alternative services tuner priority" -msgstr "" - -#: ../data/ -msgid "Audio" -msgstr "" - -#: ../data/ -msgid "BER" -msgstr "" - -#: ../data/ -msgid "BER:" -msgstr "" - -#: ../data/ -msgid "Backup is done. Please press OK to see the result." -msgstr "" - -#: ../data/ -msgid "Behavior of 'pause' when paused" -msgstr "" - -#: ../data/ -msgid "Behavior of 0 key in PiP-mode" -msgstr "" - -#: ../data/ -msgid "Behavior when a movie is started" -msgstr "" - -#: ../data/ -msgid "Behavior when a movie is stopped" -msgstr "" - -#: ../data/ -msgid "Behavior when a movie reaches the end" -msgstr "" - -#: ../data/ -msgid "" -"By pressing the OK Button on your remote control, the info bar is being " -"displayed." -msgstr "" - -#: ../data/ -msgid "C" -msgstr "" - -#: ../data/ -msgid "Change bouquets in quickzap" -msgstr "" - -#: ../data/ -msgid "Channel Selection" -msgstr "" - -#: ../data/ -msgid "Channellist menu" -msgstr "" - -#: ../data/ -msgid "Choose Tuner" -msgstr "" - -#: ../data/ -msgid "Choose bouquet" -msgstr "" - -#: ../data/ -msgid "Choose your Skin" -msgstr "" - -#: ../data/ -msgid "Command execution..." -msgstr "" - -#: ../data/ -msgid "Common Interface" -msgstr "" - -#: ../data/ -msgid "Compact flash card" -msgstr "" - -#: ../data/ -msgid "Continue in background" -msgstr "" - -#: ../data/ -msgid "Custom skip time for '1'/'3'-keys" -msgstr "" - -#: ../data/ -msgid "Custom skip time for '4'/'6'-keys" -msgstr "" - -#: ../data/ -msgid "Custom skip time for '7'/'9'-keys" -msgstr "" - -#: ../data/ -msgid "Customize" -msgstr "" - -#: ../data/ -msgid "D" -msgstr "" - -#: ../data/ -msgid "Default services lists" -msgstr "" - -#: ../data/ -msgid "Default settings" -msgstr "" - -#: ../data/ -msgid "Delay" -msgstr "" - -#: ../data/ -msgid "DiSEqC" -msgstr "" - -#: ../data/ -msgid "Dish" -msgstr "" - -#: ../data/ -msgid "Display Setup" -msgstr "" - -#: ../data/ -msgid "Do you want to do a service scan?" -msgstr "" - -#: ../data/ -msgid "Do you want to do another manual service scan?" -msgstr "" - -#: ../data/ -msgid "Do you want to enable the parental control feature on your dreambox?" -msgstr "" - -#: ../data/ -msgid "Do you want to install default sat lists?" -msgstr "" - -#: ../data/ -msgid "Do you want to restore your settings?" -msgstr "" - -#: ../data/ -msgid "Do you want to view a tutorial?" -msgstr "" - -#: ../data/ -msgid "Downloadable plugins" -msgstr "" - -#: ../data/ -msgid "EPG Selection" -msgstr "" - -#: ../data/ -msgid "Electronic Program Guide" -msgstr "" - -#: ../data/ -msgid "Enable multiple bouquets" -msgstr "" - -#: ../data/ -msgid "Enter Fast Forward at speed" -msgstr "" - -#: ../data/ -msgid "Enter Rewind at speed" -msgstr "" - -#: ../data/ -msgid "Eventview" -msgstr "" - -#: ../data/ -msgid "Exit the wizard" -msgstr "" - -#: ../data/ -msgid "Exit wizard" -msgstr "" - -#: ../data/ -msgid "Extensions" -msgstr "" - -#: ../data/ -msgid "Factory reset" -msgstr "" - -#: ../data/ -msgid "Fast Forward speeds" -msgstr "" - -#: ../data/ -msgid "Filesystem Check..." -msgstr "" - -#: ../data/ -msgid "Finetune" -msgstr "" - -#: ../data/ -msgid "Frame repeat count during non-smooth winding" -msgstr "" - -#: ../data/ -msgid "Harddisk setup" -msgstr "" - -#: ../data/ -msgid "Harddisk standby after" -msgstr "" - -#: ../data/ -msgid "Index" -msgstr "" - -#: ../data/ -msgid "InfoBar" -msgstr "" - -#: ../data/ -msgid "Infobar timeout" -msgstr "" - -#: ../data/ -msgid "Information" -msgstr "" - -#: ../data/ -msgid "Initialization..." -msgstr "" - -#: ../data/ -msgid "Installing Software..." -msgstr "" - -#: ../data/ -msgid "Installing default sat lists... Please wait..." -msgstr "" - -#: ../data/ -msgid "Installing defaults... Please wait..." -msgstr "" - -#: ../data/ -msgid "Installing package content... Please wait..." -msgstr "" - -#: ../data/ -msgid "Invert display" -msgstr "" - -#: ../data/ -msgid "Job View" -msgstr "" - -#: ../data/ -msgid "Keyboard" -msgstr "" - -#: ../data/ -msgid "Keyboard Map" -msgstr "" - -#: ../data/ -msgid "Keyboard Setup" -msgstr "" - -#: ../data/ -msgid "Keymap" -msgstr "" - -#: ../data/ -msgid "Language..." -msgstr "" - -#: ../data/ -msgid "Load Length of Movies in Movielist" -msgstr "" - -#: ../data/ -msgid "Lock:" -msgstr "" - -#: ../data/ -msgid "MORE" -msgstr "" - -#: ../data/ -msgid "Main menu" -msgstr "" - -#: ../data/ -msgid "Mainmenu" -msgstr "" - -#: ../data/ -msgid "Manual Scan" -msgstr "" - -#: ../data/ -msgid "Margin after record" -msgstr "" - -#: ../data/ -msgid "Margin before record (minutes)" -msgstr "" - -#: ../data/ -msgid "MediaPlayer" -msgstr "" - -#: ../data/ -msgid "Message" -msgstr "" - -#: ../data/ -msgid "Message..." -msgstr "" - -#: ../data/ -msgid "Modulator" -msgstr "" - -#: ../data/ -msgid "Movielist menu" -msgstr "" - -#: ../data/ -msgid "Mute" -msgstr "" - -#: ../data/ -msgid "NEXT" -msgstr "" - -#: ../data/ -msgid "NOW" -msgstr "" - -#: ../data/ -msgid "Nameserver Setup" -msgstr "" - -#: ../data/ -msgid "Network Configuration..." -msgstr "" - -#: ../data/ -msgid "Network Setup" -msgstr "" - -#: ../data/ -msgid "Network setup" -msgstr "" - -#: ../data/ -msgid "Network test..." -msgstr "" - -#: ../data/ -msgid "Network..." -msgstr "" - -#: ../data/ -msgid "No backup needed" -msgstr "" - -#: ../data/ -msgid "No, do nothing." -msgstr "" - -#: ../data/ -msgid "No, just start my dreambox" -msgstr "" - -#: ../data/ -msgid "No, scan later manually" -msgstr "" - -#: ../data/ -msgid "Now Playing" -msgstr "" - -#: ../data/ -msgid "OK, guide me through the upgrade process" -msgstr "" - -#: ../data/ -msgid "OSD Settings" -msgstr "" - -#: ../data/ -msgid "Parental control services Editor" -msgstr "" - -#: ../data/ -msgid "Parental control setup" -msgstr "" - -#: ../data/ -msgid "PiPSetup" -msgstr "" - -#: ../data/ -msgid "Pin code needed" -msgstr "" - -#: ../data/ -msgid "Please choose the default services lists you want to install." -msgstr "" - -#: ../data/ -msgid "Please set up tuner B" -msgstr "" - -#: ../data/ -msgid "Please set up tuner C" -msgstr "" - -#: ../data/ -msgid "Please set up tuner D" -msgstr "" - -#: ../data/ -msgid "Plugin browser" -msgstr "" - -#: ../data/ -msgid "Plugins" -msgstr "" - -#: ../data/ -msgid "RC Menu" -msgstr "" - -#: ../data/ -msgid "RF output" -msgstr "" - -#: ../data/ -msgid "Radio" -msgstr "" - -#: ../data/ -msgid "Reception Settings" -msgstr "" - -#: ../data/ -msgid "Recordings always have priority" -msgstr "" - -#: ../data/ -msgid "Repeat" -msgstr "" - -#: ../data/ -msgid "Restart" -msgstr "" - -#: ../data/ -msgid "Restart GUI" -msgstr "" - -#: ../data/ -msgid "" -"Restoring the settings is done. Please press OK to activate the restored " -"settings now." -msgstr "" - -#: ../data/ -msgid "Rewind speeds" -msgstr "" - -#: ../data/ -msgid "SNR" -msgstr "" - -#: ../data/ -msgid "SNR:" -msgstr "" - -#: ../data/ -msgid "Sat / Dish Setup" -msgstr "" - -#: ../data/ -msgid "Seek" -msgstr "" - -#: ../data/ -msgid "Select HDD" -msgstr "" - -#: ../data/ -msgid "Select Network Adapter" -msgstr "" - -#: ../data/ -msgid "Select a movie" -msgstr "" - -#: ../data/ -msgid "Service" -msgstr "" - -#: ../data/ -msgid "Service Scan" -msgstr "" - -#: ../data/ -msgid "Service Searching" -msgstr "" - -#: ../data/ -msgid "Service scan" -msgstr "" - -#: ../data/ -msgid "Setup Mode" -msgstr "" - -#: ../data/ -msgid "Show blinking clock in display during recording" -msgstr "" - -#: ../data/ -msgid "Show infobar on channel change" -msgstr "" - -#: ../data/ -msgid "Show infobar on event change" -msgstr "" - -#: ../data/ -msgid "Show infobar on skip forward/backward" -msgstr "" - -#: ../data/ -msgid "Show positioner movement" -msgstr "" - -#: ../data/ -msgid "Slow Motion speeds" -msgstr "" - -#: ../data/ -msgid "Somewhere else" -msgstr "" - -#: ../data/ -msgid "Sound" -msgstr "" - -#: ../data/ -msgid "Soundcarrier" -msgstr "" - -#: ../data/ -msgid "Subservices" -msgstr "" - -#: ../data/ -msgid "TV System" -msgstr "" - -#: ../data/ -msgid "Test mode" -msgstr "" - -#: ../data/ -msgid "" -"Thank you for using the wizard. Your box is now ready to use.\n" -"Please press OK to start using your Dreambox." -msgstr "" - -#: ../data/ -msgid "The backup failed. Please choose a different backup location." -msgstr "" - -#: ../data/ -msgid "The package doesn't contain anything." -msgstr "" - -#: ../data/ -msgid "The wizard is finished now." -msgstr "" - -#: ../data/ -msgid "There are no default services lists in your image." -msgstr "" - -#: ../data/ -msgid "There are no default settings in your image." -msgstr "" - -#: ../data/ -msgid "This is step number 2." -msgstr "" - -#: ../data/ -msgid "This is unsupported at the moment." -msgstr "" - -#: ../data/ -msgid "Time/Date Input" -msgstr "" - -#: ../data/ -msgid "Timer" -msgstr "" - -#: ../data/ -msgid "Timer Edit" -msgstr "" - -#: ../data/ -msgid "Timer Editor" -msgstr "" - -#: ../data/ -msgid "Timer entry" -msgstr "" - -#: ../data/ -msgid "Timer log" -msgstr "" - -#: ../data/ -msgid "Timer sanity error" -msgstr "" - -#: ../data/ -msgid "Timer selection" -msgstr "" - -#: ../data/ -msgid "Timeshift" -msgstr "" - -#: ../data/ -msgid "Timeshift path..." -msgstr "" - -#: ../data/ -msgid "Timezone" -msgstr "" - -#: ../data/ -msgid "Translation" -msgstr "" - -#: ../data/ -msgid "Translation:" -msgstr "" - -#: ../data/ -msgid "Tuner Slot" -msgstr "" - -#: ../data/ -msgid "Tuner configuration" -msgstr "" - -#: ../data/ -msgid "USB" -msgstr "" - -#: ../data/ -msgid "Use non-smooth winding at speeds above" -msgstr "" - -#: ../data/ -msgid "Use power measurement" -msgstr "" - -#: ../data/ -msgid "" -"Use the left and right buttons to change an option.\n" -"\n" -"Please set up tuner A" -msgstr "" - -#: ../data/ -msgid "" -"Use the up/down keys on your remote control to select an option. After that, " -"press OK." -msgstr "" - -#: ../data/ -msgid "Use wizard to set up basic features" -msgstr "" - -#: ../data/ -msgid "VCR scart" -msgstr "" - -#: ../data/ -msgid "Virtual KeyBoard" -msgstr "" - -#: ../data/ -msgid "Volume" -msgstr "" - -#: ../data/ -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 "" - -#: ../data/ -msgid "Welcome..." -msgstr "" - -#: ../data/ -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 "" - -#: ../data/ -msgid "What do you want to scan?" -msgstr "" - -#: ../data/ -msgid "Where do you want to backup your settings?" -msgstr "" - -#: ../data/ -msgid "Yes, backup my settings!" -msgstr "" - -#: ../data/ -msgid "Yes, do a manual scan now" -msgstr "" - -#: ../data/ -msgid "Yes, do an automatic scan now" -msgstr "" - -#: ../data/ -msgid "Yes, do another manual scan now" -msgstr "" - -#: ../data/ -msgid "Yes, perform a shutdown now." -msgstr "" - -#: ../data/ -msgid "Yes, restore the settings now" -msgstr "" - -#: ../data/ -msgid "Yes, view the tutorial" -msgstr "" - -#: ../data/ -msgid "" -"You can choose some default settings now. Please select the settings you " -"want to be installed." -msgstr "" - -#: ../data/ -msgid "You can choose, what you want to install..." -msgstr "" - -#: ../data/ -msgid "You chose not to install any default services lists." -msgstr "" - -#: ../data/ -msgid "" -"You chose not to install any default settings. You can however install the " -"default settings later in the settings menu." -msgstr "" - -#: ../data/ -msgid "" -"You chose not to install anything. Please press OK finish the install wizard." -msgstr "" - -#: ../data/ -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 "" - -#: ../data/ -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 "" - -#: ../data/ -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 "" - -#: ../data/ -msgid "" -"You have chosen to backup to your harddisk. Please press OK to start the " -"backup now." -msgstr "" - -#: ../data/ -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 "" - -#: ../data/ -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 "" - -#: ../data/ -msgid "" -"Your backup succeeded. We will now continue to explain the further upgrade " -"process." -msgstr "" - -#: ../data/ -msgid "Your dreambox is shutting down. Please stand by..." -msgstr "" - -#: ../data/ -msgid "config menu" -msgstr "" - -#: ../data/ -msgid "help..." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "50 Hz" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "If you can see this page, please press OK." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "No 50 Hz, sorry. :(" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "No picture on TV? Press EXIT and retry." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Please follow the instructions on the TV" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Refresh rate selection." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select refresh rate" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select video input" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select video mode" -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -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 "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -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 "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Video mode selection." -msgstr "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -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 "" - -#: ../lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Your TV works with 50 Hz. Good!" -msgstr "" diff --git a/po/xml2po.py b/po/xml2po.py index c517517b..cfbeaf4b 100755 --- a/po/xml2po.py +++ b/po/xml2po.py @@ -57,7 +57,7 @@ for arg in sys.argv[1:]: if c: for l in c.split('\n'): print "#. ", l - if str(k) != "": + if str(k).strip() != "": print 'msgid "' + str(k) + '"' print 'msgstr ""' diff --git a/skin.py b/skin.py old mode 100644 new mode 100755 index 5b8ce650..064fd219 --- a/skin.py +++ b/skin.py @@ -148,6 +148,8 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) guiObject.setFont(parseFont(value, scale)) elif attrib == 'zPosition': guiObject.setZPosition(int(value)) + elif attrib == 'itemHeight': + guiObject.setItemHeight(int(value)) elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"): ptr = loadPixmap(value, desktop) # this should already have been filename-resolved. if attrib == "pixmap": diff --git a/tools/genmetaindex.py b/tools/genmetaindex.py index 82e79616..f7dc5b98 100755 --- a/tools/genmetaindex.py +++ b/tools/genmetaindex.py @@ -24,7 +24,7 @@ for file in sys.argv[2:]: assert info for i in info[:]: - if i.tag not in ["name", "packagename", "shortdescription"]: + if i.tag not in ["name", "packagename", "packagetype", "shortdescription"]: info.remove(i) for i in info[:]: