def playService(self, ref, checkParentalControl = True, forceRestart = False):
oldref = self.currentlyPlayingServiceReference
if ref and oldref and ref == oldref and not forceRestart:
- print "ignore request to play already running service"
+ print "ignore request to play already running service(1)"
return 0
print "playing", ref and ref.toString()
if ref is None:
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
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
+SUBDIRS = hdbouquets sdbouquets
+
installdir = $(pkgdatadir)/defaults/Dream
dist_install_DATA = \
settings.500hd \
settings.7025 \
settings.800 \
- settings.8000 \
- userbouquet.favourites.tv
+ settings.8000
</prerequisites>
</file-->
<file type="favourites" directory="" name="bouquets.tv" />
- <file type="favourites" directory="" name="userbouquet.favourites.tv" />
+ <file type="favourites" directory="hdbouquets/" name="userbouquet.favourites.tv" />
<!--file type="package" directory="packages/" name="small-test_1.0_mipsel.ipk" /-->
</files>
</default>
</prerequisites>
</file-->
<file type="favourites" directory="" name="bouquets.tv" />
- <file type="favourites" directory="" name="userbouquet.favourites.tv" />
+ <file type="favourites" directory="sdbouquets/" name="userbouquet.favourites.tv" />
<!--file type="package" directory="packages/" name="small-test_1.0_mipsel.ipk" /-->
</files>
</default>
</prerequisites>
</file-->
<file type="favourites" directory="" name="bouquets.tv" />
- <file type="favourites" directory="" name="userbouquet.favourites.tv" />
+ <file type="favourites" directory="hdbouquets/" name="userbouquet.favourites.tv" />
<!--file type="package" directory="packages/" name="small-test_1.0_mipsel.ipk" /-->
</files>
</default>
</prerequisites>
</file-->
<file type="favourites" directory="" name="bouquets.tv" />
- <file type="favourites" directory="" name="userbouquet.favourites.tv" />
+ <file type="favourites" directory="hdbouquets/" name="userbouquet.favourites.tv" />
<!--file type="package" directory="packages/" name="small-test_1.0_mipsel.ipk" /-->
</files>
</default>
--- /dev/null
+installdir = $(pkgdatadir)/defaults/Dream/hdbouquets
+
+dist_install_DATA = \
+ userbouquet.favourites.tv
--- /dev/null
+#NAME Favourites (TV)\r
+#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCC:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2EE3:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445C:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2EF4:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445D:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445E:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:33:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D67:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7031:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7032:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7033:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E46:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCE:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DD1:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCF:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E42:431:1:C00000:0:0:0:\r
+#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
+#DESCRIPTION Doku/Wissen/Themen\r
+#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D70:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277B:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:332D:45B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3139:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0:\r
+#SERVICE 1:64:A:0:0:0:0:0:0:0::Sport\r
+#DESCRIPTION Sport\r
+#SERVICE 1:0:1:384:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:79E0:443:1:C00000:0:0:0:\r
+#SERVICE 1:64:1:0:0:0:0:0:0:0::Kinder\r
+#DESCRIPTION Kinder\r
+#SERVICE 1:0:1:2F08:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D68:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7008:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6FE0:443:1:C00000:0:0:0:\r
+#SERVICE 1:64:2:0:0:0:0:0:0:0::Nachrichten\r
+#DESCRIPTION Nachrichten\r
+#SERVICE 1:0:1:2F3A:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445F:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:79F4:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2753:402:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7035:41B:1:C00000:0:0:0:\r
+#SERVICE 1:64:3:0:0:0:0:0:0:0::Regional\r
+#DESCRIPTION Regional\r
+#SERVICE 1:0:1:3146:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:300:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:2778:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277A:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2779:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2777:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:32D6:45D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277D:444:1:C00000:0:0:0:\r
+#SERVICE 1:64:4:0:0:0:0:0:0:0::Musik\r
+#DESCRIPTION Musik\r
+#SERVICE 1:0:1:2774:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7004:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7001:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6FE1:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2FD:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:32D5:45D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:332E:45B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:304:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:702:5:85:C00000:0:0:0:\r
+#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen\r
+#DESCRIPTION Reisen\r
+#SERVICE 1:0:1:20:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung\r
+#DESCRIPTION Beratung\r
+#SERVICE 1:0:1:295:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:6:0:0:0:0:0:0:0::Einkaufen\r
+#DESCRIPTION Einkaufen\r
+#SERVICE 1:0:1:301:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:28:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:79EA:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F44:454:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3148:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:36:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:307:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:296:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:383:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:313C:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3159:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2E:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:381:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:7:0:0:0:0:0:0:0::High Definition\r
+#DESCRIPTION High Definition\r
+#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:\r
+#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen\r
+#DESCRIPTION Alternativen\r
+#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E44:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E45:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E41:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E40:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E43:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6EE1:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E2D:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E2E:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F46:445:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E47:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F76:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E92:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E93:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F78:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F79:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E94:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F77:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6EEB:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E97:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E96:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E95:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:64:8:0:0:0:0:0:0:0::Alternative SD services\r
+#DESCRIPTION Alternative SD services\r
+#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
--- /dev/null
+installdir = $(pkgdatadir)/defaults/Dream/sdbouquets
+
+dist_install_DATA = \
+ userbouquet.favourites.tv
--- /dev/null
+#NAME Favourites (TV)\r
+#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCC:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2EE3:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445C:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2EF4:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445D:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445E:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:33:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D67:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7031:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7032:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7033:41B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E46:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCE:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DD1:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6DCF:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E42:431:1:C00000:0:0:0:\r
+#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
+#DESCRIPTION Doku/Wissen/Themen\r
+#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D70:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277B:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:332D:45B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3139:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0:\r
+#SERVICE 1:64:A:0:0:0:0:0:0:0::Sport\r
+#DESCRIPTION Sport\r
+#SERVICE 1:0:1:384:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:79E0:443:1:C00000:0:0:0:\r
+#SERVICE 1:64:1:0:0:0:0:0:0:0::Kinder\r
+#DESCRIPTION Kinder\r
+#SERVICE 1:0:1:2F08:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D68:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7008:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6FE0:443:1:C00000:0:0:0:\r
+#SERVICE 1:64:2:0:0:0:0:0:0:0::Nachrichten\r
+#DESCRIPTION Nachrichten\r
+#SERVICE 1:0:1:2F3A:441:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:445F:453:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:79F4:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2753:402:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7035:41B:1:C00000:0:0:0:\r
+#SERVICE 1:64:3:0:0:0:0:0:0:0::Regional\r
+#DESCRIPTION Regional\r
+#SERVICE 1:0:1:3146:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:300:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:2778:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277A:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2779:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2777:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:32D6:45D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:277D:444:1:C00000:0:0:0:\r
+#SERVICE 1:64:4:0:0:0:0:0:0:0::Musik\r
+#DESCRIPTION Musik\r
+#SERVICE 1:0:1:2774:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7004:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:7001:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6FE1:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2FD:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:32D5:45D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:332E:45B:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:304:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:702:5:85:C00000:0:0:0:\r
+#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen\r
+#DESCRIPTION Reisen\r
+#SERVICE 1:0:1:20:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung\r
+#DESCRIPTION Beratung\r
+#SERVICE 1:0:1:295:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:6:0:0:0:0:0:0:0::Einkaufen\r
+#DESCRIPTION Einkaufen\r
+#SERVICE 1:0:1:301:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:28:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:79EA:443:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2F44:454:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3148:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:36:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:307:7:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:296:5:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:383:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:313C:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:3159:459:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:2E:21:85:C00000:0:0:0:\r
+#SERVICE 1:0:1:381:21:85:C00000:0:0:0:\r
+#SERVICE 1:64:7:0:0:0:0:0:0:0::High Definition\r
+#DESCRIPTION High Definition\r
+#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:\r
+#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen\r
+#DESCRIPTION Alternativen\r
+#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E44:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E45:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E41:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E40:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E43:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6EE1:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E2D:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E2E:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F46:445:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E47:431:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F76:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E92:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E93:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F78:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F79:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E94:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F77:457:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6EEB:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E97:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E96:4B1:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6E95:4B1:1:C00000:0:0:0:\r
+++ /dev/null
-#NAME Favourites (TV)\r
-#SERVICE 1:0:1:6DCA:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D66:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6DCC:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2EE3:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:445C:453:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2EF4:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:445D:453:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:445E:453:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:33:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D67:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7031:41B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7032:41B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7033:41B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E46:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6DCE:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6DD1:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6DCF:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E42:431:1:C00000:0:0:0:\r
-#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
-#DESCRIPTION Doku/Wissen/Themen\r
-#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:3138:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D70:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:277B:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:332D:45B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:3139:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0:\r
-#SERVICE 1:64:A:0:0:0:0:0:0:0::Sport\r
-#DESCRIPTION Sport\r
-#SERVICE 1:0:1:384:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:79E0:443:1:C00000:0:0:0:\r
-#SERVICE 1:64:1:0:0:0:0:0:0:0::Kinder\r
-#DESCRIPTION Kinder\r
-#SERVICE 1:0:1:2F08:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D68:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7008:436:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6FE0:443:1:C00000:0:0:0:\r
-#SERVICE 1:64:2:0:0:0:0:0:0:0::Nachrichten\r
-#DESCRIPTION Nachrichten\r
-#SERVICE 1:0:1:2F3A:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:445F:453:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:79F4:443:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2753:402:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7035:41B:1:C00000:0:0:0:\r
-#SERVICE 1:64:3:0:0:0:0:0:0:0::Regional\r
-#DESCRIPTION Regional\r
-#SERVICE 1:0:1:3146:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:300:7:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:2778:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:277A:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2779:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2777:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:32D6:45D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:277D:444:1:C00000:0:0:0:\r
-#SERVICE 1:64:4:0:0:0:0:0:0:0::Musik\r
-#DESCRIPTION Musik\r
-#SERVICE 1:0:1:2774:444:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7004:436:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7001:436:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6FE1:443:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2FD:7:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:32D5:45D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:332E:45B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:304:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:702:5:85:C00000:0:0:0:\r
-#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen\r
-#DESCRIPTION Reisen\r
-#SERVICE 1:0:1:20:21:85:C00000:0:0:0:\r
-#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung\r
-#DESCRIPTION Beratung\r
-#SERVICE 1:0:1:295:21:85:C00000:0:0:0:\r
-#SERVICE 1:64:6:0:0:0:0:0:0:0::Einkaufen\r
-#DESCRIPTION Einkaufen\r
-#SERVICE 1:0:1:301:7:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:28:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:79EA:443:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2F44:454:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:3148:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:36:7:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:307:7:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:296:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:383:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:313C:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:3159:459:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:2E:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:381:21:85:C00000:0:0:0:\r
-#SERVICE 1:64:7:0:0:0:0:0:0:0::High Definition\r
-#DESCRIPTION High Definition\r
-#SERVICE 1:0:19:2B5C:3F3:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:2B84:3F3:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:\r
-#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen\r
-#DESCRIPTION Alternativen\r
-#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E44:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E45:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E41:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E40:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E43:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6EE1:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E2D:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E2E:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6F46:445:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E47:431:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6F76:457:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E92:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E93:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6F78:457:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6F79:457:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E94:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6F77:457:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6EEB:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E97:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E96:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6E95:4B1:1:C00000:0:0:0:\r
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..
</screen>
<!-- Nim selection -->
<screen name="NimSelection" position="center,center" size="400,330" title="Choose Tuner">
- <widget source="nimlist" render="Listbox" position="0,0" size="380,300" scrollbarMode="showOnDemand">
+ <widget source="nimlist" render="Listbox" position="0,0" size="380,360" scrollbarMode="showOnDemand">
<convert type="TemplatedMultiContent">
{"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
}
</convert>
</widget>
expanded-plugins.png \
info-bg_mp.png \
info-bg.png \
+ lock.png \
+ lockBouquet.png \
mediaplayer_bg.png \
mute.png \
nim_active.png \
timeline-now.png \
timeline.png \
unhandled-key.png \
+ unlock.png \
+ unlockBouquet.png \
verticalline-plugins.png \
vkey_backspace.png \
vkey_bg.png \
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)
{
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)
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);
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];
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)
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)
{
else
ret += 10;
}
+ eSecDebugNoSimulate("ret3 %d", ret);
}
else // current fe is dependent of another tuner ... (so this fe can't turn the rotor!)
{
lines = mounts.readlines()
mounts.close()
- cmd = "/bin/umount"
+ cmd = "umount"
for line in lines:
parts = line.strip().split(" ")
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")
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
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)
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
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()
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
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):
self.description = description
self.has_outputs = has_outputs
self.internally_connectable = internally_connectable
+ self.multi_type = multi_type
def isCompatible(self, what):
compatible = {
}
return what in compatible[self.type]
+ def getType(self):
+ return self.type
+
def connectableTo(self):
connectable = {
"DVB-S": ("DVB-S", "DVB-S2"),
def internallyConnectableTo(self):
return self.internally_connectable
+
+ def isMultiType(self):
+ return (len(self.multi_type) > 0)
+
+ # returns dict {<slotid>: <type>}
+ def getMultiTypeList(self):
+ return self.multi_type
slot_id = property(getSlotID)
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")
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):
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(configElement):
+ fe_id = configElement.fe_id
+ open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
empty_slots = 0
for slot in nimmgr.nim_slots:
x = slot.slot
nim = config.Nims[x]
+ if slot.isMultiType():
+ typeList = []
+ value = None
+ for id in slot.getMultiTypeList().keys():
+ type = slot.getMultiTypeList()[id]
+ typeList.append((id, type))
+ if type == slot.getType():
+ value = id
+ nim.multiType = ConfigSelection(typeList, "0")
+ nim.multiType.value = value
+ nim.multiType.fe_id = x - empty_slots
+ nim.multiType.addNotifier(tunerTypeChanged)
+
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
-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()
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]
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()
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):
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)
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)
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,)))))
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
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)
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
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
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
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
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)
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
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
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):
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
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):
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
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
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" ]
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 ]
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)
installdir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer
install_PYTHON = \
- src/servicedvd.so \
__init__.py \
plugin.py \
keymap.xml \
<widget source="session.CurrentService" render="Label" position="5,4" size="120,28" font="Regular;12" transparent="1" >
<convert type="ServiceName">Name</convert>
</widget>
- <widget name="DVDPlayer" position="5,30" size="66,16" font="Regular;12" transparent="1" />
+ <widget name="DVDPlayer" position="5,30" size="66,16" font="Regular;11" transparent="1" />
<widget name="Chapter" position="72,30" size="54,16" font="Regular;12" transparent="1" halign="right" />
<widget source="session.CurrentService" render="Label" position="66,46" size="60,18" font="Regular;16" transparent="1" halign="right" >
<convert type="ServicePosition">Position</convert>
-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 \
DEFINE_REF(eServiceDVD);
eServiceDVD::eServiceDVD(eServiceReference ref):
- m_ref(ref),
- m_ddvdconfig(ddvd_create()),
- m_subtitle_widget(0),
- m_state(stIdle),
- m_current_trick(0),
- m_pump(eApp, 1)
+ m_ref(ref), m_ddvdconfig(ddvd_create()), m_subtitle_widget(0), m_state(stIdle),
+ m_current_trick(0), m_pump(eApp, 1), m_width(-1), m_height(-1),
+ m_aspect(-1), m_framerate(-1), m_progressive(-1)
{
int aspect = DDVD_16_9;
int policy = DDVD_PAN_SCAN;
m_event(this, evSeekableStatusChanged);
m_event(this, evUser+12);
break;
+#ifdef DDVD_SUPPORTS_PICTURE_INFO
+ case DDVD_SIZE_CHANGED:
+ {
+ int changed = m_width != -1 && m_height != -1 && m_aspect != -1;
+ ddvd_get_last_size(m_ddvdconfig, &m_width, &m_height, &m_aspect);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoSizeChanged);
+ break;
+ }
+ case DDVD_PROGRESSIVE_CHANGED:
+ {
+ int changed = m_progressive != -1;
+ ddvd_get_last_progressive(m_ddvdconfig, &m_progressive);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoProgressiveChanged);
+ break;
+ }
+ case DDVD_FRAMERATE_CHANGED:
+ {
+ int changed = m_framerate != -1;
+ ddvd_get_last_framerate(m_ddvdconfig, &m_framerate);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoFramerateChanged);
+ break;
+ }
+#endif
default:
break;
}
case sUser+7:
case sUser+8:
return resIsPyObject;
+#ifdef DDVD_SUPPORTS_PICTURE_INFO
+ case sVideoWidth:
+ return m_width;
+ case sVideoHeight:
+ return m_height;
+ case sAspect:
+ return m_aspect;
+ case sProgressive:
+ return m_progressive;
+ case sFrameRate:
+ return m_framerate;
+#endif
default:
return resNA;
}
void loadCuesheet();
void saveCuesheet();
+
+ int m_width, m_height, m_aspect, m_framerate, m_progressive;
};
#endif
installdir = $(pkglibdir)/python/Plugins/Extensions/SocketMMI
install_PYTHON = \
- src/socketmmi.so \
__init__.py \
plugin.py \
SocketMMI.py
-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 \
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,
def getUpdateInfos(self):
self.setState('update')
- iSoftwareTools.getUpdates(self.getUpdateInfosCB)
+ iSoftwareTools.startSoftwareTools(self.getUpdateInfosCB)
def getUpdateInfosCB(self, retval = None):
if retval is not None:
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."))
- self.rebuildList()
def rebuildList(self, retval = None):
if self.currentSelectedTag is None:
return [ ]
return [(_("Software management"), UpgradeMain, "software_manager", 50)]
-def autostart(reason, **kwargs):
- if reason is True:
- iSoftwareTools.startSoftwareTools()
def Plugins(path, **kwargs):
global plugin_path
plugin_path = path
list = [
- PluginDescriptor(where = [PluginDescriptor.WHERE_NETWORKCONFIG_READ], fnc = autostart),
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)
]
self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
{
"showEventInfo": (self.openEventView, _("show EPG...")),
- "showEventInfoPlugin": (self.showEventInfoPlugins, _("show single service EPG...")),
+ "showEventInfoPlugin": (self.showEventInfoPlugins, _("list of EPG views...")),
"showInfobarOrEpgWhenInfobarAlreadyVisible": self.showEventInfoWhenNotVisible,
})
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:
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
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"))
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))
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)
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
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()
def keyNumberGlobal(self, number):
pass
+
# for summary:
def changedEntry(self):
for x in self.onChangedEntry:
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)
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)
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,
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:
print "Creating setup"
self.list = [ ]
+ self.multiType = None
self.configMode = None
self.diseqcModeEntry = None
self.advancedSatsEntry = None
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)
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:
+ nimmanager.enumerateNIMs()
+ 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":
"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":
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)
"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,
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 defaultMoviePath()
tmp = config.movielist.videodirs.value
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)
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):
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,
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 \
$(RM) enigma2.pot
mv enigma2uniq.pot enigma2.pot
-.PHONY: enigma2.pot
-
-
%.mo: %.po
$(MSGFMT) -o $@ $<
CLEANFILES = $(foreach LANG, $(LANGS),$(LANG).mo)
+cleanall:
+ $(RM) enigma2.pot
+
clean-local:
$(RM) -r $(LANGS)