From: acid-burn Date: Thu, 21 Apr 2011 14:53:27 +0000 (+0200) Subject: Merge remote branch 'origin/pootle-import' into experimental X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=19a3bfd167508654566d8cf0ac32e9256839851c;hp=18c169704773f16937c7e70df7ecb739a07c3767 Merge remote branch 'origin/pootle-import' into experimental --- diff --git a/.gitignore b/.gitignore index 274231a..da59fcf 100644 --- a/.gitignore +++ b/.gitignore @@ -2,16 +2,8 @@ # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): -*.[oa] *~ -Makefile.in -Makefile -*.so -*.so.0.0 -*.cxx -.deps -COPYING -INSTALL +*.a aclocal.m4 autom4te.cache/ config.guess @@ -20,22 +12,24 @@ config.status config.sub configure depcomp +.deps/ +enigma2_config.h +enigma2_config.h.in enigma2.pc +index-enigma2.xml +INSTALL install-sh -lib/actions/actionids.h -lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.d -lib/python/enigma.py -missing -py-compile -po/ -main/enigma2 -version.h -*.d *.la -*.lo .libs/ -*.tar.gz -config.h libtool +*.lo ltmain.sh +Makefile +Makefile.in +missing +moc_*.cpp +*.o +py-compile stamp-h1 +*.tar.bz2 +*.tar.gz diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..322cb19 --- /dev/null +++ b/COPYING @@ -0,0 +1 @@ +See LICENSE. diff --git a/Makefile.am b/Makefile.am index bc1770b..ff252e6 100755 --- a/Makefile.am +++ b/Makefile.am @@ -1,14 +1,21 @@ SUBDIRS = include lib main data po tools -installdir = $(pkglibdir)/python +ACLOCAL_AMFLAGS = -I m4 +installdir = $(pkglibdir)/python install_PYTHON = \ Navigation.py NavigationInstance.py RecordTimer.py SleepTimer.py ServiceReference.py \ keyids.py keymapparser.py mytest.py skin.py timer.py tools.py GlobalActions.py \ e2reactor.py -install-exec-hook: - $(PYTHON) $(srcdir)/tools/genmetaindex.py $(DESTDIR)$(datadir)/meta/plugin_*.xml > $(DESTDIR)$(datadir)/meta/index-enigma2.xml +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = enigma2.pc + +metadir = $(datadir)/meta +meta_DATA = index-enigma2.xml +CLEANFILES = index-enigma2.xml + +EXTRA_DIST = lamedb -uninstall-hook: - $(RM) $(DESTDIR)$(datadir)/meta/index-enigma2.xml +index-enigma2.xml: $(top_srcdir)/tools/genmetaindex.py $(top_srcdir)/lib/python/Plugins/*/*/meta/plugin_*.xml + $(AM_V_GEN)$(PYTHON) $^ > $@ diff --git a/README b/README index e69de29..0018e58 100644 --- a/README +++ b/README @@ -0,0 +1,68 @@ +To build enigma2 on Ubuntu 10.04, follow these steps: + +0.) Consider using OE to build it for a Dreambox instead. + + To build this version for a Dreambox, you will need + a recent OE (branch "opendreambox-1.6" will do, but "3.0" won't) + or at least a backported BitBake recipe from there. + + See http://opendreambox.org/. + + Stop reading here. It's not very useful for most people + to build enigma2 for a PC. + +1.) Install these packages: + +autoconf +automake +build-essential +gettext +libdvdnav-dev +libfreetype6-dev +libfribidi-dev +libgif-dev +libgstreamer0.10-dev +libgstreamer-plugins-base0.10-dev +libjpeg62-dev +libpng12-dev +libsdl1.2-dev +libsigc++-1.2-dev +libtool +libxml2-dev +libxslt1-dev +python-dev +swig + +2.) Build and install libdvbsi++: + +git clone git://git.opendreambox.org/git/obi/libdvbsi++.git +cd libdvbsi++ +dpkg-buildpackage -uc -us +cd .. +sudo dpkg -i libdvbsi++*.deb + +3.) Build and install libxmlccwrap: + +git clone git://git.opendreambox.org/git/obi/libxmlccwrap.git +cd libxmlccwrap +dpkg-buildpackage -uc -us +cd .. +sudo dpkg -i libxmlccwrap*.deb + +4.) Build and install libdreamdvd: + +git clone git://schwerkraft.elitedvb.net/libdreamdvd/libdreamdvd.git +cd libdreamdvd +dpkg-buildpackage -uc -us +cd .. +sudo dpkg -i libdreamdvd*.deb + +5.) Build and install enigma2: + +git clone git://git.opendreambox.org/git/enigma2.git +cd enigma2 +autoreconf -i +./configure --prefix=$HOME/enigma2 --with-libsdl +make +make install + diff --git a/RecordTimer.py b/RecordTimer.py index 4ece9c5..d8bed8f 100755 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -319,16 +319,14 @@ class RecordTimerEntry(timer.TimerEntry, object): timersanitycheck = TimerSanityCheck(NavigationInstance.instance.RecordTimer.timer_list, dummyentry) if not timersanitycheck.check(): simulTimerList = timersanitycheck.getSimulTimerList() - new_end = simulTimerList[1].begin - del simulTimerList - new_end -= 30 # 30 Sekunden Prepare-Zeit lassen - del dummyentry + if simulTimerList is not None and len(simulTimerList) > 1: + new_end = simulTimerList[1].begin + new_end -= 30 # 30 Sekunden Prepare-Zeit lassen if new_end <= time(): return False self.end = new_end return True - - + def sendStandbyNotification(self, answer): if answer: Notifications.AddNotification(Screens.Standby.Standby) @@ -517,7 +515,7 @@ class RecordTimer(timer.Timer): checkit = True for timer in root.findall("timer"): newTimer = createTimer(timer) - if (self.record(newTimer, True, True) is not None) and (checkit == True): + if (self.record(newTimer, True, dosave=False) is not None) and (checkit == True): from Tools.Notifications import AddPopup from Screens.MessageBox import MessageBox AddPopup(_("Timer overlap in timers.xml detected!\nPlease recheck it!"), type = MessageBox.TYPE_ERROR, timeout = 0, id = "TimerLoadFailed") diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index 6f1cb0a..0000000 --- a/acinclude.m4 +++ /dev/null @@ -1,445 +0,0 @@ -AC_DEFUN([TUXBOX_APPS],[ - -INSTALL="$INSTALL -p" - -AC_GNU_SOURCE -AC_SYS_LARGEFILE - -AC_ARG_WITH(target, - [ --with-target=TARGET target for compilation [[native,cdk]]], - [TARGET="$withval"],[TARGET="native"]) - -AC_ARG_WITH(targetprefix, - [ --with-targetprefix=PATH prefix relative to target root (only applicable in cdk mode)], - [targetprefix="$withval"],[targetprefix="NONE"]) - -AC_ARG_WITH(debug, - [ --without-debug disable debugging code], - [DEBUG="$withval"],[DEBUG="yes"]) - -if test "$DEBUG" = "yes"; then - DEBUG_CFLAGS="-g3 -ggdb" - AC_DEFINE(DEBUG,1,[Enable debug messages]) -fi - -AC_MSG_CHECKING(target) - -if test "$TARGET" = "native"; then - AC_MSG_RESULT(native) - - if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then - CFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" - CXXFLAGS="-Wall -O2 -pipe $DEBUG_CFLAGS" - fi - if test "$prefix" = "NONE"; then - prefix=/usr/local - fi - targetprefix=$prefix -elif test "$TARGET" = "cdk"; then - AC_MSG_RESULT(cdk) - - if test "$CC" = "" -a "$CXX" = ""; then - CC=powerpc-tuxbox-linux-gnu-gcc CXX=powerpc-tuxbox-linux-gnu-g++ - fi - if test "$CFLAGS" = "" -a "$CXXFLAGS" = ""; then - CFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" - CXXFLAGS="-Wall -Os -mcpu=823 -pipe $DEBUG_CFLAGS" - fi - if test "$prefix" = "NONE"; then - AC_MSG_ERROR(invalid prefix, you need to specify one in cdk mode) - fi - if test "$targetprefix" = "NONE"; then - targetprefix="" - fi - if test "$host_alias" = ""; then - cross_compiling=yes - host_alias=powerpc-tuxbox-linux-gnu - fi -else - AC_MSG_RESULT(none) - AC_MSG_ERROR([invalid target $TARGET, choose on from native,cdk]); -fi - -AC_CANONICAL_BUILD -AC_CANONICAL_HOST - -check_path () { - return $(perl -e "if(\"$1\"=~m#^/usr/(local/)?bin#){print \"0\"}else{print \"1\";}") -} - -]) - -AC_DEFUN([TUXBOX_APPS_DIRECTORY_ONE],[ -AC_ARG_WITH($1,[ $6$7 [[PREFIX$4$5]]],[ - _$2=$withval - if test "$TARGET" = "cdk"; then - $2=`eval echo "${targetprefix}$withval"` - else - $2=$withval - fi -],[ - $2="\${$3}$5" - if test "$TARGET" = "cdk"; then - _$2=`eval echo "${target$3}$5"` - else - _$2=`eval echo "${$3}$5"` - fi -]) - -dnl automake <= 1.6 don't support this -dnl AC_SUBST($2) -AC_DEFINE_UNQUOTED($2,"$_$2",$7) -]) - -AC_DEFUN([TUXBOX_APPS_DIRECTORY],[ -AC_REQUIRE([TUXBOX_APPS]) - -if test "$TARGET" = "cdk"; then - datadir="\${prefix}/share" - tuxboxdatadir="\${prefix}/share/tuxbox" - zoneinfodir="\${datadir}/zoneinfo" - sysconfdir="\${prefix}/etc" - localstatedir="\${prefix}/var" - localedir="\${prefix}/var" - libdir="\${prefix}/lib" - targetdatadir="\${targetprefix}/share" - targetsysconfdir="\${targetprefix}/etc" - targetlocalstatedir="\${targetprefix}/var" - targetlibdir="\${targetprefix}/lib" -fi - -TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,sysconfdir,/etc,, - [--with-configdir=PATH ],[where to find the config files]) - -TUXBOX_APPS_DIRECTORY_ONE(datadir,DATADIR,datadir,/share,, - [--with-datadir=PATH ],[where to find data]) - -TUXBOX_APPS_DIRECTORY_ONE(fontdir,FONTDIR,datadir,/share,/fonts, - [--with-fontdir=PATH ],[where to find the fonts]) - -TUXBOX_APPS_DIRECTORY_ONE(libdir,LIBDIR,libdir,/lib,, - [--with-libdir=PATH ],[where to find the internal libs]) -]) - -dnl automake <= 1.6 needs this specifications -AC_SUBST(CONFIGDIR) -AC_SUBST(DATADIR) -AC_SUBST(FONTDIR) -AC_SUBST(LIBDIR) -dnl end workaround - -AC_DEFUN([TUXBOX_APPS_DVB],[ -AC_ARG_WITH(dvbincludes, - [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], - [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) - -if test "$DVBINCLUDES"; then - CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" -fi - -AC_CHECK_HEADERS(ost/dmx.h,[ - DVB_API_VERSION=1 - AC_MSG_NOTICE([found dvb version 1]) -]) - -if test -z "$DVB_API_VERSION"; then -AC_CHECK_HEADERS(linux/dvb/version.h,[ - AC_LANG_PREPROC_REQUIRE() - AC_REQUIRE([AC_PROG_EGREP]) - AC_LANG_CONFTEST([AC_LANG_SOURCE([[ -#include -version DVB_API_VERSION - ]])]) - DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` - rm -f conftest* - - AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) -]) -fi - -if test "$DVB_API_VERSION"; then - AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) - AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) -else - AC_MSG_ERROR([can't find dvb headers]) -fi -]) - -AC_DEFUN([_TUXBOX_APPS_LIB_CONFIG],[ -AC_PATH_PROG($1_CONFIG,$2,no) -if test "$$1_CONFIG" != "no"; then - if test "$TARGET" = "cdk" && check_path "$$1_CONFIG"; then - AC_MSG_$3([could not find a suitable version of $2]); - else - $1_CFLAGS=$($$1_CONFIG --cflags) - $1_LIBS=$($$1_CONFIG --libs) - fi -fi - -AC_SUBST($1_CFLAGS) -AC_SUBST($1_LIBS) -]) - -AC_DEFUN([TUXBOX_APPS_LIB_CONFIG],[ -_TUXBOX_APPS_LIB_CONFIG($1,$2,ERROR) -if test "$$1_CONFIG" = "no"; then - AC_MSG_ERROR([could not find $2]); -fi -]) - -AC_DEFUN([TUXBOX_APPS_LIB_CONFIG_CHECK],[ -_TUXBOX_APPS_LIB_CONFIG($1,$2,WARN) -]) - -AC_DEFUN([TUXBOX_APPS_PKGCONFIG],[ -AC_PATH_PROG(PKG_CONFIG, pkg-config,no) -if test "$PKG_CONFIG" = "no" ; then - AC_MSG_ERROR([could not find pkg-config]); -fi -]) - -AC_DEFUN([_TUXBOX_APPS_LIB_PKGCONFIG],[ -PKG_CHECK_MODULES($1,$2) -AC_SUBST($1_CFLAGS) -AC_SUBST($1_LIBS) -]) - -AC_DEFUN([_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL],[ -PKG_CHECK_MODULES($1,$2,$3="yes",$3="no") -if test "$$3" = "yes"; then - AC_DEFINE($3, 1, [$2 available]) -else - $1_CFLAGS="" - $1_LIBS="" -fi -AC_SUBST($1_CFLAGS) -AC_SUBST($1_LIBS) -]) - -AC_DEFUN([TUXBOX_APPS_LIB_PKGCONFIG],[ -_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -if test -z "$$1_CFLAGS" ; then - AC_MSG_ERROR([could not find package $2]); -fi -]) - -AC_DEFUN([TUXBOX_APPS_LIB_PKGCONFIG_CHECK],[ -_TUXBOX_APPS_LIB_PKGCONFIG($1,$2) -]) - -AC_DEFUN([_TUXBOX_APPS_LIB_SYMBOL],[ -AC_CHECK_LIB($2,$3,HAVE_$1="yes",HAVE_$1="no") -if test "$HAVE_$1" = "yes"; then - $1_LIBS=-l$2 -fi - -AC_SUBST($1_LIBS) -]) - -AC_DEFUN([TUXBOX_APPS_LIB_SYMBOL],[ -_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,ERROR) -if test "$HAVE_$1" = "no"; then - AC_MSG_ERROR([could not find $2]); -fi -]) - -AC_DEFUN([TUXBOX_APPS_LIB_CONFIG_SYMBOL],[ -_TUXBOX_APPS_LIB_SYMBOL($1,$2,$3,WARN) -]) - -AC_DEFUN([TUXBOX_APPS_GETTEXT],[ -AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) -AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - -AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && - (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], - :) - -AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,[$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1],:) - -AC_MSG_CHECKING([whether NLS is requested]) -AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) -AC_MSG_RESULT($USE_NLS) -AC_SUBST(USE_NLS) - -if test "$USE_NLS" = "yes"; then - AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,[ - AC_TRY_LINK([ - #include - #ifndef __GNU_GETTEXT_SUPPORTED_REVISION - #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) - #endif - extern int _nl_msg_cat_cntr; - extern int *_nl_domain_bindings; - ],[ - bindtextdomain ("", ""); - return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings; - ], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no - )] - ) - - if test "$gt_cv_func_gnugettext_libc" = "yes"; then - AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) - gt_use_preinstalled_gnugettext=yes - else - USE_NLS=no - fi -fi - -if test -f "$srcdir/po/LINGUAS"; then - ALL_LINGUAS=$(sed -e "/^#/d" "$srcdir/po/LINGUAS") -fi - -POFILES= -GMOFILES= -UPDATEPOFILES= -DUMMYPOFILES= -for lang in $ALL_LINGUAS; do - POFILES="$POFILES $srcdirpre$lang.po" - GMOFILES="$GMOFILES $srcdirpre$lang.gmo" - UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" - DUMMYPOFILES="$DUMMYPOFILES $lang.nop" -done -INST_LINGUAS= -if test -n "$ALL_LINGUAS"; then - for presentlang in $ALL_LINGUAS; do - useit=no - if test -n "$LINGUAS"; then - desiredlanguages="$LINGUAS" - else - desiredlanguages="$ALL_LINGUAS" - fi - for desiredlang in $desiredlanguages; do - case "$desiredlang" in - "$presentlang"*) useit=yes;; - esac - done - if test $useit = yes; then - INST_LINGUAS="$INST_LINGUAS $presentlang" - fi - done -fi -CATALOGS= -if test -n "$INST_LINGUAS"; then - for lang in $INST_LINGUAS; do - CATALOGS="$CATALOGS $lang.gmo" - done -fi -AC_SUBST(POFILES) -AC_SUBST(GMOFILES) -AC_SUBST(UPDATEPOFILES) -AC_SUBST(DUMMYPOFILES) -AC_SUBST(CATALOGS) -]) - -dnl backward compatiblity -AC_DEFUN([AC_GNU_SOURCE], -[AH_VERBATIM([_GNU_SOURCE], -[/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# undef _GNU_SOURCE -#endif])dnl -AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl -AC_BEFORE([$0], [AC_RUN_IFELSE])dnl -AC_DEFINE([_GNU_SOURCE]) -]) - -AC_DEFUN([AC_PROG_EGREP], -[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], - [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi]) - EGREP=$ac_cv_prog_egrep - AC_SUBST([EGREP]) -]) - -AC_DEFUN([AC_PYTHON_DEVEL],[ - # - # should allow for checking of python version here... - # - if test $cross_compiling = "yes"; then - # Check for Python include path - AC_MSG_CHECKING([for Python include path]) - - # FIXME: yes, this is wrong. sorry about that. (tmbinc) - cross_PYTHON_VERSION=$PYTHON_VERSION - python_path= - for i in $CPPFLAGS ; do - p=`echo $i | sed "s,^-I,,"` - p=`echo $p | sed "s,^-isystem,,"` - if test -f "$p/python$cross_PYTHON_VERSION/Python.h"; then - python_path="$p/python$cross_PYTHON_VERSION" - break - fi - done - AC_MSG_RESULT([$python_path]) - if test -z "$python_path" ; then - AC_MSG_ERROR([cannot find Python include path]) - fi - AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) - - # Check for Python library path - AC_MSG_CHECKING([for Python library path]) - python_path= - for i in $LDFLAGS; do - l=`echo $i | sed "s,^-L,,"` - python_path=`find $l -type f -name libpython$cross_PYTHON_VERSION.* -print | sed "1q"` - if test -n "$python_path" ; then - break - fi - done - python_path=`echo $python_path | sed "s,/libpython.*$,,"` - AC_MSG_RESULT([$python_path]) - if test -z "$python_path" ; then - AC_MSG_ERROR([cannot find Python library path]) - fi - AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$cross_PYTHON_VERSION"]) - # - python_site=`echo $python_path | sed "s/config/site-packages/"` - AC_SUBST([PYTHON_SITE_PKG],[$python_site]) - else - AC_REQUIRE([AM_PATH_PYTHON]) - - # Check for Python include path - AC_MSG_CHECKING([for Python include path]) - python_path=`echo $PYTHON | sed "s,/bin.*$,,"` - for i in "$python_path/include/python$PYTHON_VERSION/" "$python_path/include/python/" "$python_path/" ; do - python_path=`find $i -type f -name Python.h -print | sed "1q"` - if test -n "$python_path" ; then - break - fi - done - python_path=`echo $python_path | sed "s,/Python.h$,,"` - AC_MSG_RESULT([$python_path]) - if test -z "$python_path" ; then - AC_MSG_ERROR([cannot find Python include path]) - fi - AC_SUBST([PYTHON_CPPFLAGS],[-I$python_path]) - - # Check for Python library path - AC_MSG_CHECKING([for Python library path]) - python_path=`echo $PYTHON | sed "s,/bin.*$,,"` - for i in "$python_path/lib/python$PYTHON_VERSION/config/" "$python_path/lib/python$PYTHON_VERSION/" "$python_path/lib/python/config/" "$python_path/lib/python/" "$python_path/" ; do - python_path=`find $i -type f -name libpython$PYTHON_VERSION.* -print | sed "1q"` - if test -n "$python_path" ; then - break - fi - done - python_path=`echo $python_path | sed "s,/libpython.*$,,"` - AC_MSG_RESULT([$python_path]) - if test -z "$python_path" ; then - AC_MSG_ERROR([cannot find Python library path]) - fi - AC_SUBST([PYTHON_LDFLAGS],["-L$python_path -lpython$PYTHON_VERSION"]) - # - python_site=`echo $python_path | sed "s/config/site-packages/"` - AC_SUBST([PYTHON_SITE_PKG],[$python_site]) - fi -]) diff --git a/autogen.sh b/autogen.sh index 584a74e..68f4a17 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,60 +1,2 @@ #!/bin/sh - -package="enigma2" - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -cd "$srcdir" -DIE=0 - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $package." - echo "Download the appropriate package for your system," - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" - DIE=1 -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have automake installed to compile $package." - echo "Download the appropriate package for your system," - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" - DIE=1 -} - -(libtool --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have libtool installed to compile $package." - echo "Download the appropriate package for your system," - echo "or get the source from one of the GNU ftp sites" - echo "listed in http://www.gnu.org/order/ftp.html" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if [ ! -e acinclude.m4 ]; then - for i in .. ../.. ../../..; do - if [ -e `pwd`/$i/acinclude.m4 ]; then - ln -s `pwd`/$i/acinclude.m4 . - fi - done -fi - -echo "Generating configuration files for $package, please wait...." - -echo " aclocal" -aclocal -echo " libtoolize --automake" -libtoolize --automake -echo " autoconf" -autoconf -echo " automake --add-missing" -automake --add-missing - +autoreconf -i diff --git a/config.h.in b/config.h.in deleted file mode 100644 index 3564836..0000000 --- a/config.h.in +++ /dev/null @@ -1,112 +0,0 @@ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* where to find the config files */ -#undef CONFIGDIR - -/* where to find data */ -#undef DATADIR - -/* Enable debug messages */ -#undef DEBUG - -/* Define to 1 if translation of program messages to the user's native - language is requested. */ -#undef ENABLE_NLS - -/* where to find the fonts */ -#undef FONTDIR - -/* where games data is stored */ -#undef GAMESDIR - -/* Define to 1 if you have the dvb includes */ -#undef HAVE_DVB - -/* Define to the version of the dvb api */ -#undef HAVE_DVB_API_VERSION - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_LINUX_DVB_VERSION_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OST_DMX_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* where to find the internal libs */ -#undef LIBDIR - -/* where to find locales */ -#undef LOCALEDIR - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* where to find the plugins */ -#undef PLUGINDIR - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* where to find tuxbox data */ -#undef TUXBOXDATADIR - -/* Version number of package */ -#undef VERSION - -/* With SDL */ -#undef WITH_SDL - -/* where to find zoneinfo db */ -#undef ZONEINFODIR - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# undef _GNU_SOURCE -#endif - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES diff --git a/configure.ac b/configure.ac old mode 100755 new mode 100644 index 35fad77..0c54f5b --- a/configure.ac +++ b/configure.ac @@ -1,89 +1,105 @@ -AC_INIT(enigma2,2.4) -AM_INIT_AUTOMAKE(enigma2,2.4) +AC_INIT([enigma2],[3.0.0],[enigma2-devel@lists.elitedvb.net]) +AM_INIT_AUTOMAKE([dist-bzip2 no-define tar-pax -Wno-portability]) +AC_CONFIG_HEADERS([enigma2_config.h]) -TUXBOX_APPS -TUXBOX_APPS_DIRECTORY +# Silent rules are available since 1.11, but older versions +# are still in use. So don't use them unconditionally. +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_USE_SYSTEM_EXTENSIONS +AC_SYS_LARGEFILE AC_PROG_CC AC_PROG_CXX -AC_PROG_RANLIB +m4_ifdef([LT_INIT], [LT_INIT], [AC_PROG_LIBTOOL]) +AC_CONFIG_MACRO_DIR([m4]) + +AC_CHECK_HEADERS([dbox/fp.h dbox/lcd-ks0713.h]) + +AC_PATH_PROG(MSGFMT, msgfmt, AC_MSG_ERROR(Could not find msgfmt)) + +AM_PATH_PYTHON +AX_PYTHON_DEVEL +AX_PKG_SWIG +AX_SWIG_ENABLE_CXX +AX_SWIG_PYTHON +AX_PTHREAD + +TUXBOX_APPS_DVB + +AM_CONDITIONAL(HAVE_GIT_DIR, test -d "$srcdir/.git") +AM_CONDITIONAL(HAVE_FAKE_GIT_DIR, test -f "$srcdir/.git/last_commit_info") + +PKG_CHECK_MODULES(BASE, [freetype2 fribidi gstreamer-0.10 gstreamer-pbutils-0.10 libdvbsi++ libpng libxml-2.0 sigc++-1.2]) +PKG_CHECK_MODULES(LIBDDVD, libdreamdvd, HAVE_LIBDDVD="yes", HAVE_LIBDDVD="no") +AM_CONDITIONAL(HAVE_LIBDDVD, test "$HAVE_LIBDDVD" = "yes") + +AC_CHECK_LIB([dl], [dlopen], [LIBDL_LIBS="-ldl"], [AC_MSG_ERROR([Could not find libdl])]) +AC_SUBST(LIBDL_LIBS) +AC_CHECK_LIB([jpeg], [jpeg_set_defaults], [LIBJPEG_LIBS="-ljpeg"], [AC_MSG_ERROR([Could not find libjpeg])]) +AC_SUBST(LIBJPEG_LIBS) +AC_CHECK_LIB([ungif], [DGifOpen], [LIBGIF_LIBS="-lungif"], [AC_CHECK_LIB([gif], [DGifOpen], [LIBGIF_LIBS="-lgif"], [AC_MSG_ERROR([Could not find libgif or libungif])])]) +AC_SUBST(LIBGIF_LIBS) + +AC_LANG_PUSH([C++]) +AC_CHECK_LIB([xmlccwrap], [exit], [LIBXMLCCWRAP_LIBS="-lxmlccwrap"], [AC_MSG_ERROR([Could not find libxmlccwrap])]) +AC_SUBST(LIBXMLCCWRAP_LIBS) +AC_LANG_POP AC_ARG_WITH(libsdl, - AC_HELP_STRING([--with-libsdl], [use sdl, yes or no]), - [[withsdl=$withval]], - [[withsdl=yes]] -) - -AC_CHECK_HEADER(dreamdvd/ddvdlib.h,have_ddvdlib="yes",have_ddvdlib="no") -if test x"${have_ddvdlib}" = xyes ; then - AC_DEFINE(HAVE_DDVDLIB, 1,[Define if ddvdlib is available]) -else - AC_MSG_NOTICE([ddvdlib not found... dont build dvd plugin]) + AS_HELP_STRING([--with-libsdl],[use libsdl, yes or no]), + [with_libsdl=$withval],[with_libsdl=no]) +if test "$with_libsdl" = "yes"; then + PKG_CHECK_MODULES(LIBSDL, sdl) fi -AM_CONDITIONAL(HAVE_DDVDLIB, test "$have_ddvdlib" = "yes") +AM_CONDITIONAL(HAVE_LIBSDL, test "$with_libsdl" = "yes") -AM_PATH_PYTHON() -AC_PYTHON_DEVEL -#AM_PATH_XINE(1.1.0,, AC_MSG_ERROR([*** Please install xine-lib (devel) first ***])) +AC_ARG_WITH(libxine, + AS_HELP_STRING([--with-libxine],[use libxine, yes or no]), + [with_libxine=$withval],[with_libxine=no]) +if test "$with_libxine" = "yes"; then + PKG_CHECK_MODULES(LIBXINE, libxine) + AC_DEFINE([WITH_XINE],[1],[Define to 1 if you have libxine]) +fi +AM_CONDITIONAL(HAVE_LIBXINE, test "$with_libxine" = "yes") -TUXBOX_APPS_DVB +AC_ARG_WITH(debug, + AS_HELP_STRING([--without-debug],[disable debugging code]), + [with_debug="$withval"],[with_debug="yes"]) +if test "$with_debug" = "yes"; then + DEBUG_CFLAGS="-ggdb3" + AC_DEFINE([DEBUG],[1],[Define to 1 to enable debugging code]) +fi -_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL(FREETYPE, freetype2, HAVE_FREETYPE2) -if test "$HAVE_FREETYPE2" = "no" ; then - TUXBOX_APPS_LIB_CONFIG(FREETYPE, freetype-config) +AC_ARG_WITH(memcheck, + AS_HELP_STRING([--with-memcheck],[enable memory leak checks]), + [with_memcheck="$withval"],[with_memcheck="no"]) +if test "$with_memcheck" = "yes"; then + AC_DEFINE([MEMLEAK_CHECK],[1],[Define to 1 to enable memory leak checks]) fi -TUXBOX_APPS_LIB_PKGCONFIG(FRIBIDI,fribidi) -TUXBOX_APPS_LIB_PKGCONFIG(ID3TAG,id3tag) -TUXBOX_APPS_LIB_PKGCONFIG(MAD,mad) -#TUXBOX_APPS_LIB_PKGCONFIG(PLUGINS,tuxbox-plugins) -TUXBOX_APPS_LIB_PKGCONFIG(PNG,libpng) -TUXBOX_APPS_LIB_PKGCONFIG(SIGC,sigc++-1.2) -TUXBOX_APPS_LIB_PKGCONFIG(DVBSI,libdvbsi++) -_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL(GSTREAMER,gstreamer,HAVE_GSTREAMER) -_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL(GSTREAMERPBUTILS,gstreamer-pbutils,HAVE_GSTSTREAMERPBUTILS) -_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL(LIBXINE,libxine,HAVE_LIBXINE) -AC_CHECK_LIB(jpeg, jpeg_set_defaults, HAVE_JPEG="yes", HAVE_JPEG="no") -JPEG_LIBS="-ljpeg" -AC_SUBST(JPEG_LIBS) - -AC_SUBST(LIBUNGIF_LIBS,"") -AC_CHECK_HEADERS(gif_lib.h, - AC_CHECK_LIB(ungif,DGifOpen, - [AC_DEFINE(HAVE_LIBUNGIF,1,[Define if you have libgif/libungif including devel headers]) - LIBUNGIF_LIBS="-lungif"], - [AC_CHECK_LIB(gif,DGifOpen, - [AC_DEFINE(HAVE_LIUNBGIF,1) - LIBUNGIF_LIBS="-lgif"])])) - -TUXBOX_APPS_LIB_PKGCONFIG(XML2,libxml-2.0) - -# ok, we are in trouble: XMLCCWRAP only defines C++ symbols. So let's just check if linking works, -# and assume everything will be ok. Then just check for the "exit" symbol, which should be always there. -AC_LANG_SAVE -AC_LANG_CPLUSPLUS -TUXBOX_APPS_LIB_SYMBOL(XMLCCWRAP, xmlccwrap, exit) -AC_LANG_RESTORE - -if test "$withsdl" = "yes" ; then - _TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL(SDL,sdl,WITH_SDL) - if test "$WITH_SDL" = "no" ; then - TUXBOX_APPS_LIB_CONFIG(SDL,sdl-config) - AC_DEFINE_UNQUOTED([WITH_SDL],[$withsdl],[With SDL]) + +AC_ARG_WITH(po, + AS_HELP_STRING([--with-po],[enable updating of po files]), + [with_po="$withval"],[with_po="no"]) +if test "$with_po" = "yes"; then + AC_PATH_PROG(MSGINIT, msginit) + AC_PATH_PROG(MSGMERGE, msgmerge) + AC_PATH_PROG(MSGUNIQ, msguniq) + AC_PATH_PROG(XGETTEXT, xgettext) + if test -z "$MSGINIT" -o -z "$MSGMERGE" -o -z "$MSGUNIQ" -o -z "$XGETTEXT"; then + AC_MSG_ERROR([Could not find required gettext tools]) fi fi -# allow 'if WITH_SDL' conditionals in Makefile.am -AM_CONDITIONAL(WITH_SDL, test "$WITH_SDL" = "yes") +AM_CONDITIONAL(UPDATE_PO, test "$with_po" = "yes") -CPPFLAGS="$CPPFLAGS "'-I$(top_srcdir)' -CPPFLAGS="$CPPFLAGS -D_REENTRANT $PYTHON_CPPFLAGS $MD5SUM_CFLAGS $FREETYPE_CFLAGS $FRIBIDI_CFLAGS $ID3TAG_CFLAGS $MAD_CFLAGS $PLUGINS_CFLAGS $PNG_CFLAGS $SDL_CFLAGS $SIGC_CFLAGS $XMLTREE_CFLAGS $DVBSI_CFLAGS $GSTREAMER_CFLAGS $GSTREAMERPBUTILS_CFLAGS $LIBXINE_CFLAGS $LIBUNGIF_CFLAGS" -#CPPFLAGS="$CPPFLAGS -DMEMLEAK_CHECK" -CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions -Wall" -LDFLAGS="$LDFLAGS -pthread $PYTHON_LDFLAGS $SDL_LDFLAGS $GSTREAMER_LDFLAGS $GSTREAMERPBUTILS_LDFLAGS $LIBXINE_LDFLAGS $LIBUNGIF_LDFLAGS" -#LDFLAGS="-rdynamic $LDFLAGS" +ENIGMA2_CFLAGS="-fno-rtti -fno-exceptions" +AC_SUBST(ENIGMA2_CFLAGS) -TUXBOX_APPS_GETTEXT +CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS" +CFLAGS="$CFLAGS $DEBUG_CFLAGS -Wall" +CXXFLAGS="$CXXFLAGS $DEBUG_CFLAGS -Wall $BASE_CFLAGS $ENIGMA2_CFLAGS $PTHREAD_CFLAGS" -AC_OUTPUT([ +AC_CONFIG_FILES([ Makefile data/Makefile data/fonts/Makefile @@ -93,6 +109,7 @@ data/defaults/Dream/Makefile data/defaults/Dream/hdbouquets/Makefile data/defaults/Dream/sdbouquets/Makefile data/extensions/Makefile +data/keymaps/Makefile data/skin_default/Makefile data/skin_default/menu/Makefile data/skin_default/icons/Makefile @@ -102,6 +119,7 @@ include/Makefile lib/Makefile lib/actions/Makefile lib/base/Makefile +lib/base/eenv.cpp lib/driver/Makefile lib/dvb/Makefile lib/dvb/lowlevel/Makefile @@ -188,8 +206,7 @@ lib/components/Makefile po/Makefile main/Makefile tools/Makefile +tools/enigma2.sh enigma2.pc ]) - -#lib/python/Plugins/Extensions/SimpleRSS/Makefile -#lib/python/Plugins/Extensions/FileManager/Makefile +AC_OUTPUT diff --git a/data/Makefile.am b/data/Makefile.am index 1ed9444..0eaa082 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = countries fonts defaults extensions skin_default +SUBDIRS = countries fonts defaults extensions keymaps skin_default dist_pkgdata_DATA = \ defaultsatlists.xml \ diff --git a/data/defaults/Dream/Makefile.am b/data/defaults/Dream/Makefile.am index cda5583..ee66c93 100644 --- a/data/defaults/Dream/Makefile.am +++ b/data/defaults/Dream/Makefile.am @@ -6,11 +6,15 @@ dist_install_DATA = \ bouquets.tv \ dm800se.info \ dm500hd.info \ + dm7020hd.info \ dm7025.info \ dm8000.info \ dm800.info \ settings.800se \ settings.500hd \ + settings.7020hd \ settings.7025 \ settings.800 \ - settings.8000 + settings.8000 \ + settings.c \ + settings.t diff --git a/data/defaults/Dream/dm500hd.info b/data/defaults/Dream/dm500hd.info index b1b4d53..29d14b6 100644 --- a/data/defaults/Dream/dm500hd.info +++ b/data/defaults/Dream/dm500hd.info @@ -19,8 +19,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/dm7020hd.info b/data/defaults/Dream/dm7020hd.info new file mode 100644 index 0000000..e0a1fbb --- /dev/null +++ b/data/defaults/Dream/dm7020hd.info @@ -0,0 +1,46 @@ + + + + + + + + Dream Multimedia GmbH + Dream Multimedia Default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/dm7025.info b/data/defaults/Dream/dm7025.info index a1585cf..0211199 100644 --- a/data/defaults/Dream/dm7025.info +++ b/data/defaults/Dream/dm7025.info @@ -19,8 +19,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/dm800.info b/data/defaults/Dream/dm800.info index 4793bd8..39b0cb0 100644 --- a/data/defaults/Dream/dm800.info +++ b/data/defaults/Dream/dm800.info @@ -19,8 +19,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/dm8000.info b/data/defaults/Dream/dm8000.info index 2ef2013..f052226 100644 --- a/data/defaults/Dream/dm8000.info +++ b/data/defaults/Dream/dm8000.info @@ -19,8 +19,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/dm800se.info b/data/defaults/Dream/dm800se.info index 6974b12..1685ede 100644 --- a/data/defaults/Dream/dm800se.info +++ b/data/defaults/Dream/dm800se.info @@ -19,8 +19,28 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/defaults/Dream/settings.7020hd b/data/defaults/Dream/settings.7020hd new file mode 100644 index 0000000..ae2963b --- /dev/null +++ b/data/defaults/Dream/settings.7020hd @@ -0,0 +1 @@ +config.misc.rcused=1 \ No newline at end of file diff --git a/data/defaults/Dream/settings.c b/data/defaults/Dream/settings.c new file mode 100644 index 0000000..72ab938 --- /dev/null +++ b/data/defaults/Dream/settings.c @@ -0,0 +1 @@ +config.tv.lastroot=1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 134) || (type == 195) ORDER BY name; diff --git a/data/defaults/Dream/settings.t b/data/defaults/Dream/settings.t new file mode 100644 index 0000000..72ab938 --- /dev/null +++ b/data/defaults/Dream/settings.t @@ -0,0 +1 @@ +config.tv.lastroot=1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 134) || (type == 195) ORDER BY name; diff --git a/data/defaultsatlists.xml b/data/defaultsatlists.xml index 132b427..ff0ae8b 100644 --- a/data/defaultsatlists.xml +++ b/data/defaultsatlists.xml @@ -12,11 +12,14 @@ self.condition = self.runWizard self.disableKeys = True - + + + - + + if self.runWizard: self.condition = True diff --git a/data/encoding.conf b/data/encoding.conf old mode 100644 new mode 100755 index a3cefe6..36f619d --- a/data/encoding.conf +++ b/data/encoding.conf @@ -6,6 +6,7 @@ gre ISO8859-7 pol ISO8859-2 rus ISO8859-5 bul ISO8859-5 +tha ISO8859-11 cze ISO6397 ces ISO6397 slo ISO6397 @@ -31,25 +32,32 @@ slk ISO6397 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 +200 318 #Hotbird Eutelsat (Eurosport) +300 318 #Hotbird Eutelsat (Eurosport, Animal Pl.HD) 400 318 #Hotbird 13.0 Cyfra+ 1000 318 #Hotbird 13.0 Grupa ITI 1500 318 #Hotbird 13.0 Cyfra+ 1600 318 #Hotbird 13.0 Cyfra+ +2800 318 #Hotbird 13.0 MTV Networks (Comedy Central) 7400 113 #Hotbird 13.0 Cyfrowy Polsat 7800 113 #Hotbird 13.0 Cyfrowy Polsat 7900 113 #Hotbird 13.0 Cyfrowy Polsat 8100 113 #Hotbird 13.0 Universal (Cyfra+) +8100 318 #Hotbird 13.0 Eutelsat (Universal) 11000 318 #Hotbird 13.0 Cyfra+ 11400 318 #Hotbird 13.0 Cyfra+ +11600 318 #Hotbird 13.0 BBC HD, ITI +11700 318 #Hotbird 13.0 Eurosport2 11900 318 #Hotbird 13.0 Cyfra+ 12200 318 #Hotbird 13.0 Disney Channel Polska and other 12800 318 #Hotbird 13.0 Viacom ... MTV / VH1 Polska 13000 318 #Hotbird 13.0 BBC Polska and other +13100 318 #Hotbird 13.0 Crime and Investigation 13200 113 #Hotbird 13.0 Cyfrowy Polsat #Fallback encoding table for single transponders #ISO6397 also enables two byte char encoding #TSID ONID ISO8859-X -12800 318 ISO6397 #Viacom ... MTV / VH1 Polska +#12800 318 ISO6397 #Viacom ... MTV / VH1 Polska 21100 126 ISO8859-9 # Digital Platform 7°E 10.928 H 30.000 2/3 8PSK 41200 126 ISO8859-9 # Digital Platform 7°E 11.451 V 25.066 2/3 50100 126 ISO8859-9 # Digital Platform 7°E 11.471 H 30.000 3/4 diff --git a/data/fonts/Makefile.am b/data/fonts/Makefile.am index f743b8c..2f7e7c7 100644 --- a/data/fonts/Makefile.am +++ b/data/fonts/Makefile.am @@ -1,7 +1,8 @@ -installdir = $(FONTDIR) +installdir = $(datadir)/fonts dist_install_DATA = \ ae_AlMateen.ttf \ lcd.ttf \ md_khmurabi_10.ttf \ - nmsbd.ttf + nmsbd.ttf \ + tuxtxt.ttf diff --git a/data/fonts/tuxtxt.ttf b/data/fonts/tuxtxt.ttf new file mode 100644 index 0000000..9be6547 Binary files /dev/null and b/data/fonts/tuxtxt.ttf differ diff --git a/data/keymap.xml b/data/keymap.xml index 9461d50..f167024 100755 --- a/data/keymap.xml +++ b/data/keymap.xml @@ -130,6 +130,9 @@ + + + @@ -174,10 +177,12 @@ + + @@ -370,6 +375,7 @@ + @@ -463,6 +469,7 @@ + @@ -643,6 +650,7 @@ + diff --git a/data/keymaps/Makefile.am b/data/keymaps/Makefile.am new file mode 100644 index 0000000..8499d99 --- /dev/null +++ b/data/keymaps/Makefile.am @@ -0,0 +1,6 @@ +keymapsdir = $(datadir)/keymaps +keymaps_DATA = \ + dream-de.info \ + dream-de.kmap \ + eng.info \ + eng.kmap diff --git a/data/keymaps/dream-de.info b/data/keymaps/dream-de.info new file mode 100644 index 0000000..d7f5b07 --- /dev/null +++ b/data/keymaps/dream-de.info @@ -0,0 +1,2 @@ +kmap=dream-de.kmap +name=Dreambox Keyboard Deutsch diff --git a/data/keymaps/dream-de.kmap b/data/keymaps/dream-de.kmap new file mode 100644 index 0000000..693317a Binary files /dev/null and b/data/keymaps/dream-de.kmap differ diff --git a/data/keymaps/eng.info b/data/keymaps/eng.info new file mode 100644 index 0000000..d73372c --- /dev/null +++ b/data/keymaps/eng.info @@ -0,0 +1,2 @@ +kmap=eng.kmap +name=Keyboard English diff --git a/data/keymaps/eng.kmap b/data/keymaps/eng.kmap new file mode 100644 index 0000000..15a722f Binary files /dev/null and b/data/keymaps/eng.kmap differ diff --git a/data/setup.xml b/data/setup.xml index f5dea73..8620709 100755 --- a/data/setup.xml +++ b/data/setup.xml @@ -28,10 +28,12 @@ config.usage.load_length_of_movies_in_moviellist config.usage.showdish config.usage.multibouquet + config.usage.multiepg_ask_bouquet config.usage.quickzap_bouquet_change config.usage.e1like_radio_mode config.usage.on_long_powerpress config.usage.on_short_powerpress + config.usage.timerlist_finished_timer_position config.usage.infobar_timeout config.usage.output_12V config.usage.show_event_progress_in_servicelist @@ -47,27 +49,10 @@ config.seek.speeds_forward config.seek.speeds_backward config.seek.speeds_slowmotion - - config.seek.enter_forward - config.seek.enter_backward - - config.seek.stepwise_minspeed - config.seek.stepwise_repeat + + config.seek.enter_forward + config.seek.enter_backward config.seek.on_pause config.usage.pip_zero_button config.usage.alternatives_priority diff --git a/data/skin.xml b/data/skin.xml index 868fbc4..b4b6cbc 100755 --- a/data/skin.xml +++ b/data/skin.xml @@ -46,35 +46,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/skin_default.xml b/data/skin_default.xml index e5b3132..2dee1db 100755 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -1,4 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -695,18 +728,18 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - - - - - - - - - - - - + + + + + + + + + + + + @@ -1118,10 +1151,13 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - - - - + + + LanguageCode + + + + @@ -1136,75 +1172,75 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + Name Progress - + Format:%H:%M - + Format:%S - + Name Progress - + Format:%H:%M - + Name Progress - + Format:%H:%M - + Format:%S - + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean Blink - + Name Progress - + Format:%H:%M - + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean Blink - + Name Position - + Format:%H:%M @@ -1214,87 +1250,87 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + Name Progress - + Format:%H:%M - + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean Blink - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - + - + - + Format:%H:%M @@ -1304,7 +1340,7 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + Format:%H:%M @@ -1314,33 +1350,33 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - - + + - + - - + + - + - - + + - - + + diff --git a/data/skin_default/icons/Makefile.am b/data/skin_default/icons/Makefile.am index b453aa7..7a709b0 100755 --- a/data/skin_default/icons/Makefile.am +++ b/data/skin_default/icons/Makefile.am @@ -45,10 +45,10 @@ dist_install_DATA = \ mp_buttons.png \ network_wired.png \ network_wired-active.png \ - network_wired-inactive.png \ + network_wired-inactive.png \ network_wireless.png \ network_wireless-active.png \ - network_wireless-inactive.png \ + network_wireless-inactive.png \ plugin.png \ rass_logo.png \ rass_page1.png \ diff --git a/debug b/debug deleted file mode 100755 index d247b3e..0000000 --- a/debug +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -/home/dump/tmb/oe-mono/build/tmp/work/gdb-cross-6.3-r0/install/gdb-cross/usr/local/mipsel/oe/bin/mipsel-linux-gdb main/enigma2 -x debug.gdb - diff --git a/debug.gdb b/debug.gdb deleted file mode 100644 index 69cf5d0..0000000 --- a/debug.gdb +++ /dev/null @@ -1,3 +0,0 @@ -set solib-absolute-prefix /home/tmbinc/mips/target -target remote 10.0.0.203:1234 -continue diff --git a/enigma2.bb b/enigma2.bb new file mode 100644 index 0000000..2da423c --- /dev/null +++ b/enigma2.bb @@ -0,0 +1,75 @@ +DESCRIPTION = "Enigma2 is an experimental, but useful framebuffer-based frontend for DVB functions" +DESCRIPTION_append_enigma2-plugin-extensions-cutlisteditor = "enables you to cut your movies." +DESCRIPTION_append_enigma2-plugin-extensions-graphmultiepg = "shows a graphical timeline EPG." +DESCRIPTION_append_enigma2-plugin-extensions-pictureplayer = "displays photos on the TV." +DESCRIPTION_append_enigma2-plugin-systemplugins-frontprocessorupdate = "keeps your frontprocessor up to date." +DESCRIPTION_append_enigma2-plugin-systemplugins-positionersetup = "helps you installing a motorized dish." +DESCRIPTION_append_enigma2-plugin-systemplugins-satelliteequipmentcontrol = "allows you to fine-tune DiSEqC-settings." +DESCRIPTION_append_enigma2-plugin-systemplugins-satfinder = "helps you to align your dish." +DESCRIPTION_append_enigma2-plugin-systemplugins-skinselector = "shows a menu with selectable skins." +DESCRIPTION_append_enigma2-plugin-systemplugins-videomode = "selects advanced video modes" +DESCRIPTION_append_enigma2-plugin-systemplugins-crashlogautosubmit = "automatically send crashlogs to Dream Multimedia" +DESCRIPTION_append_enigma2-plugin-systemplugins-cleanupwizard = "informs you on low internal memory on system startup." +DESCRIPTION_append_enigma2-plugin-extenstions-modem = "opens a menu to connect to internet via builtin modem." +DESCRIPTION_append_enigma2-plugin-systemplugins-wirelesslan = "helps you configuring your wireless lan" +DESCRIPTION_append_enigma2-plugin-systemplugins-networkwizard = "provides easy step by step network configuration" + +DEPENDS = "jpeg libungif libpng libsigc++-1.2 gettext-native \ + dreambox-dvbincludes freetype libdvbsi++ python swig-native \ + libfribidi libxmlccwrap libdreamdvd gstreamer gst-plugin-dvbmediasink \ + gst-plugins-bad gst-plugins-good gst-plugins-ugly python-wifi" + +RDEPENDS = "python-codecs python-core python-lang python-re python-threading \ + python-xml python-fcntl gst-plugin-decodebin gst-plugin-decodebin2 python-stringold \ + python-pickle gst-plugin-app \ + gst-plugin-id3demux gst-plugin-mad gst-plugin-ogg gst-plugin-playbin \ + gst-plugin-typefindfunctions gst-plugin-audioconvert gst-plugin-audioresample \ + gst-plugin-wavparse python-netclient gst-plugin-mpegstream gst-plugin-selector \ + gst-plugin-flac gst-plugin-dvbmediasink gst-plugin-mpegdemux \ + gst-plugin-souphttpsrc gst-plugin-mpegaudioparse gst-plugin-subparse \ + gst-plugin-apetag gst-plugin-icydemux gst-plugin-autodetect \ + glibc-gconv-iso8859-15 ethtool" + +GST_ALSA_RDEPENDS = "gst-plugin-alsa alsa-conf" +GST_DVD_RDEPENDS = "gst-plugin-cdxaparse gst-plugin-cdio gst-plugin-vcdsrc" +GST_MISC_RDEPENDS = "gst-plugin-matroska gst-plugin-qtdemux gst-plugin-vorbis gst-plugin-audioparsersbad" +GST_RTSP_RDEPENDS = "gst-plugin-udp gst-plugin-rtsp gst-plugin-rtp gst-plugin-rtpmanager" +GST_BASE_RDEPENDS = "${GST_ALSA_RDEPENDS} ${GST_MISC_RDEPENDS} ${GST_RTSP_RDEPENDS}" + +RDEPENDS_append_dm800 = " ${GST_BASE_RDEPENDS} gst-plugin-ivorbisdec" +RDEPENDS_append_dm8000 = " ${GST_BASE_RDEPENDS} ${GST_DVD_RDEPENDS} gst-plugin-avi" +RDEPENDS_append_dm500hd = " ${GST_BASE_RDEPENDS} ${GST_DVD_RDEPENDS} gst-plugin-avi" +RDEPENDS_append_dm800se = " ${GST_BASE_RDEPENDS} ${GST_DVD_RDEPENDS} gst-plugin-avi" + +RDEPENDS_enigma2-plugin-extensions-cutlisteditor = "aio-grab" +RDEPENDS_enigma2-plugin-extensions-dvdplayer = "libdreamdvd0" +RDEPENDS_enigma2-plugin-systemplugins-nfiflash = "python-twisted-web" +RDEPENDS_enigma2-plugin-systemplugins-softwaremanager = "python-twisted-web" +RDEPENDS_enigma2-plugin-systemplugins-crashlogautosubmit = "twisted-mail twisted-names python-compression python-mime python-email" +RDEPENDS_enigma2-plugin-extensions-modem = "dreambox-modem-ppp-scripts ppp" +RDEPENDS_enigma2-plugin-systemplugins-wirelesslan = "wpa-supplicant wireless-tools python-wifi" + +RCONFLICTS_enigma2-plugin-systemplugins-softwaremanager = "enigma2-plugin-systemplugins-configurationbackup enigma2-plugin-systemplugins-softwareupdate" +RREPLACES_enigma2-plugin-systemplugins-softwaremanager = "enigma2-plugin-systemplugins-configurationbackup enigma2-plugin-systemplugins-softwareupdate" + +PV = "${GITVER}" + +inherit srctree autotools gitver pkgconfig + +EXTRA_OECONF = " \ + BUILD_SYS=${BUILD_SYS} \ + HOST_SYS=${HOST_SYS} \ + STAGING_INCDIR=${STAGING_INCDIR} \ + STAGING_LIBDIR=${STAGING_LIBDIR} \ +" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +PACKAGES += "${PN}-meta" + +FILES_${PN} += "${datadir}/fonts" +FILES_${PN}-meta = "${datadir}/meta" + +python populate_packages_prepend () { + enigma2_plugindir = bb.data.expand('${libdir}/enigma2/python/Plugins', d) + do_split_packages(d, enigma2_plugindir, '(.*?/.*?)/.*', 'enigma2-plugin-%s', '%s ', recursive=True, match_path=True, prepend=True) +} diff --git a/enigma2.pc.in b/enigma2.pc.in index 01ba434..f34d904 100644 --- a/enigma2.pc.in +++ b/enigma2.pc.in @@ -6,5 +6,5 @@ includedir=@includedir@ Name: enigma2 Description: Enigma2 Version: @VERSION@ -Libs: -Cflags: -I${includedir}/enigma2 +Cflags: -I${includedir}/enigma2 @ENIGMA2_CFLAGS@ +Requires.private: sigc++-1.2 diff --git a/include/Makefile.am b/include/Makefile.am index d0c682f..ada16ca 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,3 +1,3 @@ -EXTRA_DIST = \ +pkginclude_HEADERS = \ connection.h \ libsig_comp.h diff --git a/lib/actions/.gitignore b/lib/actions/.gitignore new file mode 100644 index 0000000..460e43d --- /dev/null +++ b/lib/actions/.gitignore @@ -0,0 +1 @@ +actionids.h diff --git a/lib/actions/Makefile.am b/lib/actions/Makefile.am index 8da583f..eb8327d 100644 --- a/lib/actions/Makefile.am +++ b/lib/actions/Makefile.am @@ -1,15 +1,27 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h + +EXTRA_DIST = parseactions.py noinst_LIBRARIES = libenigma_actions.a libenigma_actions_a_SOURCES = \ - action.cpp + action.cpp -CLEANFILES = actionids.h +actionsincludedir = $(pkgincludedir)/lib/actions +actionsinclude_HEADERS = \ + action.h -action.cpp: actionids.h +nodist_actionsinclude_HEADERS = \ + actionids.h + +BUILT_SOURCES = actionids.h +CLEANFILES = actionids.h -actionids.h: - python ./parseactions.py include ../gui/*.h > actionids.h - python ./parseactions.py parse ../gui/*.h >> actionids.h +actionids.h: $(srcdir)/parseactions.py $(top_srcdir)/lib/gui/*.h + $(AM_V_GEN)$(PYTHON) $(srcdir)/parseactions.py include $(top_srcdir)/lib/gui/*.h > $@ + $(AM_V_at)$(PYTHON) $(srcdir)/parseactions.py parse $(top_srcdir)/lib/gui/*.h >> $@ diff --git a/lib/actions/action.h b/lib/actions/action.h index cbf5370..edcfac6 100644 --- a/lib/actions/action.h +++ b/lib/actions/action.h @@ -3,10 +3,6 @@ #include - /* avoid warnigs :) */ -#include -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L #include #include #include diff --git a/lib/actions/parseactions.py b/lib/actions/parseactions.py index 2462a75..cad432a 100644 --- a/lib/actions/parseactions.py +++ b/lib/actions/parseactions.py @@ -89,7 +89,7 @@ def do_file(f, mode): if mode == "include": # hack hack hack!! - print "#include " + print "#include " else: print "\t// " + f diff --git a/lib/base/.gitignore b/lib/base/.gitignore new file mode 100644 index 0000000..aa9ae18 --- /dev/null +++ b/lib/base/.gitignore @@ -0,0 +1 @@ +eenv.cpp diff --git a/lib/base/Makefile.am b/lib/base/Makefile.am index 0508563..d76dfc9 100644 --- a/lib/base/Makefile.am +++ b/lib/base/Makefile.am @@ -1,12 +1,56 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_base.a libenigma_base_a_SOURCES = \ - buffer.cpp ebase.cpp eerror.cpp elock.cpp \ - init.cpp message.cpp thread.cpp \ - smartptr.cpp estring.cpp connection.cpp \ - filepush.cpp encoding.cpp console.cpp rawfile.cpp \ - nconfig.cpp ioprio.cpp etpm.cpp + buffer.cpp \ + connection.cpp \ + console.cpp \ + ebase.cpp \ + eenv.cpp \ + eerror.cpp \ + elock.cpp \ + encoding.cpp \ + estring.cpp \ + etpm.cpp \ + filepush.cpp \ + init.cpp \ + ioprio.cpp \ + message.cpp \ + nconfig.cpp \ + rawfile.cpp \ + smartptr.cpp \ + thread.cpp +EXTRA_DIST = \ + eenv.cpp.in + +baseincludedir = $(pkgincludedir)/lib/base +baseinclude_HEADERS = \ + buffer.h \ + console.h \ + ebase.h \ + eenv.h \ + eerror.h \ + elock.h \ + encoding.h \ + eptrlist.h \ + estring.h \ + etpm.h \ + filepush.h \ + i18n.h \ + itssource.h \ + init.h \ + init_num.h \ + ioprio.h \ + message.h \ + nconfig.h \ + object.h \ + rawfile.h \ + ringbuffer.h \ + smartptr.h \ + thread.h diff --git a/lib/base/console.cpp b/lib/base/console.cpp index 43f9f61..0018768 100644 --- a/lib/base/console.cpp +++ b/lib/base/console.cpp @@ -519,7 +519,7 @@ eConsolePy_write(eConsolePy* self, PyObject *args) int ret = -1; Py_ssize_t argc = PyTuple_Size(args); if (argc > 1) - ret = PyArg_ParseTuple(args, "si", &data, &len); + ret = !PyArg_ParseTuple(args, "si", &data, &len); else if (argc == 1) { PyObject *ob; diff --git a/lib/base/console.h b/lib/base/console.h index e730b40..60540da 100644 --- a/lib/base/console.h +++ b/lib/base/console.h @@ -1,7 +1,6 @@ #ifndef __LIB_BASE_CONSOLE_H__ #define __LIB_BASE_CONSOLE_H__ -#include "Python.h" #include #include #include diff --git a/lib/base/eenv.cpp.in b/lib/base/eenv.cpp.in new file mode 100644 index 0000000..52c4214 --- /dev/null +++ b/lib/base/eenv.cpp.in @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include +#include + +bool eEnv::initialized = false; + +void eEnv::initialize() +{ + static const struct { + std::string name; + std::string value; + } cfgenv[] = { + { "prefix", "@prefix@" }, + { "exec_prefix", "@exec_prefix@" }, + { "bindir", "@bindir@" }, + { "sbindir", "@sbindir@" }, + { "libexecdir", "@libexecdir@" }, + { "datarootdir", "@datarootdir@" }, + { "datadir", "@datadir@" }, + { "sysconfdir", "@sysconfdir@" }, + { "sharedstatedir", "@sharedstatedir@" }, + { "localstatedir", "@localstatedir@" }, + { "libdir", "@libdir@" }, + { "localedir", "@localedir@" }, + }; + size_t i; + + // 1st pass, as generated by configure. + // Variables set by the user will not be overwritten. + for (i = 0; i < (sizeof(cfgenv) / sizeof(*cfgenv)); i++) { + eDebug("setenv('%s', '%s', 0)", cfgenv[i].name.c_str(), cfgenv[i].value.c_str()); + setenv(cfgenv[i].name.c_str(), cfgenv[i].value.c_str(), 0); + } + + // 2nd pass: Resolve directories. + for (i = 0; i < (sizeof(cfgenv) / sizeof(*cfgenv)); i++) { + std::string dest; + eEnv::resolveVar(dest, "${" + cfgenv[i].name + "}"); + eDebug("setenv('%s', '%s', 1)", cfgenv[i].name.c_str(), dest.c_str()); + setenv(cfgenv[i].name.c_str(), dest.c_str(), 1); + } +} + +int eEnv::resolveVar(std::string &dest, const char *src) +{ + size_t i = 0; + int ret; + wordexp_t p; + + ret = wordexp(src, &p, WRDE_NOCMD | WRDE_UNDEF); + if (ret != 0) { + switch (ret) { + case WRDE_BADCHAR: + eDebug("%s: bad character", __func__); + break; + case WRDE_BADVAL: + eDebug("%s: bad value", __func__); + break; + case WRDE_CMDSUB: + eDebug("%s: invalid command substitution", __func__); + break; + case WRDE_NOSPACE: + eDebug("%s: out of memory", __func__); + break; + case WRDE_SYNTAX: + eDebug("%s: syntax error", __func__); + break; + default: + eDebug("%s: unknown error", __func__); + break; + } + + return -1; + } + + while (i < p.we_wordc) { + if (strchr(p.we_wordv[i], '$')) { + ret = eEnv::resolveVar(dest, p.we_wordv[i]); + if (ret < 0) + break; + } else { + dest.append(p.we_wordv[i]); + } + + if (++i < p.we_wordc) + dest.append(" "); + } + + wordfree(&p); + return ret; +} + +int eEnv::resolveVar(std::string &dest, const std::string &src) +{ + return eEnv::resolveVar(dest, src.c_str()); +} + +std::string eEnv::resolve(const std::string &src) +{ + std::string dest; + + if (!initialized) { + eEnv::initialize(); + initialized = true; + } + + eDebug("%s: resolve %s", __func__, src.c_str()); + + eEnv::resolveVar(dest, src); + + eDebug("%s: -> %s", __func__, dest.c_str()); + + return dest; +} diff --git a/lib/base/eenv.h b/lib/base/eenv.h new file mode 100644 index 0000000..3d149f5 --- /dev/null +++ b/lib/base/eenv.h @@ -0,0 +1,16 @@ +#ifndef __lib_base_paths_h +#define __lib_base_paths_h + +#include + +class eEnv { +private: + static bool initialized; + static void initialize(); + static int resolveVar(std::string &dest, const char *src); + static int resolveVar(std::string &dest, const std::string &src); +public: + static std::string resolve(const std::string &path); +}; + +#endif diff --git a/lib/base/encoding.cpp b/lib/base/encoding.cpp index 8b4b592..361acce 100644 --- a/lib/base/encoding.cpp +++ b/lib/base/encoding.cpp @@ -2,6 +2,7 @@ #include #include #include +#include eDVBTextEncodingHandler encodingHandler; // the one and only instance @@ -17,8 +18,8 @@ inline char toupper(char c) eDVBTextEncodingHandler::eDVBTextEncodingHandler() { - const char * file=DATADIR "/enigma2/encoding.conf"; - FILE *f = fopen(file, "rt"); + std::string file = eEnv::resolve("${datadir}/enigma2/encoding.conf"); + FILE *f = fopen(file.c_str(), "rt"); if (f) { char *line = (char*) malloc(256); @@ -61,7 +62,7 @@ eDVBTextEncodingHandler::eDVBTextEncodingHandler() free(line); } else - eDebug("[eDVBTextEncodingHandler] couldn't open %s !", file); + eDebug("[eDVBTextEncodingHandler] couldn't open %s !", file.c_str()); } void eDVBTextEncodingHandler::getTransponderDefaultMapping(int tsidonid, int &table) diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index 91f24ba..e3e2a13 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -29,7 +29,7 @@ void eFilePushThread::thread() { setIoPrio(prio_class, prio); - off_t dest_pos = 0, source_pos = 0; + off_t dest_pos = 0; size_t bytes_read = 0; off_t current_span_offset = 0; @@ -46,9 +46,7 @@ void eFilePushThread::thread() sigaction(SIGUSR1, &act, 0); hasStarted(); - - source_pos = m_raw_source.lseek(0, SEEK_CUR); - + /* m_stop must be evaluated after each syscall. */ while (!m_stop) { @@ -137,14 +135,12 @@ void eFilePushThread::thread() if (m_sg && !current_span_remaining) { - m_sg->getNextSourceSpan(source_pos, bytes_read, current_span_offset, current_span_remaining); + m_sg->getNextSourceSpan(m_current_position, bytes_read, current_span_offset, current_span_remaining); ASSERT(!(current_span_remaining % m_blocksize)); - - if (source_pos != current_span_offset) - source_pos = m_raw_source.lseek(current_span_offset, SEEK_SET); + m_current_position = current_span_offset; bytes_read = 0; } - + size_t maxread = sizeof(m_buffer); /* if we have a source span, don't read past the end */ @@ -157,9 +153,9 @@ void eFilePushThread::thread() m_buf_start = 0; m_filter_end = 0; m_buf_end = 0; - + if (maxread) - m_buf_end = m_raw_source.read(m_buffer, maxread); + m_buf_end = m_source->read(m_current_position, m_buffer, maxread); if (m_buf_end < 0) { @@ -177,10 +173,7 @@ void eFilePushThread::thread() /* a read might be mis-aligned in case of a short read. */ int d = m_buf_end % m_blocksize; if (d) - { - m_raw_source.lseek(-d, SEEK_CUR); m_buf_end -= d; - } if (m_buf_end == 0) { @@ -216,18 +209,10 @@ void eFilePushThread::thread() sleep(1); continue; } -#if 0 - eDebug("FILEPUSH: end-of-file! (currently unhandled)"); - if (!m_raw_source.lseek(0, SEEK_SET)) - { - eDebug("(looping)"); - continue; - } -#endif break; } else { - source_pos += m_buf_end; + m_current_position += m_buf_end; bytes_read += m_buf_end; if (m_sg) current_span_remaining -= m_buf_end; @@ -239,20 +224,30 @@ void eFilePushThread::thread() eDebug("FILEPUSH THREAD STOP"); } -void eFilePushThread::start(int fd_source, int fd_dest) +void eFilePushThread::start(int fd, int fd_dest) { - m_raw_source.setfd(fd_source); - m_fd_dest = fd_dest; - resume(); + eRawFile *f = new eRawFile(); + ePtr source = f; + f->setfd(fd); + start(source, fd_dest); } -int eFilePushThread::start(const char *filename, int fd_dest) +int eFilePushThread::start(const char *file, int fd_dest) { - if (m_raw_source.open(filename) < 0) + eRawFile *f = new eRawFile(); + ePtr source = f; + if (f->open(file) < 0) return -1; + start(source, fd_dest); + return 0; +} + +void eFilePushThread::start(ePtr &source, int fd_dest) +{ + m_source = source; m_fd_dest = fd_dest; + m_current_position = 0; resume(); - return 0; } void eFilePushThread::stop() @@ -273,11 +268,6 @@ void eFilePushThread::pause() stop(); } -void eFilePushThread::seek(int whence, off_t where) -{ - m_raw_source.lseek(where, whence); -} - void eFilePushThread::resume() { m_stop = 0; diff --git a/lib/base/filepush.h b/lib/base/filepush.h index 71ee997..a4457f6 100644 --- a/lib/base/filepush.h +++ b/lib/base/filepush.h @@ -24,9 +24,10 @@ public: void stop(); void start(int sourcefd, int destfd); int start(const char *filename, int destfd); - + + void start(ePtr &source, int destfd); + void pause(); - void seek(int whence, off_t where); void resume(); /* flushes the internal readbuffer */ @@ -57,11 +58,12 @@ private: int m_send_pvr_commit; int m_stream_mode; int m_blocksize; + off_t m_current_position; + + ePtr m_source; - eRawFile m_raw_source; - eFixedMessagePump m_messagepump; - + void recvEvent(const int &evt); }; diff --git a/lib/base/itssource.h b/lib/base/itssource.h new file mode 100644 index 0000000..91167ff --- /dev/null +++ b/lib/base/itssource.h @@ -0,0 +1,19 @@ +#ifndef __lib_base_idatasource_h +#define __lib_base_idatasource_h + +#include + +class iTsSource: public iObject +{ +public: + /* NOTE: should only be used to get current position or filelength */ + virtual off_t lseek(off_t offset, int whence)=0; + + /* NOTE: you must be able to handle short reads! */ + virtual ssize_t read(off_t offset, void *buf, size_t count)=0; /* NOTE: this is what you in normal case have to use!! */ + + virtual off_t length()=0; + virtual int valid()=0; +}; + +#endif diff --git a/lib/base/rawfile.cpp b/lib/base/rawfile.cpp index c7e11fe..3a09e07 100644 --- a/lib/base/rawfile.cpp +++ b/lib/base/rawfile.cpp @@ -4,7 +4,10 @@ #include #include +DEFINE_REF(eRawFile); + eRawFile::eRawFile() + :m_lock(false) { m_fd = -1; m_file = 0; @@ -53,6 +56,13 @@ void eRawFile::setfd(int fd) off_t eRawFile::lseek(off_t offset, int whence) { + eSingleLocker l(m_lock); + m_current_offset = lseek_internal(offset, whence); + return m_current_offset; +} + +off_t eRawFile::lseek_internal(off_t offset, int whence) +{ // eDebug("lseek: %lld, %d", offset, whence); /* if there is only one file, use the native lseek - the file could be growing! */ if (m_nrfiles < 2) @@ -61,7 +71,8 @@ off_t eRawFile::lseek(off_t offset, int whence) return ::lseek(m_fd, offset, whence); else { - ::fseeko(m_file, offset, whence); + if (::fseeko(m_file, offset, whence) < 0) + perror("fseeko"); return ::ftello(m_file); } } @@ -100,11 +111,19 @@ int eRawFile::close() } } -ssize_t eRawFile::read(void *buf, size_t count) +ssize_t eRawFile::read(off_t offset, void *buf, size_t count) { -// eDebug("read: %p, %d", buf, count); + eSingleLocker l(m_lock); + + if (offset != m_current_offset) + { + m_current_offset = lseek_internal(offset, SEEK_SET); + if (m_current_offset < 0) + return m_current_offset; + } + switchOffset(m_current_offset); - + if (m_nrfiles >= 2) { if (m_current_offset + count > m_totallength) diff --git a/lib/base/rawfile.h b/lib/base/rawfile.h index a1c73d6..7b736a3 100644 --- a/lib/base/rawfile.h +++ b/lib/base/rawfile.h @@ -2,24 +2,27 @@ #define __lib_base_rawfile_h #include +#include -class eRawFile +class eRawFile: public iTsSource { + DECLARE_REF(eRawFile); + eSingleLock m_lock; public: eRawFile(); ~eRawFile(); - int open(const char *filename, int cached = 0); void setfd(int fd); - off_t lseek(off_t offset, int whence); int close(); - ssize_t read(void *buf, size_t count); /* NOTE: you must be able to handle short reads! */ + + // iTsSource + off_t lseek(off_t offset, int whence); + ssize_t read(off_t offset, void *buf, size_t count); off_t length(); int valid(); private: int m_fd; /* for uncached */ FILE *m_file; /* for cached */ - int m_cached; std::string m_basename; off_t m_splitsize, m_totallength, m_current_offset, m_base_offset, m_last_offset; @@ -27,6 +30,8 @@ private: void scan(); int m_current_file; int switchOffset(off_t off); + + off_t lseek_internal(off_t offset, int whence); FILE *openFileCached(int nr); int openFileUncached(int nr); }; diff --git a/lib/base/thread.cpp b/lib/base/thread.cpp index fa923de..1fda6a4 100644 --- a/lib/base/thread.cpp +++ b/lib/base/thread.cpp @@ -58,7 +58,12 @@ int eThread::runAsync(int prio, int policy) pthread_attr_setschedpolicy(&attr, policy); pthread_attr_setschedparam(&attr, &p); } - + + if (the_thread) { + eDebug("old thread joined %d", pthread_join(the_thread, 0)); + the_thread = 0; + } + if (pthread_create(&the_thread, &attr, wrapper, this)) { pthread_attr_destroy(&attr); @@ -69,7 +74,7 @@ int eThread::runAsync(int prio, int policy) pthread_attr_destroy(&attr); return 0; -} +} int eThread::run(int prio, int policy) { diff --git a/lib/components/Makefile.am b/lib/components/Makefile.am index e377ab8..364c694 100644 --- a/lib/components/Makefile.am +++ b/lib/components/Makefile.am @@ -1,6 +1,16 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_components.a -libenigma_components_a_SOURCES = scan.cpp file_eraser.cpp +libenigma_components_a_SOURCES = \ + file_eraser.cpp \ + scan.cpp + +componentsincludedir = $(pkgincludedir)/lib/components +componentsinclude_HEADERS = \ + file_eraser.h \ + scan.h diff --git a/lib/driver/Makefile.am b/lib/driver/Makefile.am index de1271b..b498a6c 100644 --- a/lib/driver/Makefile.am +++ b/lib/driver/Makefile.am @@ -1,7 +1,38 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h + +AM_CXXFLAGS = \ + $(LIBSDL_CFLAGS) noinst_LIBRARIES = libenigma_driver.a libenigma_driver_a_SOURCES = \ - rc.cpp rcinput.cpp rcconsole.cpp avswitch.cpp rfmod.cpp etimezone.cpp misc_options.cpp + avswitch.cpp \ + etimezone.cpp \ + misc_options.cpp \ + rc.cpp \ + rcconsole.cpp \ + rcinput.cpp \ + rfmod.cpp + +driverincludedir = $(pkgincludedir)/lib/driver +driverinclude_HEADERS = \ + avswitch.h \ + etimezone.h \ + input_fake.h \ + misc_options.h \ + rc.h \ + rcconsole.h \ + rcdbox.h \ + rcdreambox2.h \ + rcinput.h \ + rfmod.h + +if HAVE_LIBSDL +libenigma_driver_a_SOURCES += \ + rcsdl.cpp \ + rcsdl.h +endif diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp index eb5aee3..77f4322 100644 --- a/lib/driver/rcconsole.cpp +++ b/lib/driver/rcconsole.cpp @@ -5,7 +5,7 @@ #include #include -eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()) +eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::getInstance()), m_escape(false) { handle=open(filename, O_RDONLY|O_NONBLOCK); if (handle<0) @@ -38,7 +38,7 @@ void eRCConsoleDriver::keyPressed(int) unsigned char data[16]; unsigned char *d = data; int num = read(handle, data, 16); - int code=-1; + unsigned char code; int km = input->getKeyboardMode(); @@ -47,42 +47,29 @@ void eRCConsoleDriver::keyPressed(int) while (num--) { -// eDebug("console code %08x\n", *d); - if (km == eRCInput::kmAll) - code = *d++; - else - { - if (*d == 27) // escape code - { - while (num) - { - num--; - if (*++d != '[') - break; - } - code = -1; - } else - code = *d; - ++d; - - if (code < 32) /* control characters */ - code = -1; - else switch(code) - { - case 0x7E: // mute, einfg, entf - case 0x7F: // backspace - code = -1; - default: - break; + code = *d++; +// eDebug("console code %02x\n", code); + if (km == eRCInput::kmAscii) { + if (m_escape) { + if (code != '[') + m_escape = false; + continue; } + + if (code == 27) // escape code + m_escape = true; + + if ((code < 32) || // control characters + (code == 0x7e) || // mute, einfg, entf + (code == 0x7f)) // backspace + continue; } - if (code != -1) - for (std::list::iterator i(listeners.begin()); i!=listeners.end(); ++i) - { -// eDebug("ascii %08x", code); - (*i)->handleCode(code); - } + for (std::list::iterator i(listeners.begin()); i!=listeners.end(); ++i) + { +// eDebug("ascii %02x", code); + (*i)->handleCode(code); + } } } @@ -116,7 +103,7 @@ class eRCConsoleInit eRCConsoleDriver driver; eRCConsole device; public: - eRCConsoleInit(): driver("/dev/vc/0"), device(&driver) + eRCConsoleInit(): driver("/dev/tty0"), device(&driver) { } }; diff --git a/lib/driver/rcconsole.h b/lib/driver/rcconsole.h index 85234d5..8a24612 100644 --- a/lib/driver/rcconsole.h +++ b/lib/driver/rcconsole.h @@ -10,6 +10,7 @@ class eRCConsoleDriver: public eRCDriver protected: int handle; ePtr sn; + bool m_escape; void keyPressed(int); public: eRCConsoleDriver(const char *filename); diff --git a/lib/driver/rcsdl.cpp b/lib/driver/rcsdl.cpp new file mode 100644 index 0000000..0705cb0 --- /dev/null +++ b/lib/driver/rcsdl.cpp @@ -0,0 +1,392 @@ +#include +#include +//#include +#include +#include +#include + +/* + * eSDLInputDevice + */ + +eSDLInputDevice::eSDLInputDevice(eRCDriver *driver) : eRCDevice("SDL", driver), m_escape(false), m_unicode(0) +{ +} + +eSDLInputDevice::~eSDLInputDevice() +{ +} + +void eSDLInputDevice::handleCode(long arg) +{ + D_ENTER(); + + const SDL_KeyboardEvent *event = (const SDL_KeyboardEvent *)arg; + const SDL_keysym *key = &event->keysym; + int km = input->getKeyboardMode(); + int code, flags; + + if (event->type == SDL_KEYDOWN) { + m_unicode = key->unicode; + flags = eRCKey::flagMake; + } else { + flags = eRCKey::flagBreak; + } + + if (km == eRCInput::kmNone) { + code = translateKey(key->sym); + D_PRINT("translated code: %d", code); + } else { + code = m_unicode; + D_PRINT("native virtual code: %d / sym: %d", code, key->sym); + if ((code == 0) && (key->sym < 128)) { + code = key->sym; + D_PRINT("ASCII code: %u", code); + } + + if ((km == eRCInput::kmAscii) && + ((code < SDLK_SPACE) || + (code == 0x7e) || + (code == SDLK_DELETE) || + (code > 255))) { + code = translateKey(key->sym); + } else { + // ASCII keys should only generate key press events + if (flags == eRCKey::flagBreak) + D_RETURN(); + + if (km == eRCInput::kmAscii) { + // skip ESC c or ESC '[' c + if (m_escape) { + if (code != '[') + m_escape = false; + D_RETURN(); + } + if (code == SDLK_ESCAPE) + m_escape = true; + } + flags |= eRCKey::flagAscii; + } + } + + D_PRINT("code=%d (%#x) flags=%d (%#x)", code, code, flags, flags); + input->keyPressed(eRCKey(this, code, flags)); + D_RETURN(); +} + +const char *eSDLInputDevice::getDescription() const +{ + return "SDL"; +} + +int eSDLInputDevice::translateKey(SDLKey key) +{ + #define P(a) case SDLK_##a: return KEY_##a + #define P2(a,b) case SDLK_##a: return KEY_##b + + switch (key) { + P(BACKSPACE); + P(TAB); + P(CLEAR); + P2(RETURN,ENTER); + P(PAUSE); + P2(ESCAPE,ESC); + P(SPACE); +#if 0 + P(EXCLAIM); + P(QUOTEDBL); + P(HASH); +#endif + P(DOLLAR); +#if 0 + P(AMPERSAND); +#endif + P2(QUOTE,APOSTROPHE); +#if 0 + P(LEFTPAREN); + P(RIGHTPAREN); + P(ASTERISK); + P(PLUS); +#endif + P(COMMA); + P(MINUS); + P2(PERIOD,DOT); + P(SLASH); + P(0); + P(1); + P(2); + P(3); + P(4); + P(5); + P(6); + P(7); + P(8); + P(9); +#if 0 + P(COLON); +#endif + P(SEMICOLON); +#if 0 + P(LESS); +#endif + P2(EQUALS,EQUAL); +#if 0 + P(GREATER); +#endif + P(QUESTION); +#if 0 + P(AT); +#endif + P2(LEFTBRACKET,LEFTBRACE); + P(BACKSLASH); + P2(RIGHTBRACKET,RIGHTBRACE); + P2(CARET,GRAVE); +#if 0 + P(UNDERSCORE); + P(BACKQUOTE); +#endif + P2(a,A); + P2(b,B); + P2(c,C); + P2(d,D); + P2(e,E); + P2(f,F); + P2(g,G); + P2(h,H); + P2(i,I); + P2(j,J); + P2(k,K); + P2(l,L); + P2(m,M); + P2(n,N); + P2(o,O); + P2(p,P); + P2(q,Q); + P2(r,R); + P2(s,S); + P2(t,T); + P2(u,U); + P2(v,V); + P2(w,W); + P2(x,X); + P2(y,Y); + P2(z,Z); + P(DELETE); +#if 0 + P(WORLD_0); + P(WORLD_1); + P(WORLD_2); + P(WORLD_3); + P(WORLD_4); + P(WORLD_5); + P(WORLD_6); + P(WORLD_7); + P(WORLD_8); + P(WORLD_9); + P(WORLD_10); + P(WORLD_11); + P(WORLD_12); + P(WORLD_13); + P(WORLD_14); + P(WORLD_15); + P(WORLD_16); + P(WORLD_17); + P(WORLD_18); + P(WORLD_19); + P(WORLD_20); + P(WORLD_21); + P(WORLD_22); + P(WORLD_23); + P(WORLD_24); + P(WORLD_25); + P(WORLD_26); + P(WORLD_27); + P(WORLD_28); + P(WORLD_29); + P(WORLD_30); + P(WORLD_31); + P(WORLD_32); + P(WORLD_33); + P(WORLD_34); + P(WORLD_35); + P(WORLD_36); + P(WORLD_37); + P(WORLD_38); + P(WORLD_39); + P(WORLD_40); + P(WORLD_41); + P(WORLD_42); + P(WORLD_43); + P(WORLD_44); + P(WORLD_45); + P(WORLD_46); + P(WORLD_47); + P(WORLD_48); + P(WORLD_49); + P(WORLD_50); + P(WORLD_51); + P(WORLD_52); + P(WORLD_53); + P(WORLD_54); + P(WORLD_55); + P(WORLD_56); + P(WORLD_57); + P(WORLD_58); + P(WORLD_59); + P(WORLD_60); + P(WORLD_61); + P(WORLD_62); + P(WORLD_63); + P(WORLD_64); + P(WORLD_65); + P(WORLD_66); + P(WORLD_67); + P(WORLD_68); + P(WORLD_69); + P(WORLD_70); + P(WORLD_71); + P(WORLD_72); + P(WORLD_73); + P(WORLD_74); + P(WORLD_75); + P(WORLD_76); + P(WORLD_77); + P(WORLD_78); + P(WORLD_79); + P(WORLD_80); + P(WORLD_81); + P(WORLD_82); + P(WORLD_83); + P(WORLD_84); + P(WORLD_85); + P(WORLD_86); + P(WORLD_87); + P(WORLD_88); + P(WORLD_89); + P(WORLD_90); + P(WORLD_91); + P(WORLD_92); + P(WORLD_93); + P(WORLD_94); + P(WORLD_95); +#endif + P(KP0); + P(KP1); + P(KP2); + P(KP3); + P(KP4); + P(KP5); + P(KP6); + P(KP7); + P(KP8); + P(KP9); + P2(KP_PERIOD,KPDOT); + P2(KP_DIVIDE,KPSLASH); + P2(KP_MULTIPLY,KPASTERISK); + P2(KP_MINUS,KPMINUS); + P2(KP_PLUS,KPPLUS); + P2(KP_ENTER,KPENTER); + P2(KP_EQUALS,KPEQUAL); + P(UP); + P(DOWN); + P(RIGHT); + P(LEFT); + P(INSERT); + P(HOME); + P(END); + P(PAGEUP); + P(PAGEDOWN); + P(F1); + P(F2); + P(F3); + P(F4); + P(F5); + P(F6); + P(F7); + P(F8); + P(F9); + P(F10); + P(F11); + P(F12); + P(F13); + P(F14); + P(F15); + P(NUMLOCK); + P(CAPSLOCK); + P2(SCROLLOCK,SCROLLLOCK); + P2(RSHIFT,RIGHTSHIFT); + P2(LSHIFT,LEFTSHIFT); + P2(RCTRL,RIGHTCTRL); + P2(LCTRL,LEFTCTRL); + P2(RALT,RIGHTALT); + P2(LALT,LEFTALT); + P2(RMETA,RIGHTMETA); + P2(LMETA,LEFTMETA); +#if 0 + P(LSUPER); + P(RSUPER); +#endif + P(MODE); + P(COMPOSE); + P(HELP); + P(PRINT); + P2(SYSREQ,SYSRQ); + P(BREAK); + P(MENU); + P(POWER); + P(EURO); + P(UNDO); + default: + eDebug("unhandled SDL keycode: %d", key); + return KEY_RESERVED; + } + + #undef P2 + #undef P +} + +/* + * eSDLInputDriver + */ + +eSDLInputDriver *eSDLInputDriver::instance; + +eSDLInputDriver::eSDLInputDriver() : eRCDriver(eRCInput::getInstance()) +{ + ASSERT(instance == 0); + instance = this; +} + +eSDLInputDriver::~eSDLInputDriver() +{ + instance = 0; +} + +void eSDLInputDriver::keyPressed(const SDL_KeyboardEvent *key) +{ + eDebug("km=%d enabled=%d locked=%d", + input->getKeyboardMode(), enabled, input->islocked()); + + if (!enabled || input->islocked()) + return; + + std::list::iterator i(listeners.begin()); + while (i != listeners.end()) { + (*i)->handleCode((long)key); + ++i; + } +} + +class eRCSDLInit +{ +private: + eSDLInputDriver driver; + eSDLInputDevice device; + +public: + eRCSDLInit(): driver(), device(&driver) + { + } +}; + +eAutoInitP0 init_rcSDL(eAutoInitNumbers::rc+1, "SDL RC Driver"); diff --git a/lib/driver/rcsdl.h b/lib/driver/rcsdl.h new file mode 100644 index 0000000..9732f5e --- /dev/null +++ b/lib/driver/rcsdl.h @@ -0,0 +1,37 @@ +#ifndef __lib_driver_rcsdl_h +#define __lib_driver_rcsdl_h + +#include + +#include + +class eSDLInputDevice : public eRCDevice +{ +private: + bool m_escape; + unsigned int m_unicode; + int translateKey(SDLKey key); + +public: + eSDLInputDevice(eRCDriver *driver); + ~eSDLInputDevice(); + + virtual void handleCode(long arg); + virtual const char *getDescription() const; +}; + +class eSDLInputDriver : public eRCDriver +{ +private: + static eSDLInputDriver *instance; + +public: + eSDLInputDriver(); + ~eSDLInputDriver(); + + static eSDLInputDriver *getInstance() { return instance; } + + void keyPressed(const SDL_KeyboardEvent *key); +}; + +#endif diff --git a/lib/dvb/Makefile.am b/lib/dvb/Makefile.am index b47ffed..9b33755 100644 --- a/lib/dvb/Makefile.am +++ b/lib/dvb/Makefile.am @@ -1,12 +1,64 @@ SUBDIRS = lowlevel -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_dvb.a -libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \ - sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp eit.cpp rotor_calc.cpp \ - epgcache.cpp dvbtime.cpp metaparser.cpp volume.cpp tstools.cpp pvrparse.cpp \ - pesparse.cpp teletext.cpp radiotext.cpp subtitle.cpp +libenigma_dvb_a_SOURCES = \ + crc32.cpp \ + db.cpp \ + decoder.cpp \ + demux.cpp \ + dvb.cpp \ + dvbtime.cpp \ + eit.cpp \ + epgcache.cpp \ + esection.cpp \ + frontend.cpp \ + metaparser.cpp \ + pesparse.cpp \ + pmt.cpp \ + pvrparse.cpp \ + radiotext.cpp \ + rotor_calc.cpp \ + scan.cpp \ + sec.cpp \ + subtitle.cpp \ + teletext.cpp \ + tstools.cpp \ + volume.cpp +dvbincludedir = $(pkgincludedir)/lib/dvb +dvbinclude_HEADERS = \ + crc32.h \ + db.h \ + decoder.h \ + demux.h \ + dvb.h \ + dvbtime.h \ + eit.h \ + epgcache.h \ + esection.h \ + frontend.h \ + frontendparms.h \ + idemux.h \ + idvb.h \ + isection.h \ + list.h \ + metaparser.h \ + pesparse.h \ + pmt.h \ + pvrparse.h \ + radiotext.h \ + rotor_calc.h \ + scan.h \ + sec.h \ + specs.h \ + subtitle.h \ + teletext.h \ + tstools.h \ + volume.h diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 38be635..0547407 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos) RESULT eBouquet::flushChanges() { - FILE *f=fopen((CONFIGDIR"/enigma2/"+m_filename).c_str(), "w"); + FILE *f=fopen(eEnv::resolve("${sysconfdir}/enigma2/" + m_filename).c_str(), "w"); if (!f) return -1; if ( fprintf(f, "#NAME %s\r\n", m_bouquet_name.c_str()) < 0 ) @@ -280,7 +281,7 @@ DEFINE_REF(eDVBDB); void eDVBDB::reloadServicelist() { - loadServicelist(CONFIGDIR"/enigma2/lamedb"); + loadServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()); } void eDVBDB::parseServiceData(ePtr s, std::string str) @@ -324,19 +325,11 @@ void eDVBDB::loadServicelist(const char *file) { eDebug("---- opening lame channel db"); FILE *f=fopen(file, "rt"); - if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0) - { - struct stat s; - if ( !stat("lamedb", &s) ) - { - if ( !stat(CONFIGDIR"/enigma2", &s) ) - { - rename("lamedb", CONFIGDIR"/enigma2/lamedb" ); - reloadServicelist(); - } - } + if (!f) { + eDebug("can't open %s: %m", file); return; } + char line[256]; int version=3; if ((!fgets(line, 256, f)) || sscanf(line, "eDVB services /%d/", &version) != 1) @@ -594,7 +587,7 @@ void eDVBDB::saveServicelist(const char *file) void eDVBDB::saveServicelist() { - saveServicelist(CONFIGDIR"/enigma2/lamedb"); + saveServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()); } void eDVBDB::loadBouquet(const char *path) @@ -618,28 +611,20 @@ void eDVBDB::loadBouquet(const char *path) std::list &list = bouquet.m_services; list.clear(); - std::string p = CONFIGDIR"/enigma2/"; + std::string p = eEnv::resolve("${sysconfdir}/enigma2/"); p+=path; eDebug("loading bouquet... %s", p.c_str()); FILE *fp=fopen(p.c_str(), "rt"); - int entries=0; if (!fp) { - struct stat s; - if ( !stat(path, &s) ) - { - rename(path, p.c_str() ); - loadBouquet(path); - return; - } - eDebug("failed to open."); - if ( strstr(path, "bouquets.tv") ) + eDebug("can't open %s: %m", p.c_str()); + if (!strcmp(path, "bouquets.tv")) { eDebug("recreate bouquets.tv"); bouquet.m_bouquet_name="Bouquets (TV)"; bouquet.flushChanges(); } - else if ( strstr(path, "bouquets.radio") ) + else if (!strcmp(path, "bouquets.radio")) { eDebug("recreate bouquets.radio"); bouquet.m_bouquet_name="Bouquets (Radio)"; @@ -647,6 +632,7 @@ void eDVBDB::loadBouquet(const char *path) } return; } + int entries=0; char line[256]; bool read_descr=false; eServiceReference *e = NULL; diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 88cd3ee..a89f72b 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -203,6 +203,9 @@ int eDVBAudio::startPid(int pid, int type) case aLPCM: bypass = 6; break; + case aDTSHD: + bypass = 0x10; + break; } eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass); @@ -1299,9 +1302,10 @@ RESULT eTSMPEGDecoder::showSinglePic(const char *filename) if (f >= 0) { struct stat s; + size_t written=0; fstat(f, &s); if (m_video_clip_fd == -1) - m_video_clip_fd = open("/dev/dvb/adapter0/video0", O_WRONLY|O_NONBLOCK); + m_video_clip_fd = open("/dev/dvb/adapter0/video0", O_WRONLY); if (m_video_clip_fd >= 0) { bool seq_end_avail = false; diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index 3a0fbac..7610b65 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -13,7 +13,7 @@ private: ePtr m_demux; int m_fd, m_fd_demux, m_dev, m_is_freezed; public: - enum { aMPEG, aAC3, aDTS, aAAC, aAACHE, aLPCM }; + enum { aMPEG, aAC3, aDTS, aAAC, aAACHE, aLPCM, aDTSHD }; eDVBAudio(eDVBDemux *demux, int dev); enum { aMonoLeft, aStereo, aMonoRight }; void setChannel(int channel); diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index 081059b..f4d8618 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -85,6 +85,13 @@ int eDVBDemux::openDemux(void) return ::open(filename, O_RDWR); } +int eDVBDemux::openDVR(int flags) +{ + char filename[128]; + snprintf(filename, 128, "/dev/dvb/adapter%d/dvr%d", adapter, demux); + return ::open(filename, flags); +} + DEFINE_REF(eDVBDemux) RESULT eDVBDemux::setSourceFrontend(int fenum) @@ -648,18 +655,36 @@ RESULT eDVBTSRecorder::setBoundary(off_t max) RESULT eDVBTSRecorder::stop() { + int state=3; + for (std::map::iterator i(m_pids.begin()); i != m_pids.end(); ++i) stopPID(i->first); if (!m_running) return -1; + +#if HAVE_DVB_API_VERSION >= 5 + /* workaround for record thread stop */ + if (::ioctl(m_source_fd, DMX_STOP) < 0) + perror("DMX_STOP"); + else + state &= ~1; + + if (::close(m_source_fd) < 0) + perror("close"); + else + state &= ~2; +#endif + m_thread->stop(); - - close(m_source_fd); + + if (state & 3) + ::close(m_source_fd); + + m_running = 0; m_source_fd = -1; - + m_thread->stopSaveMetaInformation(); - return 0; } diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h index d43c41b..e73982e 100644 --- a/lib/dvb/demux.h +++ b/lib/dvb/demux.h @@ -26,7 +26,8 @@ public: RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; } RESULT flush(); RESULT connectEvent(const Slot1 &event, ePtr &conn); - + int openDVR(int flags); + int getRefCount() { return ref; } private: int adapter, demux, source; diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 5162945..0b1bdc2 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -98,6 +98,8 @@ eDVBResourceManager::eDVBResourceManager() m_boxtype = DM500HD; else if (!strncmp(tmp, "dm800se\n", rd)) m_boxtype = DM800SE; + else if (!strncmp(tmp, "dm7020hd\n", rd)) + m_boxtype = DM7020HD; else { eDebug("boxtype detection via /proc/stb/info not possible... use fallback via demux count!\n"); if (m_demux.size() == 3) @@ -108,7 +110,7 @@ eDVBResourceManager::eDVBResourceManager() m_boxtype = DM8000; } - eDebug("found %d adapter, %d frontends(%d sim) and %d demux, boxtype %d", + eDebug("found %zd adapter, %zd frontends(%zd sim) and %zd demux, boxtype %d", m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size(), m_boxtype); eDVBCAService::registerChannelCallback(this); @@ -143,19 +145,20 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr) #endif if (stat(filename, &s)) break; - ePtr fe; + eDVBFrontend *fe; { int ok = 0; - fe = new eDVBFrontend(m_nr, num_fe, ok); + fe = new eDVBFrontend(m_nr, num_fe, ok, true); if (ok) - m_frontend.push_back(fe); + m_simulate_frontend.push_back(ePtr(fe)); } + { int ok = 0; - fe = new eDVBFrontend(m_nr, num_fe, ok, true); + fe = new eDVBFrontend(m_nr, num_fe, ok, false, fe); if (ok) - m_simulate_frontend.push_back(fe); + m_frontend.push_back(ePtr(fe)); } ++num_fe; } @@ -334,7 +337,7 @@ PyObject *eDVBResourceManager::setFrontendSlotInformations(ePyObject list) } if (assigned != m_frontend.size()) { char blasel[256]; - sprintf(blasel, "eDVBResourceManager::setFrontendSlotInformations .. assigned %d socket informations, but %d registered frontends!", + sprintf(blasel, "eDVBResourceManager::setFrontendSlotInformations .. assigned %zd socket informations, but %d registered frontends!", m_frontend.size(), assigned); PyErr_SetString(PyExc_StandardError, blasel); return NULL; @@ -464,7 +467,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr unused; - if (m_boxtype == DM800 || m_boxtype == DM500HD || m_boxtype == DM800SE) // dm800 / 500hd + if (m_boxtype == DM800) // dm800 { cap |= capHoldDecodeReference; // this is checked in eDVBChannel::getDemux for (; i != m_demux.end(); ++i, ++n) @@ -520,7 +523,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrfirst, current_offset, i->second, size); + eDebug("HIT, %lld < %lld < %lld, size: %zd", i->first, current_offset, i->second, size); return; } if (current_offset < aligned_start) @@ -1529,10 +1532,10 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off len = aligned_end - aligned_start; start = aligned_end - len; - eDebug("skipping to %llx, %d", start, len); + eDebug("skipping to %llx, %zd", start, len); } - eDebug("result: %llx, %x (%llx %llx)", start, size, aligned_start, aligned_end); + eDebug("result: %llx, %zx (%llx %llx)", start, size, aligned_start, aligned_end); return; } } @@ -1548,7 +1551,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off { start = current_offset; size = max; - eDebug("NO CUESHEET. (%08llx, %d)", start, size); + eDebug("NO CUESHEET. (%08llx, %zd)", start, size); } else { start = current_offset; @@ -1752,6 +1755,20 @@ RESULT eDVBChannel::getCurrentFrontendParameters(ePtr &p RESULT eDVBChannel::playFile(const char *file) { + eRawFile *f = new eRawFile(); + ePtr source = f; + + if (f->open(file) < 0) + { + eDebug("can't open PVR file %s (%m)", file); + return -ENOENT; + } + + return playSource(source, file); +} + +RESULT eDVBChannel::playSource(ePtr &source, const char *streaminfo_file) +{ ASSERT(!m_frontend); if (m_pvr_thread) { @@ -1760,7 +1777,13 @@ RESULT eDVBChannel::playFile(const char *file) m_pvr_thread = 0; } - m_tstools.openFile(file); + if (!source->valid()) + { + eDebug("PVR source is not valid!"); + return -ENOENT; + } + + m_tstools.setSource(source, streaminfo_file); /* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST, THEN DO A REAL FIX HERE! */ @@ -1770,14 +1793,28 @@ RESULT eDVBChannel::playFile(const char *file) /* (this codepath needs to be improved anyway.) */ #if HAVE_DVB_API_VERSION < 3 m_pvr_fd_dst = open("/dev/pvr", O_WRONLY); -#else - m_pvr_fd_dst = open("/dev/misc/pvr", O_WRONLY); -#endif if (m_pvr_fd_dst < 0) { - eDebug("can't open /dev/misc/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved. + eDebug("can't open /dev/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved. + return -ENODEV; + } +#else + ePtr &demux = m_demux ? m_demux : m_decoder_demux; + if (demux) + { + m_pvr_fd_dst = demux->get().openDVR(O_WRONLY); + if (m_pvr_fd_dst < 0) + { + eDebug("can't open /dev/dvb/adapterX/dvrX - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved. + return -ENODEV; + } + } + else + { + eDebug("no demux allocated yet.. so its not possible to open the dvr device!!"); return -ENODEV; } +#endif } m_pvr_thread = new eDVBChannelFilePush(); @@ -1787,15 +1824,7 @@ RESULT eDVBChannel::playFile(const char *file) m_event(this, evtPreStart); - if (m_pvr_thread->start(file, m_pvr_fd_dst)) - { - delete m_pvr_thread; - m_pvr_thread = 0; - ::close(m_pvr_fd_dst); - m_pvr_fd_dst = -1; - eDebug("can't open PVR file %s (%m)", file); - return -ENOENT; - } + m_pvr_thread->start(source, m_pvr_fd_dst); CONNECT(m_pvr_thread->m_event, eDVBChannel::pvrEvent); m_state = state_ok; @@ -1804,7 +1833,7 @@ RESULT eDVBChannel::playFile(const char *file) return 0; } -void eDVBChannel::stopFile() +void eDVBChannel::stopSource() { if (m_pvr_thread) { @@ -1814,6 +1843,13 @@ void eDVBChannel::stopFile() } if (m_pvr_fd_dst >= 0) ::close(m_pvr_fd_dst); + ePtr d; + m_tstools.setSource(d); +} + +void eDVBChannel::stopFile() +{ + stopSource(); } void eDVBChannel::setCueSheet(eCueSheet *cuesheet) diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index fb92580..3349014 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -135,7 +135,7 @@ class eDVBResourceManager: public iObject, public Object DECLARE_REF(eDVBResourceManager); int avail, busy; - enum { DM7025, DM800, DM500HD, DM800SE, DM8000 }; + enum { DM7025, DM800, DM500HD, DM800SE, DM8000, DM7020HD }; int m_boxtype; @@ -259,7 +259,10 @@ public: /* iDVBPVRChannel */ RESULT playFile(const char *file); void stopFile(); - + + RESULT playSource(ePtr& source, const char *priv=NULL); + void stopSource(); + void setCueSheet(eCueSheet *cuesheet); RESULT getLength(pts_t &len); @@ -301,7 +304,7 @@ private: std::list > m_source_span; void getNextSourceSpan(off_t current_offset, size_t bytes_read, off_t &start, size_t &size); void flushPVR(iDVBDemux *decoding_demux=0); - + eSingleLock m_cuesheet_lock; friend class eUsePtr; diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index 119223a..4d32474 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -213,9 +213,9 @@ pthread_mutex_t eEPGCache::channel_map_lock= DEFINE_REF(eEPGCache) eEPGCache::eEPGCache() - :messages(this,1), cleanTimer(eTimer::create(this))//, paused(0) + :messages(this,1), cleanTimer(eTimer::create(this)), m_running(0)//, paused(0) { - eDebug("[EPGC] Initialized EPGCache"); + eDebug("[EPGC] Initialized EPGCache (wait for setCacheFile call now)"); CONNECT(messages.recv_msg, eEPGCache::gotMessage); CONNECT(eDVBLocalTimeHandler::getInstance()->m_timeUpdated, eEPGCache::timeUpdated); @@ -226,22 +226,46 @@ eEPGCache::eEPGCache() if (!res_mgr) eDebug("[eEPGCache] no resource manager !!!!!!!"); else - { res_mgr->connectChannelAdded(slot(*this,&eEPGCache::DVBChannelAdded), m_chanAddedConn); + + instance=this; + memset(m_filename, 0, sizeof(m_filename)); +} + +void eEPGCache::setCacheFile(const char *path) +{ + bool inited = !!strlen(m_filename); + strncpy(m_filename, path, 1024); + if (!inited) + { + eDebug("[EPGC] setCacheFile read/write epg data from/to '%s'", m_filename); if (eDVBLocalTimeHandler::getInstance()->ready()) timeUpdated(); } - instance=this; } void eEPGCache::timeUpdated() { - if (!sync()) + if (strlen(m_filename)) { - eDebug("[EPGC] time updated.. start EPG Mainloop"); - run(); - } else - messages.send(Message(Message::timeChanged)); + if (!sync()) + { + eDebug("[EPGC] time updated.. start EPG Mainloop"); + run(); + singleLock s(channel_map_lock); + channelMapIterator it = m_knownChannels.begin(); + for (; it != m_knownChannels.end(); ++it) + { + if (it->second->state == -1) { + it->second->state=0; + messages.send(Message(Message::startChannel, it->first)); + } + } + } else + messages.send(Message(Message::timeChanged)); + } + else + eDebug("[EPGC] time updated.. but cache file not set yet.. dont start epg!!"); } void eEPGCache::DVBChannelAdded(eDVBChannel *chan) @@ -337,8 +361,13 @@ void eEPGCache::DVBChannelRunning(iDVBChannel *chan) return; } #endif - messages.send(Message(Message::startChannel, chan)); - // -> gotMessage -> changedService + if (m_running) { + data.state=0; + messages.send(Message(Message::startChannel, chan)); + // -> gotMessage -> changedService + } + else + data.state=-1; } } } @@ -365,7 +394,8 @@ void eEPGCache::DVBChannelStateChanged(iDVBChannel *chan) case iDVBChannel::state_release: { eDebug("[eEPGCache] remove channel %p", chan); - messages.send(Message(Message::leaveChannel, chan)); + if (it->second->state >= 0) + messages.send(Message(Message::leaveChannel, chan)); pthread_mutex_lock(&it->second->channel_active); singleLock s(channel_map_lock); m_knownChannels.erase(it); @@ -953,39 +983,24 @@ void eEPGCache::gotMessage( const Message &msg ) void eEPGCache::thread() { hasStarted(); + m_running=1; nice(4); load(); cleanLoop(); runLoop(); save(); + m_running=0; } void eEPGCache::load() { - FILE *f = fopen("/hdd/epg.dat", "r"); + FILE *f = fopen(m_filename, "r"); if (f) { - unlink("/hdd/epg.dat"); + unlink(m_filename); int size=0; int cnt=0; -#if 0 - unsigned char md5_saved[16]; - unsigned char md5[16]; - bool md5ok=false; - if (!md5_file("/hdd/epg.dat", 1, md5)) - { - FILE *f = fopen("/hdd/epg.dat.md5", "r"); - if (f) - { - fread( md5_saved, 16, 1, f); - fclose(f); - if ( !memcmp(md5_saved, md5, 16) ) - md5ok=true; - } - } - if ( md5ok ) -#endif { unsigned int magic=0; fread( &magic, sizeof(int), 1, f); @@ -1027,7 +1042,7 @@ void eEPGCache::load() eventDB[key]=std::pair(evMap,tmMap); } eventData::load(f); - eDebug("[EPGC] %d events read from /hdd/epg.dat", cnt); + eDebug("[EPGC] %d events read from %s", cnt, m_filename); #ifdef ENABLE_PRIVATE_EPG char text2[11]; fread( text2, 11, 1, f); @@ -1075,103 +1090,106 @@ void eEPGCache::load() void eEPGCache::save() { - struct statfs s; - off64_t tmp; - if (statfs("/hdd", &s)<0) - tmp=0; - else + /* create empty file */ + FILE *f = fopen(m_filename, "w"); + + if (!f) { - tmp=s.f_blocks; - tmp*=s.f_bsize; + eDebug("[EPGC] couldn't save epg data to '%s'(%m)", m_filename); + return; } - // prevent writes to builtin flash - if ( tmp < 1024*1024*50 ) // storage size < 50MB + char *buf = realpath(m_filename, NULL); + if (!buf) + { + eDebug("[EPGC] realpath to '%s' failed in save (%m)", m_filename); + fclose(f); return; + } + + eDebug("[EPGC] store epg to realpath '%s'", buf); + + struct statfs s; + off64_t tmp; + if (statfs(buf, &s) < 0) { + eDebug("[EPGC] statfs '%s' failed in save (%m)", buf); + fclose(f); + return; + } + + free(buf); // check for enough free space on storage tmp=s.f_bfree; tmp*=s.f_bsize; if ( tmp < (eventData::CacheSize*12)/10 ) // 20% overhead + { + eDebug("[EPGC] not enough free space at path '%s' %lld bytes availd but %d needed", buf, tmp, (eventData::CacheSize*12)/10); + fclose(f); return; + } - FILE *f = fopen("/hdd/epg.dat", "w"); int cnt=0; - if ( f ) - { - unsigned int magic = 0x98765432; - fwrite( &magic, sizeof(int), 1, f); - const char *text = "UNFINISHED_V7"; - fwrite( text, 13, 1, f ); - int size = eventDB.size(); - fwrite( &size, sizeof(int), 1, f ); - for (eventCache::iterator service_it(eventDB.begin()); service_it != eventDB.end(); ++service_it) - { - timeMap &timemap = service_it->second.second; - fwrite( &service_it->first, sizeof(uniqueEPGKey), 1, f); - size = timemap.size(); - fwrite( &size, sizeof(int), 1, f); - for (timeMap::iterator time_it(timemap.begin()); time_it != timemap.end(); ++time_it) - { - __u8 len = time_it->second->ByteSize; - fwrite( &time_it->second->type, sizeof(__u8), 1, f ); - fwrite( &len, sizeof(__u8), 1, f); - fwrite( time_it->second->EITdata, len, 1, f); - ++cnt; - } + unsigned int magic = 0x98765432; + fwrite( &magic, sizeof(int), 1, f); + const char *text = "UNFINISHED_V7"; + fwrite( text, 13, 1, f ); + int size = eventDB.size(); + fwrite( &size, sizeof(int), 1, f ); + for (eventCache::iterator service_it(eventDB.begin()); service_it != eventDB.end(); ++service_it) + { + timeMap &timemap = service_it->second.second; + fwrite( &service_it->first, sizeof(uniqueEPGKey), 1, f); + size = timemap.size(); + fwrite( &size, sizeof(int), 1, f); + for (timeMap::iterator time_it(timemap.begin()); time_it != timemap.end(); ++time_it) + { + __u8 len = time_it->second->ByteSize; + fwrite( &time_it->second->type, sizeof(__u8), 1, f ); + fwrite( &len, sizeof(__u8), 1, f); + fwrite( time_it->second->EITdata, len, 1, f); + ++cnt; } - eDebug("[EPGC] %d events written to /hdd/epg.dat", cnt); - eventData::save(f); + } + eDebug("[EPGC] %d events written to %s", cnt, m_filename); + eventData::save(f); #ifdef ENABLE_PRIVATE_EPG - const char* text3 = "PRIVATE_EPG"; - fwrite( text3, 11, 1, f ); - size = content_time_tables.size(); + const char* text3 = "PRIVATE_EPG"; + fwrite( text3, 11, 1, f ); + size = content_time_tables.size(); + fwrite( &size, sizeof(int), 1, f); + for (contentMaps::iterator a = content_time_tables.begin(); a != content_time_tables.end(); ++a) + { + contentMap &content_time_table = a->second; + fwrite( &a->first, sizeof(uniqueEPGKey), 1, f); + int size = content_time_table.size(); fwrite( &size, sizeof(int), 1, f); - for (contentMaps::iterator a = content_time_tables.begin(); a != content_time_tables.end(); ++a) + for (contentMap::iterator i = content_time_table.begin(); i != content_time_table.end(); ++i ) { - contentMap &content_time_table = a->second; - fwrite( &a->first, sizeof(uniqueEPGKey), 1, f); - int size = content_time_table.size(); + int size = i->second.size(); + fwrite( &i->first, sizeof(int), 1, f); fwrite( &size, sizeof(int), 1, f); - for (contentMap::iterator i = content_time_table.begin(); i != content_time_table.end(); ++i ) - { - int size = i->second.size(); - fwrite( &i->first, sizeof(int), 1, f); - fwrite( &size, sizeof(int), 1, f); - for ( contentTimeMap::iterator it(i->second.begin()); - it != i->second.end(); ++it ) - { - fwrite( &it->first, sizeof(time_t), 1, f); - fwrite( &it->second.first, sizeof(time_t), 1, f); - fwrite( &it->second.second, sizeof(__u16), 1, f); - } - } - } -#endif - // write version string after binary data - // has been written to disk. - fsync(fileno(f)); - fseek(f, sizeof(int), SEEK_SET); - fwrite("ENIGMA_EPG_V7", 13, 1, f); - fclose(f); -#if 0 - unsigned char md5[16]; - if (!md5_file("/hdd/epg.dat", 1, md5)) - { - FILE *f = fopen("/hdd/epg.dat.md5", "w"); - if (f) + for ( contentTimeMap::iterator it(i->second.begin()); + it != i->second.end(); ++it ) { - fwrite( md5, 16, 1, f); - fclose(f); + fwrite( &it->first, sizeof(time_t), 1, f); + fwrite( &it->second.first, sizeof(time_t), 1, f); + fwrite( &it->second.second, sizeof(__u16), 1, f); } } -#endif } +#endif + // write version string after binary data + // has been written to disk. + fsync(fileno(f)); + fseek(f, sizeof(int), SEEK_SET); + fwrite("ENIGMA_EPG_V7", 13, 1, f); + fclose(f); } eEPGCache::channel_data::channel_data(eEPGCache *ml) :cache(ml) - ,abortTimer(eTimer::create(ml)), zapTimer(eTimer::create(ml)), state(0) + ,abortTimer(eTimer::create(ml)), zapTimer(eTimer::create(ml)), state(-2) ,isRunning(0), haveData(0) #ifdef ENABLE_PRIVATE_EPG ,startPrivateTimer(eTimer::create(ml)) diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h index 4d45d87..90aff6c 100644 --- a/lib/dvb/epgcache.h +++ b/lib/dvb/epgcache.h @@ -177,7 +177,8 @@ class eEPGCache: public eMainloop, private eThread, public Object eEPGCache *cache; ePtr abortTimer, zapTimer; int prevChannelState; - __u8 state, isRunning, haveData; + int state; + __u8 isRunning, haveData; ePtr channel; ePtr m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn, m_ViasatConn; ePtr m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader, m_ViasatReader; @@ -290,6 +291,8 @@ private: void thread(); // thread function // called from epgcache thread + int m_running; + char m_filename[1024]; void save(); void load(); #ifdef ENABLE_PRIVATE_EPG @@ -325,6 +328,9 @@ public: #endif #endif + // must be called once! + void setCacheFile(const char *filename); + // called from main thread inline void Lock(); inline void Unlock(); diff --git a/lib/dvb/esection.h b/lib/dvb/esection.h index 2bb17a9..3e097cc 100644 --- a/lib/dvb/esection.h +++ b/lib/dvb/esection.h @@ -63,7 +63,7 @@ protected: else TABLE_eDebugNoNewLine("-"); - TABLE_eDebug(" %d/%d TID %02x", avail.size(), max, data[0]); + TABLE_eDebug(" %zd/%d TID %02x", avail.size(), max, data[0]); if (avail.size() == max) { @@ -100,6 +100,10 @@ class eAUTable: public eAUGTable int first; ePtr m_demux; eMainloop *ml; + + /* needed to detect broken table version handling (seen on some m2ts files) */ + struct timespec m_prev_table_update; + int m_table_cnt; public: eAUTable() @@ -119,6 +123,7 @@ public: int begin(eMainloop *m, const eDVBTableSpec &spec, ePtr demux) { + m_table_cnt = 0; ml = m; m_demux = demux; first= 1; @@ -197,6 +202,24 @@ public: if (current && (!current->getSpec(spec))) { + /* detect broken table version handling (seen on some m2ts files) */ + if (m_table_cnt) + { + if (abs(timeout_usec(m_prev_table_update)) > 500000) + m_table_cnt = -1; + else if (m_table_cnt > 1) // two pmt update within one second + { + eDebug("Seen two consecutive table version changes within 500ms. " + "This seems broken, so auto update for pid %04x, table %02x is now disabled!!", + spec.pid, spec.tid); + m_table_cnt = 0; + return; + } + } + + ++m_table_cnt; + clock_gettime(CLOCK_MONOTONIC, &m_prev_table_update); + next = new Table(); CONNECT(next->tableReady, eAUTable::slotTableReady); spec.flags &= ~(eDVBTableSpec::tfAnyVersion|eDVBTableSpec::tfThisVersion|eDVBTableSpec::tfHaveTimeout); diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index ebdad8a..5718896 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -453,8 +453,8 @@ DEFINE_REF(eDVBFrontend); 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) +eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate, eDVBFrontend *simulate_fe) + :m_simulate(simulate), m_enabled(false), m_type(-1), m_simulate_fe(simulate_fe), m_dvbid(fe), m_slotid(fe) ,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 @@ -503,10 +503,10 @@ int eDVBFrontend::openFrontend() #else dvb_frontend_info fe_info; #endif - eDebugNoSimulate("opening frontend %d", m_dvbid); - if (m_fd < 0) + if (!m_simulate) { - if (!m_simulate || m_type == -1) + eDebug("opening frontend %d", m_dvbid); + if (m_fd < 0) { m_fd = ::open(m_filename, O_RDWR|O_NONBLOCK); if (m_fd < 0) @@ -515,70 +515,69 @@ int eDVBFrontend::openFrontend() return -1; } } - } - else - eWarning("frontend %d already opened", m_dvbid); - if (m_type == -1) - { - if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0) + else + eWarning("frontend %d already opened", m_dvbid); + if (m_type == -1) { - eWarning("ioctl FE_GET_INFO failed"); - ::close(m_fd); - m_fd = -1; - return -1; - } + if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0) + { + eWarning("ioctl FE_GET_INFO failed"); + ::close(m_fd); + m_fd = -1; + return -1; + } - switch (fe_info.type) - { - case FE_QPSK: - m_type = iDVBFrontend::feSatellite; - break; - case FE_QAM: - m_type = iDVBFrontend::feCable; - break; - case FE_OFDM: - m_type = iDVBFrontend::feTerrestrial; - break; - default: - eWarning("unknown frontend type."); - ::close(m_fd); - m_fd = -1; - return -1; + switch (fe_info.type) + { + case FE_QPSK: + m_type = iDVBFrontend::feSatellite; + break; + case FE_QAM: + m_type = iDVBFrontend::feCable; + break; + case FE_OFDM: + m_type = iDVBFrontend::feTerrestrial; + break; + default: + eWarning("unknown frontend type."); + ::close(m_fd); + m_fd = -1; + return -1; + } + if (m_simulate_fe) + m_simulate_fe->m_type = m_type; + eDebugNoSimulate("detected %s frontend", "satellite\0cable\0 terrestrial"+fe_info.type*10); } - eDebugNoSimulate("detected %s frontend", "satellite\0cable\0 terrestrial"+fe_info.type*10); - } #if HAVE_DVB_API_VERSION < 3 - if (m_type == iDVBFrontend::feSatellite) - { - if (m_secfd < 0) - { - if (!m_simulate) + if (m_type == iDVBFrontend::feSatellite) + { + if (m_secfd < 0) { - m_secfd = ::open(m_sec_filename, O_RDWR); - if (m_secfd < 0) + if (!m_simulate) { - eWarning("failed! (%s) %m", m_sec_filename); - ::close(m_fd); - m_fd=-1; - return -1; + m_secfd = ::open(m_sec_filename, O_RDWR); + if (m_secfd < 0) + { + eWarning("failed! (%s) %m", m_sec_filename); + ::close(m_fd); + m_fd=-1; + return -1; + } } } - } - else - eWarning("sec %d already opened", m_dvbid); - } + else + eWarning("sec %d already opened", m_dvbid); + } #endif - setTone(iDVBFrontend::toneOff); - setVoltage(iDVBFrontend::voltageOff); - - if (!m_simulate) - { m_sn = eSocketNotifier::create(eApp, m_fd, eSocketNotifier::Read, false); CONNECT(m_sn->activated, eDVBFrontend::feEvent); } + setTone(iDVBFrontend::toneOff); + setVoltage(iDVBFrontend::voltageOff); + return 0; } @@ -1860,11 +1859,11 @@ int eDVBFrontend::tuneLoopInt() // called by m_tuneTimer int slotid = sec_fe->m_slotid; // FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000 if (slotid < 2) - sprintf(dev, "/dev/i2c/%d", slotid); + sprintf(dev, "/dev/i2c-%d", slotid); else if (slotid == 2) - sprintf(dev, "/dev/i2c/2"); // first nim socket on DM8000 use /dev/i2c/2 + sprintf(dev, "/dev/i2c-2"); // first nim socket on DM8000 use /dev/i2c-2 else if (slotid == 3) - sprintf(dev, "/dev/i2c/4"); // second nim socket on DM8000 use /dev/i2c/4 + sprintf(dev, "/dev/i2c-4"); // second nim socket on DM8000 use /dev/i2c-4 int fd = ::open(dev, O_RDWR); unsigned char data[2]; @@ -2111,8 +2110,8 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm, return -EINVAL; } #if HAVE_DVB_API_VERSION < 5 - parm_inversion |= (feparm.rolloff << 2); // Hack.. we use bit 2..3 of inversion param for rolloff - parm_inversion |= (feparm.pilot << 4); // Hack.. we use bit 4..5 of inversion param for pilot + parm_inversion = (fe_spectral_inversion_t)((feparm.rolloff << 2) | parm_inversion); // Hack.. we use bit 2..3 of inversion param for rolloff + parm_inversion = (fe_spectral_inversion_t)((feparm.pilot << 4) | parm_inversion); // Hack.. we use bit 4..5 of inversion param for pilot if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation_8PSK) { parm_u_qpsk_fec_inner = (fe_code_rate_t)((int)parm_u_qpsk_fec_inner+9); diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index bef4a18..5887f40 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -72,6 +72,7 @@ private: bool m_simulate; bool m_enabled; int m_type; + eDVBFrontend *m_simulate_fe; // only used to set frontend type in dvb.cpp int m_dvbid; int m_slotid; int m_fd; @@ -115,7 +116,7 @@ private: bool setSecSequencePos(int steps); static int PriorityOrder; public: - eDVBFrontend(int adap, int fe, int &ok, bool simulate=false); + eDVBFrontend(int adap, int fe, int &ok, bool simulate=false, eDVBFrontend *simulate_fe=NULL); virtual ~eDVBFrontend(); int readInputpower(); diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index f1217a6..86936f8 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -605,6 +606,10 @@ public: virtual RESULT playFile(const char *file) = 0; virtual void stopFile() = 0; + /* new interface */ + virtual RESULT playSource(ePtr &source, const char *priv=NULL) = 0; + virtual void stopSource() = 0; + virtual void setCueSheet(eCueSheet *cuesheet) = 0; virtual RESULT getLength(pts_t &pts) = 0; @@ -631,6 +636,7 @@ public: virtual RESULT getSTC(pts_t &pts, int num=0)=0; virtual RESULT getCADemuxID(uint8_t &id)=0; virtual RESULT flush()=0; + virtual int openDVR(int flags)=0; }; #if HAVE_DVB_API_VERSION < 3 && !defined(VIDEO_EVENT_SIZE_CHANGED) @@ -645,7 +651,7 @@ public: /** Set Displayed Video PID and type */ virtual RESULT setVideoPID(int vpid, int type)=0; - enum { af_MPEG, af_AC3, af_DTS, af_AAC }; + enum { af_MPEG, af_AC3, af_DTS, af_AAC, af_DTSHD }; /** Set Displayed Audio PID and type */ virtual RESULT setAudioPID(int apid, int type)=0; diff --git a/lib/dvb/lowlevel/Makefile.am b/lib/dvb/lowlevel/Makefile.am index 98e89f9..1108097 100644 --- a/lib/dvb/lowlevel/Makefile.am +++ b/lib/dvb/lowlevel/Makefile.am @@ -1,3 +1,4 @@ -EXTRA_DIST = \ +lowlevelincludedir = $(pkgincludedir)/lib/dvb/lowlevel +lowlevelinclude_HEADERS = \ eit.h \ mhw.h diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index ea4b96c..e5e6331 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -20,13 +20,14 @@ #include eDVBServicePMTHandler::eDVBServicePMTHandler() - :m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF) + :m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF), m_no_pat_entry_delay(eTimer::create()) { m_use_decode_demux = 0; m_pmt_pid = -1; eDVBResourceManager::getInstance(m_resourceManager); CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready); CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready); + CONNECT(m_no_pat_entry_delay->timeout, eDVBServicePMTHandler::sendEventNoPatEntry); } eDVBServicePMTHandler::~eDVBServicePMTHandler() @@ -43,8 +44,15 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel) && (state == iDVBChannel::state_ok) && (!m_demux)) { if (m_channel) - if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) + { + if (m_pvr_demux_tmp) + { + m_demux = m_pvr_demux_tmp; + m_pvr_demux_tmp = NULL; + } + else if (m_channel->getDemux(m_demux, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) eDebug("Allocating %s-decoding a demux for now tuned-in channel failed.", m_use_decode_demux ? "" : "non-"); + } serviceEvent(eventTuned); @@ -126,30 +134,60 @@ void eDVBServicePMTHandler::PMTready(int error) } } +void eDVBServicePMTHandler::sendEventNoPatEntry() +{ + serviceEvent(eventNoPATEntry); +} + void eDVBServicePMTHandler::PATready(int) { + eDebug("PATready"); ePtr > ptr; if (!m_PAT.getCurrent(ptr)) { + int service_id_single = -1; + int pmtpid_single = -1; int pmtpid = -1; + int cnt=0; std::vector::const_iterator i; for (i = ptr->getSections().begin(); pmtpid == -1 && i != ptr->getSections().end(); ++i) { const ProgramAssociationSection &pat = **i; ProgramAssociationConstIterator program; for (program = pat.getPrograms()->begin(); pmtpid == -1 && program != pat.getPrograms()->end(); ++program) + { + ++cnt; if (eServiceID((*program)->getProgramNumber()) == m_reference.getServiceID()) pmtpid = (*program)->getProgramMapPid(); + if (++cnt == 1 && pmtpid_single == -1 && pmtpid == -1) + { + pmtpid_single = (*program)->getProgramMapPid(); + service_id_single = (*program)->getProgramNumber(); + } + else + pmtpid_single = service_id_single = -1; + } } - if (pmtpid == -1) - serviceEvent(eventNoPATEntry); - else + if (pmtpid_single != -1) // only one PAT entry .. and not valid pmtpid found + { + eDebug("use single pat entry!"); + m_reference.setServiceID(eServiceID(service_id_single)); + pmtpid = pmtpid_single; + } + if (pmtpid == -1) { + eDebug("no PAT entry found.. start delay"); + m_no_pat_entry_delay->start(1000, true); + } + else { + eDebug("use pmtpid %04x for service_id %04x", pmtpid, m_reference.getServiceID().get()); + m_no_pat_entry_delay->stop(); m_PMT.begin(eApp, eDVBPMTSpec(pmtpid, m_reference.getServiceID().get()), m_demux); + } } else serviceEvent(eventNoPAT); } -PyObject *eDVBServicePMTHandler::getCaIds() +PyObject *eDVBServicePMTHandler::getCaIds(bool pair) { ePyObject ret; @@ -157,20 +195,37 @@ PyObject *eDVBServicePMTHandler::getCaIds() if ( !getProgramInfo(prog) ) { - int cnt=prog.caids.size(); - if (cnt) + if (pair) + { + int cnt=prog.caids.size(); + if (cnt) + { + ret=PyList_New(cnt); + std::list::iterator it(prog.caids.begin()); + while(cnt--) + { + ePyObject tuple = PyTuple_New(2); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(it->caid)); + PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong((it++)->capid)); + PyList_SET_ITEM(ret, cnt, tuple); + } + } + } + else { + std::set set(prog.caids.begin(), prog.caids.end()); + std::set::iterator it(set.begin()); + int cnt=set.size(); ret=PyList_New(cnt); - std::set::iterator it(prog.caids.begin()); while(cnt--) - PyList_SET_ITEM(ret, cnt, PyInt_FromLong(*it++)); + PyList_SET_ITEM(ret, cnt, PyInt_FromLong((it++)->caid)); } } return ret ? (PyObject*)ret : (PyObject*)PyList_New(0); } -int eDVBServicePMTHandler::getProgramInfo(struct program &program) +int eDVBServicePMTHandler::getProgramInfo(program &program) { ePtr > ptr; int cached_apid_ac3 = -1; @@ -213,8 +268,29 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) for (i = ptr->getSections().begin(); i != ptr->getSections().end(); ++i) { const ProgramMapSection &pmt = **i; + int is_hdmv = 0; + program.pcrPid = pmt.getPcrPid(); + for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); + desc != pmt.getDescriptors()->end(); ++desc) + { + if ((*desc)->getTag() == CA_DESCRIPTOR) + { + CaDescriptor *descr = (CaDescriptor*)(*desc); + program::capid_pair pair; + pair.caid = descr->getCaSystemId(); + pair.capid = descr->getCaPid(); + program.caids.push_back(pair); + } + else if ((*desc)->getTag() == REGISTRATION_DESCRIPTOR) + { + RegistrationDescriptor *d = (RegistrationDescriptor*)(*desc); + if (d->getFormatIdentifier() == 0x48444d56) // HDMV + is_hdmv = 1; + } + } + ElementaryStreamInfoConstIterator es; for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es) { @@ -270,25 +346,34 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) audio.type = audioStream::atAACHE; forced_audio = 1; } - case 0x80: // user private ... but blueray LPCM - if (!isvideo && !isaudio) + case 0x80: // user private ... but bluray LPCM + case 0xA0: // bluray secondary LPCM + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atLPCM; } - case 0x81: // user private ... but blueray AC3 - if (!isvideo && !isaudio) + case 0x81: // user private ... but bluray AC3 + case 0xA1: // bluray secondary AC3 + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atAC3; } - case 0x82: // Blueray DTS (dvb user private...) - case 0xA2: // Blueray secondary DTS - if (!isvideo && !isaudio) + case 0x82: // bluray DTS (dvb user private...) + case 0xA2: // bluray secondary DTS + if (!isvideo && !isaudio && is_hdmv) { isaudio = 1; audio.type = audioStream::atDTS; } + case 0x86: // bluray DTS-HD (dvb user private...) + case 0xA6: // bluray secondary DTS-HD + if (!isvideo && !isaudio && is_hdmv) + { + isaudio = 1; + audio.type = audioStream::atDTSHD; + } case 0x06: // PES Private case 0xEA: // TS_PSI_ST_SMPTE_VC1 { @@ -460,7 +545,10 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) case CA_DESCRIPTOR: { CaDescriptor *descr = (CaDescriptor*)(*desc); - program.caids.insert(descr->getCaSystemId()); + program::capid_pair pair; + pair.caid = descr->getCaSystemId(); + pair.capid = descr->getCaPid(); + program.caids.push_back(pair); break; } default: @@ -477,9 +565,9 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) default: break; } - if (isteletext && (isaudio || isvideo)) + if (isteletext && (isaudio || isvideo)) { - eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid()); + eDebug("ambiguous streamtype for PID %04x detected.. forced as teletext!", (*es)->getPid()); continue; // continue with next PID } else if (issubtitle && (isaudio || isvideo)) @@ -517,15 +605,6 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) else continue; } - for (DescriptorConstIterator desc = pmt.getDescriptors()->begin(); - desc != pmt.getDescriptors()->end(); ++desc) - { - if ((*desc)->getTag() == CA_DESCRIPTOR) - { - CaDescriptor *descr = (CaDescriptor*)(*desc); - program.caids.insert(descr->getCaSystemId()); - } - } } ret = 0; @@ -589,8 +668,12 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) program.textPid = cached_tpid; } CAID_LIST &caids = m_service->m_ca; - for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it) - program.caids.insert(*it); + for (CAID_LIST::iterator it(caids.begin()); it != caids.end(); ++it) { + program::capid_pair pair; + pair.caid = *it; + pair.capid = -1; // not known yet + program.caids.push_back(pair); + } if ( cnt ) ret = 0; } @@ -675,10 +758,16 @@ void eDVBServicePMTHandler::SDTScanEvent(int event) int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *cue, bool simulate, eDVBService *service) { + ePtr s; + return tuneExt(ref, use_decode_demux, s, NULL, cue, simulate, service); +} + +int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr &source, const char *streaminfo_file, eCueSheet *cue, bool simulate, eDVBService *service) +{ RESULT res=0; m_reference = ref; - m_use_decode_demux = use_decode_demux; + m_no_pat_entry_delay->stop(); /* use given service as backup. This is used for timeshift where we want to clone the live stream using the cache, but in fact have a PVR channel */ m_service = service; @@ -702,11 +791,12 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, { if (!ref.getServiceID().get() /* incorrect sid in meta file or recordings.epl*/ ) { - eWarning("no .meta file found, trying to find PMT pid"); eDVBTSTools tstools; - if (tstools.openFile(ref.path.c_str())) - eWarning("failed to open file"); - else + bool b = source || !tstools.openFile(ref.path.c_str(), 1); + eWarning("no .meta file found, trying to find PMT pid"); + if (source) + tstools.setSource(source, NULL); + if (b) { int service_id, pmt_pid; if (!tstools.findPMT(pmt_pid, service_id)) @@ -716,6 +806,8 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, m_pmt_pid = pmt_pid; } } + else + eWarning("no valid source to find PMT pid!"); } eDebug("alloc PVR"); /* allocate PVR */ @@ -757,7 +849,13 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux, if (m_pvr_channel) { m_pvr_channel->setCueSheet(cue); - m_pvr_channel->playFile(ref.path.c_str()); + + if (m_pvr_channel->getDemux(m_pvr_demux_tmp, (!m_use_decode_demux) ? 0 : iDVBChannel::capDecode)) + eDebug("Allocating %s-decoding a demux for PVR channel failed.", m_use_decode_demux ? "" : "non-"); + else if (source) + m_pvr_channel->playSource(source, streaminfo_file); + else + m_pvr_channel->playFile(ref.path.c_str()); } } diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index 483c06b..0c44f35 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -86,8 +86,8 @@ class eDVBServicePMTHandler: public Object eUsePtr m_channel; eUsePtr m_pvr_channel; ePtr m_resourceManager; - ePtr m_demux; - + ePtr m_demux, m_pvr_demux_tmp; + void channelStateChanged(iDVBChannel *); ePtr m_channelStateChanged_connection; void channelEvent(iDVBChannel *, int event); @@ -102,6 +102,7 @@ class eDVBServicePMTHandler: public Object int m_use_decode_demux; uint8_t m_decode_demux_num; + ePtr m_no_pat_entry_delay; public: eDVBServicePMTHandler(); ~eDVBServicePMTHandler(); @@ -144,7 +145,7 @@ public: { int pid, rdsPid; // hack for some radio services which transmit radiotext on different pid (i.e. harmony fm, HIT RADIO FFH, ...) - enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM }; + enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM, atDTSHD }; int type; // mpeg2, ac3, dts, ... int component_tag; @@ -181,11 +182,17 @@ public: struct program { + struct capid_pair + { + uint16_t caid; + int capid; + bool operator< (const struct capid_pair &t) const { return t.caid < caid; } + }; std::vector videoStreams; std::vector audioStreams; int defaultAudioStream; std::vector subtitleStreams; - std::set caids; + std::list caids; int pcrPid; int pmtPid; int textPid; @@ -193,10 +200,10 @@ public: PyObject *createPythonObject(); }; - int getProgramInfo(struct program &program); + int getProgramInfo(program &program); int getDataDemux(ePtr &demux); int getDecodeDemux(ePtr &demux); - PyObject *getCaIds(); + PyObject *getCaIds(bool pair=false); // caid / ecmpid pair int getPVRChannel(ePtr &pvr_channel); int getServiceReference(eServiceReferenceDVB &service) { service = m_reference; return 0; } @@ -204,8 +211,14 @@ public: int getPMT(ePtr > &ptr) { return m_PMT.getCurrent(ptr); } int getChannel(eUsePtr &channel); void resetCachedProgram() { m_have_cached_program = false; } + void sendEventNoPatEntry(); + /* deprecated interface */ int tune(eServiceReferenceDVB &ref, int use_decode_demux, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0); + + /* new interface */ + int tuneExt(eServiceReferenceDVB &ref, int use_decode_demux, ePtr &, const char *streaminfo_file, eCueSheet *sg=0, bool simulate=false, eDVBService *service = 0); + void free(); private: bool m_have_cached_program; diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp index 5cdecbd..e19dd1e 100644 --- a/lib/dvb/pvrparse.cpp +++ b/lib/dvb/pvrparse.cpp @@ -123,7 +123,7 @@ void eMPEGStreamInformation::fixupDiscontinuties() pts_t current = i->second - currentDelta; pts_t diff = current - lastpts_t; - if (llabs(diff) > (90000*5)) // 5sec diff + if (llabs(diff) > (90000*10)) // 10sec diff { // eDebug("%llx < %llx, have discont. new timestamp is %llx (diff is %llx)!", current, lastpts_t, i->second, diff); currentDelta = i->second - lastpts_t; /* FIXME: should be the extrapolated new timestamp, based on the current rate */ diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index b37aa71..fb6f204 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -29,7 +30,8 @@ eDVBScan::eDVBScan(iDVBChannel *channel, bool usePAT, bool debug) 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"); + std::string filename = eEnv::resolve("${sysconfdir}/scan_tp_valid_check.py"); + FILE *f = fopen(filename.c_str(), "r"); if (f) { char code[16384]; @@ -37,7 +39,7 @@ eDVBScan::eDVBScan(iDVBChannel *channel, bool usePAT, bool debug) if (rd) { code[rd]=0; - m_additional_tsid_onid_check_func = Py_CompileString(code, "/etc/enigma2/scan_tp_valid_check.py", Py_file_input); + m_additional_tsid_onid_check_func = Py_CompileString(code, filename.c_str(), Py_file_input); } fclose(f); } @@ -191,9 +193,9 @@ RESULT eDVBScan::nextChannel() if (m_ch_toScan.empty()) { SCAN_eDebug("no channels left to scan."); - SCAN_eDebug("%d channels scanned, %d were unavailable.", + SCAN_eDebug("%zd channels scanned, %zd were unavailable.", m_ch_scanned.size(), m_ch_unavailable.size()); - SCAN_eDebug("%d channels in database.", m_new_channels.size()); + SCAN_eDebug("%zd channels in database.", m_new_channels.size()); m_event(evtFinish); return -ENOENT; } diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index d48d44e..851e9b1 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -212,7 +212,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite eSecDebugNoSimulate("ret5 %d", ret); - if (ret && lnb_param.SatCR_idx == -1) + if (ret && !is_unicable) { int lof = sat.frequency > lnb_param.m_lof_threshold ? lnb_param.m_lof_hi : lnb_param.m_lof_lo; @@ -300,11 +300,6 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if ( sit != lnb_param.m_satellites.end()) { eSecCommandList sec_sequence; - - lnb_param.guard_offset = 0; //HACK - - frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); - eDVBSatelliteSwitchParameters &sw_param = sit->second; bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; @@ -327,6 +322,15 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode; eDVBSatelliteSwitchParameters::t_voltage_mode voltage_mode = sw_param.m_voltage_mode; bool diseqc13V = voltage_mode == eDVBSatelliteSwitchParameters::HV_13; + bool is_unicable = lnb_param.SatCR_idx != -1; + + bool useGotoXX = false; + int RotorCmd=-1; + int send_mask = 0; + + lnb_param.guard_offset = 0; //HACK + + frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx); if (diseqc13V) voltage_mode = eDVBSatelliteSwitchParameters::HV; @@ -371,13 +375,10 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA int lof = (band&1)?lnb_param.m_lof_hi:lnb_param.m_lof_lo; - int local=0; - - - if(lnb_param.SatCR_idx == -1) + if(!is_unicable) { - // calc Frequency - local = abs(sat.frequency + // calc Frequency + int local= abs(sat.frequency - lof); parm.FREQUENCY = ((((local * 2) / 125) + 1) / 2) * 125; frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY); @@ -399,7 +400,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA } else { - int tmp1 = abs(sat.frequency + int tmp1 = abs(sat.frequency -lof) + lnb_param.SatCRvco - 1400000 @@ -414,6 +415,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord); eDebug("[prepare] guard_offset %d",lnb_param.guard_offset); frontend.setData(eDVBFrontend::FREQ_OFFSET, (lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 + lof - (2 * (lnb_param.SatCRvco - (tmp1-tmp2))) ); + voltage = VOLTAGE(13); } if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0) @@ -436,7 +438,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO); bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); - int send_mask = 0; /* + /* send_mask 1 must send csw 2 must send ucsw 4 send toneburst first @@ -462,7 +464,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA if (di_param.m_command_order==4 && send_burst) send_mask |= 8; } - if (changed_csw) + if (changed_csw) { if ( di_param.m_use_fast && di_param.m_committed_cmd < eDVBSatelliteDiseqcParameters::SENDNO @@ -488,387 +490,201 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA eDebugNoNewLine("0"); eDebug(""); #endif - if (doSetVoltageToneFrontend) + if ( diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 + && !sat.no_rotor_command_on_tune ) { - int RotorCmd=-1; - bool useGotoXX = false; - if ( diseqc_mode == eDVBSatelliteDiseqcParameters::V1_2 - && !sat.no_rotor_command_on_tune ) + if (sw_param.m_rotorPosNum) // we have stored rotor pos? + RotorCmd=sw_param.m_rotorPosNum; + else // we must calc gotoxx cmd { - if (sw_param.m_rotorPosNum) // we have stored rotor pos? - RotorCmd=sw_param.m_rotorPosNum; - else // we must calc gotoxx cmd - { - eDebugNoSimulate("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 ); - useGotoXX = true; - - double SatLon = abs(sat.orbital_position)/10.00, - SiteLat = rotor_param.m_gotoxx_parameters.m_latitude, - SiteLon = rotor_param.m_gotoxx_parameters.m_longitude; - - if ( rotor_param.m_gotoxx_parameters.m_la_direction == eDVBSatelliteRotorParameters::SOUTH ) - SiteLat = -SiteLat; - - if ( rotor_param.m_gotoxx_parameters.m_lo_direction == eDVBSatelliteRotorParameters::WEST ) - SiteLon = 360 - SiteLon; - - eDebugNoSimulate("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon ); - double satHourAngle = - calcSatHourangle( SatLon, SiteLat, SiteLon ); - eDebugNoSimulate("PolarmountHourAngle=%lf", satHourAngle ); - - static int gotoXTable[10] = - { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E }; - - if (SiteLat >= 0) // Northern Hemisphere - { - int tmp=(int)round( fabs( 180 - satHourAngle ) * 10.0 ); - RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; - - if (satHourAngle < 180) // the east - RotorCmd |= 0xE000; - else // west - RotorCmd |= 0xD000; - } - else // Southern Hemisphere - { - if (satHourAngle < 180) // the east - { - int tmp=(int)round( fabs( satHourAngle ) * 10.0 ); - RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; - RotorCmd |= 0xD000; - } - else // west - { - int tmp=(int)round( fabs( 360 - satHourAngle ) * 10.0 ); - RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; - RotorCmd |= 0xE000; - } - } - eDebugNoSimulate("RotorCmd = %04x", RotorCmd); - } - } + eDebugNoSimulate("Entry for %d,%d? not in Rotor Table found... i try gotoXX?", sat.orbital_position / 10, sat.orbital_position % 10 ); + useGotoXX = true; - if ( send_mask ) - { - int vlt = iDVBFrontend::voltageOff; - eSecCommand::pair compare; - compare.steps = +3; - compare.tone = iDVBFrontend::toneOff; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); - - if (diseqc13V) - vlt = iDVBFrontend::voltage13; - else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) - { - if (rotor_param.m_inputpower_parameters.m_use) - vlt = VOLTAGE(18); // in input power mode set 18V for measure input power - else - vlt = VOLTAGE(13); // in normal mode start turning with 13V - } - else - vlt = voltage; + double SatLon = abs(sat.orbital_position)/10.00, + SiteLat = rotor_param.m_gotoxx_parameters.m_latitude, + SiteLon = rotor_param.m_gotoxx_parameters.m_longitude; - // check if voltage is already correct.. - compare.voltage = vlt; - compare.steps = +7; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + if ( rotor_param.m_gotoxx_parameters.m_la_direction == eDVBSatelliteRotorParameters::SOUTH ) + SiteLat = -SiteLat; - // check if voltage is disabled - compare.voltage = iDVBFrontend::voltageOff; - compare.steps = +4; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + if ( rotor_param.m_gotoxx_parameters.m_lo_direction == eDVBSatelliteRotorParameters::WEST ) + SiteLon = 360 - SiteLon; - // voltage is changed... use DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); + eDebugNoSimulate("siteLatitude = %lf, siteLongitude = %lf, %lf degrees", SiteLat, SiteLon, SatLon ); + double satHourAngle = + calcSatHourangle( SatLon, SiteLat, SiteLon ); + eDebugNoSimulate("PolarmountHourAngle=%lf", satHourAngle ); - // voltage was disabled.. use DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) ); + static int gotoXTable[10] = + { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E }; - sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) ); - if (needDiSEqCReset) + if (SiteLat >= 0) // Northern Hemisphere { - eDVBDiseqcCommand diseqc; - memset(diseqc.data, 0, MAX_DISEQC_LENGTH); - diseqc.len = 3; - diseqc.data[0] = 0xE0; - diseqc.data[1] = 0; - diseqc.data[2] = 0; - // diseqc reset - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_RESET_CMD]) ); - diseqc.data[2] = 3; - // diseqc peripherial powersupply on - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD]) ); - } + int tmp=(int)round( fabs( 180 - satHourAngle ) * 10.0 ); + RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; - for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat) + if (satHourAngle < 180) // the east + RotorCmd |= 0xE000; + else // west + RotorCmd |= 0xD000; + } + else // Southern Hemisphere { - if ( send_mask & 4 ) + if (satHourAngle < 180) // the east { - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) ); - } - - int loops=0; - - if ( send_mask & 1 ) - ++loops; - if ( send_mask & 2 ) - ++loops; - - loops <<= di_param.m_repeats; - - for ( int i = 0; i < loops;) // fill commands... - { - eDVBDiseqcCommand diseqc; - memset(diseqc.data, 0, MAX_DISEQC_LENGTH); - diseqc.len = 4; - diseqc.data[0] = i ? 0xE1 : 0xE0; - diseqc.data[1] = 0x10; - if ( (send_mask & 2) && (di_param.m_command_order & 4) ) - { - diseqc.data[2] = 0x39; - diseqc.data[3] = ucsw; - } - else if ( send_mask & 1 ) - { - diseqc.data[2] = 0x38; - diseqc.data[3] = csw; - } - else // no committed command confed.. so send uncommitted.. - { - diseqc.data[2] = 0x39; - diseqc.data[3] = ucsw; - } - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - - i++; - if ( i < loops ) - { - int cmd=0; - if (diseqc.data[2] == 0x38 && (send_mask & 2)) - cmd=0x39; - else if (diseqc.data[2] == 0x39 && (send_mask & 1)) - cmd=0x38; - int tmp = m_params[DELAY_BETWEEN_DISEQC_REPEATS]; - if (cmd) - { - int delay = di_param.m_repeats ? (tmp - 54) / 2 : tmp; // standard says 100msek between two repeated commands - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay) ); - diseqc.data[2]=cmd; - diseqc.data[3]=(cmd==0x38) ? csw : ucsw; - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - ++i; - if ( i < loops ) - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay ) ); - else - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); - } - else // delay 120msek when no command is in repeat gap - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, tmp) ); - } - else - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); + int tmp=(int)round( fabs( satHourAngle ) * 10.0 ); + RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; + RotorCmd |= 0xD000; } - - if ( send_mask & 8 ) // toneburst at end of sequence + else // west { - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) ); + int tmp=(int)round( fabs( 360 - satHourAngle ) * 10.0 ); + RotorCmd = (tmp/10)*0x10 + gotoXTable[ tmp % 10 ]; + RotorCmd |= 0xE000; } - - if (di_param.m_seq_repeat && seq_repeat == 0) - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) ); } + eDebugNoSimulate("RotorCmd = %04x", RotorCmd); } + } - eDebugNoSimulate("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd); - if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) + if ( send_mask ) + { + int diseqc_repeats = diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0 ? di_param.m_repeats : 0; + int vlt = iDVBFrontend::voltageOff; + eSecCommand::pair compare; + compare.steps = +3; + compare.tone = iDVBFrontend::toneOff; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); + + if (diseqc13V) + vlt = iDVBFrontend::voltage13; + else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) { - eSecCommand::pair compare; - if (!send_mask && lnb_param.SatCR_idx == -1) - { - compare.steps = +3; - compare.tone = iDVBFrontend::toneOff; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); - - compare.voltage = iDVBFrontend::voltageOff; - compare.steps = +4; - // the next is a check if voltage is switched off.. then we first set a voltage :) - // else we set voltage after all diseqc stuff.. - sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); - - if (rotor_param.m_inputpower_parameters.m_use) - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); // set 18V for measure input power - else - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); // in normal mode start turning with 13V - - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_MOTOR_CMD]) ); // wait 750ms when voltage was disabled - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +9) ); // no need to send stop rotor cmd and recheck voltage - } + if (rotor_param.m_inputpower_parameters.m_use && !is_unicable) + vlt = VOLTAGE(18); // in input power mode set 18V for measure input power else - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BETWEEN_SWITCH_AND_MOTOR_CMD]) ); // wait 700ms when diseqc changed + vlt = VOLTAGE(13); // in normal mode start turning with 13V + } + else + vlt = voltage; + // check if voltage is already correct.. + compare.voltage = vlt; + compare.steps = +7; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + + // check if voltage is disabled + compare.voltage = iDVBFrontend::voltageOff; + compare.steps = +4; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + + // voltage is changed... use DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) ); + + // voltage was disabled.. use DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, vlt) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS]) ); + + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_SWITCHPARMS) ); + if (needDiSEqCReset) + { eDVBDiseqcCommand diseqc; memset(diseqc.data, 0, MAX_DISEQC_LENGTH); diseqc.len = 3; diseqc.data[0] = 0xE0; - diseqc.data[1] = 0x31; // positioner - diseqc.data[2] = 0x60; // stop - sec_sequence.push_back( eSecCommand(eSecCommand::IF_ROTORPOS_VALID_GOTO, +5) ); + diseqc.data[1] = 0; + diseqc.data[2] = 0; + // diseqc reset sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_RESET_CMD]) ); + diseqc.data[2] = 3; + // diseqc peripherial powersupply on sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - // wait 150msec after send rotor stop cmd - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_MOTOR_STOP_CMD]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD]) ); + } - diseqc.data[0] = 0xE0; - diseqc.data[1] = 0x31; // positioner - if ( useGotoXX ) + for (int seq_repeat = 0; seq_repeat < (di_param.m_seq_repeat?2:1); ++seq_repeat) + { + if ( send_mask & 4 ) { - diseqc.len = 5; - diseqc.data[2] = 0x6E; // drive to angular position - diseqc.data[3] = ((RotorCmd & 0xFF00) / 0x100); - diseqc.data[4] = RotorCmd & 0xFF; + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) ); } - else + + int loops=0; + + if ( send_mask & 1 ) + ++loops; + if ( send_mask & 2 ) + ++loops; + + loops <<= diseqc_repeats; + + for ( int i = 0; i < loops;) // fill commands... { + eDVBDiseqcCommand diseqc; + memset(diseqc.data, 0, MAX_DISEQC_LENGTH); diseqc.len = 4; - diseqc.data[2] = 0x6B; // goto stored sat position - diseqc.data[3] = RotorCmd; - diseqc.data[4] = 0x00; - } -// if(lnb_param.SatCR_idx == -1) - { - int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds! - if ( rotor_param.m_inputpower_parameters.m_use || lnb_param.SatCR_idx == -1) - { // use measure rotor input power to detect rotor state - bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed); - eSecCommand::rotor cmd; - eSecCommand::pair compare; - if (turn_fast) - compare.voltage = VOLTAGE(18); - else - compare.voltage = VOLTAGE(13); - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); - // measure idle power values - compare.steps = -2; - if (turn_fast) { - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); - compare.val = 1; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); - } - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) ); - compare.val = 0; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); - //////////////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries - sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout - // rotor start loop - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); - cmd.direction=1; // check for running rotor - cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta; - cmd.steps=+5; - cmd.okcount=0; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start - sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start - //////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); - if (turn_fast) - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*20) ); // mrt is in seconds... our SLEEP time is 50ms.. so * 20 - // rotor running loop - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec - sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); - cmd.direction=0; // check for stopped rotor - cmd.steps=+3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start - ///////////////////// - sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); + diseqc.data[0] = i ? 0xE1 : 0xE0; + diseqc.data[1] = 0x10; + if ( (send_mask & 2) && (di_param.m_command_order & 4) ) + { + diseqc.data[2] = 0x39; + diseqc.data[3] = ucsw; } - else - { // use normal turning mode - if (curRotorPos != -1) - { - mrt = abs(curRotorPos - sat.orbital_position); - if (mrt > 1800) - mrt = 3600 - mrt; - if (mrt % 10) - mrt += 10; // round a little bit - mrt *= 2000; // (we assume a very slow rotor with just 0.5 degree per second here) - mrt /= 10000; - mrt += 3; // a little bit overhead + else if ( send_mask & 1 ) + { + diseqc.data[2] = 0x38; + diseqc.data[3] = csw; + } + else // no committed command confed.. so send uncommitted.. + { + diseqc.data[2] = 0x39; + diseqc.data[3] = ucsw; + } + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + + i++; + if ( i < loops ) + { + int cmd=0; + if (diseqc.data[2] == 0x38 && (send_mask & 2)) + cmd=0x39; + else if (diseqc.data[2] == 0x39 && (send_mask & 1)) + cmd=0x38; + int tmp = m_params[DELAY_BETWEEN_DISEQC_REPEATS]; + if (cmd) + { + int delay = diseqc_repeats ? (tmp - 54) / 2 : tmp; // standard says 100msek between two repeated commands + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay) ); + diseqc.data[2]=cmd; + diseqc.data[3]=(cmd==0x38) ? csw : ucsw; + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + ++i; + if ( i < loops ) + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, delay ) ); + else + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); } - doSetVoltageToneFrontend=false; - doSetFrontend=false; - eSecCommand::rotor cmd; - eSecCommand::pair compare; - compare.voltage = VOLTAGE(13); - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change - - sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) ); // sleep one second before change voltage or tone - - compare.voltage = voltage; - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage? - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); - - compare.tone = tone; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 0) ); - - cmd.direction=1; // check for running rotor - cmd.deltaA=0; - cmd.steps = +3; - cmd.okcount=0; - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*4) ); // mrt is in seconds... our SLEEP time is 250ms.. so * 4 - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +5 ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start - sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +4) ); - sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) ); - sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -5) ); + else // delay 120msek when no command is in repeat gap + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, tmp) ); } - eDebug("set rotor timeout to %d seconds", mrt); - sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); - sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); + else + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); } + + if ( send_mask & 8 ) // toneburst at end of sequence + { + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_TONEBURST, di_param.m_toneburst_param) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_TONEBURST]) ); + } + + if (di_param.m_seq_repeat && seq_repeat == 0) + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) ); } } } @@ -882,33 +698,17 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); - if ((doSetVoltageToneFrontend) && (lnb_param.SatCR_idx == -1)) - { - eSecCommand::pair compare; - compare.voltage = voltage; - compare.steps = +3; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ? - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_VOLTAGE_CHANGE]) ); - compare.tone = tone; - sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); - } - - sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) ); - - if(lnb_param.SatCR_idx != -1) + if(is_unicable) { // check if voltage is disabled eSecCommand::pair compare; compare.steps = +3; compare.voltage = iDVBFrontend::voltageOff; sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_SWITCH_CMDS] ) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_SWITCH_CMDS]) ); // wait 20 ms after voltage change @@ -923,9 +723,209 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) ); - sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + if ( RotorCmd != -1 && RotorCmd != lastRotorCmd && !rotor_param.m_inputpower_parameters.m_use) + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change + } + + eDebugNoSimulate("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd); + if ( RotorCmd != -1 && RotorCmd != lastRotorCmd ) + { + int mrt = m_params[MOTOR_RUNNING_TIMEOUT]; // in seconds! + eSecCommand::pair compare; + if (!send_mask && !is_unicable) + { + compare.steps = +3; + compare.tone = iDVBFrontend::toneOff; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE_DISABLE_BEFORE_DISEQC]) ); + + compare.voltage = iDVBFrontend::voltageOff; + compare.steps = +4; + // the next is a check if voltage is switched off.. then we first set a voltage :) + // else we set voltage after all diseqc stuff.. + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) ); + + if (rotor_param.m_inputpower_parameters.m_use) + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); // set 18V for measure input power + else + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); // in normal mode start turning with 13V + + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_MOTOR_CMD]) ); // wait 750ms when voltage was disabled + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +9) ); // no need to send stop rotor cmd and recheck voltage + } + else + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BETWEEN_SWITCH_AND_MOTOR_CMD]) ); // wait 700ms when diseqc changed + + eDVBDiseqcCommand diseqc; + memset(diseqc.data, 0, MAX_DISEQC_LENGTH); + diseqc.len = 3; + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x31; // positioner + diseqc.data[2] = 0x60; // stop + sec_sequence.push_back( eSecCommand(eSecCommand::IF_ROTORPOS_VALID_GOTO, +5) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + // wait 150msec after send rotor stop cmd + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_MOTOR_STOP_CMD]) ); + + diseqc.data[0] = 0xE0; + diseqc.data[1] = 0x31; // positioner + if ( useGotoXX ) + { + diseqc.len = 5; + diseqc.data[2] = 0x6E; // drive to angular position + diseqc.data[3] = ((RotorCmd & 0xFF00) / 0x100); + diseqc.data[4] = RotorCmd & 0xFF; + } + else + { + diseqc.len = 4; + diseqc.data[2] = 0x6B; // goto stored sat position + diseqc.data[3] = RotorCmd; + diseqc.data[4] = 0x00; + } + + // use measure rotor input power to detect motor state + if ( rotor_param.m_inputpower_parameters.m_use) + { + bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed) && !is_unicable; + eSecCommand::rotor cmd; + eSecCommand::pair compare; + if (turn_fast) + compare.voltage = VOLTAGE(18); + else + compare.voltage = VOLTAGE(13); + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); + // measure idle power values + compare.steps = -2; + if (turn_fast) { + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) ); + compare.val = 1; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) ); + } + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) ); + compare.val = 0; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) ); + //////////////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout + // rotor start loop + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); + cmd.direction=1; // check for running rotor + cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta; + cmd.steps=+5; + cmd.okcount=0; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start + sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start + //////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); + if (turn_fast) + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*20) ); // mrt is in seconds... our SLEEP time is 50ms.. so * 20 + // rotor running loop + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec + sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) ); + cmd.direction=0; // check for stopped rotor + cmd.steps=+3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start + ///////////////////// + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); + } + // use normal motor turning mode + else + { + if (curRotorPos != -1) + { + mrt = abs(curRotorPos - sat.orbital_position); + if (mrt > 1800) + mrt = 3600 - mrt; + if (mrt % 10) + mrt += 10; // round a little bit + mrt *= 2000; // (we assume a very slow rotor with just 0.5 degree per second here) + mrt /= 10000; + mrt += 3; // a little bit overhead + } + doSetVoltageToneFrontend=false; + doSetFrontend=false; + eSecCommand::rotor cmd; + eSecCommand::pair compare; + compare.voltage = VOLTAGE(13); + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change + + sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 1000) ); // sleep one second before change voltage or tone + + compare.voltage = voltage; + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage? + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); + + compare.tone = tone; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 0) ); + + cmd.direction=1; // check for running rotor + cmd.deltaA=0; + cmd.steps = +3; + cmd.okcount=0; + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, mrt*4) ); // mrt is in seconds... our SLEEP time is 250ms.. so * 4 + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +5 ) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +4) ); + sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND, 1) ); + sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -5) ); + eDebug("set rotor timeout to %d seconds", mrt); + } + sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd); + sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position); + } + + if (doSetVoltageToneFrontend && !is_unicable) + { + eSecCommand::pair compare; + compare.voltage = voltage; + compare.steps = +3; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // voltage already correct ? + sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_VOLTAGE_CHANGE]) ); + compare.tone = tone; + sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) ); + sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_FINAL_CONT_TONE_CHANGE]) ); } + sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) ); + if (doSetFrontend) { sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) ); diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index d5ad249..6cd855c 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -7,7 +7,6 @@ #include eDVBTSTools::eDVBTSTools() - :m_file_lock(true) { m_pid = -1; m_maxrange = 256*1024; @@ -23,19 +22,39 @@ eDVBTSTools::eDVBTSTools() m_futile = 0; } +void eDVBTSTools::closeSource() +{ + m_source = NULL; +} + eDVBTSTools::~eDVBTSTools() { - closeFile(); + closeSource(); } int eDVBTSTools::openFile(const char *filename, int nostreaminfo) { + eRawFile *f = new eRawFile(); + ePtr src = f; + + if (f->open(filename, 1) < 0) + return -1; + + setSource(src, nostreaminfo ? NULL : filename); + + return 0; +} + +void eDVBTSTools::setSource(ePtr &source, const char *stream_info_filename) +{ closeFile(); - - if (!nostreaminfo) + + m_source = source; + + if (stream_info_filename) { - eDebug("loading streaminfo for %s", filename); - m_streaminfo.load(filename); + eDebug("loading streaminfo for %s", stream_info_filename); + m_streaminfo.load(stream_info_filename); } if (!m_streaminfo.empty()) @@ -45,19 +64,14 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo) // eDebug("no recorded stream information available"); m_use_streaminfo = 0; } - - m_samples_taken = 0; - eSingleLocker l(m_file_lock); - if (m_file.open(filename, 1) < 0) - return -1; - return 0; + m_samples_taken = 0; } void eDVBTSTools::closeFile() { - eSingleLocker l(m_file_lock); - m_file.close(); + if (m_source) + closeSource(); } void eDVBTSTools::setSyncPID(int pid) @@ -77,31 +91,24 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) if (!m_streaminfo.getPTS(offset, pts)) return 0; - if (!m_file.valid()) + if (!m_source || !m_source->valid()) return -1; offset -= offset % 188; - eSingleLocker l(m_file_lock); - if (m_file.lseek(offset, SEEK_SET) < 0) - { - eDebug("lseek failed"); - return -1; - } - int left = m_maxrange; while (left >= 188) { unsigned char packet[188]; - if (m_file.read(packet, 188) != 188) + if (m_source->read(offset, packet, 188) != 188) { eDebug("read error"); break; } left -= 188; offset += 188; - + if (packet[0] != 0x47) { eDebug("resync"); @@ -111,8 +118,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) if (packet[i] == 0x47) break; ++i; + --offset; } - offset = m_file.lseek(i - 188, SEEK_CUR); continue; } @@ -205,6 +212,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) break; case 0x71: // AC3 / DTS break; + case 0x72: // DTS - HD + break; default: eDebug("skip unknwn stream_id_extension %02x\n", payload[9+offs]); continue; @@ -404,7 +413,7 @@ int eDVBTSTools::getNextAccessPoint(pts_t &ts, const pts_t &start, int direction void eDVBTSTools::calcBegin() { - if (!m_file.valid()) + if (!m_source || !m_source->valid()) return; if (!(m_begin_valid || m_futile)) @@ -419,11 +428,10 @@ void eDVBTSTools::calcBegin() void eDVBTSTools::calcEnd() { - if (!m_file.valid()) + if (!m_source || !m_source->valid()) return; - eSingleLocker l(m_file_lock); - off_t end = m_file.lseek(0, SEEK_END); + off_t end = m_source->lseek(0, SEEK_END); if (llabs(end - m_last_filelength) > 1*1024*1024) { @@ -573,31 +581,28 @@ int eDVBTSTools::takeSample(off_t off, pts_t &p) int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) { /* FIXME: this will be factored out soon! */ - if (!m_file.valid()) + if (!m_source || !m_source->valid()) { eDebug(" file not valid"); return -1; } - eSingleLocker l(m_file_lock); - if (m_file.lseek(0, SEEK_SET) < 0) - { - eDebug("seek failed"); - return -1; - } + off_t position=0; int left = 5*1024*1024; while (left >= 188) { unsigned char packet[188]; - if (m_file.read(packet, 188) != 188) + int ret = m_source->read(position, packet, 188); + if (ret != 188) { eDebug("read error"); break; } left -= 188; - + position += 188; + if (packet[0] != 0x47) { int i = 0; @@ -605,12 +610,11 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) { if (packet[i] == 0x47) break; + --position; ++i; } - m_file.lseek(i - 188, SEEK_CUR); continue; } - int pid = ((packet[1] << 8) | packet[2]) & 0x1FFF; int pusi = !!(packet[1] & 0x40); @@ -698,9 +702,26 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram else if (direction == +1) direction = 0; } - /* let's find the next frame after the given offset */ off_t start = offset; +#if 0 + /* backtrack to find the previous sequence start, in case of MPEG2 */ + if ((data & 0xFF) == 0x00) { + do { + --start; + if (m_streaminfo.getStructureEntry(start, data, 0)) + { + eDebug("get previous failed"); + return -1; + } + } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00) && ((data & 0xFF) != 0xB3)); /* sequence start or previous frame */ + if ((data & 0xFF) != 0xB3) + start = offset; /* Failed to find corresponding sequence start, so never mind */ + } + +#endif + + /* let's find the next frame after the given offset */ do { if (m_streaminfo.getStructureEntry(offset, data, 1)) { @@ -715,9 +736,11 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram // eDebug("%08llx@%llx (next)", data, offset); } while (((data & 0xFF) != 9) && ((data & 0xFF) != 0x00)); /* next frame */ +#if 0 /* align to TS pkt start */ -// start = start - (start % 188); -// offset = offset - (offset % 188); + start = start - (start % 188); + offset = offset - (offset % 188); +#endif len = offset - start; _offset = start; diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h index ed8b924..9982792 100644 --- a/lib/dvb/tstools.h +++ b/lib/dvb/tstools.h @@ -19,9 +19,12 @@ public: eDVBTSTools(); ~eDVBTSTools(); + void setSource(ePtr &source, const char *streaminfo_filename=NULL); + void closeSource(); + int openFile(const char *filename, int nostreaminfo = 0); void closeFile(); - + void setSyncPID(int pid); void setSearchRange(int maxrange); @@ -77,8 +80,7 @@ private: int m_pid; int m_maxrange; - eSingleLock m_file_lock; - eRawFile m_file; + ePtr m_source; int m_begin_valid, m_end_valid; pts_t m_pts_begin, m_pts_end; diff --git a/lib/dvb_ci/Makefile.am b/lib/dvb_ci/Makefile.am index fc7f762..9ef7249 100644 --- a/lib/dvb_ci/Makefile.am +++ b/lib/dvb_ci/Makefile.am @@ -1,10 +1,28 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_dvb_ci.a -libenigma_dvb_ci_a_SOURCES = dvbci.cpp dvbci_session.cpp dvbci_resmgr.cpp \ - dvbci_appmgr.cpp dvbci_camgr.cpp \ - dvbci_datetimemgr.cpp dvbci_mmi.cpp \ - dvbci_ui.cpp +libenigma_dvb_ci_a_SOURCES = \ + dvbci.cpp \ + dvbci_appmgr.cpp \ + dvbci_camgr.cpp \ + dvbci_datetimemgr.cpp \ + dvbci_mmi.cpp \ + dvbci_resmgr.cpp \ + dvbci_session.cpp \ + dvbci_ui.cpp +dvbciincludedir = $(pkgincludedir)/lib/dvb_ci +dvbciinclude_HEADERS = \ + dvbci.h \ + dvbci_appmgr.h \ + dvbci_camgr.h \ + dvbci_datetimemgr.h \ + dvbci_mmi.h \ + dvbci_resmgr.h \ + dvbci_session.h \ + dvbci_ui.h diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 883fb5a..374672a 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -297,8 +297,9 @@ void eDVBCIInterfaces::recheckPMTHandlers() if (!pmthandler->getProgramInfo(p)) { int cnt=0; - for (caidSet::reverse_iterator x(p.caids.rbegin()); x != p.caids.rend(); ++x, ++cnt) - caids.push_front(*x); + std::set set(p.caids.begin(), p.caids.end()); + for (std::set::reverse_iterator x(set.rbegin()); x != set.rend(); ++x, ++cnt) + caids.push_front(x->caid); if (service && cnt) service->m_ca = caids; } @@ -738,7 +739,7 @@ PyObject *eDVBCIInterfaces::getDescrambleRules(int slotid) if (!slot) { char tmp[255]; - snprintf(tmp, 255, "eDVBCIInterfaces::getDescrambleRules try to get rules for CI Slot %d... but just %d slots are available", slotid, m_slots.size()); + snprintf(tmp, 255, "eDVBCIInterfaces::getDescrambleRules try to get rules for CI Slot %d... but just %zd slots are available", slotid, m_slots.size()); PyErr_SetString(PyExc_StandardError, tmp); return 0; } @@ -790,7 +791,7 @@ RESULT eDVBCIInterfaces::setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) if (!slot) { char tmp[255]; - snprintf(tmp, 255, "eDVBCIInterfaces::setDescrambleRules try to set rules for CI Slot %d... but just %d slots are available", slotid, m_slots.size()); + snprintf(tmp, 255, "eDVBCIInterfaces::setDescrambleRules try to set rules for CI Slot %d... but just %zd slots are available", slotid, m_slots.size()); PyErr_SetString(PyExc_StandardError, tmp); return -1; } @@ -861,7 +862,7 @@ RESULT eDVBCIInterfaces::setDescrambleRules(int slotid, SWIG_PYOBJECT(ePyObject) if (PyTuple_Size(tuple) != 2) { char buf[255]; - snprintf(buf, 255, "eDVBCIInterfaces::setDescrambleRules provider tuple has %d instead of 2 entries!!", PyTuple_Size(tuple)); + snprintf(buf, 255, "eDVBCIInterfaces::setDescrambleRules provider tuple has %zd instead of 2 entries!!", PyTuple_Size(tuple)); PyErr_SetString(PyExc_StandardError, buf); return -1; } @@ -913,7 +914,7 @@ PyObject *eDVBCIInterfaces::readCICaIds(int slotid) if (!slot) { char tmp[255]; - snprintf(tmp, 255, "eDVBCIInterfaces::readCICaIds try to get CAIds for CI Slot %d... but just %d slots are available", slotid, m_slots.size()); + snprintf(tmp, 255, "eDVBCIInterfaces::readCICaIds try to get CAIds for CI Slot %d... but just %zd slots are available", slotid, m_slots.size()); PyErr_SetString(PyExc_StandardError, tmp); } else diff --git a/lib/gdi/Makefile.am b/lib/gdi/Makefile.am index 1280556..20321f5 100644 --- a/lib/gdi/Makefile.am +++ b/lib/gdi/Makefile.am @@ -1,15 +1,58 @@ -INCLUDES = \ - -I$(top_srcdir)/include -I$(top_srcdir)/lib/gdi/ati +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h + +AM_CXXFLAGS = \ + $(LIBSDL_CFLAGS) noinst_LIBRARIES = libenigma_gdi.a libenigma_gdi_a_SOURCES = \ - region.cpp grc.cpp epng.cpp erect.cpp fb.cpp font.cpp font_arabic.cpp gfbdc.cpp \ - glcddc.cpp gpixmap.cpp lcd.cpp gfont.cpp accel.cpp picload.cpp picexif.cpp \ - compositing.cpp bcm.cpp + accel.cpp \ + bcm.cpp \ + compositing.cpp \ + epng.cpp \ + erect.cpp \ + fb.cpp \ + font.cpp \ + font_arabic.cpp \ + gfont.cpp \ + glcddc.cpp \ + gmaindc.cpp \ + gpixmap.cpp \ + grc.cpp \ + lcd.cpp \ + picexif.cpp \ + picload.cpp \ + region.cpp -if WITH_SDL -libenigma_gdi_a_SOURCES += sdl.cpp -endif +gdiincludedir = $(pkgincludedir)/lib/gdi +gdiinclude_HEADERS = \ + accel.h \ + compositing.h \ + epng.h \ + epoint.h \ + erect.h \ + esize.h \ + fb.h \ + font.h \ + gfont.h \ + glcddc.h \ + gpixmap.h \ + grc.h \ + lcd.h \ + picexif.h \ + picload.h \ + region.h -# ati/2dablt.cpp ati/2dcore.cpp ati/ati_core.cpp ati/test.cpp ati/2dutil.cpp +if HAVE_LIBSDL +libenigma_gdi_a_SOURCES += \ + sdl.cpp \ + sdl.h +else +libenigma_gdi_a_SOURCES += \ + gfbdc.cpp \ + gfbdc.h +endif diff --git a/lib/gdi/accel.cpp b/lib/gdi/accel.cpp index 9450ecc..bd1439f 100644 --- a/lib/gdi/accel.cpp +++ b/lib/gdi/accel.cpp @@ -112,7 +112,7 @@ int gAccel::blit(gSurface *dst, const gSurface *src, const eRect &p, const eRect pal_addr = src->stride * src->y; unsigned long *pal = (unsigned long*)(((unsigned char*)src->data) + pal_addr); pal_addr += src->data_phys; - for (i = 0; i < 256; ++i) + for (i = 0; i < src->clut.colors; ++i) *pal++ = src->clut.data[i].argb() ^ 0xFF000000; } else return -1; /* unsupported source format */ @@ -138,12 +138,14 @@ int gAccel::fill(gSurface *dst, const eRect &area, unsigned long col) col); return 0; #endif -#if 0 // def BCM_ACCEL - bcm_accel_fill( - dst->data_phys, dst->x, dst->y, dst->stride, - area.left(), area.top(), area.width(), area.height(), - col); - return 0; +#ifdef BCM_ACCEL + if (!m_bcm_accel_state) { + bcm_accel_fill( + dst->data_phys, dst->x, dst->y, dst->stride, + area.left(), area.top(), area.width(), area.height(), + col); + return 0; + } #endif return -1; } diff --git a/lib/gdi/bcm.cpp b/lib/gdi/bcm.cpp index 12b5f22..b215b10 100644 --- a/lib/gdi/bcm.cpp +++ b/lib/gdi/bcm.cpp @@ -23,10 +23,10 @@ static int exec_list(void); int bcm_accel_init(void) { - fb_fd = open("/dev/fb/0", O_RDWR); + fb_fd = open("/dev/fb0", O_RDWR); if (fb_fd < 0) { - perror("/dev/fb/0"); + perror("/dev/fb0"); return 1; } if (exec_list()) @@ -123,6 +123,51 @@ void bcm_accel_fill( int x, int y, int width, int height, unsigned long color) { -// printf("unimplemented bcm_accel_fill\n"); + C(0x43); // reset source + C(0x53); // reset dest + C(0x5b); // reset pattern + C(0x67); // reset blend + C(0x75); // reset output + + // clear dest surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x45); + + // clear src surface + P(0x0, 0); + P(0x1, 0); + P(0x2, 0); + P(0x3, 0); + P(0x4, 0); + C(0x5); + + P(0x2d, color); + + P(0x2e, x); // prepare output rect + P(0x2f, y); + P(0x30, width); + P(0x31, height); + C(0x6e); // set this rect as output rect + + P(0x0, dst_addr); // prepare output surface + P(0x1, dst_stride); + P(0x2, dst_width); + P(0x3, dst_height); + P(0x4, 0x7e48888); + C(0x69); // set output surface + + P(0x6f, 0); + P(0x70, 0); + P(0x71, 2); + P(0x72, 2); + C(0x73); // select color keying + + C(0x77); // do it + + exec_list(); } diff --git a/lib/gdi/epng.cpp b/lib/gdi/epng.cpp index 972a89d..fd33298 100644 --- a/lib/gdi/epng.cpp +++ b/lib/gdi/epng.cpp @@ -1,3 +1,4 @@ +#define PNG_SKIP_SETJMP_CHECK #include #include #include diff --git a/lib/gdi/fb.cpp b/lib/gdi/fb.cpp index cde3e35..7ee555c 100644 --- a/lib/gdi/fb.cpp +++ b/lib/gdi/fb.cpp @@ -83,12 +83,12 @@ nolfb: int fbClass::showConsole(int state) { - int fd=open("/dev/vc/0", O_RDWR); + int fd=open("/dev/tty0", O_RDWR); if(fd>=0) { if(ioctl(fd, KDSETMODE, state?KD_TEXT:KD_GRAPHICS)<0) { - eDebug("setting /dev/vc/0 status failed."); + eDebug("setting /dev/tty0 status failed."); } close(fd); } diff --git a/lib/gdi/fb.h b/lib/gdi/fb.h index 5447380..fcb5ff2 100644 --- a/lib/gdi/fb.h +++ b/lib/gdi/fb.h @@ -19,7 +19,7 @@ class fbClass int m_number_of_pages; int m_phys_mem; #ifdef SWIG - fbClass(const char *fb="/dev/fb/0"); + fbClass(const char *fb="/dev/fb0"); ~fbClass(); public: #else @@ -41,7 +41,7 @@ public: unsigned int Stride() { return stride; } fb_cmap *CMAP() { return &cmap; } - fbClass(const char *fb="/dev/fb/0"); + fbClass(const char *fb="/dev/fb0"); ~fbClass(); // low level gfx stuff diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index a5db43a..9e17547 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -15,12 +15,10 @@ // use this for init Freetype... #include #include FT_FREETYPE_H -#ifdef HAVE_FREETYPE2 #define FTC_Image_Cache_New(a,b) FTC_ImageCache_New(a,b) #define FTC_Image_Cache_Lookup(a,b,c,d) FTC_ImageCache_Lookup(a,b,c,d,NULL) #define FTC_SBit_Cache_New(a,b) FTC_SBitCache_New(a,b) #define FTC_SBit_Cache_Lookup(a,b,c,d) FTC_SBitCache_Lookup(a,b,c,d,NULL) -#endif #include #include @@ -29,12 +27,7 @@ #include #include -#define HAVE_FRIBIDI -// until we have it in the cdk - -#ifdef HAVE_FRIBIDI #include -#endif #include @@ -42,10 +35,6 @@ fontRenderClass *fontRenderClass::instance; static pthread_mutex_t ftlock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; -#ifndef HAVE_FREETYPE2 -static FTC_Font cache_current_font=0; -#endif - struct fntColorCacheKey { gRGB start, end; @@ -210,12 +199,8 @@ float fontRenderClass::getLineHeight(const gFont& font) return 0; singleLock s(ftlock); FT_Face current_face; -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(cacheManager, fnt->scaler.face_id, ¤t_face) < 0) || (FTC_Manager_LookupSize(cacheManager, &fnt->scaler, &fnt->size) < 0)) -#else - if (FTC_Manager_Lookup_Size(cacheManager, &fnt->font.font, ¤t_face, &fnt->size)<0) -#endif { eDebug("FTC_Manager_Lookup_Size failed!"); return 0; @@ -263,7 +248,6 @@ DEFINE_REF(Font); Font::Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tw): tabwidth(tw) { renderer=render; -#ifdef HAVE_FREETYPE2 font.face_id = faceid; font.width = isize; font.height = isize; @@ -272,12 +256,6 @@ Font::Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tw): tabwi scaler.width = isize; scaler.height = isize; scaler.pixel = 1; -#else - font.font.face_id=faceid; - font.font.pix_width = isize; - font.font.pix_height = isize; - font.image_type = ftc_image_grays; -#endif height=isize; if (tabwidth==-1) tabwidth=8*isize; @@ -474,18 +452,12 @@ void eTextPara::setFont(Font *fnt, Font *replacement) // we ask for replacment_font first becauseof the cache if (replacement_font) { -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, replacement_font->scaler.face_id, &replacement_face) < 0) || (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, &replacement_font->scaler, &replacement_font->size) < 0)) -#else - if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, - &replacement_font->font.font, &replacement_face, - &replacement_font->size)<0) -#endif { eDebug("FTC_Manager_Lookup_Size failed!"); return; @@ -493,24 +465,17 @@ void eTextPara::setFont(Font *fnt, Font *replacement) } if (current_font) { -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, current_font->scaler.face_id, ¤t_face) < 0) || (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, ¤t_font->scaler, ¤t_font->size) < 0)) -#else - if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) -#endif { eDebug("FTC_Manager_Lookup_Size failed!"); return; } } -#ifndef HAVE_FREETYPE2 - cache_current_font=¤t_font->font.font; -#endif previous=0; use_kerning=FT_HAS_KERNING(current_face); } @@ -525,7 +490,6 @@ int eTextPara::renderString(const char *string, int rflags) if (!current_font) return -1; -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, current_font->scaler.face_id, ¤t_face) < 0) || @@ -536,17 +500,6 @@ int eTextPara::renderString(const char *string, int rflags) eDebug("FTC_Manager_Lookup_Size failed!"); return -1; } -#else - if (¤t_font->font.font != cache_current_font) - { - if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) - { - eDebug("FTC_Manager_Lookup_Size failed!"); - return -1; - } - cache_current_font=¤t_font->font.font; - } -#endif if (!current_face) eFatal("eTextPara::renderString: no current_face"); @@ -610,7 +563,6 @@ int eTextPara::renderString(const char *string, int rflags) // now do the usual logical->visual reordering int size=uc_shape.size(); -#ifdef HAVE_FRIBIDI FriBidiCharType dir=FRIBIDI_TYPE_ON; uc_visual.resize(size); // gaaanz lahm, aber anders geht das leider nicht, sorry. @@ -618,9 +570,6 @@ int eTextPara::renderString(const char *string, int rflags) std::copy(uc_shape.begin(), uc_shape.end(), array); fribidi_log2vis(array, size, &dir, target, 0, 0, 0); uc_visual.assign(target, target+size); -#else - uc_visual=uc_shape; -#endif glyphs.reserve(size); @@ -714,13 +663,11 @@ nprint: isprintable=0; } bboxValid=false; calc_bbox(); -#ifdef HAVE_FRIBIDI if (dir & FRIBIDI_MASK_RTL) { realign(dirRight); doTopBottomReordering=true; } -#endif if (charCount) { @@ -739,7 +686,6 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons if (!current_font) return; -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, current_font->scaler.face_id, ¤t_face) < 0) || @@ -750,17 +696,6 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons eDebug("FTC_Manager_Lookup_Size failed!"); return; } -#else - if (¤t_font->font.font != cache_current_font) - { - if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) - { - eDebug("FTC_Manager_Lookup_Size failed!"); - return; - } - cache_current_font=¤t_font->font.font; - } -#endif ePtr target; dc.getPixmap(target); diff --git a/lib/gdi/font.h b/lib/gdi/font.h index 7dd9f89..6b82183 100644 --- a/lib/gdi/font.h +++ b/lib/gdi/font.h @@ -8,11 +8,9 @@ #include FT_CACHE_H #include FT_CACHE_IMAGE_H #include FT_CACHE_SMALL_BITMAPS_H -#ifdef HAVE_FREETYPE2 typedef FTC_ImageCache FTC_Image_Cache; typedef FTC_ImageTypeRec FTC_Image_Desc; typedef FTC_SBitCache FTC_SBit_Cache; -#endif #include #include @@ -191,9 +189,7 @@ class Font: public iObject { DECLARE_REF(Font); public: -#ifdef HAVE_FREETYPE2 FTC_ScalerRec scaler; -#endif FTC_Image_Desc font; fontRenderClass *renderer; FT_Error getGlyphBitmap(FT_ULong glyph_index, FTC_SBit *sbit); diff --git a/lib/gdi/gfbdc.cpp b/lib/gdi/gfbdc.cpp index 80dd247..a4f65eb 100644 --- a/lib/gdi/gfbdc.cpp +++ b/lib/gdi/gfbdc.cpp @@ -7,18 +7,8 @@ #include -gFBDC *gFBDC::instance; - -ePtr NewgFBDCPtr(void) -{ - ePtr ptr; - gFBDC::getInstance(ptr); - return ptr; -} - gFBDC::gFBDC() { - instance=this; fb=new fbClass; if (!fb->Available()) @@ -34,7 +24,6 @@ gFBDC::~gFBDC() { delete fb; delete[] surface.clut.data; - instance=0; } void gFBDC::calcRamp() @@ -91,7 +80,7 @@ void gFBDC::setPalette() fb->PutCMAP(); } -void gFBDC::exec(gOpcode *o) +void gFBDC::exec(const gOpcode *o) { switch (o->opcode) { @@ -242,7 +231,4 @@ void gFBDC::reloadSettings() setPalette(); } -// eAutoInitPtr init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC"); -#ifndef WITH_SDL eAutoInitPtr init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC"); -#endif diff --git a/lib/gdi/gfbdc.h b/lib/gdi/gfbdc.h index 23051c4..7f76d0c 100644 --- a/lib/gdi/gfbdc.h +++ b/lib/gdi/gfbdc.h @@ -3,17 +3,12 @@ #include "fb.h" #include "gpixmap.h" -#include "grc.h" +#include "gmaindc.h" -class gFBDC; - -SWIG_IGNORE(gFBDC); -class gFBDC: public gDC +class gFBDC: public gMainDC { -#ifndef SWIG fbClass *fb; - static gFBDC *instance; - void exec(gOpcode *opcode); + void exec(const gOpcode *opcode); unsigned char ramp[256], rampalpha[256]; // RGB ramp 0..255 int brightness, gamma, alpha; void calcRamp(); @@ -21,13 +16,8 @@ class gFBDC: public gDC gSurface surface, surface_back; int m_enable_double_buffering; int m_xres, m_yres; -#else - gFBDC(); - virtual ~gFBDC(); -#endif public: void setResolution(int xres, int yres); -#ifndef SWIG void reloadSettings(); void setAlpha(int alpha); void setBrightness(int brightness); @@ -43,17 +33,7 @@ public: gFBDC(); virtual ~gFBDC(); - static int getInstance(ePtr &ptr) { if (!instance) return -1; ptr = instance; return 0; } int islocked() { return fb->islocked(); } -#endif }; -SWIG_TEMPLATE_TYPEDEF(ePtr, gFBDC); -SWIG_EXTEND(ePtr, - static ePtr getInstance() - { - extern ePtr NewgFBDCPtr(void); - return NewgFBDCPtr(); - } -); #endif diff --git a/lib/gdi/glcddc.cpp b/lib/gdi/glcddc.cpp index a593cfa..bade53b 100644 --- a/lib/gdi/glcddc.cpp +++ b/lib/gdi/glcddc.cpp @@ -30,7 +30,7 @@ gLCDDC::~gLCDDC() instance=0; } -void gLCDDC::exec(gOpcode *o) +void gLCDDC::exec(const gOpcode *o) { switch (o->opcode) { diff --git a/lib/gdi/glcddc.h b/lib/gdi/glcddc.h index 6d5f383..a2b3c7f 100644 --- a/lib/gdi/glcddc.h +++ b/lib/gdi/glcddc.h @@ -9,7 +9,7 @@ class gLCDDC: public gDC eLCD *lcd; static gLCDDC *instance; int update; - void exec(gOpcode *opcode); + void exec(const gOpcode *opcode); gSurface surface; public: gLCDDC(); diff --git a/lib/gdi/gmaindc.cpp b/lib/gdi/gmaindc.cpp new file mode 100644 index 0000000..4890027 --- /dev/null +++ b/lib/gdi/gmaindc.cpp @@ -0,0 +1,28 @@ +#include + +gMainDC *gMainDC::m_instance; + +ePtr NewgMainDCPtr(void) +{ + ePtr ptr; + gMainDC::getInstance(ptr); + return ptr; +} + +gMainDC::gMainDC() +{ + ASSERT(m_instance == 0); + m_instance = this; +} + +gMainDC::gMainDC(gPixmap *pixmap) : gDC(pixmap) +{ + ASSERT(m_instance == 0); + m_instance = this; +} + +gMainDC::~gMainDC() +{ + m_instance = 0; +} + diff --git a/lib/gdi/gmaindc.h b/lib/gdi/gmaindc.h new file mode 100644 index 0000000..780be2e --- /dev/null +++ b/lib/gdi/gmaindc.h @@ -0,0 +1,33 @@ +#ifndef __lib_gdi_gmaindc_h +#define __lib_gdi_gmaindc_h + +#include "grc.h" + +class gMainDC; + +SWIG_IGNORE(gMainDC); +class gMainDC: public gDC +{ +protected: + static gMainDC *m_instance; + + gMainDC(); + gMainDC(gPixmap *pixmap); + virtual ~gMainDC(); +public: + virtual void setResolution(int xres, int yres) = 0; +#ifndef SWIG + static int getInstance(ePtr &ptr) { if (!m_instance) return -1; ptr = m_instance; return 0; } +#endif +}; + +SWIG_TEMPLATE_TYPEDEF(ePtr, gMainDC); +SWIG_EXTEND(ePtr, + static ePtr getInstance() + { + extern ePtr NewgMainDCPtr(void); + return NewgMainDCPtr(); + } +); + +#endif diff --git a/lib/gdi/grc.cpp b/lib/gdi/grc.cpp index dff6b05..a45b3b1 100644 --- a/lib/gdi/grc.cpp +++ b/lib/gdi/grc.cpp @@ -609,7 +609,7 @@ gDC::~gDC() delete[] m_spinner_pic; } -void gDC::exec(gOpcode *o) +void gDC::exec(const gOpcode *o) { switch (o->opcode) { diff --git a/lib/gdi/grc.h b/lib/gdi/grc.h index 3b8201a..38caa10 100644 --- a/lib/gdi/grc.h +++ b/lib/gdi/grc.h @@ -286,7 +286,7 @@ protected: eRect m_spinner_pos; int m_spinner_num, m_spinner_i; public: - virtual void exec(gOpcode *opcode); + virtual void exec(const gOpcode *opcode); gDC(gPixmap *pixmap); gDC(); virtual ~gDC(); @@ -296,10 +296,10 @@ public: virtual eSize size() { return m_pixmap->size(); } virtual int islocked() { return 0; } - void enableSpinner(); - void disableSpinner(); - void incrementSpinner(); - void setSpinner(eRect pos, ePtr *pic, int len); + virtual void enableSpinner(); + virtual void disableSpinner(); + virtual void incrementSpinner(); + virtual void setSpinner(eRect pos, ePtr *pic, int len); }; #endif diff --git a/lib/gdi/lcd.cpp b/lib/gdi/lcd.cpp index a7dc22d..518ee1b 100644 --- a/lib/gdi/lcd.cpp +++ b/lib/gdi/lcd.cpp @@ -4,8 +4,12 @@ #include #include +#if defined(HAVE_DBOX_FP_H) && defined(HAVE_DBOX_LCD_KS0713_H) #include #include +#else +#define NO_LCD 1 +#endif #include #include @@ -70,10 +74,6 @@ eDBoxLCD::eDBoxLCD() eDebug("found OLED display!"); is_oled = 1; } -#else - lcdfd = -1; -#endif - instance=this; if (lcdfd<0) eDebug("couldn't open LCD - load lcd.o!"); @@ -106,6 +106,9 @@ eDBoxLCD::eDBoxLCD() is_oled = 3; } } +#endif + instance=this; + setSize(xres, yres, bpp); } @@ -117,6 +120,7 @@ void eDBoxLCD::setInverted(unsigned char inv) int eDBoxLCD::setLCDContrast(int contrast) { +#ifndef NO_LCD int fp; if((fp=open("/dev/dbox/fp0", O_RDWR))<=0) { @@ -129,11 +133,13 @@ int eDBoxLCD::setLCDContrast(int contrast) eDebug("[LCD] can't set lcd contrast"); } close(fp); +#endif return(0); } int eDBoxLCD::setLCDBrightness(int brightness) { +#ifndef NO_LCD eDebug("setLCDBrightness %d", brightness); FILE *f=fopen("/proc/stb/lcd/oled_brightness", "w"); if (!f) @@ -157,6 +163,7 @@ int eDBoxLCD::setLCDBrightness(int brightness) eDebug("[LCD] can't set lcd brightness (%m)"); close(fp); } +#endif return(0); } diff --git a/lib/gdi/picexif.cpp b/lib/gdi/picexif.cpp index f9e8055..1eacc29 100644 --- a/lib/gdi/picexif.cpp +++ b/lib/gdi/picexif.cpp @@ -90,9 +90,9 @@ void Cexif::ClearExif() bool Cexif::DecodeExif(const char *filename, int Thumb) { + bool ret = false; FILE * hFile = fopen(filename, "r"); - if(!hFile) return false; - + if(!hFile) return ret; m_exifinfo = new EXIFINFO; memset(m_exifinfo,0,sizeof(EXIFINFO)); @@ -107,7 +107,8 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) int a = fgetc(hFile); strcpy(m_szLastError,"EXIF-Data not found"); - if (a != 0xff || fgetc(hFile) != M_SOI) return false; + if (a != 0xff || fgetc(hFile) != M_SOI) + goto decode_exif_out_false; for(;;) { @@ -117,7 +118,8 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) if (SectionsRead >= MAX_SECTIONS) { - strcpy(m_szLastError,"Too many sections in jpg file"); return false; + strcpy(m_szLastError,"Too many sections in jpg file"); + goto decode_exif_out_false; } for (a=0;a<7;a++) @@ -127,13 +129,15 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) if (a >= 6) { - strcpy(m_szLastError,"too many padding unsigned chars\n"); return false; + strcpy(m_szLastError,"too many padding unsigned chars\n"); + goto decode_exif_out_false; } } if (marker == 0xff) { - strcpy(m_szLastError,"too many padding unsigned chars!"); return false; + strcpy(m_szLastError,"too many padding unsigned chars!"); + goto decode_exif_out_false; } Sections[SectionsRead].Type = marker; @@ -145,14 +149,16 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) if (itemlen < 2) { - strcpy(m_szLastError,"invalid marker"); return false; + strcpy(m_szLastError,"invalid marker"); + goto decode_exif_out_false; } Sections[SectionsRead].Size = itemlen; Data = (unsigned char *)malloc(itemlen); if (Data == NULL) { - strcpy(m_szLastError,"Could not allocate memory"); return false; + strcpy(m_szLastError,"Could not allocate memory"); + goto decode_exif_out_false; } Sections[SectionsRead].Data = Data; @@ -163,17 +169,18 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) got = fread(Data+2, 1, itemlen-2,hFile); if (got != itemlen-2) { - strcpy(m_szLastError,"Premature end of file?"); return false; + strcpy(m_szLastError,"Premature end of file?"); + goto decode_exif_out_false; } SectionsRead += 1; switch(marker) { case M_SOS: - return true; + goto decode_exif_out_true; case M_EOI: printf("No image in jpeg!\n"); - return false; + goto decode_exif_out_false; case M_COM: if (HaveCom) { @@ -221,8 +228,12 @@ bool Cexif::DecodeExif(const char *filename, int Thumb) } } +decode_exif_out_true: + ret = true; + +decode_exif_out_false: fclose(hFile); - return true; + return ret; } bool Cexif::process_EXIF(unsigned char * CharBuf, unsigned int length) @@ -428,7 +439,7 @@ bool Cexif::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, case 6: strcpy(m_exifinfo->Orientation,"Right-Top"); break; case 7: strcpy(m_exifinfo->Orientation,"Right-Bottom"); break; case 8: strcpy(m_exifinfo->Orientation,"Left-Bottom"); break; - default: strcpy(m_exifinfo->Orientation,"Undefined rotation value"); + default: strcpy(m_exifinfo->Orientation,"Undefined"); break; } break; case TAG_EXIF_IMAGELENGTH: diff --git a/lib/gdi/picload.cpp b/lib/gdi/picload.cpp index c162f89..0ce10c0 100644 --- a/lib/gdi/picload.cpp +++ b/lib/gdi/picload.cpp @@ -1,4 +1,5 @@ -#include // must be included before Python.h because of setjmp +#define PNG_SKIP_SETJMP_CHECK +#include #include #include diff --git a/lib/gdi/sdl.cpp b/lib/gdi/sdl.cpp index 6dbdb67..eb4e2ae 100644 --- a/lib/gdi/sdl.cpp +++ b/lib/gdi/sdl.cpp @@ -1,80 +1,83 @@ -#ifdef WITH_SDL #include - +#include #include #include +#include +#include #include -gSDLDC *gSDLDC::m_instance; - -gSDLDC::gSDLDC() +gSDLDC::gSDLDC() : m_pump(eApp, 1) { - if (SDL_Init(SDL_INIT_VIDEO) < 0) - { + if (SDL_Init(SDL_INIT_VIDEO) < 0) { eWarning("Could not initialize SDL: %s", SDL_GetError()); return; } - - m_screen = SDL_SetVideoMode(720, 576, 32, SDL_HWSURFACE); - if (!m_screen) - { - eWarning("Could not create SDL surface: %s", SDL_GetError()); - return; - } - m_instance=this; - + setResolution(720, 576); + + CONNECT(m_pump.recv_msg, gSDLDC::pumpEvent); + m_surface.type = 0; - m_surface.x = m_screen->w; - m_surface.y = m_screen->h; - m_surface.bpp = m_screen->format->BitsPerPixel; - m_surface.bypp = m_screen->format->BytesPerPixel; - m_surface.stride = m_screen->pitch; - m_surface.data = m_screen->pixels; - m_surface.clut.colors=256; - m_surface.clut.data=new gRGB[m_surface.clut.colors]; - + m_surface.clut.colors = 256; + m_surface.clut.data = new gRGB[m_surface.clut.colors]; + m_pixmap = new gPixmap(&m_surface); - + memset(m_surface.clut.data, 0, sizeof(*m_surface.clut.data)*m_surface.clut.colors); + + run(); } gSDLDC::~gSDLDC() { + pushEvent(EV_QUIT); + kill(); SDL_Quit(); - m_instance=0; } -void gSDLDC::setPalette() +void gSDLDC::keyEvent(const SDL_Event &event) { - if (!m_surface.clut.data) - return; - -/* for (int i=0; i<256; ++i) - { - fb->CMAP()->red[i]=ramp[m_surface.clut.data[i].r]<<8; - fb->CMAP()->green[i]=ramp[m_surface.clut.data[i].g]<<8; - fb->CMAP()->blue[i]=ramp[m_surface.clut.data[i].b]<<8; - fb->CMAP()->transp[i]=rampalpha[m_surface.clut.data[i].a]<<8; - if (!fb->CMAP()->red[i]) - fb->CMAP()->red[i]=0x100; - } - fb->PutCMAP(); */ + eSDLInputDriver *driver = eSDLInputDriver::getInstance(); + + eDebug("SDL Key %s: key=%d", (event.type == SDL_KEYDOWN) ? "Down" : "Up", event.key.keysym.sym); + + if (driver) + driver->keyPressed(&event.key); } -void gSDLDC::exec(gOpcode *o) +void gSDLDC::pumpEvent(const SDL_Event &event) { - switch (o->opcode) - { - case gOpcode::setPalette: - { - gDC::exec(o); - setPalette(); + switch (event.type) { + case SDL_KEYDOWN: + case SDL_KEYUP: + keyEvent(event); + break; + case SDL_QUIT: + eDebug("SDL Quit"); + extern void quitMainloop(int exit_code); + quitMainloop(0); break; } +} + +void gSDLDC::pushEvent(enum event code, void *data1, void *data2) +{ + SDL_Event event; + + event.type = SDL_USEREVENT; + event.user.code = code; + event.user.data1 = data1; + event.user.data2 = data2; + + SDL_PushEvent(&event); +} + +void gSDLDC::exec(const gOpcode *o) +{ + switch (o->opcode) { case gOpcode::flush: - SDL_Flip(m_screen); + pushEvent(EV_FLIP); eDebug("FLUSH"); break; default: @@ -83,6 +86,68 @@ void gSDLDC::exec(gOpcode *o) } } -eAutoInitPtr init_gSDLDC(eAutoInitNumbers::graphic-1, "gSDLDC"); +void gSDLDC::setResolution(int xres, int yres) +{ + pushEvent(EV_SET_VIDEO_MODE, (void *)xres, (void *)yres); +} + +/* + * SDL thread below... + */ + +void gSDLDC::evSetVideoMode(unsigned long xres, unsigned long yres) +{ + m_screen = SDL_SetVideoMode(xres, yres, 32, SDL_HWSURFACE); + if (!m_screen) { + eFatal("Could not create SDL surface: %s", SDL_GetError()); + return; + } -#endif + m_surface.x = m_screen->w; + m_surface.y = m_screen->h; + m_surface.bpp = m_screen->format->BitsPerPixel; + m_surface.bypp = m_screen->format->BytesPerPixel; + m_surface.stride = m_screen->pitch; + m_surface.data = m_screen->pixels; + + SDL_EnableUNICODE(1); +} + +void gSDLDC::evFlip() +{ + SDL_Flip(m_screen); +} + +void gSDLDC::thread() +{ + hasStarted(); + + bool stop = false; + while (!stop) { + SDL_Event event; + if (SDL_WaitEvent(&event)) { + switch (event.type) { + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_QUIT: + m_pump.send(event); + break; + case SDL_USEREVENT: + switch (event.user.code) { + case EV_SET_VIDEO_MODE: + evSetVideoMode((unsigned long)event.user.data1, (unsigned long)event.user.data2); + break; + case EV_FLIP: + evFlip(); + break; + case EV_QUIT: + stop = true; + break; + } + break; + } + } + } +} + +eAutoInitPtr init_gSDLDC(eAutoInitNumbers::graphic-1, "gSDLDC"); diff --git a/lib/gdi/sdl.h b/lib/gdi/sdl.h index 20ff04f..6d016cf 100644 --- a/lib/gdi/sdl.h +++ b/lib/gdi/sdl.h @@ -1,27 +1,39 @@ #ifndef __lib_gdi_sdl_h #define __lib_gdi_sdl_h -#include "fb.h" -#include "gpixmap.h" -#include "grc.h" +#include +#include #include -class gSDLDC: public gDC +class gSDLDC: public gMainDC, public eThread, public Object { +private: SDL_Surface *m_screen; - static gSDLDC *m_instance; - void exec(gOpcode *opcode); + void exec(const gOpcode *opcode); - void setPalette(); gSurface m_surface; + + eFixedMessagePump m_pump; + void keyEvent(const SDL_Event &event); + void pumpEvent(const SDL_Event &event); + virtual void thread(); + + enum event { + EV_SET_VIDEO_MODE, + EV_FLIP, + EV_QUIT, + }; + + void pushEvent(enum event code, void *data1 = 0, void *data2 = 0); + void evSetVideoMode(unsigned long xres, unsigned long yres); + void evFlip(); + public: - + void setResolution(int xres, int yres); gSDLDC(); virtual ~gSDLDC(); - static int getInstance(ePtr &ptr) { if (!m_instance) return -1; ptr = m_instance; return 0; } int islocked() { return 0; } }; - #endif diff --git a/lib/gui/Makefile.am b/lib/gui/Makefile.am index f4de9d1..9d31bf7 100644 --- a/lib/gui/Makefile.am +++ b/lib/gui/Makefile.am @@ -1,11 +1,50 @@ -INCLUDES = \ +AM_CPPFLAGS = \ + -I$(top_srcdir) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/src + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_gui.a libenigma_gui_a_SOURCES = \ - ebutton.cpp elabel.cpp eslider.cpp ewidget.cpp ewidgetdesktop.cpp \ - ewindow.cpp ewindowstyle.cpp elistbox.cpp elistboxcontent.cpp \ - epixmap.cpp ewindowstyleskinned.cpp einput.cpp einputstring.cpp einputnumber.cpp \ - ewidgetanimation.cpp epositiongauge.cpp evideo.cpp esubtitle.cpp ecanvas.cpp + ebutton.cpp \ + ecanvas.cpp \ + einput.cpp \ + einputnumber.cpp \ + einputstring.cpp \ + elabel.cpp \ + elistbox.cpp \ + elistboxcontent.cpp \ + epixmap.cpp \ + epositiongauge.cpp \ + eslider.cpp \ + esubtitle.cpp \ + evideo.cpp \ + ewidget.cpp \ + ewidgetanimation.cpp \ + ewidgetdesktop.cpp \ + ewindow.cpp \ + ewindowstyle.cpp \ + ewindowstyleskinned.cpp + +guiincludedir = $(pkgincludedir)/lib/gui +guiinclude_HEADERS = \ + ebutton.h \ + ecanvas.h \ + einput.h \ + einputnumber.h \ + einputstring.h \ + elabel.h \ + elistbox.h \ + elistboxcontent.h \ + epixmap.h \ + epositiongauge.h \ + eslider.h \ + esubtitle.h \ + evideo.h \ + ewidget.h \ + ewidgetanimation.h \ + ewidgetdesktop.h \ + ewindow.h \ + ewindowstyle.h \ + ewindowstyleskinned.h diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp index 43fbc59..ba0794e 100644 --- a/lib/gui/elistboxcontent.cpp +++ b/lib/gui/elistboxcontent.cpp @@ -501,6 +501,7 @@ eListboxPythonMultiContent::~eListboxPythonMultiContent() { Py_XDECREF(m_buildFunc); Py_XDECREF(m_selectableFunc); + Py_XDECREF(m_template); } void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update) @@ -640,7 +641,8 @@ static ePyObject lookupColor(ePyObject color, ePyObject data) if ((icolor & 0xFF000000) == 0xFF000000) { int index = icolor & 0xFFFFFF; - eDebug("[eListboxPythonMultiContent] template color index: %d", index); + if (PyTuple_GetItem(data, index) == Py_None) + return ePyObject(); return PyTuple_GetItem(data, index); } @@ -967,6 +969,9 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c if (ppixmap) { ePtr pixmap; + if (PyInt_Check(ppixmap) && data) /* if the pixmap is in fact a number, it refers to the data list */ + ppixmap = PyTuple_GetItem(data, PyInt_AsLong(ppixmap)); + if (SwigFromPython(pixmap, ppixmap)) { eDebug("eListboxPythonMultiContent (Pixmap) get pixmap failed"); @@ -1155,5 +1160,7 @@ void eListboxPythonMultiContent::entryRemoved(int idx) void eListboxPythonMultiContent::setTemplate(ePyObject tmplate) { + Py_XDECREF(m_template); m_template = tmplate; + Py_XINCREF(m_template); } diff --git a/lib/gui/epositiongauge.cpp b/lib/gui/epositiongauge.cpp index ff98c08..e45d4a6 100644 --- a/lib/gui/epositiongauge.cpp +++ b/lib/gui/epositiongauge.cpp @@ -112,6 +112,7 @@ int ePositionGauge::event(int event, void *data, void *data2) // painter.fill(eRect(0, 10, s.width(), s.height()-20)); pts_t in = 0, out = 0; + int xm, xm_last = -1; std::multiset::iterator i(m_cue_entries.begin()); @@ -126,17 +127,22 @@ int ePositionGauge::event(int event, void *data, void *data2) continue; } else if (i->what == 1) /* out */ out = i++->where; - else if (i->what == 2) /* mark */ + else /* mark or last */ { - int xm = scale(i->where); - painter.setForegroundColor(gRGB(0xFF8080)); - painter.fill(eRect(xm - 2, 0, 4, s.height())); + xm = scale(i->where); + if (i->what == 2) { + painter.setForegroundColor(gRGB(0xFF8080)); + if (xm - 2 < xm_last) /* Make sure last is not overdrawn */ + painter.fill(eRect(xm_last, 0, 2 + xm - xm_last, s.height())); + else + painter.fill(eRect(xm - 2, 0, 4, s.height())); + } else if (i->what == 3) { + painter.setForegroundColor(gRGB(0x80FF80)); + painter.fill(eRect(xm - 1, 0, 3, s.height())); + xm_last = xm + 2; + } i++; continue; - } else /* other marker, like last position */ - { - ++i; - continue; } } diff --git a/lib/gui/esubtitle.h b/lib/gui/esubtitle.h index 45345db..cdad728 100644 --- a/lib/gui/esubtitle.h +++ b/lib/gui/esubtitle.h @@ -23,15 +23,21 @@ struct ePangoSubtitlePageElement struct ePangoSubtitlePage { - pts_t show_pts; + pts_t m_show_pts; int m_timeout; /* in milliseconds */ std::vector m_elements; void clear() { m_elements.clear(); } }; +struct eVobSubtitlePage +{ + pts_t m_show_pts; + int m_timeout; /* in milliseconds */ + ePtr m_pixmap; +}; + class eDVBTeletextSubtitlePage; -class eDVBPangoSubtitlePage; -class ePangoSubtitlePage; +class eDVBSubtitlePage; class eSubtitleWidget: public eWidget, public Object { diff --git a/lib/gui/ewidgetdesktop.cpp b/lib/gui/ewidgetdesktop.cpp index 98bc1f7..08bd047 100644 --- a/lib/gui/ewidgetdesktop.cpp +++ b/lib/gui/ewidgetdesktop.cpp @@ -381,7 +381,10 @@ void eWidgetDesktop::makeCompatiblePixmap(gPixmap &pm) ePtr target_pixmap; m_screen.m_dc->getPixmap(target_pixmap); - ASSERT(target_pixmap); + if (!target_pixmap) { + eDebug("no target pixmap! assuming bpp > 8 for accelerated graphics."); + return; + } if (target_pixmap->surface && target_pixmap->surface->bpp > 8) return; diff --git a/lib/gui/ewindowstyle.cpp b/lib/gui/ewindowstyle.cpp index 68a74e0..0ecdc2a 100644 --- a/lib/gui/ewindowstyle.cpp +++ b/lib/gui/ewindowstyle.cpp @@ -28,7 +28,9 @@ eWindowStyleManager::~eWindowStyleManager() void eWindowStyleManager::getStyle(int style_id, ePtr &style) { - style = m_current_style[style_id]; + std::map >::iterator it = m_current_style.find(style_id); + ASSERT(it != m_current_style.end()); + style = it->second; } void eWindowStyleManager::setStyle(int style_id, eWindowStyle *style) diff --git a/lib/mmi/Makefile.am b/lib/mmi/Makefile.am index 020c988..392c52c 100644 --- a/lib/mmi/Makefile.am +++ b/lib/mmi/Makefile.am @@ -1,6 +1,14 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_mmi.a -libenigma_mmi_a_SOURCES = mmi_ui.cpp +libenigma_mmi_a_SOURCES = \ + mmi_ui.cpp + +mmiincludedir = $(pkgincludedir)/lib/mmi +mmiinclude_HEADERS = \ + mmi_ui.h diff --git a/lib/nav/Makefile.am b/lib/nav/Makefile.am index 0320cb2..3d57d6a 100644 --- a/lib/nav/Makefile.am +++ b/lib/nav/Makefile.am @@ -1,9 +1,16 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h noinst_LIBRARIES = libenigma_nav.a libenigma_nav_a_SOURCES = \ - core.cpp pcore.cpp - + core.cpp \ + pcore.cpp +navincludedir = $(pkgincludedir)/lib/nav +navinclude_HEADERS = \ + core.h \ + pcore.h diff --git a/lib/python/.gitignore b/lib/python/.gitignore new file mode 100644 index 0000000..c1fa59f --- /dev/null +++ b/lib/python/.gitignore @@ -0,0 +1,2 @@ +enigma.py +enigma_python.cpp diff --git a/lib/python/Components/Converter/Makefile.am b/lib/python/Components/Converter/Makefile.am index 3b6fd3e..b73f6d5 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 SensorToText.py + Combine.py SensorToText.py ValueToPixmap.py diff --git a/lib/python/Components/Converter/ValueToPixmap.py b/lib/python/Components/Converter/ValueToPixmap.py new file mode 100644 index 0000000..0acd263 --- /dev/null +++ b/lib/python/Components/Converter/ValueToPixmap.py @@ -0,0 +1,40 @@ +from Components.Converter.Converter import Converter +from Components.Element import cached, ElementError +from Tools.Directories import fileExists, SCOPE_SKIN_IMAGE, SCOPE_CURRENT_SKIN, resolveFilename +from Tools.LoadPixmap import LoadPixmap + + +class ValueToPixmap(Converter, object): + LANGUAGE_CODE = 0 + PATH = 1 + + def __init__(self, type): + Converter.__init__(self, type) + if type == "LanguageCode": + self.type = self.LANGUAGE_CODE + elif type == "Path": + self.type = self.PATH + else: + raise ElementError("'%s' is not for ValueToPixmap converter" % type) + + @cached + def getPixmap(self): + if self.source: + val = self.source.text + if val in (None, ""): + return None + if self.type == self.PATH: + return LoadPixmap(val) + if self.type == self.LANGUAGE_CODE: + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "countries/" + val[3:].lower() + ".png")) + if png == None: + png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "countries/missing.png")) + return png + return None + + pixmap = property(getPixmap) + + def changed(self, what): + if what[0] != self.CHANGED_SPECIFIC or what[1] == self.type: + Converter.changed(self, what) + diff --git a/lib/python/Components/DreamInfoHandler.py b/lib/python/Components/DreamInfoHandler.py index 03d5215..8097365 100755 --- a/lib/python/Components/DreamInfoHandler.py +++ b/lib/python/Components/DreamInfoHandler.py @@ -84,6 +84,8 @@ class InfoHandler(xml.sax.ContentHandler): self.attributes["packagename"] = str(attrs["packagename"]) if attrs.has_key("packagetype"): self.attributes["packagetype"] = str(attrs["packagetype"]) + if attrs.has_key("needsRestart"): + self.attributes["needsRestart"] = str(attrs["needsRestart"]) if attrs.has_key("shortdescription"): self.attributes["shortdescription"] = str(attrs["shortdescription"]) @@ -120,6 +122,8 @@ class InfoHandler(xml.sax.ContentHandler): self.attributes["name"] = str(data) if self.elements[-1] == "packagename": self.attributes["packagename"] = str(data) + if self.elements[-1] == "needsRestart": + self.attributes["needsRestart"] = str(data) if self.elements[-1] == "shortdescription": self.attributes["shortdescription"] = str(data) if self.elements[-1] == "description": @@ -397,7 +401,7 @@ class DreamInfoHandler: def installIPK(self, directory, name): if self.blocking: - os.system("ipkg install " + directory + name) + os.system("opkg install " + directory + name) self.installNext() else: self.ipkg = IpkgComponent() diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index 1d71514..1b7e81f 100755 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -28,7 +28,8 @@ EXTENSIONS = { "mpeg": "movie", "mkv": "movie", "mp4": "movie", - "mov": "movie" + "mov": "movie", + "m2ts": "movie", } def FileEntryComponent(name, absolute = None, isDir = False): diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py old mode 100755 new mode 100644 index e8e612a..30a7b60 --- a/lib/python/Components/Harddisk.py +++ b/lib/python/Components/Harddisk.py @@ -5,23 +5,27 @@ from SystemInfo import SystemInfo import time from Components.Console import Console +def MajorMinor(path): + rdev = stat(path).st_rdev + return (major(rdev),minor(rdev)) + def readFile(filename): file = open(filename) data = file.read().strip() file.close() return data -class Harddisk: - DEVTYPE_UDEV = 0 - DEVTYPE_DEVFS = 1 +DEVTYPE_UDEV = 0 +DEVTYPE_DEVFS = 1 +class Harddisk: def __init__(self, device): self.device = device if access("/dev/.udev", 0): - self.type = self.DEVTYPE_UDEV + self.type = DEVTYPE_UDEV elif access("/dev/.devfsd", 0): - self.type = self.DEVTYPE_DEVFS + self.type = DEVTYPE_DEVFS else: print "Unable to determine structure of /dev" @@ -33,11 +37,11 @@ class Harddisk: self.disk_path = '' self.phys_path = path.realpath(self.sysfsPath('device')) - if self.type == self.DEVTYPE_UDEV: + if self.type == DEVTYPE_UDEV: self.dev_path = '/dev/' + self.device self.disk_path = self.dev_path - elif self.type == self.DEVTYPE_DEVFS: + elif self.type == DEVTYPE_DEVFS: tmp = readFile(self.sysfsPath('dev')).split(':') s_major = int(tmp[0]) s_minor = int(tmp[1]) @@ -60,9 +64,9 @@ class Harddisk: return self.device < ob.device def partitionPath(self, n): - if self.type == self.DEVTYPE_UDEV: + if self.type == DEVTYPE_UDEV: return self.dev_path + n - elif self.type == self.DEVTYPE_DEVFS: + elif self.type == DEVTYPE_DEVFS: return self.dev_path + '/part' + n def sysfsPath(self, filename): @@ -75,9 +79,9 @@ class Harddisk: def bus(self): # CF (7025 specific) - if self.type == self.DEVTYPE_UDEV: + if self.type == DEVTYPE_UDEV: ide_cf = False # FIXME - elif self.type == self.DEVTYPE_DEVFS: + elif self.type == DEVTYPE_DEVFS: ide_cf = self.device[:2] == "hd" and "host0" not in self.dev_path internal = "pci" in self.phys_path @@ -125,18 +129,20 @@ class Harddisk: for line in lines: parts = line.strip().split(" ") - if path.realpath(parts[0]).startswith(self.dev_path): - try: + real_path = path.realpath(parts[0]) + if not real_path[-1].isdigit(): + continue + try: + if MajorMinor(real_path) == MajorMinor(self.partitionPath(real_path[-1])): stat = statvfs(parts[1]) - except OSError: - continue - return stat.f_bfree/1000 * stat.f_bsize/1000 - + return stat.f_bfree/1000 * stat.f_bsize/1000 + except OSError: + pass return -1 def numPartitions(self): numPart = -1 - if self.type == self.DEVTYPE_UDEV: + if self.type == DEVTYPE_UDEV: try: devdir = listdir('/dev') except OSError: @@ -145,7 +151,7 @@ class Harddisk: if filename.startswith(self.device): numPart += 1 - elif self.type == self.DEVTYPE_DEVFS: + elif self.type == DEVTYPE_DEVFS: try: idedir = listdir(self.dev_path) except OSError: @@ -168,16 +174,23 @@ class Harddisk: cmd = "umount" - for line in lines: - parts = line.strip().split(" ") - if path.realpath(parts[0]).startswith(self.dev_path): - cmd = ' ' . join([cmd, parts[1]]) + for line in lines: + parts = line.strip().split(" ") + real_path = path.realpath(parts[0]) + if not real_path[-1].isdigit(): + continue + try: + if MajorMinor(real_path) == MajorMinor(self.partitionPath(real_path[-1])): + cmd = ' ' . join([cmd, parts[1]]) + break + except OSError: + pass res = system(cmd) return (res >> 8) def createPartition(self): - cmd = 'printf "0,\n;\n;\n;\ny\n" | sfdisk -f ' + self.disk_path + cmd = 'printf "8,\n;0,0\n;0,0\n;0,0\ny\n" | sfdisk -f -uS ' + self.disk_path res = system(cmd) return (res >> 8) @@ -201,10 +214,16 @@ class Harddisk: res = -1 for line in lines: parts = line.strip().split(" ") - if path.realpath(parts[0]) == self.partitionPath("1"): - cmd = "mount -t ext3 " + parts[0] - res = system(cmd) - break + real_path = path.realpath(parts[0]) + if not real_path[-1].isdigit(): + continue + try: + if MajorMinor(real_path) == MajorMinor(self.partitionPath(real_path[-1])): + cmd = "mount -t ext3 " + parts[0] + res = system(cmd) + break + except OSError: + pass return (res >> 8) @@ -394,24 +413,38 @@ class Partition: return True return False -DEVICEDB = \ +DEVICEDB_SR = \ {"dm8000": { - # dm8000: - "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": "Front USB Slot", - "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0": "Back, upper USB Slot", - "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0": "Back, lower USB Slot", - "/devices/platform/brcm-ehci-1.1/usb2/2-1/2-1:1.0/host1/target1:0:0/1:0:0:0": "DVD Drive", + "/devices/pci0000:01/0000:01:00.0/host0/target0:0:0/0:0:0:0": _("DVD Drive"), + "/devices/pci0000:01/0000:01:00.0/host1/target1:0:0/1:0:0:0": _("DVD Drive"), + "/devices/platform/brcm-ehci-1.1/usb2/2-1/2-1:1.0/host3/target3:0:0/3:0:0:0": _("DVD Drive"), + }, + "dm800": + { + }, + "dm7025": + { + } + } + +DEVICEDB = \ + {"dm8000": + { + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": _("Front USB Slot"), + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0": _("Back, upper USB Slot"), + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.3/1-1.3:1.0": _("Back, lower USB Slot"), + "/devices/platform/brcm-ehci.0/usb1/1-1/1-1.1/1-1.1:1.0": _("Front USB Slot"), + "/devices/platform/brcm-ehci-1.1/usb2/2-1/2-1:1.0/": _("Internal USB Slot"), + "/devices/platform/brcm-ohci-1.1/usb4/4-1/4-1:1.0/": _("Internal USB Slot"), }, "dm800": { - # dm800: "/devices/platform/brcm-ehci.0/usb1/1-2/1-2:1.0": "Upper USB Slot", "/devices/platform/brcm-ehci.0/usb1/1-1/1-1:1.0": "Lower USB Slot", }, "dm7025": { - # dm7025: "/devices/pci0000:00/0000:00:14.1/ide1/1.0": "CF Card Slot", #hdc "/devices/pci0000:00/0000:00:14.1/ide0/0.0": "Internal Harddisk" } @@ -422,6 +455,7 @@ class HarddiskManager: self.hdd = [ ] self.cd = "" self.partitions = [ ] + self.devices_scanned_on_init = [ ] self.on_partition_list_change = CList() @@ -489,24 +523,23 @@ class HarddiskManager: def enumerateBlockDevices(self): print "enumerating block devices..." for blockdev in listdir("/sys/block"): - error, blacklisted, removable, is_cdrom, partitions, medium_found = self.getBlockDevInfo(blockdev) - print "found block device '%s':" % blockdev, - if error: - print "error querying properties" - elif blacklisted: - print "blacklisted" - elif not medium_found: - print "no medium" - else: - print "ok, removable=%s, cdrom=%s, partitions=%s, device=%s" % (removable, is_cdrom, partitions, blockdev) - - self.addHotplugPartition(blockdev) - for part in partitions: - self.addHotplugPartition(part) + error, blacklisted, removable, is_cdrom, partitions, medium_found = self.addHotplugPartition(blockdev) + if not error and not blacklisted: + if medium_found: + for part in partitions: + self.addHotplugPartition(part) + self.devices_scanned_on_init.append((blockdev, removable, is_cdrom, medium_found)) def getAutofsMountpoint(self, device): return "/autofs/%s/" % (device) + def is_hard_mounted(self, device): + mounts = file('/proc/mounts').read().split('\n') + for x in mounts: + if x.find('/autofs') == -1 and x.find(device) != -1: + return True + return False + def addHotplugPartition(self, device, physdev = None): if not physdev: dev, part = self.splitDeviceName(device) @@ -516,22 +549,36 @@ class HarddiskManager: physdev = dev print "couldn't determine blockdev physdev for device", device - # device is the device name, without /dev - # physdev is the physical device path, which we (might) use to determine the userfriendly name - description = self.getUserfriendlyDeviceName(device, physdev) + error, blacklisted, removable, is_cdrom, partitions, medium_found = self.getBlockDevInfo(device) + print "found block device '%s':" % device, - p = Partition(mountpoint = self.getAutofsMountpoint(device), description = description, force_mounted = True, device = device) - self.partitions.append(p) - self.on_partition_list_change("add", p) + if blacklisted: + print "blacklisted" + else: + if error: + print "error querying properties" + elif not medium_found: + print "no medium" + else: + print "ok, removable=%s, cdrom=%s, partitions=%s" % (removable, is_cdrom, partitions) + + l = len(device) + if l: + # see if this is a harddrive + if not device[l-1].isdigit() and not removable and not is_cdrom: + self.hdd.append(Harddisk(device)) + self.hdd.sort() + SystemInfo["Harddisk"] = len(self.hdd) > 0 + + if (not removable or medium_found) and not self.is_hard_mounted(device): + # device is the device name, without /dev + # physdev is the physical device path, which we (might) use to determine the userfriendly name + description = self.getUserfriendlyDeviceName(device, physdev) + p = Partition(mountpoint = self.getAutofsMountpoint(device), description = description, force_mounted = True, device = device) + self.partitions.append(p) + self.on_partition_list_change("add", p) - # see if this is a harddrive - l = len(device) - if l and not device[l-1].isdigit(): - error, blacklisted, removable, is_cdrom, partitions, medium_found = self.getBlockDevInfo(device) - if not blacklisted and not removable and not is_cdrom and medium_found: - self.hdd.append(Harddisk(device)) - self.hdd.sort() - SystemInfo["Harddisk"] = len(self.hdd) > 0 + return error, blacklisted, removable, is_cdrom, partitions, medium_found def removeHotplugPartition(self, device): mountpoint = self.getAutofsMountpoint(device) @@ -589,15 +636,23 @@ class HarddiskManager: def getUserfriendlyDeviceName(self, dev, phys): dev, part = self.splitDeviceName(dev) description = "External Storage %s" % dev + have_model_descr = False try: description = readFile("/sys" + phys + "/model") + have_model_descr = True except IOError, s: print "couldn't read model: ", s from Tools.HardwareInfo import HardwareInfo - for physdevprefix, pdescription in DEVICEDB.get(HardwareInfo().device_name,{}).items(): + if dev.find('sr') == 0 and dev[2].isdigit(): + devicedb = DEVICEDB_SR + else: + devicedb = DEVICEDB + for physdevprefix, pdescription in devicedb.get(HardwareInfo().device_name,{}).items(): if phys.startswith(physdevprefix): - description = pdescription - + if have_model_descr: + description = pdescription + ' - ' + description + else: + description = pdescription # not wholedisk and not partition 1 if part and part != 1: description += " (Partition %d)" % part diff --git a/lib/python/Components/Ipkg.py b/lib/python/Components/Ipkg.py index 7144777..cc55965 100755 --- a/lib/python/Components/Ipkg.py +++ b/lib/python/Components/Ipkg.py @@ -19,9 +19,8 @@ class IpkgComponent: CMD_UPDATE = 3 CMD_UPGRADE = 4 - def __init__(self, ipkg = '/usr/bin/ipkg'): + def __init__(self, ipkg = 'opkg'): self.ipkg = ipkg - self.opkgAvail = fileExists('/usr/bin/opkg') self.cmd = eConsoleAppContainer() self.cache = None self.callbackList = [] @@ -90,10 +89,7 @@ class IpkgComponent: if data.find('Downloading') == 0: self.callCallbacks(self.EVENT_DOWNLOAD, data.split(' ', 5)[1].strip()) elif data.find('Upgrading') == 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]) + 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/Keyboard.py b/lib/python/Components/Keyboard.py index 820d103..b026cd5 100755 --- a/lib/python/Components/Keyboard.py +++ b/lib/python/Components/Keyboard.py @@ -1,6 +1,7 @@ from Components.Console import Console from os import listdir as os_listdir, path as os_path from re import compile as re_compile +from enigma import eEnv class Keyboard: def __init__(self): @@ -8,9 +9,9 @@ class Keyboard: self.readKeyboardMapFiles() def readKeyboardMapFiles(self): - for keymapfile in os_listdir('/usr/share/keymaps/'): + for keymapfile in os_listdir(eEnv.resolve('${datadir}/keymaps/')): if (keymapfile.endswith(".info")): - f = open('/usr/share/keymaps/' + keymapfile) + f = open(eEnv.resolve('${datadir}/keymaps/') + keymapfile) mapfile = None mapname = None for line in f: @@ -32,7 +33,7 @@ class Keyboard: try: keymap = self.keyboardmaps[index] print "Activating keymap:",keymap[1] - keymappath = '/usr/share/keymaps/' + keymap[0] + keymappath = eEnv.resolve('${datadir}/keymaps/') + keymap[0] if os_path.exists(keymappath): Console().ePopen(("loadkmap < " + str(keymappath))) except: diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index e980cb8..eee5a70 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -20,9 +20,8 @@ class Network: self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() - self.deactivateConsole = Console() self.deactivateInterfaceConsole = Console() - self.activateConsole = Console() + self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() @@ -30,37 +29,29 @@ class Network: self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] + self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): - fp = file('/proc/mounts', 'r') - mounts = fp.readlines() - fp.close() - for line in mounts: - parts = line.strip().split(' ') - if parts[1] == '/' and (parts[2] == 'nfs' or parts[2] == 'smbfs'): - return True - return False + if self.remoteRootFS == None: + fp = file('/proc/mounts', 'r') + mounts = fp.readlines() + fp.close() + self.remoteRootFS = False + for line in mounts: + parts = line.strip().split() + if parts[1] == '/' and parts[2] == 'nfs': + self.remoteRootFS = True + break + return self.remoteRootFS + + def isBlacklisted(self, iface): + return iface in ('lo', 'wifi0', 'wmaster0') def getInterfaces(self, callback = None): - devicesPattern = re_compile('[a-z]+[0-9]+') self.configuredInterfaces = [] - fp = file('/proc/net/dev', 'r') - result = fp.readlines() - fp.close() - for line in result: - try: - device = devicesPattern.search(line).group() - if device in ('wifi0', 'wmaster0'): - continue - self.getDataForInterface(device, callback) - except AttributeError: - pass - #print "self.ifaces:", self.ifaces - #self.writeNetworkConfig() - #print ord(' ') - #for line in result: - # print ord(line[0]) + for device in self.getInstalledAdapters(): + self.getAddrInet(device, callback) # helper function def regExpMatch(self, pattern, string): @@ -69,37 +60,32 @@ class Network: try: return pattern.search(string).group() except AttributeError: - None + return None # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): - strIP = ip.split('.') - ip = [] - for x in strIP: - ip.append(int(x)) - return ip - - def getDataForInterface(self, iface,callback): - #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. + return [ int(n) for n in ip.split('.') ] + + def getAddrInet(self, iface, callback): if not self.Console: self.Console = Console() - cmd = "ip -o addr" + cmd = "ip -o addr show dev " + iface self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args - data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False } + data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : False } globalIPpattern = re_compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' - macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' + macRegexp = '[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}' ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) netmaskLinePattern = re_compile('/' + netRegexp) netmaskPattern = re_compile(netRegexp) bcastLinePattern = re_compile(' brd ' + ipRegexp) upPattern = re_compile('UP') - macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}') + macPattern = re_compile(macRegexp) macLinePattern = re_compile('link/ether ' + macRegexp) for line in result.splitlines(): @@ -144,7 +130,7 @@ class Network: print line[0:7] if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) - if gateway is not None: + if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data @@ -171,12 +157,14 @@ class Network: if iface.has_key('gateway'): fp.write(" gateway %d.%d.%d.%d\n" % tuple(iface['gateway'])) if iface.has_key("configStrings"): - fp.write("\n" + iface["configStrings"] + "\n") + fp.write(iface["configStrings"]) if iface["preup"] is not False and not iface.has_key("configStrings"): fp.write(iface["preup"]) - fp.write(iface["postdown"]) + if iface["predown"] is not False and not iface.has_key("configStrings"): + fp.write(iface["predown"]) fp.write("\n") fp.close() + self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): @@ -225,9 +213,9 @@ class Network: if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i - if (split[0] == "post-down"): - if self.ifaces[currif].has_key("postdown"): - self.ifaces[currif]["postdown"] = i + if (split[0] in ("pre-down","post-down")): + if self.ifaces[currif].has_key("predown"): + self.ifaces[currif]["predown"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): @@ -262,49 +250,13 @@ class Network: for line in resolv: if self.regExpMatch(nameserverPattern, line) is not None: ip = self.regExpMatch(ipPattern, line) - if ip is not None: + if ip: self.nameservers.append(self.convertIP(ip)) print "nameservers:", self.nameservers - def deactivateNetworkConfig(self, callback = None): - if self.onRemoteRootFS(): - if callback is not None: - callback(True) - return - self.deactivateConsole = Console() - self.commands = [] - self.commands.append("/etc/init.d/avahi-daemon stop") - for iface in self.ifaces.keys(): - cmd = "ip addr flush " + iface - self.commands.append(cmd) - self.commands.append("/etc/init.d/networking stop") - self.commands.append("killall -9 udhcpc") - self.commands.append("rm /var/run/udhcpc*") - self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True) - - def deactivateNetworkFinished(self,extra_args): - callback = extra_args - if len(self.deactivateConsole.appContainers) == 0: - if callback is not None: - callback(True) - - def activateNetworkConfig(self, callback = None): - if self.onRemoteRootFS(): - if callback is not None: - callback(True) - return - self.activateConsole = Console() - self.commands = [] - self.commands.append("/etc/init.d/networking start") - self.commands.append("/etc/init.d/avahi-daemon start") - self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True) - - def activateNetworkFinished(self,extra_args): - callback = extra_args - if len(self.activateConsole.appContainers) == 0: - if callback is not None: - callback(True) + def getInstalledAdapters(self): + return [x for x in listdir('/sys/class/net') if not self.isBlacklisted(x)] def getConfiguredAdapters(self): return self.configuredNetworkAdapters @@ -315,47 +267,44 @@ class Network: def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) - else: - self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) - return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name + self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) + return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): - if iface.startswith('eth'): - if iface not in self.lan_interfaces and len(self.lan_interfaces) == 0: - self.lan_interfaces.append(iface) - return _("LAN connection") - elif iface not in self.lan_interfaces and len(self.lan_interfaces) >= 1: - self.lan_interfaces.append(iface) - return _("LAN connection") + " " + str(len(self.lan_interfaces)) - else: - if iface not in self.wlan_interfaces and len(self.wlan_interfaces) == 0: + name = None + if self.isWirelessInterface(iface): + if iface not in self.wlan_interfaces: self.wlan_interfaces.append(iface) - return _("WLAN connection") - elif iface not in self.wlan_interfaces and len(self.wlan_interfaces) >= 1: - self.wlan_interfaces.append(iface) - return _("WLAN connection") + " " + str(len(self.wlan_interfaces)) - + name = _("WLAN connection") + if len(self.wlan_interfaces): + name += " " + str(len(self.wlan_interfaces)) + else: + if iface not in self.lan_interfaces: + self.lan_interfaces.append(iface) + name = _("LAN connection") + if len(self.lan_interfaces): + name += " " + str(len(self.lan_interfaces)) + return name + def getFriendlyAdapterDescription(self, iface): - if iface == 'eth0': - return _("Internal LAN adapter.") + if not self.isWirelessInterface(iface): + return _('Ethernet network interface') + + moduledir = self.getWlanModuleDir(iface) + if moduledir: + name = os_path.basename(os_path.realpath(moduledir)) + if name in ('ath_pci','ath5k'): + name = 'Atheros' + elif name in ('rt73','rt73usb','rt3070sta'): + name = 'Ralink' + elif name == 'zd1211b': + name = 'Zydas' + elif name == 'r871x_usb_drv': + name = 'Realtek' else: - classdir = "/sys/class/net/" + iface + "/device/" - driverdir = "/sys/class/net/" + iface + "/device/driver/" - if os_path.exists(classdir): - files = listdir(classdir) - if 'driver' in files: - if os_path.realpath(driverdir).endswith('ath_pci'): - return _("Atheros")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") - elif os_path.realpath(driverdir).endswith('zd1211b'): - return _("Zydas")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") - elif os_path.realpath(driverdir).endswith('rt73'): - return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") - elif os_path.realpath(driverdir).endswith('rt73usb'): - return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") - else: - return str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") - else: - return _("Unknown network adapter.") + name = _('Unknown') + + return name + ' ' + _('wireless network interface') def getAdapterName(self, iface): return iface @@ -403,16 +352,12 @@ class Network: self.nameservers[i] = newnameserver def resetNetworkConfig(self, mode='lan', callback = None): - if self.onRemoteRootFS(): - if callback is not None: - callback(True) - return self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): - cmd = "ip addr flush " + iface - self.commands.append(cmd) + if iface != 'eth0' or not self.onRemoteRootFS(): + self.commands.append("ip addr flush dev " + iface) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") @@ -486,18 +431,15 @@ class Network: statecallback(self.NetworkState) def restartNetwork(self,callback = None): - if self.onRemoteRootFS(): - if callback is not None: - callback(True) - return self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): - cmd = "ip addr flush " + iface - self.commands.append(cmd) + if iface != 'eth0' or not self.onRemoteRootFS(): + self.commands.append("ifdown " + iface) + self.commands.append("ip addr flush dev " + iface) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") @@ -554,9 +496,13 @@ class Network: def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: - if len(self.deactivateInterfaceConsole.appContainers): - for name in self.deactivateInterfaceConsole.appContainers.keys(): - self.deactivateInterfaceConsole.kill(name) + self.deactivateInterfaceConsole.killAll() + self.deactivateInterfaceConsole = None + + def stopActivateInterfaceConsole(self): + if self.activateInterfaceConsole is not None: + self.activateInterfaceConsole.killAll() + self.activateInterfaceConsole = None def checkforInterface(self,iface): if self.getAdapterAttribute(iface, 'up') is True: @@ -589,59 +535,138 @@ class Network: if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) - def deactivateInterface(self,iface,callback = None): - if self.onRemoteRootFS(): + def deactivateInterface(self,ifaces,callback = None): + self.config_ready = False + self.msgPlugins() + commands = [] + def buildCommands(iface): + commands.append("ifdown " + iface) + commands.append("ip addr flush dev " + iface) + #wpa_supplicant sometimes doesn't quit properly on SIGTERM + if os_path.exists('/var/run/wpa_supplicant/'+ iface): + commands.append("wpa_cli -i" + iface + " terminate") + + if not self.deactivateInterfaceConsole: + self.deactivateInterfaceConsole = Console() + + if isinstance(ifaces, (list, tuple)): + for iface in ifaces: + if iface != 'eth0' or not self.onRemoteRootFS(): + buildCommands(iface) + else: + if ifaces == 'eth0' and self.onRemoteRootFS(): + if callback is not None: + callback(True) + return + buildCommands(ifaces) + self.deactivateInterfaceConsole.eBatch(commands, self.deactivateInterfaceFinished, [ifaces,callback], debug=True) + + def deactivateInterfaceFinished(self,extra_args): + (ifaces, callback) = extra_args + def checkCommandResult(iface): + if self.deactivateInterfaceConsole and self.deactivateInterfaceConsole.appResults.has_key("ifdown " + iface): + result = str(self.deactivateInterfaceConsole.appResults.get("ifdown " + iface)).strip("\n") + if result == "ifdown: interface " + iface + " not configured": + return False + else: + return True + #ifdown sometimes can't get the interface down. + if isinstance(ifaces, (list, tuple)): + for iface in ifaces: + if checkCommandResult(iface) is False: + Console().ePopen(("ifconfig " + iface + " down" )) + else: + if checkCommandResult(ifaces) is False: + Console().ePopen(("ifconfig " + ifaces + " down" )) + + if self.deactivateInterfaceConsole: + if len(self.deactivateInterfaceConsole.appContainers) == 0: + if callback is not None: + callback(True) + + def activateInterface(self,iface,callback = None): + if self.config_ready: + self.config_ready = False + self.msgPlugins() + if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return - self.deactivateInterfaceConsole = Console() - self.commands = [] - cmd1 = "ip addr flush " + iface - cmd2 = "ifconfig " + iface + " down" - self.commands.append(cmd1) - self.commands.append(cmd2) - self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, callback, debug=True) + if not self.activateInterfaceConsole: + self.activateInterfaceConsole = Console() + commands = [] + commands.append("ifup " + iface) + self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) - def deactivateInterfaceFinished(self,extra_args): + def activateInterfaceFinished(self,extra_args): callback = extra_args - if self.deactivateInterfaceConsole: - if len(self.deactivateInterfaceConsole.appContainers) == 0: + if self.activateInterfaceConsole: + if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) + def sysfsPath(self, iface): + return '/sys/class/net/' + iface + + def isWirelessInterface(self, iface): + if iface in self.wlan_interfaces: + return True + + if os_path.isdir(self.sysfsPath(iface) + '/wireless'): + return True + + # r871x_usb_drv on kernel 2.6.12 is not identifiable over /sys/class/net/'ifacename'/wireless so look also inside /proc/net/wireless + device = re_compile('[a-z]{2,}[0-9]*:') + ifnames = [] + fp = open('/proc/net/wireless', 'r') + for line in fp: + try: + ifnames.append(device.search(line).group()[:-1]) + except AttributeError: + pass + if iface in ifnames: + return True + + return False + + def getWlanModuleDir(self, iface = None): + devicedir = self.sysfsPath(iface) + '/device' + moduledir = devicedir + '/driver/module' + if os_path.isdir(moduledir): + return moduledir + + # identification is not possible over default moduledir + for x in listdir(devicedir): + # rt3070 on kernel 2.6.18 registers wireless devices as usb_device (e.g. 1-1.3:1.0) and identification is only possible over /sys/class/net/'ifacename'/device/1-xxx + if x.startswith("1-"): + moduledir = devicedir + '/' + x + '/driver/module' + if os_path.isdir(moduledir): + return moduledir + # rt73, zd1211b, r871x_usb_drv on kernel 2.6.12 can be identified over /sys/class/net/'ifacename'/device/driver, so look also here + moduledir = devicedir + '/driver' + if os_path.isdir(moduledir): + return moduledir + + return None + def detectWlanModule(self, iface = None): - self.wlanmodule = None - classdir = "/sys/class/net/" + iface + "/device/" - driverdir = "/sys/class/net/" + iface + "/device/driver/" - if os_path.exists(classdir): - classfiles = listdir(classdir) - driver_found = False - nl80211_found = False - for x in classfiles: - if x == 'driver': - driver_found = True - if x.startswith('ieee80211:'): - nl80211_found = True - - if driver_found and nl80211_found: - #print about.getKernelVersionString() - self.wlanmodule = "nl80211" - else: - if driver_found and not nl80211_found: - driverfiles = listdir(driverdir) - if os_path.realpath(driverdir).endswith('ath_pci'): - if len(driverfiles) >= 1: - self.wlanmodule = 'madwifi' - if os_path.realpath(driverdir).endswith('rt73'): - if len(driverfiles) == 2 or len(driverfiles) == 5: - self.wlanmodule = 'ralink' - if os_path.realpath(driverdir).endswith('zd1211b'): - if len(driverfiles) == 1 or len(driverfiles) == 5: - self.wlanmodule = 'zydas' - if self.wlanmodule is None: - self.wlanmodule = "wext" - print 'Using "%s" as wpa-supplicant driver' % (self.wlanmodule) - return self.wlanmodule + if not self.isWirelessInterface(iface): + return None + + devicedir = self.sysfsPath(iface) + '/device' + if os_path.isdir(devicedir + '/ieee80211'): + return 'nl80211' + + moduledir = self.getWlanModuleDir(iface) + if moduledir: + module = os_path.basename(os_path.realpath(moduledir)) + if module in ('ath_pci','ath5k'): + return 'madwifi' + if module in ('rt73','rt73'): + return 'ralink' + if module == 'zd1211b': + return 'zydas' + return 'wext' def calc_netmask(self,nmask): from struct import pack, unpack diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py index 7303186..bd1a363 100644 --- a/lib/python/Components/NimManager.py +++ b/lib/python/Components/NimManager.py @@ -10,7 +10,7 @@ from enigma import eDVBSatelliteEquipmentControl as secClass, \ eDVBSatelliteDiseqcParameters as diseqcParam, \ eDVBSatelliteSwitchParameters as switchParam, \ eDVBSatelliteRotorParameters as rotorParam, \ - eDVBResourceManager, eDVBDB + eDVBResourceManager, eDVBDB, eEnv from time import localtime, mktime from datetime import datetime @@ -390,6 +390,7 @@ class SecConfigure: if currLnb.diseqcMode.value == "1_0": currCO = currLnb.commandOrder1_0.value + sec.setRepeats(0) else: currCO = currLnb.commandOrder.value @@ -1082,7 +1083,7 @@ def InitNimManager(nimmgr): unicablelnbproducts = {} unicablematrixproducts = {} - doc = xml.etree.cElementTree.parse("/usr/share/enigma2/unicable.xml") + doc = xml.etree.cElementTree.parse(eEnv.resolve("${datadir}/enigma2/unicable.xml")) root = doc.getroot() entry = root.find("lnb") @@ -1360,25 +1361,32 @@ def InitNimManager(nimmgr): 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) - try: - oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline() - open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0") - except: - print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" - frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend() - frontend.closeFrontend() - open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value) - frontend.reopenFrontend() - try: - open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue) - except: - print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" - nimmgr.enumerateNIMs() - + + cur_type = int(open("/proc/stb/frontend/%d/mode" % (fe_id), "r").read()) + if cur_type != int(configElement.value): + print "tunerTypeChanged feid %d from %d to mode %d" % (fe_id, cur_type, int(configElement.value)) + + try: + oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline() + open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0") + except: + print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" + + frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend() + frontend.closeFrontend() + open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value) + frontend.reopenFrontend() + try: + open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue) + except: + print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" + nimmgr.enumerateNIMs() + else: + print "tuner type is already already %d" %cur_type + empty_slots = 0 for slot in nimmgr.nim_slots: x = slot.slot diff --git a/lib/python/Components/ParentalControlList.py b/lib/python/Components/ParentalControlList.py index 797ea39..0e65257 100644 --- a/lib/python/Components/ParentalControlList.py +++ b/lib/python/Components/ParentalControlList.py @@ -1,5 +1,5 @@ from MenuList import MenuList -from Components.ParentalControl import parentalControl, IMG_WHITESERVICE, IMG_WHITEBOUQUET, IMG_BLACKSERVICE, IMG_BLACKBOUQUET +from Components.ParentalControl import IMG_WHITESERVICE, IMG_WHITEBOUQUET, IMG_BLACKSERVICE, IMG_BLACKBOUQUET from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT @@ -32,13 +32,14 @@ class ParentalControlList(MenuList): self.l.setItemHeight(32) def toggleSelectedLock(self): + from Components.ParentalControl import parentalControl print "self.l.getCurrentSelection():", self.l.getCurrentSelection() print "self.l.getCurrentSelectionIndex():", self.l.getCurrentSelectionIndex() curSel = self.l.getCurrentSelection() if curSel[0][2]: parentalControl.unProtectService(self.l.getCurrentSelection()[0][0]) else: - parentalControl.protectService(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 5e439fd..b06246b 100755 --- a/lib/python/Components/PluginComponent.py +++ b/lib/python/Components/PluginComponent.py @@ -8,9 +8,13 @@ from Plugins.Plugin import PluginDescriptor import keymapparser class PluginComponent: + firstRun = True + restartRequired = False + def __init__(self): self.plugins = {} self.pluginList = [ ] + self.installedPluginList = [ ] self.setPluginPrefix("Plugins.") self.resetWarnings() @@ -18,12 +22,15 @@ class PluginComponent: self.prefix = prefix def addPlugin(self, plugin): - self.pluginList.append(plugin) - for x in plugin.where: - self.plugins.setdefault(x, []).append(plugin) - if x == PluginDescriptor.WHERE_AUTOSTART: - plugin(reason=0) - + if self.firstRun or plugin.needsRestart is False: + self.pluginList.append(plugin) + for x in plugin.where: + self.plugins.setdefault(x, []).append(plugin) + if x == PluginDescriptor.WHERE_AUTOSTART: + plugin(reason=0) + else: + self.restartRequired = True + def removePlugin(self, plugin): self.pluginList.remove(plugin) for x in plugin.where: @@ -42,7 +49,6 @@ class PluginComponent: directory_category = directory + c if not os_path.isdir(directory_category): continue - open(directory_category + "/__init__.py", "a").close() for pluginname in os_listdir(directory_category): path = directory_category + "/" + pluginname if os_path.isdir(path): @@ -67,6 +73,7 @@ class PluginComponent: plugins = [ plugins ] for p in plugins: + p.path = path p.updateIcon(path) new_plugins.append(p) @@ -81,12 +88,29 @@ class PluginComponent: # internally, the "fnc" argument will be compared with __eq__ plugins_added = [p for p in new_plugins if p not in self.pluginList] plugins_removed = [p for p in self.pluginList if not p.internal and p not in new_plugins] + + #ignore already installed but reloaded plugins + for p in plugins_removed: + for pa in plugins_added: + if pa.path == p.path and pa.where == p.where: + pa.needsRestart = False for p in plugins_removed: self.removePlugin(p) for p in plugins_added: - self.addPlugin(p) + if self.firstRun or p.needsRestart is False: + self.addPlugin(p) + else: + for installed_plugin in self.installedPluginList: + if installed_plugin.path == p.path: + if installed_plugin.where == p.where: + p.needsRestart = False + self.addPlugin(p) + + if self.firstRun: + self.firstRun = False + self.installedPluginList = self.pluginList def getPlugins(self, where): """Get list of plugins in a specific category""" @@ -97,8 +121,8 @@ class PluginComponent: for x in where: res.extend(self.plugins.get(x, [ ])) - - return res + res.sort(key=lambda x:x.weight) + return res def getPluginsForMenu(self, menuid): res = [ ] diff --git a/lib/python/Components/Renderer/Picon.py b/lib/python/Components/Renderer/Picon.py index 5ae43ed..51dc09a 100644 --- a/lib/python/Components/Renderer/Picon.py +++ b/lib/python/Components/Renderer/Picon.py @@ -2,11 +2,11 @@ ## Picon renderer by Gruffy .. some speedups by Ghost ## from Renderer import Renderer -from enigma import ePixmap +from enigma import ePixmap, eEnv from Tools.Directories import fileExists, SCOPE_SKIN_IMAGE, SCOPE_CURRENT_SKIN, resolveFilename class Picon(Renderer): - searchPaths = ('/usr/share/enigma2/%s/', + searchPaths = (eEnv.resolve('${datadir}/enigma2/%s/'), '/media/cf/%s/', '/media/usb/%s/') diff --git a/lib/python/Components/Renderer/Pixmap.py b/lib/python/Components/Renderer/Pixmap.py index d67cd55..7c6b579 100644 --- a/lib/python/Components/Renderer/Pixmap.py +++ b/lib/python/Components/Renderer/Pixmap.py @@ -3,4 +3,17 @@ from Renderer import Renderer from enigma import ePixmap class Pixmap(Renderer): + def __init__(self): + Renderer.__init__(self) + GUI_WIDGET = ePixmap + + def postWidgetCreate(self, instance): + self.changed((self.CHANGED_DEFAULT,)) + + def changed(self, what): + if what[0] != self.CHANGED_CLEAR: + if self.source and hasattr(self.source, "pixmap"): + if self.instance: + self.instance.setPixmap(self.source.pixmap) + diff --git a/lib/python/Components/Scanner.py b/lib/python/Components/Scanner.py index 813c09f..e01c61f 100644 --- a/lib/python/Components/Scanner.py +++ b/lib/python/Components/Scanner.py @@ -11,6 +11,8 @@ add_type("application/x-dream-package", ".dmpkg") add_type("application/x-dream-image", ".nfi") add_type("video/MP2T", ".ts") add_type("video/x-dvd-iso", ".iso") +add_type("video/x-matroska", ".mkv") +add_type("audio/x-matroska", ".mka") def getType(file): (type, _) = guess_type(file) diff --git a/lib/python/Components/Sources/ServiceEvent.py b/lib/python/Components/Sources/ServiceEvent.py index 93c733b..8a0a66a 100644 --- a/lib/python/Components/Sources/ServiceEvent.py +++ b/lib/python/Components/Sources/ServiceEvent.py @@ -25,7 +25,7 @@ class ServiceEvent(Source, object): def newService(self, ref): if not self.service or not ref or self.service != ref: self.service = ref - if not ref or (ref.flags & Ref.flagDirectory) == Ref.flagDirectory or ref.flags & Ref.isMarker: + if not ref: self.changed((self.CHANGED_CLEAR,)) else: self.changed((self.CHANGED_ALL,)) diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py index 3a75540..8676923 100644 --- a/lib/python/Components/Task.py +++ b/lib/python/Components/Task.py @@ -108,7 +108,6 @@ class Job(object): self.tasks[i].abort() def cancel(self): - # some Jobs might have a better idea of how to cancel a job self.abort() class Task(object): @@ -305,6 +304,7 @@ class JobManager: list.append(self.active_job) list += self.active_jobs return list + # some examples: #class PartitionExistsPostcondition: # def __init__(self, device): diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py index b472a19..b9dda6a 100644 --- a/lib/python/Components/TimerSanityCheck.py +++ b/lib/python/Components/TimerSanityCheck.py @@ -2,6 +2,7 @@ import NavigationInstance from time import localtime, mktime, gmtime from ServiceReference import ServiceReference from enigma import iServiceInformation, eServiceCenter, eServiceReference +from timer import TimerEntry class TimerSanityCheck: def __init__(self, timerlist, newtimer=None): @@ -107,7 +108,7 @@ class TimerSanityCheck: self.rep_eventlist.append((begin, idx)) begin += 86400 rflags >>= 1 - else: + elif timer.state < TimerEntry.StateEnded: self.nrep_eventlist.extend([(timer.begin,self.bflag,idx),(timer.end,self.eflag,idx)]) idx += 1 diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index b86c1a1..ce56f0f 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -1,7 +1,7 @@ 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 enigma import Misc_Options, setTunerTypePriorityOrder, eEnv; from SystemInfo import SystemInfo import os @@ -9,6 +9,8 @@ def InitUsageConfig(): config.usage = ConfigSubsection(); config.usage.showdish = ConfigYesNo(default = True) config.usage.multibouquet = ConfigYesNo(default = False) + config.usage.multiepg_ask_bouquet = ConfigYesNo(default = False) + config.usage.quickzap_bouquet_change = ConfigYesNo(default = False) config.usage.e1like_radio_mode = ConfigYesNo(default = False) config.usage.infobar_timeout = ConfigSelection(default = "5", choices = [ @@ -94,7 +96,7 @@ def InitUsageConfig(): SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output() - config.usage.keymap = ConfigText(default = "/usr/share/enigma2/keymap.xml") + config.usage.keymap = ConfigText(default = eEnv.resolve("${datadir}/enigma2/keymap.xml")) config.seek = ConfigSubsection() config.seek.selfdefined_13 = ConfigNumber(default=15) @@ -102,19 +104,19 @@ def InitUsageConfig(): config.seek.selfdefined_79 = ConfigNumber(default=300) config.seek.speeds_forward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) - config.seek.speeds_backward = ConfigSet(default=[8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) + config.seek.speeds_backward = ConfigSet(default=[2, 4, 8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128]) config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25]) config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) config.seek.enter_backward = ConfigSelection(default = "1", choices = ["1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) - config.seek.stepwise_minspeed = ConfigSelection(default = "16", choices = ["Never", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"]) - config.seek.stepwise_repeat = ConfigSelection(default = "3", choices = ["2", "3", "4", "5", "6"]) config.seek.on_pause = ConfigSelection(default = "play", choices = [ ("play", _("Play")), ("step", _("Singlestep (GOP)")), ("last", _("Last speed")) ]) + config.usage.timerlist_finished_timer_position = ConfigSelection(default = "beginning", choices = [("beginning", _("at beginning")), ("end", _("at end"))]) + def updateEnterForward(configElement): if not configElement.value: configElement.value = [2] diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py index d7506e3..5507cae 100755 --- a/lib/python/Components/config.py +++ b/lib/python/Components/config.py @@ -1624,16 +1624,17 @@ class Config(ConfigSubsection): self.pickle_this("config", self.saved_value, result) return ''.join(result) - def unpickle(self, lines): + def unpickle(self, lines, base_file=True): tree = { } for l in lines: if not l or l[0] == '#': continue n = l.find('=') + name = l[:n] val = l[n+1:].strip() - names = l[:n].split('.') + names = name.split('.') # if val.find(' ') != -1: # val = val[:val.find(' ')] @@ -1644,6 +1645,15 @@ class Config(ConfigSubsection): base[names[-1]] = val + if not base_file: # not the initial config file.. + #update config.x.y.value when exist + try: + configEntry = eval(name) + if configEntry is not None: + configEntry.value = val + except (SyntaxError, KeyError): + pass + # we inherit from ConfigSubsection, so ... #object.__setattr__(self, "saved_value", tree["config"]) if "config" in tree: @@ -1651,13 +1661,16 @@ class Config(ConfigSubsection): def saveToFile(self, filename): text = self.pickle() - f = open(filename, "w") - f.write(text) - f.close() + try: + f = open(filename, "w") + f.write(text) + f.close() + except IOError: + print "Config: Couldn't write %s" % filename - def loadFromFile(self, filename): + def loadFromFile(self, filename, base_file=False): f = open(filename, "r") - self.unpickle(f.readlines()) + self.unpickle(f.readlines(), base_file) f.close() config = Config() @@ -1668,7 +1681,7 @@ class ConfigFile: def load(self): try: - config.loadFromFile(self.CONFIG_FILE) + config.loadFromFile(self.CONFIG_FILE, True) except IOError, e: print "unable to load config (%s), assuming defaults..." % str(e) diff --git a/lib/python/Makefile.am b/lib/python/Makefile.am index e38f7d8..666ba67 100644 --- a/lib/python/Makefile.am +++ b/lib/python/Makefile.am @@ -1,23 +1,45 @@ -INCLUDES = \ +AM_CPPFLAGS = \ + -I$(top_srcdir) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/src + -include Python.h \ + -include $(top_builddir)/enigma2_config.h SUBDIRS = Components Tools Screens Plugins noinst_LIBRARIES = libenigma_python.a libenigma_python_a_SOURCES = \ - python.cpp enigma_python_wrap.cxx connections.cpp + connections.cpp \ + python.cpp -enigma_python_wrap.cxx: enigma_python.i - swig -I$(top_srcdir)/ -c++ -python -O -nortti -nothreads enigma_python.i - python enigma_py_patcher.py +pythonincludedir = $(pkgincludedir)/lib/python +pythoninclude_HEADERS = \ + connections.h \ + python.h \ + swig.h -enigma.py: enigma_python_wrap.cxx +nodist_libenigma_python_a_SOURCES = \ + enigma_python.cpp -CLEANFILES = enigma.py enigma_python_wrap.cxx +noinst_PYTHON = \ + enigma_py_patcher.py + +EXTRA_DIST = \ + enigma_python.i + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enigma_python.Pcpp@am__quote@ + +.i.cpp: + $(AM_V_GEN)$(SWIG) $(AX_SWIG_PYTHON_OPT) -MT $@ -MD -MF $(DEPDIR)/$*.Tpo -I$(top_srcdir) -O -nortti -nothreads -o $@ $< + $(AM_V_at)mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Pcpp + $(AM_V_at)$(PYTHON) $(srcdir)/enigma_py_patcher.py + +enigma.py: enigma_python.cpp + +CLEANFILES = enigma.py enigma_python.cpp installdir = $(pkglibdir)/python install_PYTHON = \ enigma.py + diff --git a/lib/python/Plugins/DemoPlugins/TPMDemo/Makefile.am b/lib/python/Plugins/DemoPlugins/TPMDemo/Makefile.am index 3ccca98..4828081 100644 --- a/lib/python/Plugins/DemoPlugins/TPMDemo/Makefile.am +++ b/lib/python/Plugins/DemoPlugins/TPMDemo/Makefile.am @@ -1,4 +1,4 @@ -installdir = $(LIBDIR)/enigma2/python/Plugins/DemoPlugins/TPMDemo +installdir = $(pkglibdir)/python/Plugins/DemoPlugins/TPMDemo install_PYTHON = \ __init__.py \ diff --git a/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py b/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py index 2c078d3..dcaa1f6 100644 --- a/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py +++ b/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py @@ -82,6 +82,6 @@ def main(session, **kwargs): # would start your plugin here def Plugins(**kwargs): - return [PluginDescriptor(name = "TPM Demo", description = _("A demo plugin for TPM usage."), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc = main), - PluginDescriptor(name = "TPM Demo", description = _("A demo plugin for TPM usage."), icon = "plugin.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc = main)] + return [PluginDescriptor(name = "TPM Demo", description = _("A demo plugin for TPM usage."), where = PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart = False, fnc = main), + PluginDescriptor(name = "TPM Demo", description = _("A demo plugin for TPM usage."), icon = "plugin.png", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc = main)] \ No newline at end of file diff --git a/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py b/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py index 69f935e..4ef4a87 100644 --- a/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py +++ b/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py @@ -80,4 +80,4 @@ def test(returnValue): print "You entered", returnValue def Plugins(**kwargs): - return PluginDescriptor(name="Test", description="plugin to test some capabilities", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) + return PluginDescriptor(name="Test", description="plugin to test some capabilities", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main) diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py index 0627df3..141c04a 100644 --- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py +++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py @@ -406,4 +406,4 @@ def main(session, service, **kwargs): session.open(CutListEditor, service) def Plugins(**kwargs): - return PluginDescriptor(name="Cutlist Editor", description=_("Cutlist editor..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main) + return PluginDescriptor(name="Cutlist Editor", description=_("Cutlist editor..."), where = PluginDescriptor.WHERE_MOVIELIST, needsRestart = False, fnc=main) diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py index 7f755db..6dbcd49 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py @@ -2,6 +2,7 @@ from Tools.Directories import fileExists from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigSubList import DVDTitle import xml.dom.minidom +from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS class ConfigColor(ConfigSequence): def __init__(self, default = [128,128,128]): @@ -125,6 +126,14 @@ class DVDProject: for key in self.filekeys: val = self.settings.dict()[key].getValue() if not fileExists(val): + if val[0] != "/": + if key.find("font") == 0: + val = resolveFilename(SCOPE_FONTS)+val + else: + val = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/"+val + if fileExists(val): + self.settings.dict()[key].setValue(val) + continue self.error += "\n%s '%s' not found" % (key, val) #except AttributeError: #print "loadProject AttributeError", self.error diff --git a/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml b/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml index 451e8a8..4645260 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml +++ b/lib/python/Plugins/Extensions/DVDBurn/DreamboxDVD.ddvdp.xml @@ -3,11 +3,11 @@ diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index e00dedd..a928ae2 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -85,7 +85,7 @@ class DemuxTask(Task): title = job.project.titles[job.i] self.global_preconditions.append(DiskspacePrecondition(title.estimatedDiskspace)) self.setTool("projectx") - self.args += [inputfile, "-demux", "-out", self.job.workspace ] + self.args += [inputfile, "-demux", "-set", "ExportPanel.Streamtype.Subpicture=0", "-set", "ExportPanel.Streamtype.Teletext=0", "-out", self.job.workspace ] self.end = 300 self.prog_state = 0 self.weighting = 1000 @@ -174,7 +174,8 @@ class DemuxTask(Task): print "[DemuxTask::cleanup]" self.mplex_streamfiles = [ self.mplex_videofile ] for pid in self.relevantAudioPIDs: - self.mplex_streamfiles.append(self.mplex_audiofiles[pid]) + if pid in self.mplex_audiofiles: + self.mplex_streamfiles.append(self.mplex_audiofiles[pid]) print self.mplex_streamfiles if failed: diff --git a/lib/python/Plugins/Extensions/DVDBurn/Text_menu_boat.ddvdm.xml b/lib/python/Plugins/Extensions/DVDBurn/Text_menu_boat.ddvdm.xml index 0de7f4b..bf6356a 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Text_menu_boat.ddvdm.xml +++ b/lib/python/Plugins/Extensions/DVDBurn/Text_menu_boat.ddvdm.xml @@ -3,17 +3,17 @@ - + + diff --git a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py old mode 100755 new mode 100644 index 64b4ae5..1cee0aa --- a/lib/python/Plugins/Extensions/DVDPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/DVDPlayer/plugin.py @@ -4,7 +4,7 @@ from Screens.Screen import Screen from Screens.MessageBox import MessageBox from Screens.ChoiceBox import ChoiceBox from Screens.HelpMenu import HelpableScreen -from Screens.InfoBarGenerics import InfoBarSeek, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarShowHide, InfoBarNotifications +from Screens.InfoBarGenerics import InfoBarSeek, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarShowHide, InfoBarNotifications, InfoBarAudioSelection, InfoBarSubtitleSupport from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap from Components.Label import Label from Components.Sources.StaticText import StaticText @@ -39,8 +39,11 @@ class FileBrowser(Screen): currDir = "/media/dvd/" if not pathExists(currDir): currDir = "/" + if lastpath == "": # 'None' is magic to start at the list of mountpoints + currDir = None - self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(iso)", useServiceRef = True) + inhibitDirs = ["/bin", "/boot", "/dev", "/etc", "/home", "/lib", "/proc", "/sbin", "/share", "/sys", "/tmp", "/usr", "/var"] + self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(iso|img)", useServiceRef = True) self["filelist"] = self.filelist self["FilelistActions"] = ActionMap(["SetupActions"], @@ -79,6 +82,12 @@ class FileBrowser(Screen): lastpath = (pathname.rstrip("/").rsplit("/",1))[0] print "lastpath video_ts.ifo=", lastpath self.close(pathname) + if fileExists(pathname+"VIDEO_TS/VIDEO_TS.IFO"): + print "dvd structure found, trying to open..." + lastpath = (pathname.rstrip("/").rsplit("/",1))[0] + print "lastpath video_ts.ifo=", lastpath + pathname += "VIDEO_TS" + self.close(pathname) else: lastpath = filename[0:filename.rfind("/")] print "lastpath directory=", lastpath @@ -186,7 +195,7 @@ class ChapterZap(Screen): self.Timer.callback.append(self.keyOK) self.Timer.start(3000, True) -class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarPVRState, InfoBarShowHide, HelpableScreen, InfoBarCueSheetSupport): +class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarPVRState, InfoBarShowHide, HelpableScreen, InfoBarCueSheetSupport, InfoBarAudioSelection, InfoBarSubtitleSupport): ALLOW_SUSPEND = Screen.SUSPEND_PAUSES ENABLE_RESUME_SUPPORT = True @@ -235,8 +244,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP self.saved_config_speeds_backward = config.seek.speeds_backward.value self.saved_config_enter_forward = config.seek.enter_forward.value self.saved_config_enter_backward = config.seek.enter_backward.value - self.saved_config_seek_stepwise_minspeed = config.seek.stepwise_minspeed.value - self.saved_config_seek_stepwise_repeat = config.seek.stepwise_repeat.value self.saved_config_seek_on_pause = config.seek.on_pause.value self.saved_config_seek_speeds_slowmotion = config.seek.speeds_slowmotion.value @@ -246,8 +253,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP config.seek.speeds_slowmotion.value = [ ] config.seek.enter_forward.value = "2" config.seek.enter_backward.value = "2" - config.seek.stepwise_minspeed.value = "Never" - config.seek.stepwise_repeat.value = "3" config.seek.on_pause.value = "play" def restore_infobar_seek_config(self): @@ -256,8 +261,6 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP config.seek.speeds_slowmotion.value = self.saved_config_seek_speeds_slowmotion config.seek.enter_forward.value = self.saved_config_enter_forward config.seek.enter_backward.value = self.saved_config_enter_backward - config.seek.stepwise_minspeed.value = self.saved_config_seek_stepwise_minspeed - config.seek.stepwise_repeat.value = self.saved_config_seek_stepwise_repeat config.seek.on_pause.value = self.saved_config_seek_on_pause def __init__(self, session, dvd_device = None, dvd_filelist = [ ], args = None): @@ -266,10 +269,12 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP InfoBarNotifications.__init__(self) InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions") InfoBarShowHide.__init__(self) + InfoBarAudioSelection.__init__(self) + InfoBarSubtitleSupport.__init__(self) HelpableScreen.__init__(self) self.save_infobar_seek_config() self.change_infobar_seek_config() - InfoBarSeek.__init__(self, useSeekBackHack=False) + InfoBarSeek.__init__(self) InfoBarPVRState.__init__(self) self.dvdScreen = self.session.instantiateDialog(DVDOverlay) @@ -345,6 +350,7 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP "prevTitle": (self.prevTitle, _("jump back to the previous title")), "tv": (self.askLeavePlayer, _("exit DVD player or return to file browser")), "dvdAudioMenu": (self.enterDVDAudioMenu, _("(show optional DVD audio menu)")), + "AudioSelection": (self.enterAudioSelection, _("Select audio track")), "nextAudioTrack": (self.nextAudioTrack, _("switch to the next audio track")), "nextSubtitleTrack": (self.nextSubtitleTrack, _("switch to the next subtitle language")), "nextAngle": (self.nextAngle, _("switch to the next angle")), @@ -537,6 +543,9 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP keys.keyPressed(key) return keys + def enterAudioSelection(self): + self.audioSelection() + def nextAudioTrack(self): self.sendKey(iServiceKeys.keyUser) @@ -625,6 +634,14 @@ class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarP newref = eServiceReference(4369, 0, val) print "play", newref.toString() if curref is None or curref != newref: + if newref.toString().endswith("/VIDEO_TS") or newref.toString().endswith("/"): + names = newref.toString().rsplit("/",3) + if names[2].startswith("Disk ") or names[2].startswith("DVD "): + name = str(names[1]) + " - " + str(names[2]) + else: + name = names[2] + print "setting name to: ", self.service + newref.setName(str(name)) self.session.nav.playService(newref) self.service = self.session.nav.getCurrentService() print "self.service", self.service @@ -758,5 +775,5 @@ def filescan(**kwargs): )] def Plugins(**kwargs): - return [PluginDescriptor(name = "DVDPlayer", description = "Play DVDs", where = PluginDescriptor.WHERE_MENU, fnc = menu), - PluginDescriptor(where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)] + return [PluginDescriptor(name = "DVDPlayer", description = "Play DVDs", where = PluginDescriptor.WHERE_MENU, needsRestart = True, fnc = menu), + PluginDescriptor(where = PluginDescriptor.WHERE_FILESCAN, needsRestart = True, fnc = filescan)] diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am b/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am index 27c751c..3e2ee67 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/Makefile.am @@ -1,17 +1,18 @@ -OBJS := servicedvd.cpp +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h --include $(OBJS:.cpp=.d) +AM_CXXFLAGS = @LIBDDVD_CFLAGS@ -installdir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer +plugindir = $(pkglibdir)/python/Plugins/Extensions/DVDPlayer -install_PYTHON = \ - servicedvd.so +plugin_LTLIBRARIES = servicedvd.la -servicedvd.so: - $(CXX) $(CPPFLAGS) -MD $(CXXFLAGS) $(DEFS) -I$(top_srcdir)/include \ - -Wall -W $(OBJS) -shared -fPIC -Wl,-soname,servicedvd.so -o servicedvd.so \ - $(LDFLAGS) -ldreamdvd +servicedvd_la_SOURCES = \ + servicedvd.cpp \ + servicedvd.h -all: servicedvd.so - -CLEANFILES = servicedvd.so servicedvd.d +servicedvd_la_LDFLAGS = -avoid-version -module +servicedvd_la_LIBADD = @LIBDDVD_LIBS@ diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp index 2ba5392..6d1397d 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp @@ -32,6 +32,7 @@ eServiceFactoryDVD::eServiceFactoryDVD() { std::list extensions; extensions.push_back("iso"); + extensions.push_back("img"); sc->addServiceFactory(eServiceFactoryDVD::id, this, extensions); } } @@ -396,6 +397,61 @@ RESULT eServiceDVD::subtitle(ePtr &ptr) return 0; } +RESULT eServiceDVD::audioTracks(ePtr &ptr) +{ + ptr = this; + return 0; +} + +int eServiceDVD::getNumberOfTracks() +{ + int i = 0; + ddvd_get_audio_count(m_ddvdconfig, &i); + return i; +} + +int eServiceDVD::getCurrentTrack() +{ + int audio_id,audio_type; + uint16_t audio_lang; + ddvd_get_last_audio(m_ddvdconfig, &audio_id, &audio_lang, &audio_type); + return audio_id; +} + +RESULT eServiceDVD::selectTrack(unsigned int i) +{ + ddvd_set_audio(m_ddvdconfig, i); + return 0; +} + +RESULT eServiceDVD::getTrackInfo(struct iAudioTrackInfo &info, unsigned int audio_id) +{ + int audio_type; + uint16_t audio_lang; + ddvd_get_audio_byid(m_ddvdconfig, audio_id, &audio_lang, &audio_type); + char audio_string[3]={audio_lang >> 8, audio_lang, 0}; + info.m_pid = audio_id+1; + info.m_language = audio_string; + switch(audio_type) + { + case DDVD_MPEG: + info.m_description = "MPEG"; + break; + case DDVD_AC3: + info.m_description = "AC3"; + break; + case DDVD_DTS: + info.m_description = "DTS"; + break; + case DDVD_LPCM: + info.m_description = "LPCM"; + break; + default: + info.m_description = "und"; + } + return 0; +} + RESULT eServiceDVD::keys(ePtr &ptr) { ptr=this; @@ -480,7 +536,10 @@ RESULT eServiceDVD::getName(std::string &name) if ( m_ddvd_titlestring[0] != '\0' ) name = m_ddvd_titlestring; else - name = m_ref.path; + if ( !m_ref.name.empty() ) + name = m_ref.name; + else + name = m_ref.path; return 0; } @@ -619,14 +678,33 @@ PyObject *eServiceDVD::getInfoObject(int w) Py_RETURN_NONE; } -RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /*entry*/) +RESULT eServiceDVD::enableSubtitles(eWidget *parent, ePyObject tuple) { delete m_subtitle_widget; + eSize size = eSize(720, 576); m_subtitle_widget = new eSubtitleWidget(parent); m_subtitle_widget->resize(parent->size()); - eSize size = eSize(720, 576); + int pid = -1; + + if ( tuple != Py_None ) + { + ePyObject entry; + int tuplesize = PyTuple_Size(tuple); + if (!PyTuple_Check(tuple)) + goto error_out; + if (tuplesize < 1) + goto error_out; + entry = PyTuple_GET_ITEM(tuple, 1); + if (!PyInt_Check(entry)) + goto error_out; + pid = PyInt_AsLong(entry)-1; + + ddvd_set_spu(m_ddvdconfig, pid); + m_event(this, evUser+7); + } + eDebug("eServiceDVD::enableSubtitles %i", pid); if (!m_pixmap) { @@ -644,6 +722,9 @@ RESULT eServiceDVD::enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) /* m_subtitle_widget->show(); return 0; + +error_out: + return -1; } RESULT eServiceDVD::disableSubtitles(eWidget */*parent*/) @@ -655,8 +736,26 @@ RESULT eServiceDVD::disableSubtitles(eWidget */*parent*/) PyObject *eServiceDVD::getSubtitleList() { - eDebug("eServiceDVD::getSubtitleList nyi"); - Py_RETURN_NONE; + ePyObject l = PyList_New(0); + unsigned int spu_count = 0; + ddvd_get_spu_count(m_ddvdconfig, &spu_count); + + for ( unsigned int spu_id = 0; spu_id < spu_count; spu_id++ ) + { + uint16_t spu_lang; + ddvd_get_spu_byid(m_ddvdconfig, spu_id, &spu_lang); + char spu_string[3]={spu_lang >> 8, spu_lang, 0}; + + ePyObject tuple = PyTuple_New(5); + PyTuple_SetItem(tuple, 0, PyInt_FromLong(2)); + PyTuple_SetItem(tuple, 1, PyInt_FromLong(spu_id+1)); + PyTuple_SetItem(tuple, 2, PyInt_FromLong(5)); + PyTuple_SetItem(tuple, 3, PyInt_FromLong(0)); + PyTuple_SetItem(tuple, 4, PyString_FromString(spu_string)); + PyList_Append(l, tuple); + Py_DECREF(tuple); + } + return l; } PyObject *eServiceDVD::getCachedSubtitle() diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h index c751a39..80cfcf0 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h @@ -26,7 +26,7 @@ public: RESULT offlineOperations(const eServiceReference &, ePtr &ptr); }; -class eServiceDVD: public iPlayableService, public iPauseableService, public iSeekableService, +class eServiceDVD: public iPlayableService, public iPauseableService, public iSeekableService, public iAudioTrackSelection, public iServiceInformation, public iSubtitleOutput, public iServiceKeys, public iCueSheet, public eThread, public Object { friend class eServiceFactoryDVD; @@ -35,7 +35,7 @@ public: virtual ~eServiceDVD(); // not implemented (yet) RESULT audioChannel(ePtr &ptr) { ptr = 0; return -1; } - RESULT audioTracks(ePtr &ptr) { ptr = 0; return -1; } + RESULT audioTracks(ePtr &ptr); RESULT frontendInfo(ePtr &ptr) { ptr = 0; return -1; } RESULT subServices(ePtr &ptr) { ptr = 0; return -1; } RESULT timeshift(ePtr &ptr) { ptr = 0; return -1; } @@ -89,8 +89,15 @@ public: void setCutList(SWIG_PYOBJECT(ePyObject)); void setCutListEnable(int enable); - // iServiceKeys + // iAudioTrackSelection + int getNumberOfTracks(); + RESULT selectTrack(unsigned int i); + RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n); + int getCurrentTrack(); + + // iServiceKeys RESULT keyPressed(int key); + private: eServiceDVD(eServiceReference ref); diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py index adb7015..af14578 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py @@ -1,8 +1,9 @@ from Plugins.Plugin import PluginDescriptor from GraphMultiEpg import GraphMultiEPG -from Screens.ChannelSelection import BouquetSelector +from Screens.ChannelSelection import BouquetSelector, SilentBouquetSelector from enigma import eServiceCenter, eServiceReference from ServiceReference import ServiceReference +from Components.config import config Session = None Servicelist = None @@ -73,6 +74,32 @@ def changeBouquetCB(direction, epg): epg_bouquet = bouquet epg.setServices(services) +def openAskBouquet(Session, bouquets, cnt): + if cnt > 1: # show bouquet list + global bouquetSel + bouquetSel = Session.openWithCallback(closed, BouquetSelector, bouquets, openBouquetEPG, enableWrapAround=True) + dlg_stack.append(bouquetSel) + elif cnt == 1: + if not openBouquetEPG(bouquets[0][1]): + cleanup() + +def openSilent(Servicelist, bouquets, cnt): + root = Servicelist.getRoot() + if cnt > 1: # create bouquet list + global bouquetSel + current = 0 + rootstr = root.toCompareString() + for bouquet in bouquets: + if bouquet[1].toCompareString() == rootstr: + break + current += 1 + if current >= cnt: + current = 0 + bouquetSel = SilentBouquetSelector(bouquets, True, current) + if cnt >= 1: # open current bouquet + if not openBouquetEPG(root): + cleanup() + def main(session, servicelist, **kwargs): global Session Session = session @@ -83,16 +110,13 @@ def main(session, servicelist, **kwargs): cnt = 0 else: cnt = len(bouquets) - if cnt > 1: # show bouquet list - global bouquetSel - bouquetSel = Session.openWithCallback(closed, BouquetSelector, bouquets, openBouquetEPG, enableWrapAround=True) - dlg_stack.append(bouquetSel) - elif cnt == 1: - if not openBouquetEPG(bouquets[0][1]): - cleanup() + if config.usage.multiepg_ask_bouquet.value: + openAskBouquet(session, bouquets, cnt) + else: + openSilent(servicelist, bouquets, cnt) def Plugins(**kwargs): name = _("Graphical Multi EPG") descr = _("A graphical EPG for all services of an specific bouquet") - return [ PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EVENTINFO, fnc=main), - PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main) ] + return [PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EVENTINFO, needsRestart = False, fnc=main), + PluginDescriptor(name=name, description=descr, where = PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart = False, fnc=main)] diff --git a/lib/python/Plugins/Extensions/Makefile.am b/lib/python/Plugins/Extensions/Makefile.am index 5a6e3f3..7a3a9be 100755 --- a/lib/python/Plugins/Extensions/Makefile.am +++ b/lib/python/Plugins/Extensions/Makefile.am @@ -1,6 +1,10 @@ installdir = $(pkglibdir)/python/Plugins/Extensions -SUBDIRS = TuxboxPlugins CutListEditor PicturePlayer MediaScanner MediaPlayer GraphMultiEPG SocketMMI DVDPlayer DVDBurn Modem +SUBDIRS = TuxboxPlugins CutListEditor PicturePlayer MediaScanner MediaPlayer GraphMultiEPG SocketMMI DVDBurn Modem + +if HAVE_LIBDDVD +SUBDIRS += DVDPlayer +endif install_PYTHON = \ __init__.py diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py old mode 100755 new mode 100644 index 9ae886f..6ff1c5a --- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py +++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py @@ -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|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov|m2ts)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls") self["filelist"] = self.filelist self.playlist = MyPlayList() @@ -1041,6 +1041,6 @@ def filescan(**kwargs): from Plugins.Plugin import PluginDescriptor def Plugins(**kwargs): return [ - PluginDescriptor(name = "MediaPlayer", description = "Play back media files", where = PluginDescriptor.WHERE_MENU, fnc = menu), - PluginDescriptor(name = "MediaPlayer", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan) + PluginDescriptor(name = "MediaPlayer", description = "Play back media files", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu), + PluginDescriptor(name = "MediaPlayer", where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan) ] diff --git a/lib/python/Plugins/Extensions/MediaScanner/plugin.py b/lib/python/Plugins/Extensions/MediaScanner/plugin.py old mode 100755 new mode 100644 index 0cefa35..76bbb26 --- a/lib/python/Plugins/Extensions/MediaScanner/plugin.py +++ b/lib/python/Plugins/Extensions/MediaScanner/plugin.py @@ -91,8 +91,8 @@ def autostart(reason, **kwargs): def Plugins(**kwargs): return [ - PluginDescriptor(name="MediaScanner", description=_("Scan Files..."), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main), + PluginDescriptor(name="MediaScanner", description=_("Scan Files..."), where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = True, fnc=main), # PluginDescriptor(where = PluginDescriptor.WHERE_MENU, fnc=menuHook), - PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart), - PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart) + PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = True, fnc = sessionstart), + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = True, fnc = autostart) ] diff --git a/lib/python/Plugins/Extensions/Modem/plugin.py b/lib/python/Plugins/Extensions/Modem/plugin.py index e57e4f5..0b397c1 100644 --- a/lib/python/Plugins/Extensions/Modem/plugin.py +++ b/lib/python/Plugins/Extensions/Modem/plugin.py @@ -280,4 +280,4 @@ def main(session, **kwargs): session.open(ModemSetup) def Plugins(**kwargs): - return PluginDescriptor(name="Modem", description="plugin to connect to internet via builtin modem", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) + return PluginDescriptor(name="Modem", description="plugin to connect to internet via builtin modem", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main) diff --git a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py old mode 100755 new mode 100644 index 5d1c2cb..169a8c8 --- a/lib/python/Plugins/Extensions/PicturePlayer/plugin.py +++ b/lib/python/Plugins/Extensions/PicturePlayer/plugin.py @@ -625,5 +625,5 @@ def filescan(**kwargs): def Plugins(**kwargs): return \ - [PluginDescriptor(name=_("PicturePlayer"), description=_("fileformats (BMP, PNG, JPG, GIF)"), icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main), - PluginDescriptor(name=_("PicturePlayer"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)] + [PluginDescriptor(name=_("PicturePlayer"), description=_("fileformats (BMP, PNG, JPG, GIF)"), icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main), + PluginDescriptor(name=_("PicturePlayer"), where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan)] diff --git a/lib/python/Plugins/Extensions/SocketMMI/plugin.py b/lib/python/Plugins/Extensions/SocketMMI/plugin.py index 387c830..568cde2 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/plugin.py +++ b/lib/python/Plugins/Extensions/SocketMMI/plugin.py @@ -22,6 +22,7 @@ def autostart(reason, **kwargs): socketHandler = SocketMMIMessageHandler() def Plugins(**kwargs): - return [ PluginDescriptor(name = "SocketMMI", description = _("Python frontend for /tmp/mmi.socket"), where = PluginDescriptor.WHERE_MENU, fnc = menu), - PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart), - PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart) ] + return [ PluginDescriptor(name = "SocketMMI", description = _("Python frontend for /tmp/mmi.socket"), where = PluginDescriptor.WHERE_MENU, needsRestart = True, fnc = menu), + PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = True, fnc = sessionstart), + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = True, fnc = autostart) ] + diff --git a/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am b/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am index 8e80e18..5ce7d03 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am +++ b/lib/python/Plugins/Extensions/SocketMMI/src/Makefile.am @@ -1,17 +1,15 @@ -OBJS = socket_mmi.cpp +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h --include $(OBJS:.cpp=.d) +plugindir = $(pkglibdir)/python/Plugins/Extensions/SocketMMI -installdir = $(pkglibdir)/python/Plugins/Extensions/SocketMMI +plugin_LTLIBRARIES = socketmmi.la -install_PYTHON = \ - socketmmi.so +socketmmi_la_SOURCES = \ + socket_mmi.cpp \ + socket_mmi.h -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 \ - $(LDFLAGS) - -all: socketmmi.so - -CLEANFILES = socketmmi.so socketmmi.d +socketmmi_la_LDFLAGS = -avoid-version -module diff --git a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp index 673b525..9a69de3 100644 --- a/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp +++ b/lib/python/Plugins/Extensions/SocketMMI/src/socket_mmi.cpp @@ -118,11 +118,11 @@ eAutoInitP0 init_socketui(eAutoInitNumbers::rc, "Socket MMI"); int eSocketMMIHandler::send_to_mmisock( void* buf, size_t len) { - int ret = write(connfd, buf, len); + ssize_t ret = write(connfd, buf, len); if ( ret < 0 ) eDebug("[eSocketMMIHandler] write (%m)"); - else if ( (uint)ret != len ) - eDebug("[eSocketMMIHandler] only %d bytes sent.. %d bytes should be sent", ret, len ); + else if ( (size_t)ret != len ) + eDebug("[eSocketMMIHandler] only %zd bytes sent.. %zu bytes should be sent", ret, len ); else return 0; return ret; diff --git a/lib/python/Plugins/Extensions/TuxboxPlugins/plugin.py b/lib/python/Plugins/Extensions/TuxboxPlugins/plugin.py index 05085ea..e124ffd 100644 --- a/lib/python/Plugins/Extensions/TuxboxPlugins/plugin.py +++ b/lib/python/Plugins/Extensions/TuxboxPlugins/plugin.py @@ -17,7 +17,7 @@ def getPlugins(): for x in dir: if x[-3:] == "cfg": params = getPluginParams(x) - pluginlist.append(PluginDescriptor(name=params["name"], description=params["desc"], where = PluginDescriptor.WHERE_PLUGINMENU, icon="tuxbox.png", fnc=boundFunction(main, plugin=x))) + pluginlist.append(PluginDescriptor(name=params["name"], description=params["desc"], where = PluginDescriptor.WHERE_PLUGINMENU, icon="tuxbox.png", needsRestart = True, fnc=boundFunction(main, plugin=x))) return pluginlist diff --git a/lib/python/Plugins/Plugin.py b/lib/python/Plugins/Plugin.py index 5a676cd..d87e6e9 100755 --- a/lib/python/Plugins/Plugin.py +++ b/lib/python/Plugins/Plugin.py @@ -61,9 +61,11 @@ class PluginDescriptor: WHERE_SOFTWAREMANAGER = 14 - def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None, wakeupfnc = None, internal = False): + def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None, wakeupfnc = None, needsRestart = None, internal = False, weight = 0): self.name = name self.internal = internal + self.needsRestart = needsRestart + self.path = None if isinstance(where, list): self.where = where else: @@ -76,6 +78,8 @@ class PluginDescriptor: else: self.icon = icon + self.weight = weight + self.wakeupfnc = wakeupfnc self.__call__ = fnc diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py b/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py index d8de354..797010c 100755 --- a/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py +++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py @@ -88,7 +88,7 @@ class CleanupWizard(WizardLanguage, Rc): if self.NextStep is not 'end': if not self.Console: self.Console = Console() - cmd = "ipkg list_installed | grep enigma2" + cmd = "opkg list_installed | grep enigma2" self.Console.ePopen(cmd, self.buildListInstalled_Finished) self.buildListRef = self.session.openWithCallback(self.buildListfinishedCB, MessageBox, _("Please wait while searching for removable packages..."), type = MessageBox.TYPE_INFO, enable_input = False) else: diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py b/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py old mode 100755 new mode 100644 index f8677bb..157aa75 --- a/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py +++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py @@ -126,10 +126,10 @@ def selSetup(menuid, **kwargs): def Plugins(**kwargs): list = [] - list.append(PluginDescriptor(name=_("CleanupWizard"), description=_("Cleanup Wizard settings"),where=PluginDescriptor.WHERE_MENU, fnc=selSetup)) + list.append(PluginDescriptor(name=_("CleanupWizard"), description=_("Cleanup Wizard settings"),where=PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=selSetup)) if config.plugins.cleanupwizard.enable.value: if not config.misc.firstrun.value: if internalMemoryExceeded: - list.append(PluginDescriptor(name=_("Cleanup Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(1, CleanupWizard))) + list.append(PluginDescriptor(name=_("Cleanup Wizard"), where = PluginDescriptor.WHERE_WIZARD, needsRestart = False, fnc=(1, CleanupWizard))) return list diff --git a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py old mode 100755 new mode 100644 index 2c0edf5..b345428 --- a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py +++ b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py @@ -12,7 +12,7 @@ from ServiceReference import ServiceReference from Plugins.Plugin import PluginDescriptor from xml.etree.cElementTree import parse as ci_parse from Tools.XMLTools import elementsWithTag, mergeText, stringToXML -from enigma import eDVBCI_UI, eDVBCIInterfaces +from enigma import eDVBCI_UI, eDVBCIInterfaces, eEnv from os import system, path as os_path @@ -115,7 +115,7 @@ class CIconfigMenu(Screen): Screen.__init__(self, session) self.ci_slot=ci_slot - self.filename="/etc/enigma2/ci"+str(self.ci_slot)+".xml" + self.filename = eEnv.resolve("${sysconfdir}/enigma2/ci") + str(self.ci_slot) + ".xml" self["key_red"] = StaticText(_("Delete")) self["key_green"] = StaticText(_("add Service")) @@ -567,7 +567,7 @@ def activate_all(session): return Len > 0 and definitions[Len-1].text or default for ci in range(NUM_CI): - filename="/etc/enigma2/ci"+str(ci)+".xml" + filename = eEnv.resolve("${sysconfdir}/enigma2/ci") + str(ci) + ".xml" if not os_path.exists(filename): print "[CI_Activate_Config_CI%d] no config file found" %ci @@ -636,10 +636,10 @@ def menu(menuid, **kwargs): def Plugins(**kwargs): if config.usage.setup_level.index > 1: - return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ), - PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ), - PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers/caids to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )] + return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = False, fnc = sessionstart ), + PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = False, fnc = autostart ), + PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers/caids to common interface modules"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu )] else: - return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ), - PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ), - PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )] + return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = False, fnc = sessionstart ), + PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = False, fnc = autostart ), + PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers to common interface modules"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu )] diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py old mode 100755 new mode 100644 index 92c1628..ab74de4 --- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py +++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py @@ -421,6 +421,6 @@ def selSetup(menuid, **kwargs): def Plugins(**kwargs): - return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart), - PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("CrashlogAutoSubmit settings"),where=PluginDescriptor.WHERE_MENU, fnc=selSetup)] + return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], needsRestart = False, fnc = autostart), + PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("CrashlogAutoSubmit settings"),where=PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=selSetup)] diff --git a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py index 4d0a992..d26881e 100644 --- a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py @@ -134,4 +134,4 @@ def DefaultServicesScannerMain(session, **kwargs): session.open(DefaultServicesScannerPlugin) def Plugins(**kwargs): - return PluginDescriptor(name="Default Services Scanner", description=_("Scans default lamedbs sorted by satellite with a connected dish positioner"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DefaultServicesScannerMain) + return PluginDescriptor(name="Default Services Scanner", description=_("Scans default lamedbs sorted by satellite with a connected dish positioner"), where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=DefaultServicesScannerMain) diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py old mode 100755 new mode 100644 index 5b7edcf..4dcf6c6 --- a/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py +++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py @@ -679,5 +679,5 @@ def autostart(reason, **kwargs): resourcemanager.addResource("DiseqcTester", DiseqcTesterMain) def Plugins(**kwargs): - return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, fnc=DiseqcTesterMain), - PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)] + return [ PluginDescriptor(name="DiSEqC Tester", description=_("Test DiSEqC settings"), where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=DiseqcTesterMain), + PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = False, fnc = autostart)] diff --git a/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py b/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py index 38b80c9..6cb30de 100644 --- a/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py +++ b/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py @@ -76,11 +76,11 @@ def Plugins(**kwargs): newversion = getUpgradeVersion() or 0 list = [] if version is not None and version < newversion: - list.append(PluginDescriptor(name="FP Upgrade", where = PluginDescriptor.WHERE_WIZARD, fnc=(8, FPUpgrade))) + list.append(PluginDescriptor(name="FP Upgrade", where = PluginDescriptor.WHERE_WIZARD, needsRestart = True, fnc=(8, FPUpgrade))) try: msg = open("/proc/stb/message").read() - list.append(PluginDescriptor(name="System Message Check", where = PluginDescriptor.WHERE_WIZARD, fnc=(9, SystemMessage, msg))) + list.append(PluginDescriptor(name="System Message Check", where = PluginDescriptor.WHERE_WIZARD, needsRestart = True, fnc=(9, SystemMessage, msg))) except: pass diff --git a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py index b19007c..84cbbcb 100644 --- a/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Hotplug/plugin.py @@ -1,66 +1,300 @@ from Plugins.Plugin import PluginDescriptor -from twisted.internet.protocol import Protocol, Factory -from twisted.internet import reactor from Components.Harddisk import harddiskmanager +from Tools.Directories import fileExists hotplugNotifier = [ ] +bdpoll = None -class Hotplug(Protocol): - def connectionMade(self): - self.received = "" +def processHotplugData(self, v): + print "hotplug:", v + action = v.get("ACTION") + device = v.get("DEVPATH") + physdevpath = v.get("PHYSDEVPATH") + media_state = v.get("X_E2_MEDIA_STATUS") - def dataReceived(self, data): - self.received += data + dev = device.split('/')[-1] - def connectionLost(self, reason): - data = self.received.split('\0')[:-1] + if action is not None and action == "add": + error, blacklisted, removable, is_cdrom, partitions, medium_found = harddiskmanager.addHotplugPartition(dev, physdevpath) + if bdpoll and removable or is_cdrom: + bdpoll.addDevice(dev, is_cdrom, medium_found) + elif action is not None and action == "remove": + if bdpoll: + bdpoll.removeDevice(dev) + harddiskmanager.removeHotplugPartition(dev) + elif media_state is not None: + if media_state == '1': + harddiskmanager.removeHotplugPartition(dev) + harddiskmanager.addHotplugPartition(dev, physdevpath) + elif media_state == '0': + harddiskmanager.removeHotplugPartition(dev) - v = {} + for callback in hotplugNotifier: + try: + callback(dev, action or media_state) + except AttributeError: + hotplugNotifier.remove(callback) - for x in data: - i = x.find('=') - var, val = x[:i], x[i+1:] - v[var] = val +CDROM_DRIVE_STATUS = 0x5326 +CDROM_MEDIA_CHANGED = 0x5325 +CDSL_CURRENT = ((int)(~0>>1)) +CDS_NO_INFO = 0 +CDS_NO_DISC = 1 +CDS_TRAY_OPEN = 2 +CDS_DRIVE_NOT_READY = 3 +CDS_DISC_OK = 4 +ENOMEDIUM = 159 +IOC_NRBITS = 8 +IOC_NRSHIFT = 0 +IOC_TYPESHIFT = (IOC_NRSHIFT+IOC_NRBITS) +BLKRRPART = ((0x12< 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 = 'selectinterface' + self.currStep = self.getStepWithID(self.NextStep) + self.afterAsyncCode() + else: + if not iNetwork.isWirelessInterface(self.selectedInterface): self.NextStep = 'nwconfig' else: - self.NextStep = 'scanwlan' + self.NextStep = 'asknetworktype' 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') + if self.originalInterfaceStateChanged is False: + for interface in self.originalInterfaceState.keys(): + if interface == self.selectedInterface: + if self.originalInterfaceState[interface]["up"] is False: + if iNetwork.checkforInterface(interface) is True: + system("ifconfig " + interface + " down") def listInterfaces(self): - self.rescanTimer.stop() self.checkOldInterfaceState() list = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] list.append((_("Exit network wizard"), "end")) @@ -169,13 +146,13 @@ class NetworkWizard(WizardLanguage, Rc): elif index == 'eth0': self.NextStep = 'nwconfig' else: - self.NextStep = 'scanwlan' + self.NextStep = 'asknetworktype' def InterfaceSelectionMoved(self): self.InterfaceSelect(self.selection) def checkInterface(self,iface): - self.rescanTimer.stop() + self.stopScan() if self.Adapterlist is None: self.Adapterlist = iNetwork.getAdapterList() if self.NextStep is not 'end': @@ -183,7 +160,7 @@ class NetworkWizard(WizardLanguage, Rc): #Reset Network to defaults if network broken 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.getInstalledAdapters(): if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1: if iNetwork.getAdapterAttribute(iface, 'up') is True: self.isInterfaceUp = True @@ -232,7 +209,7 @@ class NetworkWizard(WizardLanguage, Rc): def AdapterSetupEndCB(self,data): if data is True: - if self.selectedInterface in ('wlan0', 'ath0'): + if iNetwork.isWirelessInterface(self.selectedInterface): if self.WlanPluginInstalled == True: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB) @@ -255,7 +232,7 @@ class NetworkWizard(WizardLanguage, Rc): 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" + text2 = _('Accesspoint:') + "\t" + str(status[self.selectedInterface]["accesspoint"]) + "\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" @@ -265,7 +242,7 @@ class NetworkWizard(WizardLanguage, Rc): 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": + if str(status[self.selectedInterface]["accesspoint"]) == "Not-Associated": self.InterfaceState = False self.afterAsyncCode() @@ -275,7 +252,7 @@ class NetworkWizard(WizardLanguage, Rc): def checkNetworkCB(self,data): if data is True: - if self.selectedInterface in ('wlan0', 'ath0'): + if iNetwork.isWirelessInterface(self.selectedInterface): if self.WlanPluginInstalled == True: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB) @@ -310,96 +287,74 @@ class NetworkWizard(WizardLanguage, Rc): 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 len(self.newAPlist): 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 + if currentListEntry is not None: + 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) + if newListIndex is not None: + self["list"].setIndex(newListIndex) self["list"].updateList(self.newAPlist) def listAccessPoints(self): self.APList = [] - try: - from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan - except ImportError: - self.APList.append( ( _("No networks found"),_("unavailable") ) ) - return self.APList + if self.WlanPluginInstalled is False: + self.APList.append( ( _("No networks found"), None ) ) 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]) ) - - if "hidden..." not in self.APList: - self.APList.append(( _("enter hidden network SSID"), "hidden..." )) + from Plugins.SystemPlugins.WirelessLan.Wlan import iWlan + iWlan.setInterface(self.selectedInterface) + self.w = iWlan.getInterface() + aps = iWlan.getNetworkList() + 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]) ) + if not len(aps): + self.APList.append( ( _("No networks found"), None ) ) - self.rescanTimer.start(3000) - return self.APList + self.rescanTimer.start(4000) + 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) + self.ap = self.selection + self.NextStep = 'wlanconfig' def checkWlanSelection(self): - self.rescanTimer.stop() + self.stopScan() self.currStep = self.getStepWithID(self.NextStep) def isWlanPluginInstalled(self): try: - from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan + from Plugins.SystemPlugins.WirelessLan.Wlan import iWlan except ImportError: self.WlanPluginInstalled = False else: self.WlanPluginInstalled = True def listChoices(self): - self.rescanTimer.stop() + self.stopScan() list = [] if self.WlanPluginInstalled == True: list.append((_("Configure your wireless LAN again"), "scanwlan")) @@ -417,8 +372,7 @@ class NetworkWizard(WizardLanguage, Rc): self.selectedInterface = "eth0" self.NextStep = 'nwconfig' else: - self.NextStep = 'scanwlan' + self.NextStep = 'asknetworktype' def ChoicesSelectionMoved(self): pass - diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml index c430043..0b3a298 100755 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml @@ -87,13 +87,33 @@ self.selectKey("DOWN") + + + +self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == True) + + + + +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") @@ -138,7 +158,7 @@ self.selectKey("DOWN") - + self.clearSelectedKeys() self.selectKey("OK") @@ -196,4 +216,3 @@ self.selectKey("OK") - diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py old mode 100755 new mode 100644 index 49ec7da..30a2423 --- a/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py +++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py @@ -1,6 +1,8 @@ from Screens.Screen import Screen from Plugins.Plugin import PluginDescriptor -from Components.config import getConfigListEntry, config +from Components.config import getConfigListEntry, config, ConfigBoolean + +config.misc.firstrun = ConfigBoolean(default = True) def NetworkWizardMain(session, **kwargs): session.open(NetworkWizard) @@ -18,5 +20,5 @@ def NetworkWizard(*args, **kwargs): def Plugins(**kwargs): list = [] if config.misc.firstrun.value: - list.append(PluginDescriptor(name=_("Network Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(25, NetworkWizard))) + list.append(PluginDescriptor(name=_("Network Wizard"), where = PluginDescriptor.WHERE_WIZARD, needsRestart = False, fnc=(25, NetworkWizard))) return list diff --git a/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py b/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py index c721638..22e5436 100644 --- a/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py +++ b/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py @@ -10,7 +10,7 @@ from os import popen class Upgrade(Screen): skin = """ - + """ @@ -39,7 +39,7 @@ class Upgrade(Screen): self.close() def doUpdateDelay(self): - lines = popen("ipkg update && ipkg upgrade -force-defaults -force-overwrite", "r").readlines() + lines = popen("opkg update && opkg upgrade -force-defaults -force-overwrite", "r").readlines() string = "" for x in lines: string += x @@ -87,7 +87,7 @@ class PacketList(GUIComponent): class Ipkg(Screen): skin = """ - + """ @@ -109,13 +109,13 @@ class Ipkg(Screen): def fillPacketList(self): - lines = popen("ipkg list", "r").readlines() + lines = popen("opkg list", "r").readlines() packetlist = [] for x in lines: split = x.split(' - ') packetlist.append([split[0].strip(), split[1].strip()]) - lines = popen("ipkg list_installed", "r").readlines() + lines = popen("opkg list_installed", "r").readlines() installedlist = {} for x in lines: @@ -138,7 +138,7 @@ class Ipkg(Screen): self.close() def doUpdateDelay(self): - lines = popen("ipkg update && ipkg upgrade", "r").readlines() + lines = popen("opkg update && opkg upgrade", "r").readlines() string = "" for x in lines: string += x @@ -161,4 +161,4 @@ def IpkgMain(session, **kwargs): def Plugins(**kwargs): return [PluginDescriptor(name="Old Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain), - PluginDescriptor(name="IPKG", description="IPKG frontend", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=IpkgMain)] + PluginDescriptor(name="opkg", description="opkg frontend", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=IpkgMain)] diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py index 3cc9e75..e097117 100644 --- a/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py +++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py @@ -441,15 +441,15 @@ class TunerScreen(ScanSetup): self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency)) self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion)) - self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate)) - self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization)) + self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate)) + self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization)) if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec)) elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2)) self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation) self.list.append(self.modulationEntry) - self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff)) + self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff)) self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot)) elif tuning.type.value == "predefined_transponder": self.list.append(getConfigListEntry(_("Transponder"), tuning.transponder)) @@ -608,6 +608,6 @@ def PositionerSetupStart(menuid, **kwargs): def Plugins(**kwargs): if (nimmanager.hasNimType("DVB-S")): - return PluginDescriptor(name=_("Positioner setup"), description="Setup your positioner", where = PluginDescriptor.WHERE_MENU, fnc=PositionerSetupStart) + return PluginDescriptor(name=_("Positioner setup"), description="Setup your positioner", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=PositionerSetupStart) else: return [] diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py index ec472e7..3a8c75c 100644 --- a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py @@ -71,6 +71,6 @@ def SecSetupStart(menuid): def Plugins(**kwargs): if (nimmgr.hasNimType("DVB-S")): - return PluginDescriptor(name=_("Satellite Equipment Setup"), description="Setup your satellite equipment", where = PluginDescriptor.WHERE_MENU, fnc=SecSetupStart) + return PluginDescriptor(name=_("Satellite Equipment Setup"), description="Setup your satellite equipment", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=SecSetupStart) else: return [] diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py index d4fe6b5..e611ca5 100644 --- a/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py @@ -79,15 +79,15 @@ class Satfinder(ScanSetup): self.scan_sat.system.value = eDVBFrontendParametersSatellite.System_DVB_S self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency)) self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion)) - self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate)) - self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization)) + self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate)) + self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization)) if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec)) elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2)) self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation) self.list.append(self.modulationEntry) - self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff)) + self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff)) self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot)) elif self.tuning_transponder and self.tuning_type.value == "predefined_transponder": self.list.append(getConfigListEntry(_("Transponder"), self.tuning_transponder)) @@ -276,6 +276,6 @@ def SatfinderStart(menuid, **kwargs): def Plugins(**kwargs): if (nimmanager.hasNimType("DVB-S")): - return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, fnc=SatfinderStart) + return PluginDescriptor(name=_("Satfinder"), description="Helps setting up your dish", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=SatfinderStart) else: return [] diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py b/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py old mode 100755 new mode 100644 index 997b957..fd2b5e1 --- a/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py @@ -12,12 +12,13 @@ from Plugins.Plugin import PluginDescriptor from Components.config import config from Tools.Directories import resolveFilename, SCOPE_PLUGINS from os import path, walk +from enigma import eEnv class SkinSelector(Screen): # for i18n: # _("Choose your Skin") skinlist = [] - root = "/usr/share/enigma2/" + root = eEnv.resolve("${datadir}/enigma2/") def __init__(self, session, args = None): @@ -130,4 +131,4 @@ def SkinSelSetup(menuid, **kwargs): return [] def Plugins(**kwargs): - return PluginDescriptor(name="Skinselector", description="Select Your Skin", where = PluginDescriptor.WHERE_MENU, fnc=SkinSelSetup) + return PluginDescriptor(name="Skinselector", description="Select Your Skin", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=SkinSelSetup) diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py index 7bd7d7a..c7c143f 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py @@ -11,16 +11,15 @@ from Components.config import config from Components.ConfigList import ConfigList,ConfigListScreen from Components.FileList import MultiFileSelectList from Plugins.Plugin import PluginDescriptor -from enigma import eTimer +from enigma import eTimer, eEnv from Tools.Directories import * from os import popen, path, makedirs, listdir, access, stat, rename, remove, W_OK, R_OK from time import gmtime, strftime, localtime from datetime import date - config.plugins.configurationbackup = ConfigSubsection() config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False) -config.plugins.configurationbackup.backupdirs = ConfigLocations(default=['/etc/enigma2/', '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname']) +config.plugins.configurationbackup.backupdirs = ConfigLocations(default=[eEnv.resolve('${sysconfdir}/enigma2/'), '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/wpa_supplicant.ath0.conf', '/etc/wpa_supplicant.wlan0.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname']) def getBackupPath(): backuppath = config.plugins.configurationbackup.backuplocation.value @@ -268,7 +267,7 @@ class RestoreMenu(Screen): self.sel = self["filelist"].getCurrent() if self.sel: self.val = self.path + "/" + self.sel - self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n" + self.sel )) + self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n") + self.sel) def startDelete(self, ret = False): if (ret == True): diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/ImageWizard.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/ImageWizard.py index 1797e4f..3ea787c 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/ImageWizard.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/ImageWizard.py @@ -9,13 +9,15 @@ from Plugins.Plugin import PluginDescriptor from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap from os import popen, path, makedirs, listdir, access, stat, rename, remove, W_OK, R_OK +from enigma import eEnv from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigLocations, ConfigBoolean from Components.Harddisk import harddiskmanager + config.misc.firstrun = ConfigBoolean(default = True) config.plugins.configurationbackup = ConfigSubsection() config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False) -config.plugins.configurationbackup.backupdirs = ConfigLocations(default=['/etc/enigma2/', '/etc/network/interfaces', '/etc/wpa_supplicant.conf']) +config.plugins.configurationbackup.backupdirs = ConfigLocations(default=[eEnv.resolve('${sysconfdir}/enigma2/'), '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/wpa_supplicant.ath0.conf', '/etc/wpa_supplicant.wlan0.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname']) backupfile = "enigma2settingsbackup.tar.gz" diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py index ee0bec7..ec2f82c 100755 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py @@ -9,9 +9,10 @@ from Components.Ipkg import IpkgComponent from Components.Network import iNetwork from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR from Tools.HardwareInfo import HardwareInfo -import sha - +import hashlib from time import time +from os import urandom + rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?'] def bin2long(s): @@ -30,7 +31,7 @@ def decrypt_block(src, mod): if len(src) != 128 and len(src) != 202: return None dest = rsa_pub1024(src[:128], mod) - hash = sha.new(dest[1:107]) + hash = hashlib.sha1(dest[1:107]) if len(src) == 202: hash.update(src[131:192]) result = hash.digest() @@ -46,10 +47,12 @@ def validate_cert(cert, key): def read_random(): try: - fd = open("/dev/urandom", "r") - buf = fd.read(8) - fd.close() - return buf + xor = lambda a,b: ''.join(chr(ord(c)^ord(d)) for c,d in zip(a,b*100)) + random = urandom(8) + x = str(time())[-8:] + result = xor(random, x) + + return result except: return None @@ -205,7 +208,7 @@ class SoftwareTools(DreamInfoHandler): if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() - cmd = "ipkg list" + cmd = "opkg list" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args = None): @@ -241,7 +244,7 @@ class SoftwareTools(DreamInfoHandler): if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() - cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" + cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta enigma2-drivers-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) @@ -264,13 +267,12 @@ class SoftwareTools(DreamInfoHandler): callback(False) def startIpkgListInstalled(self, callback = None): - print "STARTIPKGLISTINSTALLED" if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() - cmd = "ipkg list_installed" + cmd = "opkg list-installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args = None): @@ -331,7 +333,7 @@ class SoftwareTools(DreamInfoHandler): def startIpkgUpdate(self, callback = None): if not self.Console: self.Console = Console() - cmd = "ipkg update" + cmd = "opkg update" self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) def IpkgUpdateCB(self, result, retval, extra_args = None): @@ -344,6 +346,7 @@ class SoftwareTools(DreamInfoHandler): callback = None def cleanupSoftwareTools(self): + self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() @@ -366,4 +369,4 @@ class SoftwareTools(DreamInfoHandler): return False return True -iSoftwareTools = SoftwareTools() \ No newline at end of file +iSoftwareTools = SoftwareTools() diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py old mode 100755 new mode 100644 index 00608ee..12fd609 --- a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py @@ -28,7 +28,7 @@ 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 Tools.NumericalTextInput import NumericalTextInput -from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eRCInput, getPrevAsciiCode +from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eRCInput, getPrevAsciiCode, eEnv from cPickle import dump, load from os import path as os_path, system as os_system, unlink, stat, mkdir, popen, makedirs, listdir, access, rename, remove, W_OK, R_OK, F_OK from time import time, gmtime, strftime, localtime @@ -43,10 +43,10 @@ from SoftwareTools import iSoftwareTools config.plugins.configurationbackup = ConfigSubsection() config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False) -config.plugins.configurationbackup.backupdirs = ConfigLocations(default=['/etc/enigma2/', '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname']) +config.plugins.configurationbackup.backupdirs = ConfigLocations(default=[eEnv.resolve('${sysconfdir}/enigma2/'), '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/wpa_supplicant.ath0.conf', '/etc/wpa_supplicant.wlan0.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname']) -config.plugins.SoftwareManager = ConfigSubsection() -config.plugins.SoftwareManager.overwriteConfigFiles = ConfigSelection( +config.plugins.softwaremanager = ConfigSubsection() +config.plugins.softwaremanager.overwriteConfigFiles = ConfigSelection( [ ("Y", _("Yes, always")), ("N", _("No, never")), @@ -261,9 +261,6 @@ class UpdatePluginMenu(Screen): for x in parts: if not access(x[1], F_OK|R_OK|W_OK) or x[1] == '/': parts.remove(x) - for x in parts: - if x[1].startswith('/autofs/'): - 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 (currentEntry == "backupfiles"): @@ -278,14 +275,20 @@ class UpdatePluginMenu(Screen): def backupfiles_choosen(self, ret): self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value ) - + config.plugins.configurationbackup.backupdirs.save() + config.plugins.configurationbackup.save() + config.save() + def backuplocation_choosen(self, option): + oldpath = config.plugins.configurationbackup.backuplocation.getValue() if option is not None: config.plugins.configurationbackup.backuplocation.value = str(option[1]) config.plugins.configurationbackup.backuplocation.save() config.plugins.configurationbackup.save() config.save() - self.createBackupfolders() + newpath = config.plugins.configurationbackup.backuplocation.getValue() + if newpath != oldpath: + self.createBackupfolders() def runUpgrade(self, result): if result: @@ -362,7 +365,7 @@ class SoftwareManagerSetup(Screen, ConfigListScreen): def createSetup(self): self.list = [ ] - self.overwriteConfigfilesEntry = getConfigListEntry(_("Overwrite configuration files ?"), config.plugins.SoftwareManager.overwriteConfigFiles) + self.overwriteConfigfilesEntry = getConfigListEntry(_("Overwrite configuration files ?"), config.plugins.softwaremanager.overwriteConfigFiles) self.list.append(self.overwriteConfigfilesEntry) self["config"].list = self.list self["config"].l.setSeperation(400) @@ -486,7 +489,6 @@ class SoftwareManagerInfo(Screen): self.list = [] backupfiles = config.plugins.configurationbackup.backupdirs.value for entry in backupfiles: - print entry self.list.append((entry,)) self['list'].setList(self.list) @@ -566,6 +568,7 @@ class PluginManager(Screen, DreamInfoHandler): self.currentSelectedIndex = None self.currentSelectedPackage = None self.saved_currentSelectedPackage = None + self.restartRequired = False self.onShown.append(self.setWindowTitle) self.onLayoutFinish.append(self.getUpdateInfos) @@ -806,6 +809,8 @@ class PluginManager(Screen, DreamInfoHandler): name = x[0].strip() details = x[1].strip() description = x[2].strip() + if description == "": + description = "No description available." packagename = x[3].strip() selectState = self.getSelectionState(details) if iSoftwareTools.installed_packetlist.has_key(packagename): @@ -887,6 +892,8 @@ class PluginManager(Screen, DreamInfoHandler): self.package = iSoftwareTools.packageDetails[0] if self.package[0].has_key("attributes"): self.attributes = self.package[0]["attributes"] + if self.attributes.has_key("needsRestart"): + self.restartRequired = True if self.attributes.has_key("package"): self.packagefiles = self.attributes["package"] if plugin[1] == 'installed': @@ -918,17 +925,21 @@ class PluginManager(Screen, DreamInfoHandler): self.close() 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.reloadPluginlist() + if plugins.restartRequired or self.restartRequired: + self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + else: self.selectedFiles = [] + self.restartRequired = False self.detailsClosed(True) + + def ExecuteReboot(self, result): if result: quitMainloop(3) + else: + self.selectedFiles = [] + self.restartRequired = False + self.detailsClosed(True) def reloadPluginlist(self): plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) @@ -1166,7 +1177,7 @@ class PluginDetails(Screen, DreamInfoHandler): self.package = self.packageDetails[0] if self.package[0].has_key("attributes"): self.attributes = self.package[0]["attributes"] - + self.restartRequired = False self.cmdList = [] self.oktext = _("\nAfter pressing OK, please wait!") self.picload = ePicLoad() @@ -1264,6 +1275,8 @@ class PluginDetails(Screen, DreamInfoHandler): def go(self): if self.attributes.has_key("package"): self.packagefiles = self.attributes["package"] + if self.attributes.has_key("needsRestart"): + self.restartRequired = True self.cmdList = [] if self.pluginstate in ('installed', 'remove'): if self.packagefiles: @@ -1284,30 +1297,23 @@ class PluginDetails(Screen, DreamInfoHandler): 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.reloadPluginlist() + if plugins.restartRequired or self.restartRequired: + self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + else: self.close(True) + def UpgradeReboot(self, result): if result: quitMainloop(3) + else: + self.close(True) 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) + self.close(True) def reloadPluginlist(self): plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) @@ -1335,9 +1341,9 @@ class UpdatePlugin(Screen): self["slider"] = self.slider self.activityslider = Slider(0, 100) self["activityslider"] = self.activityslider - self.status = StaticText(_("Upgrading Dreambox... Please wait")) + self.status = StaticText(_("Please wait...")) self["status"] = self.status - self.package = StaticText() + self.package = StaticText(_("Verifying your internet connection...")) self["package"] = self.package self.oktext = _("Press OK on your remote control to continue.") @@ -1348,20 +1354,35 @@ class UpdatePlugin(Screen): 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.updating = False self["actions"] = ActionMap(["WizardActions"], { "ok": self.exit, "back": self.exit }, -1) + + iNetwork.checkNetworkState(self.checkNetworkCB) + self.onClose.append(self.cleanup) + + def cleanup(self): + iNetwork.stopPingConsole() + + def checkNetworkCB(self,data): + if data is not None: + if data <= 2: + self.updating = True + self.activityTimer.start(100, False) + self.package.setText(_("Package list update")) + self.status.setText(_("Upgrading Dreambox... Please wait")) + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + else: + self.package.setText(_("Your network is not working. Please try again.")) + self.status.setText(self.oktext) def doActivityTimer(self): self.activity += 1 @@ -1397,8 +1418,8 @@ class UpdatePlugin(Screen): self.status.setText(_("Configuring")) elif event == IpkgComponent.EVENT_MODIFIED: - if config.plugins.SoftwareManager.overwriteConfigFiles.value in ("N", "Y"): - self.ipkg.write(True and config.plugins.SoftwareManager.overwriteConfigFiles.value) + if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"): + self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value) else: self.session.openWithCallback( self.modificationCallback, @@ -1440,6 +1461,9 @@ class UpdatePlugin(Screen): self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?")) else: self.close() + else: + if not self.updating: + self.close() def exitAnswer(self, result): if result is not None and result: @@ -1496,7 +1520,7 @@ class IPKGMenu(Screen): def fill_list(self): self.flist = [] - self.path = '/etc/ipkg/' + self.path = '/etc/opkg/' if (os_path.exists(self.path) == False): self.entry = False return @@ -1679,11 +1703,12 @@ class PacketManager(Screen, NumericalTextInput): self.list_updating = True self.packetlist = [] self.installed_packetlist = {} + self.upgradeable_packages = {} 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.cache_file = eEnv.resolve('${libdir}/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') @@ -1839,7 +1864,7 @@ class PacketManager(Screen, NumericalTextInput): self.list_updating = False if not self.Console: self.Console = Console() - cmd = "ipkg list" + cmd = "opkg list" self.Console.ePopen(cmd, self.IpkgList_Finished) #print event, "-", param pass @@ -1847,47 +1872,68 @@ class PacketManager(Screen, NumericalTextInput): def IpkgList_Finished(self, result, retval, extra_args = None): if result: self.packetlist = [] + last_name = "" for x in result.splitlines(): - tokens = x.split(' - ') #self.blacklisted_packages + 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 "" + if name == last_name: + continue + last_name = name self.packetlist.append([name, version, descr]) + if not self.Console: self.Console = Console() - cmd = "ipkg list_installed" + cmd = "opkg list-installed" self.Console.ePopen(cmd, self.IpkgListInstalled_Finished) 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 + 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 "" self.installed_packetlist[name] = version - self.buildPacketList() + if not self.Console: + self.Console = Console() + cmd = "opkg list-upgradable" + self.Console.ePopen(cmd, self.OpkgListUpgradeable_Finished) + def OpkgListUpgradeable_Finished(self, result, retval, extra_args = None): + if result: + self.upgradeable_packages = {} + 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 > 2 and tokens[2].strip() or "" + self.upgradeable_packages[name] = version + self.buildPacketList() + def buildEntryComponent(self, name, version, description, state): divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) + if description == "": + description = "No description available." if state == 'installed': installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png")) - return((name, version, description, state, installedpng, divpng)) + 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)) + 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)) + 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: @@ -1903,24 +1949,22 @@ class PacketManager(Screen, NumericalTextInput): 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: + if self.installed_packetlist.has_key(x[0]): + if self.upgradeable_packages.has_key(x[0]): status = "upgradeable" - self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status)) + else: + status = "installed" 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]) + self.list.append(self.buildEntryComponent(x[0], x[1], x[2], status)) + self.cachelist.append([x[0], x[1], x[2], 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 = """ @@ -1993,9 +2037,9 @@ def Plugins(path, **kwargs): global plugin_path plugin_path = path list = [ - 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) + PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup), + PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan) ] if config.usage.setup_level.index >= 2: # expert+ - list.append(PluginDescriptor(name=_("Software management"), 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, needsRestart = False, fnc=UpgradeMain)) return list diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am b/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am index cfdeb65..490a772 100755 --- a/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am +++ b/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am @@ -1,4 +1,4 @@ -installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/TempFanControl +installdir = $(pkglibdir)/python/Plugins/SystemPlugins/TempFanControl SUBDIRS = meta @@ -6,4 +6,4 @@ install_PYTHON = \ __init__.py \ plugin.py -dist_install_DATA = LICENSE \ No newline at end of file +dist_install_DATA = LICENSE diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/meta/plugin_tempfancontrol.xml b/lib/python/Plugins/SystemPlugins/TempFanControl/meta/plugin_tempfancontrol.xml index a0bb5fa..5c6565a 100755 --- a/lib/python/Plugins/SystemPlugins/TempFanControl/meta/plugin_tempfancontrol.xml +++ b/lib/python/Plugins/SystemPlugins/TempFanControl/meta/plugin_tempfancontrol.xml @@ -2,6 +2,8 @@ + + diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py old mode 100755 new mode 100644 index 42fe82d..48f871f --- a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py +++ b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py @@ -166,5 +166,5 @@ def startMenu(menuid): 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) + return PluginDescriptor(name = "Temperature and Fan control", description = _("Temperature and Fan control"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = startMenu) diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml index 11b0c59..f52b4da 100755 --- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml +++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml @@ -3,6 +3,8 @@ + + diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py b/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py old mode 100755 new mode 100644 index 7953d38..cde3930 --- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py +++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py @@ -394,5 +394,5 @@ def startSetup(menuid): def Plugins(**kwargs): list = [] if config.usage.setup_level.index >= 2 and os_path.exists("/proc/stb/vmpeg/0/pep_apply"): - list.append(PluginDescriptor(name=_("Videoenhancement Setup"), description=_("Advanced Video Enhancement Setup"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup)) + list.append(PluginDescriptor(name=_("Videoenhancement Setup"), description=_("Advanced Video Enhancement Setup"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup)) return list diff --git a/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py b/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py index 1b62206..9e90c72 100644 --- a/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py +++ b/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py @@ -34,6 +34,6 @@ def startSetup(menuid): def Plugins(**kwargs): return [ - PluginDescriptor(name=_("Video Fine-Tuning"), description=_("fine-tune your display"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup), - PluginDescriptor(name=_("Video Fine-Tuning Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(1, videoFinetuneWizard)) + PluginDescriptor(name=_("Video Fine-Tuning"), description=_("fine-tune your display"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup), + PluginDescriptor(name=_("Video Fine-Tuning Wizard"), where = PluginDescriptor.WHERE_WIZARD, needsRestart = False, fnc=(1, videoFinetuneWizard)) ] diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py index 59c5047..6ecbfd4 100644 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoHardware.py @@ -196,10 +196,12 @@ class VideoHardware: print "saveMode", port, mode, rate config.av.videoport.value = port config.av.videoport.save() - config.av.videomode[port].value = mode - config.av.videomode[port].save() - config.av.videorate[mode].value = rate - config.av.videorate[mode].save() + if port in config.av.videomode: + config.av.videomode[port].value = mode + config.av.videomode[port].save() + if mode in config.av.videorate: + config.av.videorate[mode].value = rate + config.av.videorate[mode].save() def isPortAvailable(self, port): # fixme @@ -239,9 +241,9 @@ class VideoHardware: portlist = self.getPortList() for port in portlist: descr = port - if descr == 'DVI' and hw_type in ('dm500hd', 'dm800se'): + if descr == 'DVI' and hw_type in ('dm500hd', 'dm800se', 'dm7020hd'): descr = 'HDMI' - elif descr == 'DVI-PC' and hw_type in ('dm500hd', 'dm800se'): + elif descr == 'DVI-PC' and hw_type in ('dm500hd', 'dm800se', 'dm7020hd'): descr = 'HDMI-PC' lst.append((port, descr)) diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py index 9b9044e..18e8176 100755 --- a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py @@ -90,7 +90,7 @@ class VideoWizard(WizardLanguage, Rc): for port in self.hw.getPortList(): if self.hw.isPortUsed(port): descr = port - if descr == 'DVI' and hw_type in ('dm500hd', 'dm800se'): + if descr == 'DVI' and hw_type in ('dm500hd', 'dm800se', 'dm7020hd'): descr = 'HDMI' if port != "DVI-PC": list.append((descr,port)) @@ -108,7 +108,7 @@ class VideoWizard(WizardLanguage, Rc): self.inputSelect(self.selection) if self["portpic"].instance is not None: picname = self.selection - if picname == "DVI" and HardwareInfo().get_device_name() in ("dm500hd", "dm800se"): + if picname == "DVI" and HardwareInfo().get_device_name() in ("dm500hd", "dm800se", "dm7020hd"): picname = "HDMI" self["portpic"].instance.setPixmapFromFile(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/Videomode/" + picname + ".png")) diff --git a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py old mode 100755 new mode 100644 index 39c1131..7396534 --- a/lib/python/Plugins/SystemPlugins/Videomode/plugin.py +++ b/lib/python/Plugins/SystemPlugins/Videomode/plugin.py @@ -227,8 +227,8 @@ def VideoWizard(*args, **kwargs): def Plugins(**kwargs): list = [ # PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart), - PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup) + PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup) ] if config.misc.videowizardenabled.value: - list.append(PluginDescriptor(name=_("Video Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(0, VideoWizard))) + list.append(PluginDescriptor(name=_("Video Wizard"), where = PluginDescriptor.WHERE_WIZARD, needsRestart = False, fnc=(0, VideoWizard))) return list diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py index baefd43..a185157 100755 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py @@ -1,36 +1,42 @@ from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword from Components.Console import Console +from Components.Network import iNetwork -from os import system +from os import system, path as os_path from string import maketrans, strip import sys import types -from re import compile as re_compile, search as re_search +from re import compile as re_compile, search as re_search, escape as re_escape from pythonwifi.iwlibs import getNICnames, Wireless, Iwfreq, getWNICnames from pythonwifi import flags as wififlags list = [] +list.append("Unencrypted") list.append("WEP") list.append("WPA") -list.append("WPA2") list.append("WPA/WPA2") +list.append("WPA2") weplist = [] weplist.append("ASCII") weplist.append("HEX") config.plugins.wlan = ConfigSubsection() -config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False)) -config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False)) +config.plugins.wlan.essid = NoSave(ConfigText(default = "", fixed_size = False)) +config.plugins.wlan.hiddenessid = NoSave(ConfigYesNo(default = False)) +config.plugins.wlan.encryption = NoSave(ConfigSelection(list, default = "WPA2")) +config.plugins.wlan.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) +config.plugins.wlan.psk = NoSave(ConfigPassword(default = "", fixed_size = False)) + -config.plugins.wlan.encryption = ConfigSubsection() -config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = True)) -config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2")) -config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) -config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False)) +def getWlanConfigName(iface): + return '/etc/wpa_supplicant.' + iface + '.conf' class Wlan: - def __init__(self, iface): + def __init__(self, iface = None): + self.iface = iface + self.oldInterfaceState = None + a = ''; b = '' for i in range(0, 255): a = a + chr(i) @@ -39,135 +45,37 @@ class Wlan: else: b = b + chr(i) - self.iface = iface - self.wlaniface = {} - self.WlanConsole = Console() self.asciitrans = maketrans(a, b) - def stopWlanConsole(self): - if self.WlanConsole is not None: - print "killing self.WlanConsole" - self.WlanConsole = None - del self.WlanConsole - - def getDataForInterface(self, callback = None): - #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. - print "self.iface im getDataForInterface",self.iface - if len(self.WlanConsole.appContainers) == 0: - self.WlanConsole = Console() - cmd = "iwconfig " + self.iface - self.WlanConsole.ePopen(cmd, self.iwconfigFinished, callback) - - def iwconfigFinished(self, result, retval, extra_args): - print "self.iface im iwconfigFinished",self.iface - callback = extra_args - data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False } - - for line in result.splitlines(): - line = line.strip() - if "ESSID" in line: - if "off/any" in line: - ssid = _("No Connection") - else: - if "Nickname" in line: - tmpssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid - else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid - - if ssid is not None: - data['essid'] = ssid - if 'Frequency' in line: - frequency = line[line.index('Frequency')+10 :line.index(' GHz')] - if frequency is not None: - data['frequency'] = frequency - if "Access Point" in line: - ap=line[line.index('Access Point')+14:len(line)-1] - if ap is not None: - data['acesspoint'] = ap - if "Bit Rate" in line: - br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] - if br is not None: - data['bitrate'] = br - if 'Encryption key' in line: - if ":off" in line: - enc = _("Disabled") - else: - enc = line[line.index('Encryption key')+15 :line.index(' Security')] - if enc is not None: - data['encryption'] = _("Enabled") - if 'Quality' in line: - if "/100" in line: - qual = line[line.index('Quality')+8:line.index('/100')] - else: - qual = line[line.index('Quality')+8:line.index('Sig')] - if qual is not None: - data['quality'] = qual - if 'Signal level' in line: - signal = line[line.index('Signal level')+13 :line.index(' dBm')] - if signal is not None: - data['signal'] = signal - - self.wlaniface[self.iface] = data - - if len(self.WlanConsole.appContainers) == 0: - print "self.wlaniface after loading:", self.wlaniface - self.WlanConsole = None - if callback is not None: - callback(True,self.wlaniface) - - def getAdapterAttribute(self, attribute): - if self.wlaniface.has_key(self.iface): - print "self.wlaniface.has_key",self.iface - if self.wlaniface[self.iface].has_key(attribute): - return self.wlaniface[self.iface][attribute] - return None - def asciify(self, str): return str.translate(self.asciitrans) - def getWirelessInterfaces(self): - device = re_compile('[a-z]{2,}[0-9]*:') - ifnames = [] + return getWNICnames() + + def setInterface(self, iface = None): + self.iface = iface - fp = open('/proc/net/wireless', 'r') - for line in fp: - try: - # append matching pattern, without the trailing colon - ifnames.append(device.search(line).group()[:-1]) - except AttributeError: - pass - return ifnames + def getInterface(self): + return self.iface - def getNetworkList(self): - system("ifconfig "+self.iface+" up") + if self.oldInterfaceState is None: + self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up") + if self.oldInterfaceState is False: + if iNetwork.getAdapterAttribute(self.iface, "up") is False: + iNetwork.setAdapterAttribute(self.iface, "up", True) + system("ifconfig "+self.iface+" up") + ifobj = Wireless(self.iface) # a Wireless NIC Object - - #Association mappings - #stats, quality, discard, missed_beacon = ifobj.getStatistics() - #snr = quality.signallevel - quality.noiselevel try: scanresults = ifobj.scan() except: scanresults = None - print "[Wlan.py] No Wireless Networks could be found" - + print "[Wlan.py] No wireless networks could be found" + aps = {} if scanresults is not None: - aps = {} (num_channels, frequencies) = ifobj.getChannelInfo() index = 1 for result in scanresults: @@ -188,7 +96,6 @@ class Wlan: element = element.encode() extra.append( strip(self.asciify(element)) ) for element in extra: - print element if 'SignalStrength' in element: signal = element[element.index('SignalStrength')+15:element.index(',L')] if 'LinkQuality' in element: @@ -207,277 +114,222 @@ class Wlan: 'signal' : str(signal), 'custom' : extra, } - #print "GOT APS ENTRY:",aps[bssid] - index = index + 1 - return aps + index = index + 1 + return aps - def getStatus(self): - ifobj = Wireless(self.iface) - fq = Iwfreq() - try: - self.channel = str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))) - except: - self.channel = 0 - status = { - 'BSSID': str(ifobj.getAPaddr()), #ifobj.getStatistics() - 'ESSID': str(ifobj.getEssid()), - 'quality': "%s/%s" % (ifobj.getStatistics()[1].quality,ifobj.getQualityMax().quality), - 'signal': str(ifobj.getStatistics()[1].siglevel-0x100) + " dBm", - 'bitrate': str(ifobj.getBitrate()), - 'channel': str(self.channel), - #'channel': str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))), - } - - for (key, item) in status.items(): - if item is "None" or item is "": - status[key] = _("N/A") - - return status + def stopGetNetworkList(self): + if self.oldInterfaceState is not None: + if self.oldInterfaceState is False: + iNetwork.setAdapterAttribute(self.iface, "up", False) + system("ifconfig "+self.iface+" down") + self.oldInterfaceState = None + self.iface = None +iWlan = Wlan() class wpaSupplicant: def __init__(self): pass - - def writeConfig(self): - - essid = config.plugins.wlan.essid.value - hiddenessid = config.plugins.wlan.hiddenessid.value - encrypted = config.plugins.wlan.encryption.enabled.value - encryption = config.plugins.wlan.encryption.type.value - wepkeytype = config.plugins.wlan.encryption.wepkeytype.value - psk = config.plugins.wlan.encryption.psk.value - fp = file('/etc/wpa_supplicant.conf', 'w') - fp.write('#WPA Supplicant Configuration by enigma2\n') - fp.write('ctrl_interface=/var/run/wpa_supplicant\n') - fp.write('eapol_version=1\n') - fp.write('fast_reauth=1\n') - if essid == 'hidden...': - fp.write('ap_scan=2\n') + def writeConfig(self, iface): + essid = config.plugins.wlan.essid.value + hiddenessid = config.plugins.wlan.hiddenessid.value + encryption = config.plugins.wlan.encryption.value + wepkeytype = config.plugins.wlan.wepkeytype.value + psk = config.plugins.wlan.psk.value + fp = file(getWlanConfigName(iface), 'w') + fp.write('#WPA Supplicant Configuration by enigma2\n') + fp.write('ctrl_interface=/var/run/wpa_supplicant\n') + fp.write('eapol_version=1\n') + fp.write('fast_reauth=1\n') + + if hiddenessid: + fp.write('ap_scan=2\n') + else: + fp.write('ap_scan=1\n') + fp.write('network={\n') + fp.write('\tssid="'+essid+'"\n') + fp.write('\tscan_ssid=0\n') + if encryption in ('WPA', 'WPA2', 'WPA/WPA2'): + fp.write('\tkey_mgmt=WPA-PSK\n') + if encryption == 'WPA': + fp.write('\tproto=WPA\n') + fp.write('\tpairwise=TKIP\n') + fp.write('\tgroup=TKIP\n') + elif encryption == 'WPA2': + fp.write('\tproto=RSN\n') + fp.write('\tpairwise=CCMP\n') + fp.write('\tgroup=CCMP\n') else: - fp.write('ap_scan=1\n') - fp.write('network={\n') - if essid == 'hidden...': - fp.write('\tssid="'+hiddenessid+'"\n') + fp.write('\tproto=WPA RSN\n') + fp.write('\tpairwise=CCMP TKIP\n') + fp.write('\tgroup=CCMP TKIP\n') + fp.write('\tpsk="'+psk+'"\n') + elif encryption == 'WEP': + fp.write('\tkey_mgmt=NONE\n') + if wepkeytype == 'ASCII': + fp.write('\twep_key0="'+psk+'"\n') else: - fp.write('\tssid="'+essid+'"\n') - fp.write('\tscan_ssid=0\n') - if encrypted: - if encryption == 'WPA' or encryption == 'WPA2' or encryption == 'WPA/WPA2' : - fp.write('\tkey_mgmt=WPA-PSK\n') - - if encryption == 'WPA': - fp.write('\tproto=WPA\n') - fp.write('\tpairwise=TKIP\n') - fp.write('\tgroup=TKIP\n') - elif encryption == 'WPA2': - fp.write('\tproto=WPA RSN\n') - fp.write('\tpairwise=CCMP TKIP\n') - fp.write('\tgroup=CCMP TKIP\n') - else: - fp.write('\tproto=WPA WPA2\n') - fp.write('\tpairwise=CCMP\n') - fp.write('\tgroup=TKIP\n') - fp.write('\tpsk="'+psk+'"\n') - - elif encryption == 'WEP': - fp.write('\tkey_mgmt=NONE\n') - if wepkeytype == 'ASCII': - fp.write('\twep_key0="'+psk+'"\n') - else: - fp.write('\twep_key0='+psk+'\n') - else: - fp.write('\tkey_mgmt=NONE\n') - fp.write('}') - fp.write('\n') - fp.close() - system("cat /etc/wpa_supplicant.conf") + fp.write('\twep_key0='+psk+'\n') + else: + fp.write('\tkey_mgmt=NONE\n') + fp.write('}') + fp.write('\n') + fp.close() + #system('cat ' + getWlanConfigName(iface)) - def loadConfig(self): + def loadConfig(self,iface): + configfile = getWlanConfigName(iface) + if not os_path.exists(configfile): + configfile = '/etc/wpa_supplicant.conf' try: #parse the wpasupplicant configfile - fp = file('/etc/wpa_supplicant.conf', 'r') + print "[Wlan.py] parsing configfile: ",configfile + fp = file(configfile, 'r') supplicant = fp.readlines() fp.close() - ap_scan = False essid = None + encryption = "Unencrypted" for s in supplicant: split = s.strip().split('=',1) if split[0] == 'ap_scan': - print "[Wlan.py] Got Hidden SSID Scan Value "+split[1] if split[1] == '2': - ap_scan = True + config.plugins.wlan.hiddenessid.value = True else: - ap_scan = False - + config.plugins.wlan.hiddenessid.value = False + elif split[0] == 'ssid': - print "[Wlan.py] Got SSID "+split[1][1:-1] essid = split[1][1:-1] - + config.plugins.wlan.essid.value = essid + elif split[0] == 'proto': - config.plugins.wlan.encryption.enabled.value = True - if split[1] == "WPA" : + if split[1] == 'WPA' : mode = 'WPA' - if split[1] == "WPA WPA2" : - mode = 'WPA/WPA2' - if split[1] == "WPA RSN" : + if split[1] == 'RSN': mode = 'WPA2' - config.plugins.wlan.encryption.type.value = mode - print "[Wlan.py] Got Encryption: "+mode - - #currently unused ! - #elif split[0] == 'key_mgmt': - # print "split[1]",split[1] - # if split[1] == "WPA-PSK" : - # config.plugins.wlan.encryption.enabled.value = True - # config.plugins.wlan.encryption.type.value = "WPA/WPA2" - # print "[Wlan.py] Got Encryption: "+ config.plugins.wlan.encryption.type.value + if split[1] in ('WPA RSN', 'WPA WPA2'): + mode = 'WPA/WPA2' + encryption = mode elif split[0] == 'wep_key0': - config.plugins.wlan.encryption.enabled.value = True - config.plugins.wlan.encryption.type.value = 'WEP' + encryption = 'WEP' if split[1].startswith('"') and split[1].endswith('"'): - config.plugins.wlan.encryption.wepkeytype.value = 'ASCII' - config.plugins.wlan.encryption.psk.value = split[1][1:-1] + config.plugins.wlan.wepkeytype.value = 'ASCII' + config.plugins.wlan.psk.value = split[1][1:-1] else: - config.plugins.wlan.encryption.wepkeytype.value = 'HEX' - config.plugins.wlan.encryption.psk.value = split[1] + config.plugins.wlan.wepkeytype.value = 'HEX' + config.plugins.wlan.psk.value = split[1] elif split[0] == 'psk': - config.plugins.wlan.encryption.psk.value = split[1][1:-1] + config.plugins.wlan.psk.value = split[1][1:-1] else: pass + + config.plugins.wlan.encryption.value = encryption - if ap_scan is True: - config.plugins.wlan.hiddenessid.value = essid - config.plugins.wlan.essid.value = 'hidden...' - else: - config.plugins.wlan.hiddenessid.value = essid - config.plugins.wlan.essid.value = essid wsconfig = { 'hiddenessid': config.plugins.wlan.hiddenessid.value, 'ssid': config.plugins.wlan.essid.value, - 'encryption': config.plugins.wlan.encryption.enabled.value, - 'encryption_type': config.plugins.wlan.encryption.type.value, - 'encryption_wepkeytype': config.plugins.wlan.encryption.wepkeytype.value, - 'key': config.plugins.wlan.encryption.psk.value, + 'encryption': config.plugins.wlan.encryption.value, + 'wepkeytype': config.plugins.wlan.wepkeytype.value, + 'key': config.plugins.wlan.psk.value, } for (key, item) in wsconfig.items(): if item is "None" or item is "": if key == 'hiddenessid': - wsconfig['hiddenessid'] = "home" + wsconfig['hiddenessid'] = False if key == 'ssid': - wsconfig['ssid'] = "home" + wsconfig['ssid'] = "" if key == 'encryption': - wsconfig['encryption'] = True - if key == 'encryption': - wsconfig['encryption_type'] = "WPA/WPA2" - if key == 'encryption': - wsconfig['encryption_wepkeytype'] = "ASCII" - if key == 'encryption': - wsconfig['key'] = "mysecurewlan" - + wsconfig['encryption'] = "WPA2" + if key == 'wepkeytype': + wsconfig['wepkeytype'] = "ASCII" + if key == 'key': + wsconfig['key'] = "" except: - print "[Wlan.py] Error parsing /etc/wpa_supplicant.conf" + print "[Wlan.py] Error parsing ",configfile wsconfig = { - 'hiddenessid': "home", - 'ssid': "home", - 'encryption': True, - 'encryption_type': "WPA/WPA2", - 'encryption_wepkeytype': "ASCII", - 'key': "mysecurewlan", + 'hiddenessid': False, + 'ssid': "", + 'encryption': "WPA2", + 'wepkeytype': "ASCII", + 'key': "", } - print "[Wlan.py] WS-CONFIG-->",wsconfig + #print "[Wlan.py] WS-CONFIG-->",wsconfig return wsconfig - - def restart(self, iface): - system("start-stop-daemon -K -x /usr/sbin/wpa_supplicant") - system("start-stop-daemon -S -x /usr/sbin/wpa_supplicant -- -B -i"+iface+" -c/etc/wpa_supplicant.conf") class Status: def __init__(self): self.wlaniface = {} self.backupwlaniface = {} + self.statusCallback = None self.WlanConsole = Console() def stopWlanConsole(self): if self.WlanConsole is not None: - print "killing self.WlanConsole" + print "[iStatus] killing self.WlanConsole" + self.WlanConsole.killAll() self.WlanConsole = None def getDataForInterface(self, iface, callback = None): self.WlanConsole = Console() cmd = "iwconfig " + iface - self.WlanConsole.ePopen(cmd, self.iwconfigFinished, [iface, callback]) + if callback is not None: + self.statusCallback = callback + self.WlanConsole.ePopen(cmd, self.iwconfigFinished, iface) def iwconfigFinished(self, result, retval, extra_args): - (iface, callback) = extra_args - data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False } + iface = extra_args + data = { 'essid': False, 'frequency': False, 'accesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False } for line in result.splitlines(): line = line.strip() if "ESSID" in line: if "off/any" in line: - ssid = _("No Connection") + ssid = "off" else: if "Nickname" in line: - tmpssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid + ssid=(line[line.index('ESSID')+7:line.index('" Nickname')]) else: - tmpssid=(line[line.index('ESSID')+7:len(line)-1]) - if tmpssid == '': - ssid = _("Hidden networkname") - elif tmpssid ==' ': - ssid = _("Hidden networkname") - else: - ssid = tmpssid + ssid=(line[line.index('ESSID')+7:len(line)-1]) if ssid is not None: data['essid'] = ssid - if 'Frequency' in line: + if "Frequency" in line: frequency = line[line.index('Frequency')+10 :line.index(' GHz')] if frequency is not None: data['frequency'] = frequency if "Access Point" in line: - ap=line[line.index('Access Point')+14:len(line)] + if "Sensitivity" in line: + ap=line[line.index('Access Point')+14:line.index(' Sensitivity')] + else: + ap=line[line.index('Access Point')+14:len(line)] if ap is not None: - data['acesspoint'] = ap - if ap == "Not-Associated": - data['essid'] = _("No Connection") + data['accesspoint'] = ap if "Bit Rate" in line: if "kb" in line: br = line[line.index('Bit Rate')+9 :line.index(' kb/s')] - if br == '0': - br = _("Unsupported") - else: - br += " Mb/s" else: - br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + " Mb/s" + br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] if br is not None: data['bitrate'] = br - if 'Encryption key' in line: + if "Encryption key" in line: if ":off" in line: - if data['acesspoint'] is not "Not-Associated": - enc = _("Unsupported") - else: - enc = _("Disabled") - else: + enc = "off" + elif "Security" in line: enc = line[line.index('Encryption key')+15 :line.index(' Security')] if enc is not None: - enc = _("Enabled") + enc = "on" + else: + enc = line[line.index('Encryption key')+15 :len(line)] + if enc is not None: + enc = "on" if enc is not None: data['encryption'] = enc if 'Quality' in line: if "/100" in line: - #qual = line[line.index('Quality')+8:line.index('/100')] qual = line[line.index('Quality')+8:line.index(' Signal')] else: qual = line[line.index('Quality')+8:line.index('Sig')] @@ -485,8 +337,7 @@ class Status: data['quality'] = qual if 'Signal level' in line: if "dBm" in line: - signal = line[line.index('Signal level')+13 :line.index(' dBm')] - signal += " dBm" + signal = line[line.index('Signal level')+13 :line.index(' dBm')] + " dBm" elif "/100" in line: if "Noise" in line: signal = line[line.index('Signal level')+13:line.index(' Noise')] @@ -505,9 +356,10 @@ class Status: if self.WlanConsole is not None: if len(self.WlanConsole.appContainers) == 0: - print "self.wlaniface after loading:", self.wlaniface - if callback is not None: - callback(True,self.wlaniface) + print "[Wlan.py] self.wlaniface after loading:", self.wlaniface + if self.statusCallback is not None: + self.statusCallback(True,self.wlaniface) + self.statusCallback = None def getAdapterAttribute(self, iface, attribute): self.iface = iface diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py old mode 100755 new mode 100644 index 28ee363..3462146 --- a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py +++ b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py @@ -1,4 +1,4 @@ -from enigma import eTimer, eTPM +from enigma import eTimer, eTPM, eEnv from Screens.Screen import Screen from Components.ActionMap import ActionMap, NumberActionMap from Components.Pixmap import Pixmap,MultiPixmap @@ -8,37 +8,40 @@ 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 -from Components.Network import Network, iNetwork +from Components.Network import iNetwork from Components.Console import Console from Plugins.Plugin import PluginDescriptor from os import system, path as os_path, listdir from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE from Tools.LoadPixmap import LoadPixmap from Tools.HardwareInfo import HardwareInfo -from Wlan import Wlan, wpaSupplicant, iStatus -import sha +from Wlan import iWlan, wpaSupplicant, iStatus, getWlanConfigName +import hashlib +from time import time +from os import urandom, system +from re import escape as re_escape + +plugin_path = eEnv.resolve("${libdir}/enigma2/python/Plugins/SystemPlugins/WirelessLan") -plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan" list = [] +list.append("Unencrypted") list.append("WEP") list.append("WPA") -list.append("WPA2") list.append("WPA/WPA2") +list.append("WPA2") weplist = [] weplist.append("ASCII") weplist.append("HEX") config.plugins.wlan = ConfigSubsection() -config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False)) -config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False)) +config.plugins.wlan.essid = NoSave(ConfigText(default = "", fixed_size = False)) +config.plugins.wlan.hiddenessid = NoSave(ConfigYesNo(default = False)) +config.plugins.wlan.encryption = NoSave(ConfigSelection(list, default = "WPA2")) +config.plugins.wlan.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) +config.plugins.wlan.psk = NoSave(ConfigPassword(default = "", fixed_size = False)) -config.plugins.wlan.encryption = ConfigSubsection() -config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = False)) -config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2" )) -config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII")) -config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False)) class WlanStatus(Screen): @@ -105,7 +108,7 @@ class WlanStatus(Screen): }, -1) self.timer = eTimer() self.timer.timeout.get().append(self.resetList) - self.onShown.append(lambda: self.timer.start(5000)) + self.onShown.append(lambda: self.timer.start(8000)) self.onLayoutFinish.append(self.layoutFinished) self.onClose.append(self.cleanup) @@ -113,7 +116,7 @@ class WlanStatus(Screen): iStatus.stopWlanConsole() def layoutFinished(self): - self.setTitle(_("Wireless Network State")) + self.setTitle(_("Wireless network state")) def resetList(self): iStatus.getDataForInterface(self.iface,self.getInfoCB) @@ -122,32 +125,65 @@ class WlanStatus(Screen): if data is not None: if data is True: if status is not None: - self["BSSID"].setText(status[self.iface]["acesspoint"]) - self["ESSID"].setText(status[self.iface]["essid"]) - self["quality"].setText(status[self.iface]["quality"]) - self["signal"].setText(status[self.iface]["signal"]) - self["bitrate"].setText(status[self.iface]["bitrate"]) - self["enc"].setText(status[self.iface]["encryption"]) + if status[self.iface]["essid"] == "off": + essid = _("No Connection") + else: + essid = status[self.iface]["essid"] + if status[self.iface]["accesspoint"] == "Not-Associated": + accesspoint = _("Not-Associated") + essid = _("No Connection") + else: + accesspoint = status[self.iface]["accesspoint"] + if self.has_key("BSSID"): + self["BSSID"].setText(accesspoint) + if self.has_key("ESSID"): + self["ESSID"].setText(essid) + + quality = status[self.iface]["quality"] + if self.has_key("quality"): + self["quality"].setText(quality) + + if status[self.iface]["bitrate"] == '0': + bitrate = _("Unsupported") + else: + bitrate = str(status[self.iface]["bitrate"]) + " Mb/s" + if self.has_key("bitrate"): + self["bitrate"].setText(bitrate) + + signal = status[self.iface]["signal"] + if self.has_key("signal"): + self["signal"].setText(signal) + + if status[self.iface]["encryption"] == "off": + if accesspoint == "Not-Associated": + encryption = _("Disabled") + else: + encryption = _("Unsupported") + else: + encryption = _("Enabled") + if self.has_key("enc"): + self["enc"].setText(encryption) self.updateStatusLink(status) def exit(self): self.timer.stop() - self.close(True) + self.close(True) def updateStatusbar(self): - self["BSSID"].setText(_("Please wait...")) - self["ESSID"].setText(_("Please wait...")) - self["quality"].setText(_("Please wait...")) - self["signal"].setText(_("Please wait...")) - self["bitrate"].setText(_("Please wait...")) - self["enc"].setText(_("Please wait...")) + wait_txt = _("Please wait...") + self["BSSID"].setText(wait_txt) + self["ESSID"].setText(wait_txt) + self["quality"].setText(wait_txt) + self["signal"].setText(wait_txt) + self["bitrate"].setText(wait_txt) + self["enc"].setText(wait_txt) self["IFtext"].setText(_("Network:")) self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface)) self["Statustext"].setText(_("Link:")) def updateStatusLink(self,status): 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: + if status[self.iface]["essid"] == "off" or status[self.iface]["accesspoint"] == "Not-Associated" or status[self.iface]["accesspoint"] == False: self["statuspic"].setPixmapNum(1) else: self["statuspic"].setPixmapNum(0) @@ -217,6 +253,8 @@ class WlanScan(Screen): "red": self.cancel, "green": self.select, }) + iWlan.setInterface(self.iface) + self.w = iWlan.getInterface() self.onLayoutFinish.append(self.layoutFinished) self.getAccessPoints(refresh = False) @@ -226,42 +264,24 @@ class WlanScan(Screen): def select(self): cur = self["list"].getCurrent() if cur is not None: + iWlan.stopGetNetworkList() self.rescanTimer.stop() del self.rescanTimer - if cur[1] is not None: - if cur[1] == 'hidden...': - essid = cur[1] - else: - essid = cur[0] - self.close(essid,self.getWlanList()) + if cur[0] is not None: + self.close(cur[0]) else: - self.close(None,None) + self.close(None) else: - self.rescanTimer.stop() - del self.rescanTimer - self.close(None,None) - - def WlanSetupClosed(self, *ret): - if ret[0] == 2: + iWlan.stopGetNetworkList() self.rescanTimer.stop() del self.rescanTimer self.close(None) 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: - self.rescanTimer.stop() - del self.rescanTimer - self.close(None) + iWlan.stopGetNetworkList() + self.rescanTimer.stop() + del self.rescanTimer + self.close(None) def rescanTimerFired(self): self.rescanTimer.stop() @@ -270,10 +290,7 @@ class WlanScan(Screen): 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)) + return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng)) def updateAPList(self): newList = [] @@ -290,20 +307,19 @@ class WlanScan(Screen): 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 + if currentListEntry is not None: + 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) + if newListIndex is not None: + self["list"].setIndex(newListIndex) self["list"].updateList(self.newAPList) self.listLength = len(self.newAPList) self.buildWlanList() @@ -312,8 +328,7 @@ class WlanScan(Screen): def getAccessPoints(self, refresh = False): self.APList = [] self.cleanList = [] - self.w = Wlan(self.iface) - aps = self.w.getNetworkList() + aps = iWlan.getNetworkList() if aps is not None: print "[WirelessLan.py] got Accespoints!" tmpList = [] @@ -336,9 +351,6 @@ class WlanScan(Screen): 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] )) @@ -351,20 +363,17 @@ class WlanScan(Screen): def setInfo(self): length = self.getLength() - if length <= 1: - self["info"].setText(_("No wireless networks found! Please refresh.")) - elif length == 2: + if length == 0: + self["info"].setText(_("No wireless networks found! Searching...")) + elif length == 1: self["info"].setText(_("1 wireless network found!")) else: - self["info"].setText(str(length-1)+_(" wireless networks found!")) + self["info"].setText(str(length)+_(" 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]) ) + self.WlanList.append( (entry[0], entry[0]) ) def getLength(self): return self.listLength @@ -391,7 +400,7 @@ def decrypt_block(src, mod): if len(src) != 128 and len(src) != 202: return None dest = rsa_pub1024(src[:128], mod) - hash = sha.new(dest[1:107]) + hash = hashlib.sha1(dest[1:107]) if len(src) == 202: hash.update(src[131:192]) result = hash.digest() @@ -399,68 +408,71 @@ def decrypt_block(src, mod): return dest return None -def validate_cert(cert, key): +def validate_certificate(cert, key): buf = decrypt_block(cert[8:], key) if buf is None: return None return buf[36:107] + cert[139:196] -def read_random(): +def get_random(): try: - fd = open("/dev/urandom", "r") - buf = fd.read(8) - fd.close() - return buf + xor = lambda a,b: ''.join(chr(ord(c)^ord(d)) for c,d in zip(a,b*100)) + random = urandom(8) + x = str(time())[-8:] + result = xor(random, x) + + return result except: return None def WlanStatusScreenMain(session, iface): session.open(WlanStatus, iface) - def callFunction(iface): - w = Wlan(iface) - i = w.getWirelessInterfaces() + iWlan.setInterface(iface) + i = iWlan.getWirelessInterfaces() if i: - if iface in i: + if iface in i or iNetwork.isWirelessInterface(iface): return WlanStatusScreenMain + return None return None - def configStrings(iface): - hardware_info = HardwareInfo() - if hardware_info.device_name != "dm7025": + try: + device = open("/proc/stb/info/model", "r").readline().strip() + except: + device = "" + if device != "dm7025": rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?'] etpm = eTPM() l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT) if l2cert is None: return - l2key = validate_cert(l2cert, rootkey) + l2key = validate_certificate(l2cert, rootkey) if l2key is None: return l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT) if l3cert is None: - print "better run the genuine dreambox plugin" return - l3key = validate_cert(l3cert, l2key) + l3key = validate_certificate(l3cert, l2key) if l3key is None: return - rnd = read_random() + rnd = get_random() if rnd is None: return val = etpm.challenge(rnd) result = decrypt_block(val, l3key) - if hardware_info.device_name == "dm7025" or result[80:88] == rnd: + if device == "dm7025" or result[80:88] == rnd: driver = iNetwork.detectWlanModule(iface) else: driver = 'dreambox' - if driver in ('ralink', 'zydas'): - return " pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -D"+driver+"\n post-down wpa_cli terminate" - else: - if config.plugins.wlan.essid.value == "hidden...": - return ' pre-up iwconfig '+iface+' essid "'+config.plugins.wlan.hiddenessid.value+'"\n pre-up /usr/sbin/wpa_supplicant -i'+iface+' -c/etc/wpa_supplicant.conf -B -dd -D'+driver+'\n post-down wpa_cli terminate' - else: - return ' pre-up iwconfig '+iface+' essid "'+config.plugins.wlan.essid.value+'"\n pre-up /usr/sbin/wpa_supplicant -i'+iface+' -c/etc/wpa_supplicant.conf -B -dd -D'+driver+'\n post-down wpa_cli terminate' + print 'Using "%s" as wpa-supplicant driver' % (driver) + ret = "" + if driver == 'madwifi' and config.plugins.wlan.hiddenessid.value: + ret += "\tpre-up iwconfig " + iface + " essid \"" + re_escape(config.plugins.wlan.essid.value) + "\" || true\n" + ret += "\tpre-up wpa_supplicant -i" + iface + " -c" + getWlanConfigName(iface) + " -B -dd -D" + driver + " || true\n" + ret += "\tpre-down wpa_cli -i" + iface + " terminate || true\n" + return ret 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..."}) + return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, needsRestart = False, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."}) diff --git a/lib/python/Plugins/newplugin.py b/lib/python/Plugins/newplugin.py old mode 100644 new mode 100755 index c1c6f94..32c7269 --- a/lib/python/Plugins/newplugin.py +++ b/lib/python/Plugins/newplugin.py @@ -137,7 +137,7 @@ def Plugins(**kwargs): file.close() makefile = open(pluginpath + "/Makefile.am", "w") -makefile.write("""installdir = $(LIBDIR)/enigma2/python/Plugins/%s/%s +makefile.write("""installdir = $(pkglibdir)/python/Plugins/%s/%s install_PYTHON = \\ __init__.py \\ diff --git a/lib/python/Screens/AudioSelection.py b/lib/python/Screens/AudioSelection.py index a0bfcab..4c68962 100644 --- a/lib/python/Screens/AudioSelection.py +++ b/lib/python/Screens/AudioSelection.py @@ -46,7 +46,7 @@ class AudioSelection(Screen, ConfigListScreen): "cancel": self.cancel, "up": self.keyUp, "down": self.keyDown, - }, -3) + }, -2) self.settings = ConfigSubsection() choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))] @@ -62,13 +62,12 @@ class AudioSelection(Screen, ConfigListScreen): streams = [] conflist = [] selectedidx = 0 - - service = self.session.nav.getCurrentService() - self.audioTracks = audio = service and service.audioTracks() - n = audio and audio.getNumberOfTracks() or 0 - + if self.settings.menupage.getValue() == PAGE_AUDIO: self.setTitle(_("Select audio track")) + service = self.session.nav.getCurrentService() + self.audioTracks = audio = service and service.audioTracks() + n = audio and audio.getNumberOfTracks() or 0 if SystemInfo["CanDownmixAC3"]: self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value) self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False) @@ -77,11 +76,15 @@ class AudioSelection(Screen, ConfigListScreen): if n > 0: self.audioChannel = service.audioChannel() - choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))] - self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel())) - self.settings.channelmode.addNotifier(self.changeMode, initial_call = False) - conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode)) - self["key_green"].setBoolean(True) + if self.audioChannel: + choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))] + self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel())) + self.settings.channelmode.addNotifier(self.changeMode, initial_call = False) + conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode)) + self["key_green"].setBoolean(True) + else: + conflist.append(('',)) + self["key_green"].setBoolean(False) selectedAudio = self.audioTracks.getCurrentTrack() for x in range(n): number = str(x) @@ -137,7 +140,7 @@ class AudioSelection(Screen, ConfigListScreen): language = _("") selected = "" - if sel and x[:4] == sel[:4]: + if sel and x == sel: selected = _("Running") selectedidx = idx @@ -156,7 +159,7 @@ class AudioSelection(Screen, ConfigListScreen): number = "%x%02x" % (x[3],x[2]) elif x[0] == 2: - types = ("UTF-8 text","SSA / AAS",".SRT file") + types = (_(""), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)") description = types[x[2]] streams.append((x, "", number, description, language, selected)) @@ -185,7 +188,7 @@ class AudioSelection(Screen, ConfigListScreen): conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing())) self.plugincallfunc = Plugins[0][1] if len(Plugins) > 1: - print "these plugins are installed but not displayed in the dialog box:", Plugins[1:] + print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:] self["config"].list = conflist self["config"].l.setList(conflist) @@ -219,7 +222,7 @@ class AudioSelection(Screen, ConfigListScreen): config.av.downmix_ac3.save() def changeMode(self, mode): - if mode is not None: + if mode is not None and self.audioChannel: self.audioChannel.selectChannel(int(mode.getValue())) def changeAudio(self, audio): diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index c872bce..912d678 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -8,7 +8,7 @@ from Components.MenuList import MenuList from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase profile("ChannelSelection.py 1") from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode +from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode, eEnv from Components.config import config, ConfigSubsection, ConfigText from Tools.NumericalTextInput import NumericalTextInput profile("ChannelSelection.py 2") @@ -65,6 +65,24 @@ class BouquetSelector(Screen): def cancelClick(self): self.close(False) +class SilentBouquetSelector: + def __init__(self, bouquets, enableWrapAround=False, current=0): + self.bouquets = [b[1] for b in bouquets] + self.pos = current + self.count = len(bouquets) + self.enableWrapAround = enableWrapAround + + def up(self): + if self.pos > 0 or self.enableWrapAround: + self.pos = (self.pos - 1) % self.count + + def down(self): + if self.pos < (self.count - 1) or self.enableWrapAround: + self.pos = (self.pos + 1) % self.count + + def getCurrent(self): + return self.bouquets[self.pos] + # csel.bouquet_mark_edit values OFF = 0 EDIT_BOUQUET = 1 @@ -76,7 +94,7 @@ def append_when_current_valid(current, menu, args, level = 0, key = ""): class ChannelContextMenu(Screen): def __init__(self, session, csel): - from Components.ParentalControl import parentalControl + Screen.__init__(self, session) #raise Exception("we need a better summary screen here") self.csel = csel @@ -106,6 +124,7 @@ class ChannelContextMenu(Screen): isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory)) if isPlayable: if config.ParentalControl.configured.value: + from Components.ParentalControl import parentalControl if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1: append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0) else: @@ -191,6 +210,7 @@ class ChannelContextMenu(Screen): self.close() def addParentalProtection(self, service): + from Components.ParentalControl import parentalControl parentalControl.protectService(service.toCompareString()) self.close() @@ -199,6 +219,7 @@ class ChannelContextMenu(Screen): def pinEntered(self, service, result): if result: + from Components.ParentalControl import parentalControl parentalControl.unProtectService(service) self.close() else: @@ -541,7 +562,7 @@ class ChannelSelectionEdit: refstr = refstr[pos+14:] pos = refstr.find('"') if pos != -1: - filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 + filename = eEnv.resolve('${sysconfdir}/enigma2/') + refstr[:pos] self.removeCurrentService() try: if filename is not None: diff --git a/lib/python/Screens/DefaultWizard.py b/lib/python/Screens/DefaultWizard.py index 73b07ac..54e241d 100644 --- a/lib/python/Screens/DefaultWizard.py +++ b/lib/python/Screens/DefaultWizard.py @@ -25,9 +25,10 @@ class DefaultWizard(WizardLanguage, DreamInfoHandler): self["arrowup2"] = MovingPixmap() def setDirectory(self): - os_system("mount %s %s" % (resolveFilename(SCOPE_DEFAULTPARTITION), resolveFilename(SCOPE_DEFAULTPARTITIONMOUNTDIR))) self.directory = resolveFilename(SCOPE_DEFAULTPARTITIONMOUNTDIR) self.xmlfile = "defaultwizard.xml" + if self.directory: + os_system("mount %s %s" % (resolveFilename(SCOPE_DEFAULTPARTITION), self.directory)) def markDone(self): config.misc.defaultchosen.value = 0 diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py index 5b06124..5506287 100644 --- a/lib/python/Screens/InfoBar.py +++ b/lib/python/Screens/InfoBar.py @@ -221,6 +221,7 @@ class MoviePlayer(InfoBarBase, InfoBarShowHide, \ self.session.nav.stopService() elif answer == "restart": self.doSeek(0) + self.setSeekState(self.SEEK_STATE_PLAY) def doEofInternal(self, playing): if not self.execing: diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 6fa8911..93a4788 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1,4 +1,4 @@ -from ChannelSelection import ChannelSelection, BouquetSelector +from ChannelSelection import ChannelSelection, BouquetSelector, SilentBouquetSelector from Components.ActionMap import ActionMap, HelpableActionMap from Components.ActionMap import NumberActionMap @@ -559,6 +559,12 @@ class InfoBarEPG: cnt = 0 else: cnt = len(bouquets) + if config.usage.multiepg_ask_bouquet.value: + self.openMultiServiceEPGAskBouquet(bouquets, cnt, withCallback) + else: + self.openMultiServiceEPGSilent(bouquets, cnt, withCallback) + + def openMultiServiceEPGAskBouquet(self, bouquets, cnt, withCallback): if cnt > 1: # show bouquet list if withCallback: self.bouquetSel = self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True) @@ -568,6 +574,21 @@ class InfoBarEPG: elif cnt == 1: self.openBouquetEPG(bouquets[0][1], withCallback) + def openMultiServiceEPGSilent(self, bouquets, cnt, withCallback): + root = self.servicelist.getRoot() + rootstr = root.toCompareString() + current = 0 + for bouquet in bouquets: + if bouquet[1].toCompareString() == rootstr: + break + current += 1 + if current >= cnt: + current = 0 + if cnt > 1: # create bouquet list for bouq+/- + self.bouquetSel = SilentBouquetSelector(bouquets, True, self.servicelist.getBouquetNumOffset(root)) + if cnt >= 1: + self.openBouquetEPG(root, withCallback) + def changeServiceCB(self, direction, epg): if self.serviceSel: if direction > 0: @@ -717,7 +738,7 @@ class InfoBarSeek: SEEK_STATE_PAUSE = (1, 0, 0, "||") SEEK_STATE_EOF = (1, 0, 0, "END") - def __init__(self, actionmap = "InfobarSeekActions", useSeekBackHack=True): + def __init__(self, actionmap = "InfobarSeekActions"): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged, @@ -774,20 +795,10 @@ class InfoBarSeek: self.__seekableStatusChanged() def makeStateForward(self, n): -# 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) + return (0, n, 0, ">> %dx" % n) def makeStateBackward(self, n): -# 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) + return (0, -n, 0, "<< %dx" % n) def makeStateSlowMotion(self, n): return (0, 0, n, "/%d" % n) @@ -1363,6 +1374,7 @@ class InfoBarExtensions: answer[1][1]() from Tools.BoundFunction import boundFunction +import inspect # depends on InfoBarExtensions @@ -1374,9 +1386,13 @@ class InfoBarPlugins: return name def getPluginList(self): - list = [((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None, p.name) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU)] - list.sort(key = lambda e: e[2]) # sort by name - return list + l = [] + for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU): + args = inspect.getargspec(p.__call__)[0] + if len(args) == 1 or len(args) == 2 and isinstance(self, InfoBarChannelSelection): + l.append(((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None, p.name)) + l.sort(key = lambda e: e[2]) # sort by name + return l def runPlugin(self, plugin): if isinstance(self, InfoBarChannelSelection): @@ -1534,28 +1550,30 @@ class InfoBarInstantRecord: recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath()) recording.dontSave = True - + if event is None or limitEvent == False: recording.autoincrease = True - if recording.setAutoincreaseEnd(): - self.session.nav.RecordTimer.record(recording) - self.recording.append(recording) + recording.setAutoincreaseEnd() + + simulTimerList = self.session.nav.RecordTimer.record(recording) + + if simulTimerList is None: # no conflict + self.recording.append(recording) else: - simulTimerList = self.session.nav.RecordTimer.record(recording) - if simulTimerList is not None: # conflict with other recording - name = simulTimerList[1].name - name_date = ' '.join((name, strftime('%c', localtime(simulTimerList[1].begin)))) - print "[TIMER] conflicts with", name_date - recording.autoincrease = True # start with max available length, then increment - if recording.setAutoincreaseEnd(): - self.session.nav.RecordTimer.record(recording) - self.recording.append(recording) - self.session.open(MessageBox, _("Record time limited due to conflicting timer %s") % name_date, MessageBox.TYPE_INFO) - else: - self.session.open(MessageBox, _("Couldn't record due to conflicting timer %s") % name, MessageBox.TYPE_INFO) - recording.autoincrease = False - else: + if len(simulTimerList) > 1: # with other recording + name = simulTimerList[1].name + name_date = ' '.join((name, strftime('%c', localtime(simulTimerList[1].begin)))) + print "[TIMER] conflicts with", name_date + recording.autoincrease = True # start with max available length, then increment + if recording.setAutoincreaseEnd(): + self.session.nav.RecordTimer.record(recording) self.recording.append(recording) + self.session.open(MessageBox, _("Record time limited due to conflicting timer %s") % name_date, MessageBox.TYPE_INFO) + else: + self.session.open(MessageBox, _("Couldn't record due to conflicting timer %s") % name, MessageBox.TYPE_INFO) + else: + self.session.open(MessageBox, _("Couldn't record due to invalid service %s") % serviceref, MessageBox.TYPE_INFO) + recording.autoincrease = False def isInstantRecordRunning(self): print "self.recording:", self.recording @@ -1970,20 +1988,21 @@ class InfoBarCueSheetSupport: return True def jumpPreviousMark(self): - # we add 2 seconds, so if the play position is <2s after + # we add 5 seconds, so if the play position is <5s after # the mark, the mark before will be used self.jumpPreviousNextMark(lambda x: -x-5*90000, start=True) def jumpNextMark(self): - if not self.jumpPreviousNextMark(lambda x: x): + if not self.jumpPreviousNextMark(lambda x: x-90000): self.doSeek(-1) def getNearestCutPoint(self, pts, cmp=abs, start=False): # can be optimized - beforecut = False + beforecut = True nearest = None + bestdiff = -1 + instate = True if start: - beforecut = True bestdiff = cmp(0 - pts) if bestdiff >= 0: nearest = [0, False] @@ -1992,14 +2011,19 @@ class InfoBarCueSheetSupport: beforecut = False if cp[1] == self.CUT_TYPE_IN: # Start is here, disregard previous marks diff = cmp(cp[0] - pts) - if diff >= 0: + if start and diff >= 0: nearest = cp bestdiff = diff else: nearest = None - if cp[1] in (self.CUT_TYPE_MARK, self.CUT_TYPE_LAST): + bestdiff = -1 + if cp[1] == self.CUT_TYPE_IN: + instate = True + elif cp[1] == self.CUT_TYPE_OUT: + instate = False + elif cp[1] in (self.CUT_TYPE_MARK, self.CUT_TYPE_LAST): diff = cmp(cp[0] - pts) - if diff >= 0 and (nearest is None or bestdiff > diff): + if instate and diff >= 0 and (nearest is None or bestdiff > diff): nearest = cp bestdiff = diff return nearest diff --git a/lib/python/Screens/InputBox.py b/lib/python/Screens/InputBox.py index 61ce356..7dd7b12 100644 --- a/lib/python/Screens/InputBox.py +++ b/lib/python/Screens/InputBox.py @@ -41,9 +41,11 @@ class InputBox(Screen): "9": self.keyNumberGlobal, "0": self.keyNumberGlobal }, -1) + if self["input"].type == Input.TEXT: - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmAscii) + self.onExecBegin.append(self.setKeyboardModeAscii) + else: + self.onExecBegin.append(self.setKeyboardModeNone) def gotAsciiCode(self): self["input"].handleAscii(getPrevAsciiCode()) @@ -61,13 +63,9 @@ class InputBox(Screen): self["input"].delete() def go(self): - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmNone) self.close(self["input"].getText()) def cancel(self): - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmNone) self.close(None) def keyHome(self): @@ -142,19 +140,13 @@ class PinInput(InputBox): pass def closePinWrong(self, *args): - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmNone) print "args:", args self.close(False) def closePinCorrect(self, *args): - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmNone) self.close(True) def closePinCancel(self, *args): - rcinput = eRCInput.getInstance() - rcinput.setKeyboardMode(rcinput.kmNone) self.close(None) def cancel(self): diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index de2fa99..4b15ee0 100755 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -11,7 +11,7 @@ from Components.Sources.List import List from Components.Label import Label,MultiColorLabel from Components.Pixmap import Pixmap,MultiPixmap from Components.MenuList import MenuList -from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigPassword, ConfigSelection, getConfigListEntry, ConfigNothing +from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigPassword, ConfigSelection, getConfigListEntry, ConfigNothing, ConfigBoolean from Components.ConfigList import ConfigListScreen from Components.PluginComponent import plugins from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest @@ -42,11 +42,6 @@ class NetworkAdapterSelection(Screen,HelpableScreen): self["key_blue"] = StaticText("") self["introduction"] = StaticText(self.edittext) - self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] - - if not self.adapters: - self.onFirstExecBegin.append(self.NetworkFallback) - self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions", { "cancel": (self.close, _("exit network interface list")), @@ -65,6 +60,14 @@ class NetworkAdapterSelection(Screen,HelpableScreen): "yellow": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more than one interface is active.")] ), }) + self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] + + if not self.adapters: + self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getConfiguredAdapters()] + + if len(self.adapters) == 0: + self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getInstalledAdapters()] + self.list = [] self["list"] = List(self.list) self.updateList() @@ -80,14 +83,14 @@ class NetworkAdapterSelection(Screen,HelpableScreen): description = None interfacepng = None - if iface in iNetwork.lan_interfaces: + if not iNetwork.isWirelessInterface(iface): if active is True: interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired-active.png")) elif active is False: interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired-inactive.png")) else: interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired.png")) - elif iface in iNetwork.wlan_interfaces: + elif iNetwork.isWirelessInterface(iface): if active is True: interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless-active.png")) elif active is False: @@ -132,19 +135,16 @@ class NetworkAdapterSelection(Screen,HelpableScreen): fp.close() default_gw = result - if len(self.adapters) == 0: # no interface available => display only eth0 - self.list.append(self.buildInterfaceList("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True )) - else: - for x in self.adapters: - if x[1] == default_gw: - default_int = True - else: - default_int = False - if iNetwork.getAdapterAttribute(x[1], 'up') is True: - active_int = True - else: - active_int = False - self.list.append(self.buildInterfaceList(x[1],_(x[0]),default_int,active_int )) + for x in self.adapters: + if x[1] == default_gw: + default_int = True + else: + default_int = False + if iNetwork.getAdapterAttribute(x[1], 'up') is True: + active_int = True + else: + active_int = False + self.list.append(self.buildInterfaceList(x[1],_(x[0]),default_int,active_int )) if os_path.exists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")): self["key_blue"].setText(_("NetworkWizard")) @@ -179,22 +179,6 @@ class NetworkAdapterSelection(Screen,HelpableScreen): else: self.updateList() - def NetworkFallback(self): - if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True: - self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) - if iNetwork.configuredNetworkAdapters.has_key('ath0') is True: - self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) - else: - self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.lan_errortext, type = MessageBox.TYPE_INFO,timeout = 10) - - def ErrorMessageClosed(self, *ret): - if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'wlan0') - elif iNetwork.configuredNetworkAdapters.has_key('ath0') is True: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'ath0') - else: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'eth0') - def cleanup(self): iNetwork.stopLinkStateConsole() iNetwork.stopRestartConsole() @@ -312,18 +296,17 @@ class NameserverSetup(Screen, ConfigListScreen, HelpableScreen): class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): - def __init__(self, session, networkinfo, essid=None, aplist=None): + def __init__(self, session, networkinfo, essid=None): Screen.__init__(self, session) HelpableScreen.__init__(self) self.session = session if isinstance(networkinfo, (list, tuple)): self.iface = networkinfo[0] self.essid = networkinfo[1] - self.aplist = networkinfo[2] else: self.iface = networkinfo self.essid = essid - self.aplist = aplist + self.extended = None self.applyConfigRef = None self.finished_cb = None @@ -414,62 +397,36 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.gatewayEntry = None self.hiddenSSID = None self.wlanSSID = None - self.encryptionEnabled = None - self.encryptionKey = None + self.encryption = None self.encryptionType = None - self.nwlist = None + self.encryptionKey = None self.encryptionlist = None self.weplist = None self.wsconfig = None self.default = None - if self.iface in iNetwork.wlan_interfaces: - from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant,Wlan - self.w = Wlan(self.iface) + if iNetwork.isWirelessInterface(self.iface): + from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant self.ws = wpaSupplicant() self.encryptionlist = [] + self.encryptionlist.append(("Unencrypted", _("Unencrypted"))) self.encryptionlist.append(("WEP", _("WEP"))) self.encryptionlist.append(("WPA", _("WPA"))) - self.encryptionlist.append(("WPA2", _("WPA2"))) self.encryptionlist.append(("WPA/WPA2", _("WPA or WPA2"))) + self.encryptionlist.append(("WPA2", _("WPA2"))) self.weplist = [] self.weplist.append("ASCII") self.weplist.append("HEX") - if self.aplist is not None: - self.nwlist = self.aplist - self.nwlist.sort(key = lambda x: x[0]) - else: - self.nwlist = [] - self.aps = None - try: - self.aps = self.w.getNetworkList() - if self.aps is not None: - for ap in self.aps: - a = self.aps[ap] - if a['active']: - if a['essid'] != '': - self.nwlist.append((a['essid'],a['essid'])) - self.nwlist.sort(key = lambda x: x[0]) - except: - self.nwlist.append(("No Networks found",_("No Networks found"))) - - self.wsconfig = self.ws.loadConfig() - if self.essid is not None: # ssid from wlan scan - self.default = self.essid - else: - self.default = self.wsconfig['ssid'] - if "hidden..." not in self.nwlist: - self.nwlist.append(("hidden...",_("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 )) - config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = self.wsconfig['hiddenessid'], visible_width = 50, fixed_size = False)) + self.wsconfig = self.ws.loadConfig(self.iface) + if self.essid is None: + self.essid = self.wsconfig['ssid'] - config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = self.wsconfig['encryption'] )) - config.plugins.wlan.encryption.type = NoSave(ConfigSelection(self.encryptionlist, default = self.wsconfig['encryption_type'] )) - config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(self.weplist, default = self.wsconfig['encryption_wepkeytype'] )) - config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = self.wsconfig['key'], visible_width = 50, fixed_size = False)) + config.plugins.wlan.hiddenessid = NoSave(ConfigYesNo(default = self.wsconfig['hiddenessid'])) + config.plugins.wlan.essid = NoSave(ConfigText(default = self.essid, visible_width = 50, fixed_size = False)) + config.plugins.wlan.encryption = NoSave(ConfigSelection(self.encryptionlist, default = self.wsconfig['encryption'] )) + config.plugins.wlan.wepkeytype = NoSave(ConfigSelection(self.weplist, default = self.wsconfig['wepkeytype'] )) + config.plugins.wlan.psk = NoSave(ConfigPassword(default = self.wsconfig['key'], visible_width = 50, fixed_size = False)) self.activateInterfaceEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "up") or False)) self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp") or False)) @@ -502,6 +459,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.list.append(getConfigListEntry(_('Gateway'), self.gatewayConfigEntry)) self.extended = None + self.configStrings = None for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKSETUP): callFnc = p.__call__["ifaceSupported"](self.iface) if callFnc is not None: @@ -509,30 +467,21 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.extended = callFnc if p.__call__.has_key("configStrings"): self.configStrings = p.__call__["configStrings"] - else: - self.configStrings = None - if config.plugins.wlan.essid.value == 'hidden...': - self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid) - self.list.append(self.wlanSSID) - self.hiddenSSID = getConfigListEntry(_("Hidden network SSID"), config.plugins.wlan.hiddenessid) - self.list.append(self.hiddenSSID) - else: - self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid) - self.list.append(self.wlanSSID) - self.encryptionEnabled = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption.enabled) - self.list.append(self.encryptionEnabled) - - if config.plugins.wlan.encryption.enabled.value: - self.encryptionType = getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type) - self.list.append(self.encryptionType) - if config.plugins.wlan.encryption.type.value == 'WEP': - self.list.append(getConfigListEntry(_("Encryption Keytype"), config.plugins.wlan.encryption.wepkeytype)) - self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk) - self.list.append(self.encryptionKey) - else: - self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk) - self.list.append(self.encryptionKey) + self.hiddenSSID = getConfigListEntry(_("Hidden network"), config.plugins.wlan.hiddenessid) + self.list.append(self.hiddenSSID) + self.wlanSSID = getConfigListEntry(_("Networkname (SSID)"), config.plugins.wlan.essid) + self.list.append(self.wlanSSID) + self.encryption = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption) + self.list.append(self.encryption) + + self.encryptionType = getConfigListEntry(_("Encryption Keytype"), config.plugins.wlan.wepkeytype) + self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.psk) + + if config.plugins.wlan.encryption.value != "Unencrypted": + if config.plugins.wlan.encryption.value == 'WEP': + self.list.append(self.encryptionType) + self.list.append(self.encryptionKey) self["config"].list = self.list self["config"].l.setList(self.list) @@ -546,12 +495,8 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): self.createSetup() if self["config"].getCurrent() == self.gatewayEntry: self.createSetup() - if self.iface in iNetwork.wlan_interfaces: - if self["config"].getCurrent() == self.wlanSSID: - self.createSetup() - if self["config"].getCurrent() == self.encryptionEnabled: - self.createSetup() - if self["config"].getCurrent() == self.encryptionType: + if iNetwork.isWirelessInterface(self.iface): + if self["config"].getCurrent() == self.encryption: self.createSetup() def keyLeft(self): @@ -576,7 +521,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): 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(): + if 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) @@ -594,11 +539,15 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): if interface == self.iface: continue iNetwork.setAdapterAttribute(interface, "up", False) - iNetwork.deactivateInterface(interface) - self.applyConfig(True) + iNetwork.deactivateInterface(configuredInterfaces,self.deactivateSecondInterfaceCB) + + def deactivateSecondInterfaceCB(self, data): + if data is True: + self.applyConfig(True) def applyConfig(self, ret = False): if (ret == True): + self.applyConfigRef = None iNetwork.setAdapterAttribute(self.iface, "up", self.activateInterfaceEntry.value) iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value) iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value) @@ -607,17 +556,33 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value) else: iNetwork.removeAdapterAttribute(self.iface, "gateway") - if self.extended is not None and self.configStrings is not None: + + if (self.extended is not None and self.configStrings is not None): iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface)) - self.ws.writeConfig() + self.ws.writeConfig(self.iface) + if self.activateInterfaceEntry.value is False: - iNetwork.deactivateInterface(self.iface) - iNetwork.writeNetworkConfig() - iNetwork.restartNetwork(self.applyConfigDataAvail) - self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait for activation of your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False) + iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB) + iNetwork.writeNetworkConfig() + self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait for activation of your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False) + else: + if self.oldInterfaceState is False: + iNetwork.activateInterface(self.iface,self.deactivateInterfaceCB) + else: + iNetwork.deactivateInterface(self.iface,self.activateInterfaceCB) + iNetwork.writeNetworkConfig() + 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.keyCancel() + def deactivateInterfaceCB(self, data): + if data is True: + self.applyConfigDataAvail(True) + + def activateInterfaceCB(self, data): + if data is True: + iNetwork.activateInterface(self.iface,self.applyConfigDataAvail) + def applyConfigDataAvail(self, data): if data is True: iNetwork.getInterfaces(self.getInterfacesDataAvail) @@ -675,10 +640,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen): def hideInputHelp(self): current = self["config"].getCurrent() - if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...': + if current == self.wlanSSID: 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: + elif current == self.encryptionKey and config.plugins.wlan.encryption.value is not "Unencrypted": if current[1].help_window.instance is not None: current[1].help_window.instance.hide() @@ -703,7 +668,8 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.oktext = _("Press OK on your remote control to continue.") self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.") - self.errortext = _("No working wireless network interface found.\n Please verify that you have attached a compatible WLAN device or enable your local network interface.") + self.errortext = _("No working wireless network interface found.\n Please verify that you have attached a compatible WLAN device or enable your local network interface.") + self.missingwlanplugintxt = _("The wireless LAN plugin is not installed!\nPlease install it.") self["WizardActions"] = HelpableActionMap(self, "WizardActions", { @@ -739,30 +705,39 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self.onLayoutFinish.append(self.layoutFinished) self.onClose.append(self.cleanup) + + def queryWirelessDevice(self,iface): + try: + from pythonwifi.iwlibs import Wireless + import errno + except ImportError: + return False + else: + try: + ifobj = Wireless(iface) # a Wireless NIC Object + wlanresponse = ifobj.getAPaddr() + except IOError, (error_no, error_str): + if error_no in (errno.EOPNOTSUPP, errno.ENODEV, errno.EPERM): + return False + else: + print "error: ",error_no,error_str + return True + else: + return True + def ok(self): self.cleanup() if self["menulist"].getCurrent()[1] == 'edit': - if self.iface in iNetwork.wlan_interfaces: + if iNetwork.isWirelessInterface(self.iface): try: from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan - from pythonwifi.iwlibs import Wireless except ImportError: - self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + self.session.open(MessageBox, self.missingwlanplugintxt, type = MessageBox.TYPE_INFO,timeout = 10 ) else: - ifobj = Wireless(self.iface) # a Wireless NIC Object - try: - self.wlanresponse = ifobj.getAPaddr() - except IOError: - self.wlanresponse = ifobj.getStatistics() - if self.wlanresponse: - if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported' - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface) - else: - # Display Wlan not available Message - self.showErrorMessage() + if self.queryWirelessDevice(self.iface): + self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface) else: - # Display Wlan not available Message - self.showErrorMessage() + self.showErrorMessage() # Display Wlan not available Message else: self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface) if self["menulist"].getCurrent()[1] == 'test': @@ -772,45 +747,23 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): if self["menulist"].getCurrent()[1] == 'scanwlan': try: from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan - from pythonwifi.iwlibs import Wireless except ImportError: - self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + self.session.open(MessageBox, self.missingwlanplugintxt, type = MessageBox.TYPE_INFO,timeout = 10 ) else: - ifobj = Wireless(self.iface) # a Wireless NIC Object - try: - self.wlanresponse = ifobj.getAPaddr() - except IOError: - self.wlanresponse = ifobj.getStatistics() - if self.wlanresponse: - if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported' - self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface) - else: - # Display Wlan not available Message - self.showErrorMessage() + if self.queryWirelessDevice(self.iface): + self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface) else: - # Display Wlan not available Message - self.showErrorMessage() + self.showErrorMessage() # Display Wlan not available Message if self["menulist"].getCurrent()[1] == 'wlanstatus': try: from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus - from pythonwifi.iwlibs import Wireless except ImportError: - self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) - else: - ifobj = Wireless(self.iface) # a Wireless NIC Object - try: - self.wlanresponse = ifobj.getAPaddr() - except IOError: - self.wlanresponse = ifobj.getStatistics() - if self.wlanresponse: - if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported' - self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) - else: - # Display Wlan not available Message - self.showErrorMessage() + self.session.open(MessageBox, self.missingwlanplugintxt, type = MessageBox.TYPE_INFO,timeout = 10 ) + else: + if self.queryWirelessDevice(self.iface): + self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) else: - # Display Wlan not available Message - self.showErrorMessage() + self.showErrorMessage() # Display Wlan not available Message if self["menulist"].getCurrent()[1] == 'lanrestart': 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': @@ -866,7 +819,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface)) self["Statustext"].setText(_("Link:")) - if self.iface in iNetwork.wlan_interfaces: + if iNetwork.isWirelessInterface(self.iface): try: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus except: @@ -916,27 +869,16 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def AdapterSetupClosed(self, *ret): if ret is not None and len(ret): - if ret[0] == 'ok' and (self.iface in iNetwork.wlan_interfaces) and iNetwork.getAdapterAttribute(self.iface, "up") is True: + if ret[0] == 'ok' and (iNetwork.isWirelessInterface(self.iface) and iNetwork.getAdapterAttribute(self.iface, "up") is True): try: from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus - from pythonwifi.iwlibs import Wireless except ImportError: - self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 ) + self.session.open(MessageBox, self.missingwlanplugintxt, type = MessageBox.TYPE_INFO,timeout = 10 ) else: - ifobj = Wireless(self.iface) # a Wireless NIC Object - try: - self.wlanresponse = ifobj.getAPaddr() - except IOError: - self.wlanresponse = ifobj.getStatistics() - if self.wlanresponse: - if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported' - self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) - else: - # Display Wlan not available Message - self.showErrorMessage() + if self.queryWirelessDevice(self.iface): + self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface) else: - # Display Wlan not available Message - self.showErrorMessage() + self.showErrorMessage() # Display Wlan not available Message else: self.updateStatusbar() else: @@ -950,7 +892,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def WlanScanClosed(self,*ret): if ret[0] is not None: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1]) + self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0]) else: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus iStatus.stopWlanConsole() @@ -995,6 +937,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): def cleanup(self): iNetwork.stopLinkStateConsole() iNetwork.stopDeactivateInterfaceConsole() + iNetwork.stopActivateInterfaceConsole() iNetwork.stopPingConsole() try: from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus @@ -1008,7 +951,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen): 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: + if status[self.iface]["essid"] == "off" or status[self.iface]["accesspoint"] == "Not-Associated" or status[self.iface]["accesspoint"] == False: self.LinkState = False self["statuspic"].setPixmapNum(1) self["statuspic"].show() @@ -1376,7 +1319,7 @@ class NetworkAdapterTest(Screen): def LinkStatedataAvail(self,data): self.output = data.strip() - result = self.output.split('\n') + result = self.output.splitlines() pattern = re_compile("Link detected: yes") for item in result: if re_search(pattern, item): @@ -1430,7 +1373,7 @@ class NetworkAdapterTest(Screen): 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: + if status[self.iface]["essid"] == "off" or status[self.iface]["accesspoint"] == "Not-Associated" or status[self.iface]["accesspoint"] == False: self["Network"].setForegroundColorNum(1) self["Network"].setText(_("disconnected")) self["NetworkInfo_Check"].setPixmapNum(1) diff --git a/lib/python/Screens/ParentalControlSetup.py b/lib/python/Screens/ParentalControlSetup.py index f174b58..284294f 100644 --- a/lib/python/Screens/ParentalControlSetup.py +++ b/lib/python/Screens/ParentalControlSetup.py @@ -3,7 +3,7 @@ from Components.ConfigList import ConfigListScreen from Components.ActionMap import NumberActionMap from Components.config import config, getConfigListEntry, ConfigNothing, NoSave, ConfigPIN from Components.ParentalControlList import ParentalControlEntryComponent, ParentalControlList -from Components.ParentalControl import parentalControl + from Components.Sources.StaticText import StaticText from Screens.ChoiceBox import ChoiceBox from Screens.MessageBox import MessageBox @@ -119,6 +119,7 @@ class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen): elif self["config"].l.getCurrentSelection() == self.changeSetupPin: self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup PIN")) elif self["config"].l.getCurrentSelection() == self.reloadLists: + from Components.ParentalControl import parentalControl parentalControl.open() else: ConfigListScreen.keyRight(self) @@ -255,6 +256,7 @@ class ParentalControlEditor(Screen): self.session.openWithCallback(self.letterChosen, ChoiceBox, title=_("Show services beginning with"), list=mylist, keys = [], selection = sel) def letterChosen(self, result): + from Components.ParentalControl import parentalControl if result is not None: print "result:", result self.currentLetter = result[1] @@ -284,6 +286,7 @@ class ParentalControlBouquetEditor(Screen): }, -1) def cancel(self): + from Components.ParentalControl import parentalControl parentalControl.save() self.close() @@ -300,6 +303,7 @@ class ParentalControlBouquetEditor(Screen): self.bouquetlist = list.getContent("CN", True) def selectBouquet(self): + from Components.ParentalControl import parentalControl self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.bouquetlist] self.bouquetslist.setList(self.list) diff --git a/lib/python/Screens/PluginBrowser.py b/lib/python/Screens/PluginBrowser.py index 69bf80f..359552e 100755 --- a/lib/python/Screens/PluginBrowser.py +++ b/lib/python/Screens/PluginBrowser.py @@ -155,9 +155,9 @@ class PluginDownloadBrowser(Screen): def runInstall(self, val): if val: if self.type == self.DOWNLOAD: - self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name]) + self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name]) elif self.type == self.REMOVE: - self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name]) + self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name]) def setWindowTitle(self): if self.type == self.DOWNLOAD: @@ -166,17 +166,17 @@ class PluginDownloadBrowser(Screen): self.setTitle(_("Remove plugins")) def startIpkgListInstalled(self): - self.container.execute("ipkg list_installed enigma2-plugin-*") + self.container.execute("opkg list_installed enigma2-plugin-*") def startIpkgListAvailable(self): - self.container.execute("ipkg list enigma2-plugin-*") + self.container.execute("opkg list enigma2-plugin-*") def startRun(self): self["list"].instance.hide() if self.type == self.DOWNLOAD: if not PluginDownloadBrowser.lastDownloadDate or (time() - PluginDownloadBrowser.lastDownloadDate) > 3600: # Only update from internet once per hour - self.container.execute("ipkg update") + self.container.execute("opkg update") PluginDownloadBrowser.lastDownloadDate = time() else: self.startIpkgListAvailable() @@ -256,4 +256,4 @@ class PluginDownloadBrowser(Screen): self.list = list self["list"].l.setList(list) -language.addCallback(languageChanged) \ No newline at end of file +language.addCallback(languageChanged) diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index 2e2f836..f8bfeb7 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -107,6 +107,7 @@ class CableTransponderSearchSupport: if raw_channel: frontend = raw_channel.getFrontend() if frontend: + frontend.closeFrontend() # immediate close... del frontend del raw_channel return True @@ -114,13 +115,16 @@ class CableTransponderSearchSupport: def cableTransponderSearchSessionClosed(self, *val): print "cableTransponderSearchSessionClosed, val", val - self.resetTimeout() self.cable_search_container.appClosed.remove(self.cableTransponderSearchClosed) self.cable_search_container.dataAvail.remove(self.getCableTransponderData) + if val and len(val): + if val[0]: + self.setCableTransponderSearchResult(self.__tlist) + else: + self.cable_search_container.sendCtrlC() + self.setCableTransponderSearchResult(None) self.cable_search_container = None self.cable_search_session = None - if val and len(val) and val[0]: - self.setCableTransponderSearchResult(self.__tlist) self.__tlist = None self.cableTransponderSearchFinished() @@ -156,25 +160,12 @@ class CableTransponderSearchSupport: parm.modulation = qam[data[4]] parm.inversion = inv[data[5]] self.__tlist.append(parm) - tmpstr = _("Try to find used Transponders in cable network.. please wait...") - tmpstr += "\n\n" - tmpstr += data[1] - tmpstr += " kHz " - tmpstr += data[0] - self.cable_search_session["text"].setText(tmpstr) - - def setTimeout(self): - try: - self.oldtimeoutvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline() - open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0") - except: - print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" - - def resetTimeout(self): - try: - open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(self.oldtimeoutvalue) - except: - print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available" + tmpstr = _("Try to find used Transponders in cable network.. please wait...") + tmpstr += "\n\n" + tmpstr += data[1] + tmpstr += " kHz " + tmpstr += data[0] + self.cable_search_session["text"].setText(tmpstr) def startCableTransponderSearch(self, nim_idx): if not self.tryGetRawFrontend(nim_idx): @@ -260,7 +251,6 @@ class CableTransponderSearchSupport: self.cable_search_container.execute(cmd) tmpstr = _("Try to find used transponders in cable network.. please wait...") tmpstr += "\n\n..." - self.setTimeout() self.cable_search_session = self.session.openWithCallback(self.cableTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO) class DefaultSatLists(DefaultWizard): @@ -371,15 +361,15 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): self.list.append(getConfigListEntry(_('Satellite'), self.scan_satselection[index_to_scan])) self.list.append(getConfigListEntry(_('Frequency'), self.scan_sat.frequency)) self.list.append(getConfigListEntry(_('Inversion'), self.scan_sat.inversion)) - self.list.append(getConfigListEntry(_('Symbol Rate'), self.scan_sat.symbolrate)) - self.list.append(getConfigListEntry(_("Polarity"), self.scan_sat.polarization)) + self.list.append(getConfigListEntry(_('Symbol rate'), self.scan_sat.symbolrate)) + self.list.append(getConfigListEntry(_('Polarization'), self.scan_sat.polarization)) if self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec)) elif self.scan_sat.system.value == eDVBFrontendParametersSatellite.System_DVB_S2: self.list.append(getConfigListEntry(_("FEC"), self.scan_sat.fec_s2)) self.modulationEntry = getConfigListEntry(_('Modulation'), self.scan_sat.modulation) self.list.append(self.modulationEntry) - self.list.append(getConfigListEntry(_('Rolloff'), self.scan_sat.rolloff)) + self.list.append(getConfigListEntry(_('Roll-off'), self.scan_sat.rolloff)) self.list.append(getConfigListEntry(_('Pilot'), self.scan_sat.pilot)) elif self.scan_type.value == "single_satellite": self.updateSatList() @@ -401,7 +391,7 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): if self.scan_typecable.value == "single_transponder": self.list.append(getConfigListEntry(_("Frequency"), self.scan_cab.frequency)) self.list.append(getConfigListEntry(_("Inversion"), self.scan_cab.inversion)) - self.list.append(getConfigListEntry(_("Symbol Rate"), self.scan_cab.symbolrate)) + self.list.append(getConfigListEntry(_("Symbol rate"), self.scan_cab.symbolrate)) self.list.append(getConfigListEntry(_("Modulation"), self.scan_cab.modulation)) self.list.append(getConfigListEntry(_("FEC"), self.scan_cab.fec)) elif nim.isCompatible("DVB-T"): @@ -409,12 +399,12 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): self.list.append(getConfigListEntry(_("Frequency"), self.scan_ter.frequency)) self.list.append(getConfigListEntry(_("Inversion"), self.scan_ter.inversion)) self.list.append(getConfigListEntry(_("Bandwidth"), self.scan_ter.bandwidth)) - self.list.append(getConfigListEntry(_("Code rate high"), self.scan_ter.fechigh)) - self.list.append(getConfigListEntry(_("Code rate low"), self.scan_ter.feclow)) + self.list.append(getConfigListEntry(_("Code rate HP"), self.scan_ter.fechigh)) + self.list.append(getConfigListEntry(_("Code rate LP"), self.scan_ter.feclow)) self.list.append(getConfigListEntry(_("Modulation"), self.scan_ter.modulation)) self.list.append(getConfigListEntry(_("Transmission mode"), self.scan_ter.transmission)) - self.list.append(getConfigListEntry(_("Guard interval mode"), self.scan_ter.guard)) - self.list.append(getConfigListEntry(_("Hierarchy mode"), self.scan_ter.hierarchy)) + self.list.append(getConfigListEntry(_("Guard interval"), self.scan_ter.guard)) + self.list.append(getConfigListEntry(_("Hierarchy info"), self.scan_ter.hierarchy)) self.list.append(getConfigListEntry(_("Network scan"), self.scan_networkScan)) self.list.append(getConfigListEntry(_("Clear before scan"), self.scan_clearallservices)) self.list.append(getConfigListEntry(_("Only Free scan"), self.scan_onlyfree)) @@ -567,8 +557,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): (eDVBFrontendParametersSatellite.System_DVB_S2, _("DVB-S2"))]) self.scan_sat.frequency = ConfigInteger(default = defaultSat["frequency"], limits = (1, 99999)) self.scan_sat.inversion = ConfigSelection(default = defaultSat["inversion"], choices = [ - (eDVBFrontendParametersSatellite.Inversion_Off, _("off")), - (eDVBFrontendParametersSatellite.Inversion_On, _("on")), + (eDVBFrontendParametersSatellite.Inversion_Off, _("Off")), + (eDVBFrontendParametersSatellite.Inversion_On, _("On")), (eDVBFrontendParametersSatellite.Inversion_Unknown, _("Auto"))]) self.scan_sat.symbolrate = ConfigInteger(default = defaultSat["symbolrate"], limits = (1, 99999)) self.scan_sat.polarization = ConfigSelection(default = defaultSat["polarization"], choices = [ @@ -602,15 +592,15 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): (eDVBFrontendParametersSatellite.RollOff_alpha_0_25, "0.25"), (eDVBFrontendParametersSatellite.RollOff_alpha_0_20, "0.20")]) self.scan_sat.pilot = ConfigSelection(default = defaultSat.get("pilot", eDVBFrontendParametersSatellite.Pilot_Unknown), choices = [ - (eDVBFrontendParametersSatellite.Pilot_Off, _("off")), - (eDVBFrontendParametersSatellite.Pilot_On, _("on")), + (eDVBFrontendParametersSatellite.Pilot_Off, _("Off")), + (eDVBFrontendParametersSatellite.Pilot_On, _("On")), (eDVBFrontendParametersSatellite.Pilot_Unknown, _("Auto"))]) # cable self.scan_cab.frequency = ConfigInteger(default = defaultCab["frequency"], limits = (50, 999)) self.scan_cab.inversion = ConfigSelection(default = defaultCab["inversion"], choices = [ - (eDVBFrontendParametersCable.Inversion_Off, _("off")), - (eDVBFrontendParametersCable.Inversion_On, _("on")), + (eDVBFrontendParametersCable.Inversion_Off, _("Off")), + (eDVBFrontendParametersCable.Inversion_On, _("On")), (eDVBFrontendParametersCable.Inversion_Unknown, _("Auto"))]) self.scan_cab.modulation = ConfigSelection(default = defaultCab["modulation"], choices = [ (eDVBFrontendParametersCable.Modulation_QAM16, "16-QAM"), @@ -632,8 +622,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): # terrestial self.scan_ter.frequency = ConfigInteger(default = 466000, limits = (50000, 999000)) self.scan_ter.inversion = ConfigSelection(default = defaultTer["inversion"], choices = [ - (eDVBFrontendParametersTerrestrial.Inversion_Off, _("off")), - (eDVBFrontendParametersTerrestrial.Inversion_On, _("on")), + (eDVBFrontendParametersTerrestrial.Inversion_Off, _("Off")), + (eDVBFrontendParametersTerrestrial.Inversion_On, _("On")), (eDVBFrontendParametersTerrestrial.Inversion_Unknown, _("Auto"))]) # WORKAROUND: we can't use BW-auto self.scan_ter.bandwidth = ConfigSelection(default = defaultTer["bandwidth"], choices = [ @@ -845,7 +835,10 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport): self.tlist = tlist def cableTransponderSearchFinished(self): - self.startScan(self.tlist, self.flags, self.feid) + if self.tlist is None: + self.tlist = [] + else: + self.startScan(self.tlist, self.flags, self.feid) def startScan(self, tlist, flags, feid): if len(tlist): @@ -1011,7 +1004,8 @@ class ScanSimple(ConfigListScreen, Screen, CableTransponderSearchSupport): self.session.open(MessageBox, _("Nothing to scan!\nPlease setup your tuner settings before you start a service scan."), MessageBox.TYPE_ERROR) def setCableTransponderSearchResult(self, tlist): - self.scanList.append({"transponders": tlist, "feid": self.feid, "flags": self.flags}) + if tlist is not None: + self.scanList.append({"transponders": tlist, "feid": self.feid, "flags": self.flags}) def cableTransponderSearchFinished(self): self.buildTransponderList() diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py index f0bf773..4a0accd 100644 --- a/lib/python/Screens/Screen.py +++ b/lib/python/Screens/Screen.py @@ -6,6 +6,8 @@ profile("LOAD:Source") from Components.Sources.Source import Source profile("LOAD:GUIComponent") from Components.GUIComponent import GUIComponent +profile("LOAD:eRCInput") +from enigma import eRCInput class Screen(dict, GUISkin): @@ -46,6 +48,24 @@ class Screen(dict, GUISkin): # stand alone screens (for example web screens) # don't care about having or not having focus. self.stand_alone = False + self.keyboardMode = None + + def saveKeyboardMode(self): + rcinput = eRCInput.getInstance() + self.keyboardMode = rcinput.getKeyboardMode() + + def setKeyboardModeAscii(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmAscii) + + def setKeyboardModeNone(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmNone) + + def restoreKeyboardMode(self): + rcinput = eRCInput.getInstance() + if self.keyboardMode is not None: + rcinput.setKeyboardMode(self.keyboardMode) def execBegin(self): self.active_components = [ ] diff --git a/lib/python/Screens/ServiceInfo.py b/lib/python/Screens/ServiceInfo.py index fa2f447..61885df 100644 --- a/lib/python/Screens/ServiceInfo.py +++ b/lib/python/Screens/ServiceInfo.py @@ -81,9 +81,9 @@ class ServiceInfo(Screen): self.feinfo = None else: self.type = TYPE_SERVICE_INFO - self["red"] = Label(_("Serviceinfo")) + self["red"] = Label(_("Service")) self["green"] = Label(_("PIDs")) - self["yellow"] = Label(_("Transponder")) + self["yellow"] = Label(_("Multiplex")) self["blue"] = Label(_("Tuner status")) service = session.nav.getCurrentService() if service is not None: @@ -105,63 +105,63 @@ class ServiceInfo(Screen): name = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName() refstr = self.session.nav.getCurrentlyPlayingServiceReference().toString() else: - name = "N/A" - refstr = "N/A" + name = _("N/A") + refstr = _("N/A") aspect = self.getServiceInfoValue(iServiceInformation.sAspect) if aspect in ( 1, 2, 5, 6, 9, 0xA, 0xD, 0xE ): - aspect = "4:3" + aspect = _("4:3") else: - aspect = "16:9" + aspect = _("16:9") width = self.info and self.info.getInfo(iServiceInformation.sVideoWidth) or -1 height = self.info and self.info.getInfo(iServiceInformation.sVideoHeight) or -1 if width != -1 and height != -1: - Labels = ( ("Name", name, TYPE_TEXT), - ("Provider", self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), - ("Videoformat", aspect, TYPE_TEXT), - ("Videosize", "%dx%d" %(width, height), TYPE_TEXT), - ("Namespace", self.getServiceInfoValue(iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), - ("Service Reference", refstr, TYPE_TEXT)) + Labels = ( (_("Name"), name, TYPE_TEXT), + (_("Provider"), self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), + (_("Aspect ratio"), aspect, TYPE_TEXT), + (_("Resolution"), "%dx%d" %(width, height), TYPE_TEXT), + (_("Namespace"), self.getServiceInfoValue(iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), + (_("Service reference"), refstr, TYPE_TEXT)) else: - Labels = ( ("Name", name, TYPE_TEXT), - ("Provider", self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), - ("Videoformat", aspect, TYPE_TEXT), - ("Namespace", self.getServiceInfoValue(iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), - ("Service Reference", refstr, TYPE_TEXT)) + Labels = ( (_("Name"), name, TYPE_TEXT), + (_("Provider"), self.getServiceInfoValue(iServiceInformation.sProvider), TYPE_TEXT), + (_("Aspect ratio"), aspect, TYPE_TEXT), + (_("Namespace"), self.getServiceInfoValue(iServiceInformation.sNamespace), TYPE_VALUE_HEX, 8), + (_("Service reference"), refstr, TYPE_TEXT)) self.fillList(Labels) else: if self.transponder_info: tp_info = ConvertToHumanReadable(self.transponder_info) - conv = { "tuner_type" : _("Transponder Type"), - "system" : _("System"), - "modulation" : _("Modulation"), - "orbital_position" : _("Orbital Position"), - "frequency" : _("Frequency"), - "symbol_rate" : _("Symbolrate"), - "bandwidth" : _("Bandwidth"), - "polarization" : _("Polarization"), - "inversion" : _("Inversion"), - "pilot" : _("Pilot"), - "rolloff" : _("Rolloff"), - "fec_inner" : _("FEC"), - "code_rate_lp" : _("Coderate LP"), - "code_rate_hp" : _("Coderate HP"), - "constellation" : _("Constellation"), - "transmission_mode": _("Transmission Mode"), - "guard_interval" : _("Guard Interval"), - "hierarchy_information": _("Hierarchy Information") } + conv = { "tuner_type" : _("Type"), + "system" : _("System"), + "modulation" : _("Modulation"), + "orbital_position" : _("Orbital position"), + "frequency" : _("Frequency"), + "symbol_rate" : _("Symbol rate"), + "bandwidth" : _("Bandwidth"), + "polarization" : _("Polarization"), + "inversion" : _("Inversion"), + "pilot" : _("Pilot"), + "rolloff" : _("Roll-off"), + "fec_inner" : _("FEC"), + "code_rate_lp" : _("Code rate LP"), + "code_rate_hp" : _("Code rate HP"), + "constellation" : _("Constellation"), + "transmission_mode" : _("Transmission mode"), + "guard_interval" : _("Guard interval"), + "hierarchy_information" : _("Hierarchy info") } Labels = [(conv[i], tp_info[i], TYPE_VALUE_DEC) for i in tp_info.keys()] self.fillList(Labels) def pids(self): if self.type == TYPE_SERVICE_INFO: - Labels = ( ("VideoPID", self.getServiceInfoValue(iServiceInformation.sVideoPID), TYPE_VALUE_HEX_DEC, 4), - ("AudioPID", self.getServiceInfoValue(iServiceInformation.sAudioPID), TYPE_VALUE_HEX_DEC, 4), - ("PCRPID", self.getServiceInfoValue(iServiceInformation.sPCRPID), TYPE_VALUE_HEX_DEC, 4), - ("PMTPID", self.getServiceInfoValue(iServiceInformation.sPMTPID), TYPE_VALUE_HEX_DEC, 4), - ("TXTPID", self.getServiceInfoValue(iServiceInformation.sTXTPID), TYPE_VALUE_HEX_DEC, 4), - ("TSID", self.getServiceInfoValue(iServiceInformation.sTSID), TYPE_VALUE_HEX_DEC, 4), - ("ONID", self.getServiceInfoValue(iServiceInformation.sONID), TYPE_VALUE_HEX_DEC, 4), - ("SID", self.getServiceInfoValue(iServiceInformation.sSID), TYPE_VALUE_HEX_DEC, 4)) + Labels = ( (_("Video PID"), self.getServiceInfoValue(iServiceInformation.sVideoPID), TYPE_VALUE_HEX_DEC, 4), + (_("Audio PID"), self.getServiceInfoValue(iServiceInformation.sAudioPID), TYPE_VALUE_HEX_DEC, 4), + (_("PCR PID"), self.getServiceInfoValue(iServiceInformation.sPCRPID), TYPE_VALUE_HEX_DEC, 4), + (_("PMT PID"), self.getServiceInfoValue(iServiceInformation.sPMTPID), TYPE_VALUE_HEX_DEC, 4), + (_("TXT PID"), self.getServiceInfoValue(iServiceInformation.sTXTPID), TYPE_VALUE_HEX_DEC, 4), + (_("TSID"), self.getServiceInfoValue(iServiceInformation.sTSID), TYPE_VALUE_HEX_DEC, 4), + (_("ONID"), self.getServiceInfoValue(iServiceInformation.sONID), TYPE_VALUE_HEX_DEC, 4), + (_("SID"), self.getServiceInfoValue(iServiceInformation.sSID), TYPE_VALUE_HEX_DEC, 4)) self.fillList(Labels) def showFrontendData(self, real): @@ -182,37 +182,38 @@ class ServiceInfo(Screen): if frontendDataOrg and len(frontendDataOrg): frontendData = ConvertToHumanReadable(frontendDataOrg) if frontendDataOrg["tuner_type"] == "DVB-S": - return (("NIM", ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), - ("Type", frontendData["system"], TYPE_TEXT), - ("Modulation", frontendData["modulation"], TYPE_TEXT), - ("Orbital position", frontendData["orbital_position"], TYPE_VALUE_DEC), - ("Frequency", frontendData["frequency"], TYPE_VALUE_DEC), - ("Symbolrate", frontendData["symbol_rate"], TYPE_VALUE_DEC), - ("Polarization", frontendData["polarization"], TYPE_TEXT), - ("Inversion", frontendData["inversion"], TYPE_TEXT), - ("FEC inner", frontendData["fec_inner"], TYPE_TEXT), - ("Pilot", frontendData.get("pilot", None), TYPE_TEXT), - ("Rolloff", frontendData.get("rolloff", None), TYPE_TEXT)) + return ((_("NIM"), ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), + (_("Type"), frontendData["tuner_type"], TYPE_TEXT), + (_("System"), frontendData["system"], TYPE_TEXT), + (_("Modulation"), frontendData["modulation"], TYPE_TEXT), + (_("Orbital position"), frontendData["orbital_position"], TYPE_VALUE_DEC), + (_("Frequency"), frontendData["frequency"], TYPE_VALUE_DEC), + (_("Symbol rate"), frontendData["symbol_rate"], TYPE_VALUE_DEC), + (_("Polarization"), frontendData["polarization"], TYPE_TEXT), + (_("Inversion"), frontendData["inversion"], TYPE_TEXT), + (_("FEC"), frontendData["fec_inner"], TYPE_TEXT), + (_("Pilot"), frontendData.get("pilot", None), TYPE_TEXT), + (_("Roll-off"), frontendData.get("rolloff", None), TYPE_TEXT)) elif frontendDataOrg["tuner_type"] == "DVB-C": - return (("NIM", ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), - ("Type", frontendData["tuner_type"], TYPE_TEXT), - ("Frequency", frontendData["frequency"], TYPE_VALUE_DEC), - ("Symbolrate", frontendData["symbol_rate"], TYPE_VALUE_DEC), - ("Modulation", frontendData["modulation"], TYPE_TEXT), - ("Inversion", frontendData["inversion"], TYPE_TEXT), - ("FEC inner", frontendData["fec_inner"], TYPE_TEXT)) + return ((_("NIM"), ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), + (_("Type"), frontendData["tuner_type"], TYPE_TEXT), + (_("Modulation"), frontendData["modulation"], TYPE_TEXT), + (_("Frequency"), frontendData["frequency"], TYPE_VALUE_DEC), + (_("Symbol rate"), frontendData["symbol_rate"], TYPE_VALUE_DEC), + (_("Inversion"), frontendData["inversion"], TYPE_TEXT), + (_("FEC"), frontendData["fec_inner"], TYPE_TEXT)) elif frontendDataOrg["tuner_type"] == "DVB-T": - return (("NIM", ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), - ("Type", frontendData["tuner_type"], TYPE_TEXT), - ("Frequency", frontendData["frequency"], TYPE_VALUE_DEC), - ("Inversion", frontendData["inversion"], TYPE_TEXT), - ("Bandwidth", frontendData["bandwidth"], TYPE_VALUE_DEC), - ("CodeRateLP", frontendData["code_rate_lp"], TYPE_TEXT), - ("CodeRateHP", frontendData["code_rate_hp"], TYPE_TEXT), - ("Constellation", frontendData["constellation"], TYPE_TEXT), - ("Transmission Mode", frontendData["transmission_mode"], TYPE_TEXT), - ("Guard Interval", frontendData["guard_interval"], TYPE_TEXT), - ("Hierarchy Inform.", frontendData["hierarchy_information"], TYPE_TEXT)) + return ((_("NIM"), ('A', 'B', 'C', 'D')[frontendData["tuner_number"]], TYPE_TEXT), + (_("Type"), frontendData["tuner_type"], TYPE_TEXT), + (_("Frequency"), frontendData["frequency"], TYPE_VALUE_DEC), + (_("Inversion"), frontendData["inversion"], TYPE_TEXT), + (_("Bandwidth"), frontendData["bandwidth"], TYPE_VALUE_DEC), + (_("Code rate LP"), frontendData["code_rate_lp"], TYPE_TEXT), + (_("Code rate HP"), frontendData["code_rate_hp"], TYPE_TEXT), + (_("Constellation"), frontendData["constellation"], TYPE_TEXT), + (_("Transmission mode"), frontendData["transmission_mode"], TYPE_TEXT), + (_("Guard interval"), frontendData["guard_interval"], TYPE_TEXT), + (_("Hierarchy info"), frontendData["hierarchy_information"], TYPE_TEXT)) return [ ] def fillList(self, Labels): @@ -237,6 +238,6 @@ class ServiceInfo(Screen): if v == -2: v = self.info.getInfoString(what) elif v == -1: - v = "N/A" + v = _("N/A") return v diff --git a/lib/python/Screens/Setup.py b/lib/python/Screens/Setup.py index e9c3c68..61e6fdd 100755 --- a/lib/python/Screens/Setup.py +++ b/lib/python/Screens/Setup.py @@ -4,6 +4,7 @@ from Components.config import config, ConfigNothing from Components.SystemInfo import SystemInfo from Components.ConfigList import ConfigListScreen from Components.Sources.StaticText import StaticText +from enigma import eEnv import xml.etree.cElementTree @@ -14,7 +15,7 @@ try: setupfile = file('data/setup.xml', 'r') except: # if not found in the current path, we use the global datadir-path - setupfile = file('/usr/share/enigma2/setup.xml', 'r') + setupfile = file(eEnv.resolve('${datadir}/enigma2/setup.xml'), 'r') setupdom = xml.etree.cElementTree.parse(setupfile) setupfile.close() diff --git a/lib/python/Screens/SleepTimerEdit.py b/lib/python/Screens/SleepTimerEdit.py index e5e7af4..61440d4 100644 --- a/lib/python/Screens/SleepTimerEdit.py +++ b/lib/python/Screens/SleepTimerEdit.py @@ -103,6 +103,7 @@ class SleepTimerEdit(Screen): config.SleepTimer.defaulttime.setValue(time) config.SleepTimer.defaulttime.save() config.SleepTimer.action.save() + config.SleepTimer.ask.save() self.session.nav.SleepTimer.setSleepTime(time) self.session.openWithCallback(self.close, MessageBox, _("The sleep timer has been activated."), MessageBox.TYPE_INFO) else: diff --git a/lib/python/Screens/Standby.py b/lib/python/Screens/Standby.py index 1a7ebbd..94a56ee 100644 --- a/lib/python/Screens/Standby.py +++ b/lib/python/Screens/Standby.py @@ -160,14 +160,9 @@ class TryQuitMainloop(MessageBox): self.conntected=False self.session.nav.record_event.remove(self.getRecordEvent) if value: - # hack .. we dont like to show any other screens when this screen has closed - self.onClose = [self.__closed] - self.session.dialog_stack = [] - self.session.summary_stack = [None] - MessageBox.close(self, True) - - def __closed(self): - quitMainloop(self.retval) + quitMainloop(self.retval) + else: + MessageBox.close(self, True) def __onShow(self): global inTryQuitMainloop diff --git a/lib/python/Screens/TaskView.py b/lib/python/Screens/TaskView.py index 660fb27..5dd744f 100644 --- a/lib/python/Screens/TaskView.py +++ b/lib/python/Screens/TaskView.py @@ -2,6 +2,7 @@ from Screen import Screen from Components.ConfigList import ConfigListScreen from Components.config import config, ConfigSubsection, ConfigSelection, getConfigListEntry from Components.SystemInfo import SystemInfo +from Components.Task import job_manager from InfoBarGenerics import InfoBarNotifications import Screens.Standby from Tools import Notifications @@ -108,10 +109,13 @@ class JobView(InfoBarNotifications, Screen, ConfigListScreen): self.close(False) def abort(self): - if self.job.status in (self.job.FINISHED, self.job.FAILED): + if self.job.status == self.job.NOT_STARTED: + job_manager.active_jobs.remove(self.job) self.close(False) - if self["cancelable"].boolean == True: + elif self.job.status == self.job.IN_PROGRESS and self["cancelable"].boolean == True: self.job.cancel() + else: + self.close(False) def performAfterEvent(self): self["config"].hide() diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index 5435498..0abb42a 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -13,6 +13,7 @@ from ServiceReference import ServiceReference from TimerEntry import TimerEntry, TimerLog from Tools.BoundFunction import boundFunction from time import time +from timer import TimerEntry as RealTimerEntry class TimerEditList(Screen): EMPTY = 0 @@ -88,7 +89,9 @@ class TimerEditList(Screen): if not timersanitycheck.check(): t.disable() print "Sanity check failed" - self.session.openWithCallback(self.finishedEdit, TimerSanityConflict, timersanitycheck.getSimulTimerList()) + simulTimerList = timersanitycheck.getSimulTimerList() + if simulTimerList is not None: + self.session.openWithCallback(self.finishedEdit, TimerSanityConflict, simulTimerList) else: print "Sanity check passed" if timersanitycheck.doubleCheck(): @@ -172,11 +175,20 @@ class TimerEditList(Screen): self.key_blue_choice = self.EMPTY def fillTimerList(self): + #helper function to move finished timers to end of list + def eol_compare(x, y): + if x[0].state != y[0].state and x[0].state == RealTimerEntry.StateEnded or y[0].state == RealTimerEntry.StateEnded: + return cmp(x[0].state, y[0].state) + return cmp(x[0].begin, y[0].begin) + list = self.list del list[:] list.extend([(timer, False) for timer in self.session.nav.RecordTimer.timer_list]) list.extend([(timer, True) for timer in self.session.nav.RecordTimer.processed_timers]) - list.sort(cmp = lambda x, y: x[0].begin < y[0].begin) + if config.usage.timerlist_finished_timer_position.index: #end of list + list.sort(cmp = eol_compare) + else: + list.sort(key = lambda x: x[0].begin) def showLog(self): cur=self["timerlist"].getCurrent() diff --git a/lib/python/Screens/VirtualKeyBoard.py b/lib/python/Screens/VirtualKeyBoard.py index 7846e4b..c0d0c10 100755 --- a/lib/python/Screens/VirtualKeyBoard.py +++ b/lib/python/Screens/VirtualKeyBoard.py @@ -1,12 +1,13 @@ -# -*- coding: iso-8859-1 -*- +# -*- coding: UTF-8 -*- +from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode +from Screen import Screen from Components.Language import language from Components.ActionMap import ActionMap +from Components.Sources.StaticText import StaticText from Components.Label import Label from Components.Pixmap import Pixmap from Components.MenuList import MenuList from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest -from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER -from Screen import Screen from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN from Tools.LoadPixmap import LoadPixmap @@ -86,52 +87,127 @@ class VirtualKeyBoard(Screen): self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() + self.nextLang = None + self.shiftMode = False + self.text = text + self.selectedKey = 0 + + self["country"] = StaticText("") + self["header"] = Label(title) + self["text"] = Label(self.text) + self["list"] = VirtualKeyBoardList([]) + + self["actions"] = ActionMap(["OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions"], + { + "gotAsciiCode": self.keyGotAscii, + "ok": self.okClicked, + "cancel": self.exit, + "left": self.left, + "right": self.right, + "up": self.up, + "down": self.down, + "red": self.backClicked, + "green": self.ok, + "yellow": self.switchLang, + "deleteBackward": self.backClicked, + "back": self.exit + }, -2) + self.setLang() + self.onExecBegin.append(self.setKeyboardModeAscii) + self.onLayoutFinish.append(self.buildVirtualKeyBoard) + + def switchLang(self): + self.lang = self.nextLang + self.setLang() + self.buildVirtualKeyBoard() + + def setLang(self): if self.lang == 'de_DE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], - [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"], - [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], - [u"SHIFT", u"SPACE", u"@", u"ß", u"OK"]] - + [u"SHIFT", u"SPACE", u"@", u"ß", u"OK"]] self.shiftkeys_list = [ - [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], - [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"], - [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"OK"]] - + self.nextLang = 'es_ES' elif self.lang == 'es_ES': - #still missing keys (u"ùÙ") + #still missing keys (u"ùÙ") self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], - [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], - [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], - [u"SHIFT", u"SPACE", u"@", u"£", u"à", u"é", u"è", u"í", u"ì", u"ñ", u"ò", u"OK"]] - + [u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK"]] self.shiftkeys_list = [ - [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], - [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"], - [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"], + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], - [u"SHIFT", u"SPACE", u"?", u"\\", u"À", u"É", u"È", u"Í", u"Ì", u"Ñ", u"Ò", u"OK"]] - - elif self.lang in ('sv_SE', 'fi_FI'): + [u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK"]] + self.nextLang = 'fi_FI' + elif self.lang == 'fi_FI': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], - [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], - [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], - [u"SHIFT", u"SPACE", u"@", u"ß", u"å", u"OK"]] - + [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]] self.shiftkeys_list = [ - [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], - [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], - [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], - - [u"SHIFT", u"SPACE", u"?", u"\\", u"Å", u"OK"]] + [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]] + self.nextLang = 'sv_SE' + elif self.lang == 'sv_SE': + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]] + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]] + self.nextLang = 'sk_SK' + elif self.lang =='sk_SK': + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"Å¡", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK"]] + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Å¥", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], + [u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Å ", u"Č", u"Ť", u"Ň"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK"]] + self.nextLang = 'cs_CZ' + elif self.lang == 'cs_CZ': + self.keys_list = [ + [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], + [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], + [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#"], + [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], + [u"SHIFT", u"SPACE", u"ě", u"Å¡", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK"]] + self.shiftkeys_list = [ + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Å¥", u"*"], + [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], + [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], + [u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Å ", u"Ž", u"Ú", u"Á", u"É", u"OK"]] + self.nextLang = 'en_EN' else: self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], @@ -139,36 +215,15 @@ class VirtualKeyBoard(Screen): [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"#", u"\\"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK"]] - self.shiftkeys_list = [ - [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], + [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"'", u"?"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK"]] - - self.shiftMode = False - self.text = text - self.selectedKey = 0 - - self["header"] = Label(title) - self["text"] = Label(self.text) - self["list"] = VirtualKeyBoardList([]) - - self["actions"] = ActionMap(["OkCancelActions", "WizardActions", "ColorActions"], - { - "ok": self.okClicked, - "cancel": self.exit, - "left": self.left, - "right": self.right, - "up": self.up, - "down": self.down, - "red": self.backClicked, - "green": self.ok - }, -2) - - self.onLayoutFinish.append(self.buildVirtualKeyBoard) - + self.lang = 'en_EN' + self.nextLang = 'de_DE' + self["country"].setText(self.lang) self.max_key=47+len(self.keys_list[4]) def buildVirtualKeyBoard(self, selectedKey=0): @@ -192,7 +247,6 @@ class VirtualKeyBoard(Screen): selectedKey -= 12 self["list"].setList(list) - def backClicked(self): self.text = self["text"].getText()[:-1] @@ -219,7 +273,7 @@ class VirtualKeyBoard(Screen): if text is None: return - text = text.encode("utf-8") + text = text.encode("UTF-8") if text == "EXIT": self.close(None) @@ -312,3 +366,30 @@ class VirtualKeyBoard(Screen): def showActiveKey(self): self.buildVirtualKeyBoard(self.selectedKey) + + def inShiftKeyList(self,key): + for KeyList in self.shiftkeys_list: + for char in KeyList: + if char == key: + return True + return False + + def keyGotAscii(self): + char = str(unichr(getPrevAsciiCode()).encode('utf-8')) + if self.inShiftKeyList(char): + self.shiftMode = True + list = self.shiftkeys_list + else: + self.shiftMode = False + list = self.keys_list + + selkey = 0 + for keylist in list: + for key in keylist: + if key == char: + self.selectedKey = selkey + self.okClicked() + self.showActiveKey() + return + else: + selkey += 1 diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index a752d31..61e1d5e 100755 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -10,7 +10,7 @@ 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 enigma import eTimer, eEnv from xml.sax import make_parser from xml.sax.handler import ContentHandler @@ -178,7 +178,7 @@ class Wizard(Screen): parser.setContentHandler(wizardHandler) for xmlfile in self.xmlfile: if xmlfile[0] != '/': - parser.parse('/usr/share/enigma2/' + xmlfile) + parser.parse(eEnv.resolve('${datadir}/enigma2/') + xmlfile) else: parser.parse(xmlfile) diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py index 8ed2c8a..f0ef0de 100755 --- a/lib/python/Tools/Directories.py +++ b/lib/python/Tools/Directories.py @@ -3,6 +3,7 @@ from os import path as os_path, mkdir, rmdir, system, walk, stat as os_stat, listdir, readlink, makedirs, error as os_error, symlink, access, F_OK, R_OK, W_OK from stat import S_IMODE from re import compile +from enigma import eEnv try: from os import chmod @@ -39,26 +40,26 @@ PATH_CREATE = 0 PATH_DONTCREATE = 1 PATH_FALLBACK = 2 defaultPaths = { - SCOPE_TRANSPONDERDATA: ("/etc/", PATH_DONTCREATE), - SCOPE_SYSETC: ("/etc/", PATH_DONTCREATE), - SCOPE_FONTS: ("/usr/share/fonts/", PATH_DONTCREATE), - SCOPE_CONFIG: ("/etc/enigma2/", PATH_CREATE), - SCOPE_PLUGINS: ("/usr/lib/enigma2/python/Plugins/", PATH_CREATE), + SCOPE_TRANSPONDERDATA: (eEnv.resolve("${sysconfdir}/"), PATH_DONTCREATE), + SCOPE_SYSETC: (eEnv.resolve("${sysconfdir}/"), PATH_DONTCREATE), + SCOPE_FONTS: (eEnv.resolve("${datadir}/fonts/"), PATH_DONTCREATE), + SCOPE_CONFIG: (eEnv.resolve("${sysconfdir}/enigma2/"), PATH_CREATE), + SCOPE_PLUGINS: (eEnv.resolve("${libdir}/enigma2/python/Plugins/"), PATH_CREATE), - SCOPE_LANGUAGE: ("/usr/share/enigma2/po/", PATH_DONTCREATE), + SCOPE_LANGUAGE: (eEnv.resolve("${datadir}/enigma2/po/"), PATH_DONTCREATE), - SCOPE_SKIN: ("/usr/share/enigma2/", PATH_DONTCREATE), - SCOPE_SKIN_IMAGE: ("/usr/share/enigma2/", PATH_DONTCREATE), + SCOPE_SKIN: (eEnv.resolve("${datadir}/enigma2/"), PATH_DONTCREATE), + SCOPE_SKIN_IMAGE: (eEnv.resolve("${datadir}/enigma2/"), PATH_DONTCREATE), SCOPE_HDD: ("/hdd/movie/", PATH_DONTCREATE), SCOPE_MEDIA: ("/media/", PATH_DONTCREATE), - SCOPE_PLAYLIST: ("/etc/enigma2/playlist/", PATH_CREATE), + SCOPE_PLAYLIST: (eEnv.resolve("${sysconfdir}/enigma2/playlist/"), PATH_CREATE), SCOPE_USERETC: ("", PATH_DONTCREATE), # user home directory - SCOPE_DEFAULTDIR: ("/usr/share/enigma2/defaults/", PATH_CREATE), - SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE), - SCOPE_DEFAULTPARTITIONMOUNTDIR: ("/usr/share/enigma2/dealer", PATH_CREATE), - SCOPE_METADIR: ("/usr/share/meta", PATH_CREATE), + SCOPE_DEFAULTDIR: (eEnv.resolve("${datadir}/enigma2/defaults/"), PATH_CREATE), + SCOPE_DEFAULTPARTITION: ("/dev/mtdblock6", PATH_DONTCREATE), + SCOPE_DEFAULTPARTITIONMOUNTDIR: (eEnv.resolve("${datadir}/enigma2/dealer"), PATH_CREATE), + SCOPE_METADIR: (eEnv.resolve("${datadir}/meta"), PATH_CREATE), } FILE_COPY = 0 # copy files from fallback dir to the basedir @@ -67,7 +68,7 @@ PATH_COPY = 2 # copy the complete fallback dir to the basedir PATH_MOVE = 3 # move the fallback dir to the basedir (can be used for changes in paths) fallbackPaths = { SCOPE_CONFIG: [("/home/root/", FILE_MOVE), - ("/usr/share/enigma2/defaults/", FILE_COPY)], + (eEnv.resolve("${datadir}/enigma2/defaults/"), FILE_COPY)], SCOPE_HDD: [("/hdd/movies", PATH_MOVE)] } @@ -117,7 +118,11 @@ def resolveFilename(scope, base = "", path_prefix = None): if flags == PATH_CREATE: if not pathExists(path): - mkdir(path) + try: + mkdir(path) + except OSError: + print "resolveFilename: Couldn't create %s" % path + return None fallbackPath = fallbackPaths.get(scope) @@ -223,12 +228,13 @@ def InitFallbackFiles(): # returns a list of tuples containing pathname and filename matching the given pattern # example-pattern: match all txt-files: ".*\.txt$" def crawlDirectory(directory, pattern): - expression = compile(pattern) list = [] - for root, dirs, files in walk(directory): - for file in files: - if expression.match(file) is not None: - list.append((root, file)) + if directory: + expression = compile(pattern) + for root, dirs, files in walk(directory): + for file in files: + if expression.match(file) is not None: + list.append((root, file)) return list def copyfile(src, dst): diff --git a/lib/python/Tools/NumericalTextInput.py b/lib/python/Tools/NumericalTextInput.py index da090b1..252e174 100644 --- a/lib/python/Tools/NumericalTextInput.py +++ b/lib/python/Tools/NumericalTextInput.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +# -*- coding: UTF-8 -*- from enigma import eTimer from Components.Language import language @@ -31,19 +31,19 @@ class NumericalTextInput: return if self.lang == 'de_DE': - self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0 - self.mapping.append (u" 1") # 1 - self.mapping.append (u"aäbc2AÄBC") # 2 + self.mapping.append (u"0,?!&@=*'+\"()$~") # 0 + self.mapping.append (u" 1.:/-_") # 1 + self.mapping.append (u"abcä2ABCÄ") # 2 self.mapping.append (u"def3DEF") # 3 self.mapping.append (u"ghi4GHI") # 4 self.mapping.append (u"jkl5JKL") # 5 self.mapping.append (u"mnoö6MNOÖ") # 6 self.mapping.append (u"pqrsß7PQRSß") # 7 - self.mapping.append (u"tuüv8TUÜV") # 8 + self.mapping.append (u"tuvü8TUVÜ") # 8 self.mapping.append (u"wxyz9WXYZ") # 9 elif self.lang == 'es_ES': - self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0 - self.mapping.append (u" 1") # 1 + self.mapping.append (u"0,?!&@=*'+\"()$~") # 0 + self.mapping.append (u" 1.:/-_") # 1 self.mapping.append (u"abcáà2ABCÁÀ") # 2 self.mapping.append (u"deéèf3DEFÉÈ") # 3 self.mapping.append (u"ghiíì4GHIÍÌ") # 4 @@ -53,8 +53,8 @@ class NumericalTextInput: self.mapping.append (u"tuvúù8TUVÚÙ") # 8 self.mapping.append (u"wxyz9WXYZ") # 9 if self.lang in ('sv_SE', 'fi_FI'): - self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0 - self.mapping.append (u" 1") # 1 + self.mapping.append (u"0,?!&@=*'+\"()$~") # 0 + self.mapping.append (u" 1.:/-_") # 1 self.mapping.append (u"abcåä2ABCÅÄ") # 2 self.mapping.append (u"defé3DEFÉ") # 3 self.mapping.append (u"ghi4GHI") # 4 @@ -63,9 +63,20 @@ class NumericalTextInput: self.mapping.append (u"pqrs7PQRS") # 7 self.mapping.append (u"tuv8TUV") # 8 self.mapping.append (u"wxyz9WXYZ") # 9 + elif self.lang in ('cs_CZ', 'sk_SK'): + self.mapping.append (u"0,?'+\"()@$!=&*") # 0 + self.mapping.append (u" 1.:/-_") # 1 + self.mapping.append (u"abc2áäčABCÁÄČ") # 2 + self.mapping.append (u"def3ďéěDEFĎÉĚ") # 3 + self.mapping.append (u"ghi4íGHIÍ") # 4 + self.mapping.append (u"jkl5ľĺJKLĽĹ") # 5 + self.mapping.append (u"mno6ňóöôMNOŇÓÖÔ") # 6 + self.mapping.append (u"pqrs7řŕšPQRSŘŔŠ") # 7 + self.mapping.append (u"tuv8ťúůüTUVŤÚŮÜ") # 8 + self.mapping.append (u"wxyz9ýžWXYZÝŽ") # 9 else: - self.mapping.append (u".,?'+\"0-()@/:_$!=") # 0 - self.mapping.append (u" 1") # 1 + self.mapping.append (u"0,?!&@=*'+\"()$~") # 0 + self.mapping.append (u" 1.:/-_") # 1 self.mapping.append (u"abc2ABC") # 2 self.mapping.append (u"def3DEF") # 3 self.mapping.append (u"ghi4GHI") # 4 @@ -76,7 +87,8 @@ class NumericalTextInput: self.mapping.append (u"wxyz9WXYZ") # 9 def setUseableChars(self, useable): - self.useableChars = useable + self.useableChars = unicode(useable) + def getKey(self, num): cnt=0 diff --git a/lib/python/Tools/Transponder.py b/lib/python/Tools/Transponder.py index 6868929..0b8b96a 100644 --- a/lib/python/Tools/Transponder.py +++ b/lib/python/Tools/Transponder.py @@ -1,4 +1,5 @@ from enigma import eDVBFrontendParametersSatellite, eDVBFrontendParametersCable, eDVBFrontendParametersTerrestrial +from Components.NimManager import nimmanager def ConvertToHumanReadable(tp, type = None): ret = { } @@ -27,6 +28,7 @@ def ConvertToHumanReadable(tp, type = None): eDVBFrontendParametersSatellite.Modulation_QPSK : "QPSK", eDVBFrontendParametersSatellite.Modulation_QAM16 : "QAM16", eDVBFrontendParametersSatellite.Modulation_8PSK : "8PSK"}[tp["modulation"]] + ret["orbital_position"] = nimmanager.getSatName(int(tp["orbital_position"])) ret["polarization"] = { eDVBFrontendParametersSatellite.Polarisation_Horizontal : _("Horizontal"), eDVBFrontendParametersSatellite.Polarisation_Vertical : _("Vertical"), diff --git a/lib/python/connections.h b/lib/python/connections.h index ad76198..374749a 100644 --- a/lib/python/connections.h +++ b/lib/python/connections.h @@ -3,11 +3,6 @@ #include - /* avoid warnigs :) */ -#include -#undef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L - #include class PSignal @@ -85,4 +80,23 @@ public: } }; +template +class PSignal3: public PSignal, public Signal3 +{ +public: + R operator()(V0 a0, V1 a1, V2 a2) + { + if (m_list) + { + PyObject *pArgs = PyTuple_New(3); + PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0)); + PyTuple_SET_ITEM(pArgs, 1, PyFrom(a1)); + PyTuple_SET_ITEM(pArgs, 2, PyFrom(a2)); + callPython(pArgs); + Org_Py_DECREF(pArgs); + } + return Signal3::operator()(a0, a1, a2); + } +}; + #endif diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 19fb925..7c99927 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -38,6 +38,7 @@ is usually caused by not marking PSignals as immutable. #define SWIG_COMPILE #include #include +#include #include #include #include @@ -50,7 +51,7 @@ is usually caused by not marking PSignals as immutable. #include #include #include -#include +#include #include #include #include @@ -133,6 +134,7 @@ typedef long time_t; %include "std_string.i" %include %include +%include %include %immutable eSocketNotifier::activated; @@ -164,7 +166,7 @@ typedef long time_t; %include %include %include -%include +%include %include %include %include diff --git a/lib/python/python.h b/lib/python/python.h index 18fdac7..f5b6e4d 100644 --- a/lib/python/python.h +++ b/lib/python/python.h @@ -4,7 +4,6 @@ #define __lib_python_python_class_h #endif -#include #include #include diff --git a/lib/service/Makefile.am b/lib/service/Makefile.am index ed09d73..9f956b6 100644 --- a/lib/service/Makefile.am +++ b/lib/service/Makefile.am @@ -1,9 +1,39 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h + +AM_CXXFLAGS = \ + $(LIBXINE_CFLAGS) noinst_LIBRARIES = libenigma_service.a libenigma_service_a_SOURCES = \ - listboxservice.cpp service.cpp servicemp3.cpp servicedvb.cpp servicefs.cpp \ - event.cpp servicedvbrecord.cpp - + event.cpp \ + listboxservice.cpp \ + service.cpp \ + servicedvb.cpp \ + servicedvbrecord.cpp \ + servicefs.cpp \ + servicemp3.cpp \ + servicem2ts.cpp + +serviceincludedir = $(pkgincludedir)/lib/service +serviceinclude_HEADERS = \ + event.h \ + iservice.h \ + listboxservice.h \ + service.h \ + servicedvb.h \ + servicedvbrecord.h \ + servicefs.h \ + servicemp3.h \ + servicem2ts.h + +if HAVE_LIBXINE +libenigma_service_a_SOURCES += \ + servicexine.cpp +serviceinclude_HEADERS += \ + servicexine.h +endif diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 2ba7cb4..7f58249 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -289,6 +289,7 @@ public: sFileSize, sCAIDs, + sCAIDPIDs, sVideoType, /* MPEG2 MPEG4 */ sTags, /* space seperated list of tags */ diff --git a/lib/service/service.cpp b/lib/service/service.cpp index eb2757a..8c674c5 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -201,6 +201,25 @@ RESULT eServiceCenter::removeServiceFactory(int id) return 0; } +RESULT eServiceCenter::addFactoryExtension(int id, const char *extension) +{ + std::map >::iterator it = extensions.find(id); + if (it == extensions.end()) + return -1; + it->second.push_back(extension); + return 0; +} + +RESULT eServiceCenter::removeFactoryExtension(int id, const char *extension) +{ + std::map >::iterator it = extensions.find(id); + if (it == extensions.end()) + return -1; + it->second.remove(extension); + return 0; +} + + int eServiceCenter::getServiceTypeForExtension(const char *str) { for (std::map >::iterator sit(extensions.begin()); sit != extensions.end(); ++sit) diff --git a/lib/service/service.h b/lib/service/service.h index 6f6ab98..ffc7d27 100644 --- a/lib/service/service.h +++ b/lib/service/service.h @@ -40,6 +40,8 @@ public: static RESULT getPrivInstance(ePtr &ptr) { ptr = instance; return 0; } RESULT addServiceFactory(int id, iServiceHandler *hnd, std::list &extensions); RESULT removeServiceFactory(int id); + RESULT addFactoryExtension(int id, const char *extension); + RESULT removeFactoryExtension(int id, const char *extension); #endif static SWIG_VOID(RESULT) getInstance(ePtr &SWIG_NAMED_OUTPUT(ptr)) { ptr = instance; return 0; } }; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index e498dd4..8650989 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -309,7 +309,9 @@ eStaticServiceDVBPVRInformation::eStaticServiceDVBPVRInformation(const eServiceR RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, std::string &name) { ASSERT(ref == m_ref); - if (m_parser.m_name.size()) + if (!ref.name.empty()) + name = ref.name; + else if (!m_parser.m_name.empty()) name = m_parser.m_name; else { @@ -503,18 +505,19 @@ RESULT eDVBPVRServiceOfflineOperations::reindex() int err = f.open(m_ref.path.c_str(), 0); if (err < 0) return -1; - + + off_t offset = 0; off_t length = f.length(); unsigned char buffer[188*256*4]; while (1) { - off_t offset = f.lseek(0, SEEK_CUR); eDebug("at %08llx / %08llx (%d %%)", offset, length, (int)(offset * 100 / length)); - int r = f.read(buffer, sizeof(buffer)); + int r = f.read(offset, buffer, sizeof(buffer)); if (!r) break; if (r < 0) return r; + offset += r; parser.parseData(offset, buffer, r); } @@ -902,7 +905,7 @@ RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServ /* we are sure to have a ..DVB reference as the info() call was forwarded here according to it's ID. */ if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) { - eDebug("getService failed!"); +// eDebug("getService failed!"); return err; } } @@ -1093,7 +1096,8 @@ void eDVBServicePlay::serviceEventTimeshift(int event) 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 */ + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, r.path.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ m_event((iPlayableService*)this, evUser+1); } @@ -1122,7 +1126,8 @@ void eDVBServicePlay::serviceEventTimeshift(int event) 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 */ + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, m_timeshift_file_next.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ m_event((iPlayableService*)this, evUser+1); } @@ -1152,7 +1157,8 @@ RESULT eDVBServicePlay::start() m_event(this, evStart); m_first_program_info = 1; - m_service_handler.tune(service, m_is_pvr, m_cue, false, m_dvb_service); + ePtr source = createTsSource(service); + m_service_handler.tuneExt(service, m_is_pvr, source, service.path.c_str(), m_cue, false, m_dvb_service); if (m_is_pvr) { @@ -1585,7 +1591,7 @@ int eDVBServicePlay::getInfo(int w) { eDVBServicePMTHandler::program program; - if (w == sCAIDs) + if (w == sCAIDs || w == sCAIDPIDs) return resIsPyObject; eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler; @@ -1726,6 +1732,8 @@ PyObject *eDVBServicePlay::getInfoObject(int w) { case sCAIDs: return m_service_handler.getCaIds(); + case sCAIDPIDs: + return m_service_handler.getCaIds(true); case sTransponderData: return eStaticServiceDVBInformation().getInfoObject(m_reference, w); default: @@ -1793,6 +1801,8 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int info.m_description = "AAC-HE"; else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS) info.m_description = "DTS"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTSHD) + info.m_description = "DTS-HD"; else info.m_description = "???"; @@ -2356,6 +2366,13 @@ void eDVBServicePlay::resetTimeshift(int start) m_timeshift_active = 0; } +ePtr eDVBServicePlay::createTsSource(eServiceReferenceDVB &ref) +{ + eRawFile *f = new eRawFile(); + f->open(ref.path.c_str()); + return ePtr(f); +} + void eDVBServicePlay::switchToTimeshift() { if (m_timeshift_active) @@ -2367,7 +2384,9 @@ void eDVBServicePlay::switchToTimeshift() r.path = m_timeshift_file; m_cue->seekTo(0, -1000); - m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ + + ePtr source = createTsSource(r); + m_service_handler_timeshift.tuneExt(r, 1, source, m_timeshift_file.c_str(), m_cue, 0, m_dvb_service); /* use the decoder demux for everything */ eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now."); pause(); @@ -2386,7 +2405,7 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) eDebug("getting program info failed."); else { - eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size()); + eDebugNoNewLine("have %zd video stream(s)", program.videoStreams.size()); if (!program.videoStreams.empty()) { eDebugNoNewLine(" ("); @@ -2405,7 +2424,7 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged) } eDebugNoNewLine(")"); } - eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size()); + eDebugNoNewLine(", and %zd audio stream(s)", program.audioStreams.size()); if (!program.audioStreams.empty()) { eDebugNoNewLine(" ("); @@ -2582,7 +2601,7 @@ void eDVBServicePlay::loadCuesheet() m_cue_entries.insert(cueEntry(where, what)); } fclose(f); - eDebug("%d entries", m_cue_entries.size()); + eDebug("%zd entries", m_cue_entries.size()); } else eDebug("cutfile not found!"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index dafaf35..3efc259 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -185,7 +185,7 @@ public: RESULT stream(ePtr &ptr); PyObject *getStreamingData(); -private: +protected: friend class eServiceFactoryDVB; eServiceReference m_reference; @@ -289,6 +289,8 @@ private: ePtr m_video_event_connection; void video_event(struct iTSMPEGDecoder::videoEvent); + + virtual ePtr createTsSource(eServiceReferenceDVB &ref); }; class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index 419c26b..08cd247 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -313,7 +313,7 @@ int eDVBServiceRecord::doRecord() int timing_pid = -1, timing_pid_type = -1; - eDebugNoNewLine("RECORD: have %d video stream(s)", program.videoStreams.size()); + eDebugNoNewLine("RECORD: have %zd video stream(s)", program.videoStreams.size()); if (!program.videoStreams.empty()) { eDebugNoNewLine(" ("); @@ -335,7 +335,7 @@ int eDVBServiceRecord::doRecord() } eDebugNoNewLine(")"); } - eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size()); + eDebugNoNewLine(", and %zd audio stream(s)", program.audioStreams.size()); if (!program.audioStreams.empty()) { eDebugNoNewLine(" ("); diff --git a/lib/service/servicem2ts.cpp b/lib/service/servicem2ts.cpp new file mode 100644 index 0000000..e79907d --- /dev/null +++ b/lib/service/servicem2ts.cpp @@ -0,0 +1,380 @@ +#include +#include +#include +#include + +DEFINE_REF(eServiceFactoryM2TS) + +class eM2TSFile: public iTsSource +{ + DECLARE_REF(eM2TSFile); + eSingleLock m_lock; +public: + eM2TSFile(const char *filename, bool cached=false); + ~eM2TSFile(); + + // iTsSource + off_t lseek(off_t offset, int whence); + ssize_t read(off_t offset, void *buf, size_t count); + off_t length(); + int valid(); +private: + int m_sync_offset; + int m_fd; /* for uncached */ + FILE *m_file; /* for cached */ + off_t m_current_offset, m_length; + bool m_cached; + off_t lseek_internal(off_t offset, int whence); +}; + +class eStaticServiceM2TSInformation: public iStaticServiceInformation +{ + DECLARE_REF(eStaticServiceM2TSInformation); + eServiceReference m_ref; + eDVBMetaParser m_parser; +public: + eStaticServiceM2TSInformation(const eServiceReference &ref); + RESULT getName(const eServiceReference &ref, std::string &name); + int getLength(const eServiceReference &ref); + RESULT getEvent(const eServiceReference &ref, ePtr &SWIG_OUTPUT, time_t start_time); + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { return 1; } + int getInfo(const eServiceReference &ref, int w); + std::string getInfoString(const eServiceReference &ref,int w); + PyObject *getInfoObject(const eServiceReference &r, int what); +}; + +DEFINE_REF(eStaticServiceM2TSInformation); + +eStaticServiceM2TSInformation::eStaticServiceM2TSInformation(const eServiceReference &ref) +{ + m_ref = ref; + m_parser.parseFile(ref.path); +} + +RESULT eStaticServiceM2TSInformation::getName(const eServiceReference &ref, std::string &name) +{ + ASSERT(ref == m_ref); + if (m_parser.m_name.size()) + name = m_parser.m_name; + else + { + name = ref.path; + size_t n = name.rfind('/'); + if (n != std::string::npos) + name = name.substr(n + 1); + } + return 0; +} + +int eStaticServiceM2TSInformation::getLength(const eServiceReference &ref) +{ + ASSERT(ref == m_ref); + + eDVBTSTools tstools; + + struct stat s; + stat(ref.path.c_str(), &s); + + eM2TSFile *file = new eM2TSFile(ref.path.c_str()); + ePtr source = file; + + if (!source->valid()) + return 0; + + tstools.setSource(source); + + /* check if cached data is still valid */ + if (m_parser.m_data_ok && (s.st_size == m_parser.m_filesize) && (m_parser.m_length)) + return m_parser.m_length / 90000; + + /* open again, this time with stream info */ + tstools.setSource(source, ref.path.c_str()); + + /* otherwise, re-calc length and update meta file */ + pts_t len; + if (tstools.calcLen(len)) + return 0; + + m_parser.m_length = len; + m_parser.m_filesize = s.st_size; + m_parser.updateMeta(ref.path); + return m_parser.m_length / 90000; +} + +int eStaticServiceM2TSInformation::getInfo(const eServiceReference &ref, int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return iServiceInformation::resIsString; + case iServiceInformation::sServiceref: + return iServiceInformation::resIsString; + case iServiceInformation::sFileSize: + return m_parser.m_filesize; + case iServiceInformation::sTimeCreate: + if (m_parser.m_time_create) + return m_parser.m_time_create; + else + return iServiceInformation::resNA; + default: + return iServiceInformation::resNA; + } +} + +std::string eStaticServiceM2TSInformation::getInfoString(const eServiceReference &ref,int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return m_parser.m_description; + case iServiceInformation::sServiceref: + return m_parser.m_ref.toString(); + case iServiceInformation::sTags: + return m_parser.m_tags; + default: + return ""; + } +} + +PyObject *eStaticServiceM2TSInformation::getInfoObject(const eServiceReference &r, int what) +{ + switch (what) + { + case iServiceInformation::sFileSize: + return PyLong_FromLongLong(m_parser.m_filesize); + default: + Py_RETURN_NONE; + } +} + +RESULT eStaticServiceM2TSInformation::getEvent(const eServiceReference &ref, ePtr &evt, time_t start_time) +{ + if (!ref.path.empty()) + { + ePtr event = new eServiceEvent; + std::string filename = ref.path; + filename.erase(filename.length()-4, 2); + filename+="eit"; + if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get())) + { + evt = event; + return 0; + } + } + evt = 0; + return -1; +} + +DEFINE_REF(eM2TSFile); + +eM2TSFile::eM2TSFile(const char *filename, bool cached) + :m_lock(false), m_sync_offset(0), m_fd(-1), m_file(NULL), m_current_offset(0), m_length(0), m_cached(cached) +{ + if (!m_cached) + m_fd = ::open(filename, O_RDONLY | O_LARGEFILE); + else + m_file = ::fopen64(filename, "rb"); + if (valid()) + m_current_offset = m_length = lseek_internal(0, SEEK_END); +} + +eM2TSFile::~eM2TSFile() +{ + if (m_cached) + { + if (m_file) + { + ::fclose(m_file); + m_file = 0; + } + } + else + { + if (m_fd >= 0) + ::close(m_fd); + m_fd = -1; + } +} + +off_t eM2TSFile::lseek(off_t offset, int whence) +{ + eSingleLocker l(m_lock); + + offset = (offset % 188) + (offset * 192) / 188; + + if (offset != m_current_offset) + m_current_offset = lseek_internal(offset, whence); + + return m_current_offset; +} + +off_t eM2TSFile::lseek_internal(off_t offset, int whence) +{ + off_t ret; + + if (!m_cached) + ret = ::lseek(m_fd, offset, whence); + else + { + if (::fseeko(m_file, offset, whence) < 0) + perror("fseeko"); + ret = ::ftello(m_file); + } + return ret <= 0 ? ret : (ret % 192) + (ret*188) / 192; +} + +ssize_t eM2TSFile::read(off_t offset, void *b, size_t count) +{ + eSingleLocker l(m_lock); + unsigned char tmp[192*3]; + unsigned char *buf = (unsigned char*)b; + + size_t rd=0; + offset = (offset % 188) + (offset * 192) / 188; + +sync: + if ((offset+m_sync_offset) != m_current_offset) + { +// eDebug("seekTo %lld", offset+m_sync_offset); + m_current_offset = lseek_internal(offset+m_sync_offset, SEEK_SET); + if (m_current_offset < 0) + return m_current_offset; + } + + while (rd < count) { + size_t ret; + if (!m_cached) + ret = ::read(m_fd, tmp, 192); + else + ret = ::fread(tmp, 1, 192, m_file); + if (ret < 0 || ret < 192) + return rd ? rd : ret; + + if (tmp[4] != 0x47) + { + if (rd > 0) { + eDebug("short read at pos %lld async!!", m_current_offset); + return rd; + } + else { + int x=0; + if (!m_cached) + ret = ::read(m_fd, tmp+192, 384); + else + ret = ::fread(tmp+192, 1, 384, m_file); + +#if 0 + eDebugNoNewLine("m2ts out of sync at pos %lld, real %lld:", offset + m_sync_offset, m_current_offset); + for (; x < 192; ++x) + eDebugNoNewLine(" %02x", tmp[x]); + eDebug(""); + x=0; +#else + eDebug("m2ts out of sync at pos %lld, real %lld", offset + m_sync_offset, m_current_offset); +#endif + for (; x < 192; ++x) + { + if (tmp[x] == 0x47 && tmp[x+192] == 0x47) + { + int add_offs = (x - 4); + eDebug("sync found at pos %d, sync_offset is now %d, old was %d", x, add_offs + m_sync_offset, m_sync_offset); + m_sync_offset += add_offs; + goto sync; + } + } + } + } + + memcpy(buf+rd, tmp+4, 188); + + rd += 188; + m_current_offset += 188; + } + + m_sync_offset %= 188; + + return rd; +} + +int eM2TSFile::valid() +{ + if (!m_cached) + return m_fd != -1; + else + return !!m_file; +} + +off_t eM2TSFile::length() +{ + return m_length; +} + +eServiceFactoryM2TS::eServiceFactoryM2TS() +{ + ePtr sc; + eServiceCenter::getPrivInstance(sc); + if (sc) + { + std::list extensions; + extensions.push_back("m2ts"); + extensions.push_back("mts"); + sc->addServiceFactory(eServiceFactoryM2TS::id, this, extensions); + } +} + +eServiceFactoryM2TS::~eServiceFactoryM2TS() +{ + ePtr sc; + + eServiceCenter::getPrivInstance(sc); + if (sc) + sc->removeServiceFactory(eServiceFactoryM2TS::id); +} + +RESULT eServiceFactoryM2TS::play(const eServiceReference &ref, ePtr &ptr) +{ + ptr = new eServiceM2TS(ref); + return 0; +} + +RESULT eServiceFactoryM2TS::record(const eServiceReference &ref, ePtr &ptr) +{ + ptr=0; + return -1; +} + +RESULT eServiceFactoryM2TS::list(const eServiceReference &ref, ePtr &ptr) +{ + ptr=0; + return -1; +} + +RESULT eServiceFactoryM2TS::info(const eServiceReference &ref, ePtr &ptr) +{ + ptr=new eStaticServiceM2TSInformation(ref); + return 0; +} + +RESULT eServiceFactoryM2TS::offlineOperations(const eServiceReference &ref, ePtr &ptr) +{ + ptr = 0; + return -1; +} + +eServiceM2TS::eServiceM2TS(const eServiceReference &ref) + :eDVBServicePlay(ref, NULL) +{ +} + +ePtr eServiceM2TS::createTsSource(eServiceReferenceDVB &ref) +{ + ePtr source = new eM2TSFile(ref.path.c_str()); + return source; +} + +RESULT eServiceM2TS::isCurrentlySeekable() +{ + return 1; // for fast winding we need index files... so only skip forward/backward yet +} + +eAutoInitPtr init_eServiceFactoryM2TS(eAutoInitNumbers::service+1, "eServiceFactoryM2TS"); diff --git a/lib/service/servicem2ts.h b/lib/service/servicem2ts.h new file mode 100644 index 0000000..bfa4f7d --- /dev/null +++ b/lib/service/servicem2ts.h @@ -0,0 +1,33 @@ +#ifndef __servicem2ts_h +#define __servicem2ts_h + +#include + +class eServiceFactoryM2TS: public iServiceHandler +{ + DECLARE_REF(eServiceFactoryM2TS); +public: + eServiceFactoryM2TS(); + virtual ~eServiceFactoryM2TS(); + enum { id = 0x3 }; + + // iServiceHandler + RESULT play(const eServiceReference &, ePtr &ptr); + RESULT record(const eServiceReference &, ePtr &ptr); + RESULT list(const eServiceReference &, ePtr &ptr); + RESULT info(const eServiceReference &, ePtr &ptr); + RESULT offlineOperations(const eServiceReference &, ePtr &ptr); +}; + +class eServiceM2TS: public eDVBServicePlay +{ + friend class eServiceFactoryM2TS; +protected: + eServiceM2TS(const eServiceReference &ref); + ePtr createTsSource(eServiceReferenceDVB &ref); + + // iSeekableService + RESULT isCurrentlySeekable(); +}; + +#endif diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index 1fb1e44..be55d0c 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1,5 +1,3 @@ -#ifdef HAVE_GSTREAMER - /* 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 @@ -13,6 +11,7 @@ #include #include #include +#include #include @@ -227,6 +226,10 @@ eServiceMP3::eServiceMP3(eServiceReference ref) m_currentTrickRatio = 0; m_subs_to_pull = 0; m_buffer_size = 1*1024*1024; + m_prev_decoder_time = -1; + m_decoder_time_valid_state = 0; + m_errorInfo.missing_codec = ""; + CONNECT(m_seekTimeout->timeout, eServiceMP3::seekTimeoutCB); CONNECT(m_subtitle_sync_timer->timeout, eServiceMP3::pushSubtitles); CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll); @@ -325,11 +328,11 @@ eServiceMP3::eServiceMP3(eServiceReference ref) m_gst_playbin = gst_element_factory_make("playbin2", "playbin"); if (!m_gst_playbin) - m_error_message = "failed to create GStreamer pipeline!\n"; + m_errorInfo.error_message = "failed to create GStreamer pipeline!\n"; g_object_set (G_OBJECT (m_gst_playbin), "uri", uri, NULL); - int flags = 0x47; // ( == GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT ) + int flags = 0x47; // ( GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT ); g_object_set (G_OBJECT (m_gst_playbin), "flags", flags, NULL); g_free(uri); @@ -340,8 +343,9 @@ eServiceMP3::eServiceMP3(eServiceReference ref) else { m_subs_to_pull_handler_id = g_signal_connect (subsink, "new-buffer", G_CALLBACK (gstCBsubtitleAvail), this); - g_object_set (G_OBJECT (subsink), "caps", gst_caps_from_string("text/plain; text/x-plain; text/x-pango-markup"), NULL); + g_object_set (G_OBJECT (subsink), "caps", gst_caps_from_string("text/plain; text/x-plain; text/x-pango-markup; video/x-dvd-subpicture; subpicture/x-pgs"), NULL); g_object_set (G_OBJECT (m_gst_playbin), "text-sink", subsink, NULL); + } if ( m_gst_playbin ) @@ -356,10 +360,6 @@ eServiceMP3::eServiceMP3(eServiceReference ref) { 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"); - m_subtitleStreams.push_back(subs); } if ( m_sourceinfo.is_streaming ) { @@ -372,7 +372,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref) if (m_gst_playbin) gst_object_unref(GST_OBJECT(m_gst_playbin)); - eDebug("eServiceMP3::sorry, can't play: %s",m_error_message.c_str()); + eDebug("eServiceMP3::sorry, can't play: %s",m_errorInfo.error_message.c_str()); m_gst_playbin = 0; } @@ -382,12 +382,12 @@ eServiceMP3::eServiceMP3(eServiceReference ref) eServiceMP3::~eServiceMP3() { // disconnect subtitle callback - GstElement *sink; - g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL); - if (sink) + GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink"); + + if (appsink) { - g_signal_handler_disconnect (sink, m_subs_to_pull_handler_id); - gst_object_unref(sink); + g_signal_handler_disconnect (appsink, m_subs_to_pull_handler_id); + gst_object_unref(appsink); } delete m_subtitle_widget; @@ -444,6 +444,8 @@ RESULT eServiceMP3::stop() if (m_state == stStopped) return -1; + + //GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(m_gst_playbin),GST_DEBUG_GRAPH_SHOW_ALL,"e2-playbin"); eDebug("eServiceMP3::stop %s", m_ref.path.c_str()); gst_element_set_state(m_gst_playbin, GST_STATE_NULL); @@ -570,6 +572,8 @@ RESULT eServiceMP3::seekTo(pts_t to) if (!(ret = seekToImpl(to))) { m_subtitle_pages.clear(); + m_prev_decoder_time = -1; + m_decoder_time_valid_state = 0; m_subs_to_pull = 0; } } @@ -671,6 +675,7 @@ RESULT eServiceMP3::getPlayPosition(pts_t &pts) /* pos is in nanoseconds. we have 90 000 pts per second. */ pts = pos / 11111; +// eDebug("gst_element_query_position %lld pts (%lld ms)", pts, pos/1000000); return 0; } @@ -931,7 +936,7 @@ std::string eServiceMP3::getInfoString(int w) tag = "channel-mode"; break; case sUser+12: - return m_error_message; + return m_errorInfo.error_message; default: return ""; } @@ -1113,24 +1118,66 @@ RESULT eServiceMP3::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i) return 0; } +subtype_t getSubtitleType(GstPad* pad, gchar *g_codec=NULL) +{ + subtype_t type = stUnknown; + GstCaps* caps = gst_pad_get_negotiated_caps(pad); + + if ( caps ) + { + GstStructure* str = gst_caps_get_structure(caps, 0); + const gchar *g_type = gst_structure_get_name(str); + eDebug("getSubtitleType::subtitle probe caps type=%s", g_type); + + if ( !strcmp(g_type, "video/x-dvd-subpicture") ) + type = stVOB; + else if ( !strcmp(g_type, "text/x-pango-markup") ) + type = stSSA; + else if ( !strcmp(g_type, "text/plain") ) + type = stPlainText; + else if ( !strcmp(g_type, "subpicture/x-pgs") ) + type = stPGS; + else + eDebug("getSubtitleType::unsupported subtitle caps %s (%s)", g_type, g_codec); + } + else if ( g_codec ) + { + eDebug("getSubtitleType::subtitle probe codec tag=%s", g_codec); + if ( !strcmp(g_codec, "VOB") ) + type = stVOB; + else if ( !strcmp(g_codec, "SubStation Alpha") || !strcmp(g_codec, "SSA") ) + type = stSSA; + else if ( !strcmp(g_codec, "ASS") ) + type = stASS; + else if ( !strcmp(g_codec, "UTF-8 plain text") ) + type = stPlainText; + else + eDebug("getSubtitleType::unsupported subtitle codec %s", g_codec); + } + else + eDebug("getSubtitleType::unidentifiable subtitle stream!"); + + return type; +} + void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) { if (!msg) return; gchar *sourceName; GstObject *source; - source = GST_MESSAGE_SRC(msg); + if (!GST_IS_OBJECT(source)) + return; sourceName = gst_object_get_name(source); #if 0 + gchar *string; if (gst_message_get_structure(msg)) - { - gchar *string = gst_structure_to_string(gst_message_get_structure(msg)); - eDebug("eServiceMP3::gst_message from %s: %s", sourceName, string); - g_free(string); - } + string = gst_structure_to_string(gst_message_get_structure(msg)); else - eDebug("eServiceMP3::gst_message from %s: %s (without structure)", sourceName, GST_MESSAGE_TYPE_NAME(msg)); + string = g_strdup(GST_MESSAGE_TYPE_NAME(msg)); + eDebug("eTsRemoteSource::gst_message from %s: %s", sourceName, string); + g_free(string); #endif switch (GST_MESSAGE_TYPE (msg)) { @@ -1159,16 +1206,15 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) } break; case GST_STATE_CHANGE_READY_TO_PAUSED: { - GstElement *sink; - g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL); - if (sink) - { - g_object_set (G_OBJECT (sink), "max-buffers", 2, NULL); - g_object_set (G_OBJECT (sink), "sync", FALSE, NULL); - g_object_set (G_OBJECT (sink), "async", FALSE, NULL); - g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL); - gst_object_unref(sink); - } + GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink"); + if (appsink) + { + g_object_set (G_OBJECT (appsink), "max-buffers", 2, NULL); + g_object_set (G_OBJECT (appsink), "sync", FALSE, NULL); + g_object_set (G_OBJECT (appsink), "emit-signals", TRUE, NULL); + eDebug("eServiceMP3::appsink properties set!"); + gst_object_unref(appsink); + } setAC3Delay(ac3_delay); setPCMDelay(pcm_delay); } break; @@ -1285,7 +1331,6 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) continue; GstStructure* str = gst_caps_get_structure(caps, 0); const gchar *g_type = gst_structure_get_name(str); - eDebug("AUDIO STRUCT=%s", g_type); audio.type = gstCheckAudioPad(str); g_codec = g_strdup(g_type); g_lang = g_strdup_printf ("und"); @@ -1306,65 +1351,85 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) } for (i = 0; i < n_text; i++) - { - gchar *g_lang; -// gchar *g_type; -// GstPad* pad = 0; -// g_signal_emit_by_name (m_gst_playbin, "get-text-pad", i, &pad); -// GstCaps* caps = gst_pad_get_negotiated_caps(pad); -// GstStructure* str = gst_caps_get_structure(caps, 0); -// g_type = gst_structure_get_name(str); -// g_signal_emit_by_name (m_gst_playbin, "get-text-tags", i, &tags); + { + gchar *g_codec = NULL, *g_lang = NULL; + g_signal_emit_by_name (m_gst_playbin, "get-text-tags", i, &tags); subtitleStream subs; - subs.type = stPlainText; +// int ret; + g_lang = g_strdup_printf ("und"); if ( tags && gst_is_tag_list(tags) ) + { gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang); + gst_tag_list_get_string(tags, GST_TAG_SUBTITLE_CODEC, &g_codec); + gst_tag_list_free(tags); + } + subs.language_code = std::string(g_lang); - eDebug("eServiceMP3::subtitle stream=%i language=%s"/* type=%s*/, i, g_lang/*, g_type*/); + eDebug("eServiceMP3::subtitle stream=%i language=%s codec=%s", i, g_lang, g_codec); + + GstPad* pad = 0; + g_signal_emit_by_name (m_gst_playbin, "get-text-pad", i, &pad); + if ( pad ) + g_signal_connect (G_OBJECT (pad), "notify::caps", G_CALLBACK (gstTextpadHasCAPS), this); + subs.type = getSubtitleType(pad, g_codec); + m_subtitleStreams.push_back(subs); g_free (g_lang); -// g_free (g_type); } m_event((iPlayableService*)this, evUpdatedEventInfo); + + if ( m_errorInfo.missing_codec != "" ) + { + if ( m_errorInfo.missing_codec.find("video/") == 0 || ( m_errorInfo.missing_codec.find("audio/") == 0 && getNumberOfTracks() == 0 ) ) + m_event((iPlayableService*)this, evUser+12); + } break; } case GST_MESSAGE_ELEMENT: { - if ( gst_is_missing_plugin_message(msg) ) + if (const GstStructure *msgstruct = gst_message_get_structure(msg)) { - gchar *description = gst_missing_plugin_message_get_description(msg); - if ( description ) + if ( gst_is_missing_plugin_message(msg) ) { - m_error_message = "GStreamer plugin " + (std::string)description + " not available!\n"; - g_free(description); - m_event((iPlayableService*)this, evUser+12); - } - } - else if (const GstStructure *msgstruct = gst_message_get_structure(msg)) - { - const gchar *eventname = gst_structure_get_name(msgstruct); - if ( eventname ) - { - if (!strcmp(eventname, "eventSizeChanged") || !strcmp(eventname, "eventSizeAvail")) - { - gst_structure_get_int (msgstruct, "aspect_ratio", &m_aspect); - gst_structure_get_int (msgstruct, "width", &m_width); - gst_structure_get_int (msgstruct, "height", &m_height); - if (strstr(eventname, "Changed")) - m_event((iPlayableService*)this, evVideoSizeChanged); - } - else if (!strcmp(eventname, "eventFrameRateChanged") || !strcmp(eventname, "eventFrameRateAvail")) + GstCaps *caps; + gst_structure_get (msgstruct, "detail", GST_TYPE_CAPS, &caps, NULL); + std::string codec = (const char*) gst_caps_to_string(caps); + gchar *description = gst_missing_plugin_message_get_description(msg); + if ( description ) { - gst_structure_get_int (msgstruct, "frame_rate", &m_framerate); - if (strstr(eventname, "Changed")) - m_event((iPlayableService*)this, evVideoFramerateChanged); + eDebug("eServiceMP3::m_errorInfo.missing_codec = %s", codec.c_str()); + m_errorInfo.error_message = "GStreamer plugin " + (std::string)description + " not available!\n"; + m_errorInfo.missing_codec = codec.substr(0,(codec.find_first_of(','))); + g_free(description); } - else if (!strcmp(eventname, "eventProgressiveChanged") || !strcmp(eventname, "eventProgressiveAvail")) + gst_caps_unref(caps); + } + else + { + const gchar *eventname = gst_structure_get_name(msgstruct); + if ( eventname ) { - gst_structure_get_int (msgstruct, "progressive", &m_progressive); - if (strstr(eventname, "Changed")) - m_event((iPlayableService*)this, evVideoProgressiveChanged); + if (!strcmp(eventname, "eventSizeChanged") || !strcmp(eventname, "eventSizeAvail")) + { + gst_structure_get_int (msgstruct, "aspect_ratio", &m_aspect); + gst_structure_get_int (msgstruct, "width", &m_width); + gst_structure_get_int (msgstruct, "height", &m_height); + if (strstr(eventname, "Changed")) + m_event((iPlayableService*)this, evVideoSizeChanged); + } + else if (!strcmp(eventname, "eventFrameRateChanged") || !strcmp(eventname, "eventFrameRateAvail")) + { + gst_structure_get_int (msgstruct, "frame_rate", &m_framerate); + if (strstr(eventname, "Changed")) + m_event((iPlayableService*)this, evVideoFramerateChanged); + } + else if (!strcmp(eventname, "eventProgressiveChanged") || !strcmp(eventname, "eventProgressiveAvail")) + { + gst_structure_get_int (msgstruct, "progressive", &m_progressive); + if (strstr(eventname, "Changed")) + m_event((iPlayableService*)this, evVideoProgressiveChanged); + } } } } @@ -1417,7 +1482,7 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) GstBusSyncReply eServiceMP3::gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data) { eServiceMP3 *_this = (eServiceMP3*)user_data; - _this->m_pump.send(1); + _this->m_pump.send(Message(1)); /* wake */ return GST_BUS_PASS; } @@ -1471,43 +1536,103 @@ audiotype_t eServiceMP3::gstCheckAudioPad(GstStructure* structure) return atUnknown; } -void eServiceMP3::gstPoll(const int &msg) +void eServiceMP3::gstPoll(const Message &msg) { - /* ok, we have a serious problem here. gstBusSyncHandler sends - us the wakup signal, but likely before it was posted. - the usleep, an EVIL HACK (DON'T DO THAT!!!) works around this. - - I need to understand the API a bit more to make this work - proplerly. */ - if (msg == 1) + if (msg.type == 1) { GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin)); GstMessage *message; - usleep(1); - while ((message = gst_bus_pop (bus))) + while ((message = gst_bus_pop(bus))) { gstBusCall(bus, message); gst_message_unref (message); } } - else + else if (msg.type == 2) pullSubtitle(); + else if (msg.type == 3) + gstTextpadHasCAPS_synced(msg.d.pad); + else + eDebug("gstPoll unhandled Message %d\n", msg.type); } eAutoInitPtr init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3"); void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data) { - eServiceMP3 *_this = (eServiceMP3*)user_data; + eServiceMP3 *_this = (eServiceMP3*)user_data; eSingleLocker l(_this->m_subs_to_pull_lock); ++_this->m_subs_to_pull; - _this->m_pump.send(2); + _this->m_pump.send(Message(2)); +} + +void eServiceMP3::gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data) +{ + eServiceMP3 *_this = (eServiceMP3*)user_data; + + gst_object_ref (pad); + + _this->m_pump.send(Message(3, pad)); +} + +// after messagepump +void eServiceMP3::gstTextpadHasCAPS_synced(GstPad *pad) +{ + GstCaps *caps; + + g_object_get (G_OBJECT (pad), "caps", &caps, NULL); + + eDebug("gstTextpadHasCAPS:: signal::caps = %s", gst_caps_to_string(caps)); + + if (caps) + { + subtitleStream subs; + +// eDebug("gstGhostpadHasCAPS_synced %p %d", pad, m_subtitleStreams.size()); + + if (!m_subtitleStreams.empty()) + subs = m_subtitleStreams[m_currentSubtitleStream]; + else { + subs.type = stUnknown; + subs.pad = pad; + } + + if ( subs.type == stUnknown ) + { + GstTagList *tags; +// eDebug("gstGhostpadHasCAPS::m_subtitleStreams[%i].type == stUnknown...", m_currentSubtitleStream); + + gchar *g_lang; + g_signal_emit_by_name (m_gst_playbin, "get-text-tags", m_currentSubtitleStream, &tags); + + g_lang = g_strdup_printf ("und"); + if ( tags && gst_is_tag_list(tags) ) + gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang); + + subs.language_code = std::string(g_lang); + subs.type = getSubtitleType(pad); + + if (!m_subtitleStreams.empty()) + m_subtitleStreams[m_currentSubtitleStream] = subs; + else + m_subtitleStreams.push_back(subs); + + g_free (g_lang); + } + +// eDebug("gstGhostpadHasCAPS:: m_gst_prev_subtitle_caps=%s equal=%i",gst_caps_to_string(m_gst_prev_subtitle_caps),gst_caps_is_equal(m_gst_prev_subtitle_caps, caps)); + + gst_caps_unref (caps); + } + + gst_object_unref (pad); } void eServiceMP3::pullSubtitle() { GstElement *sink; g_object_get (G_OBJECT (m_gst_playbin), "text-sink", &sink, NULL); + if (sink) { while (m_subs_to_pull && m_subtitle_pages.size() < 2) @@ -1523,17 +1648,31 @@ void eServiceMP3::pullSubtitle() gint64 buf_pos = GST_BUFFER_TIMESTAMP(buffer); gint64 duration_ns = GST_BUFFER_DURATION(buffer); size_t len = GST_BUFFER_SIZE(buffer); - unsigned char line[len+1]; - memcpy(line, GST_BUFFER_DATA(buffer), len); - line[len] = 0; - eDebug("got new subtitle @ buf_pos = %lld ns (in pts=%lld): '%s' ", buf_pos, buf_pos/11111, line); - ePangoSubtitlePage page; - gRGB rgbcol(0xD0,0xD0,0xD0); - page.m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line)); - page.show_pts = buf_pos / 11111L; - page.m_timeout = duration_ns / 1000000; - m_subtitle_pages.push_back(page); - pushSubtitles(); + eDebug("pullSubtitle m_subtitleStreams[m_currentSubtitleStream].type=%i",m_subtitleStreams[m_currentSubtitleStream].type); + + if ( m_subtitleStreams[m_currentSubtitleStream].type ) + { + if ( m_subtitleStreams[m_currentSubtitleStream].type < stVOB ) + { + unsigned char line[len+1]; + SubtitlePage page; + memcpy(line, GST_BUFFER_DATA(buffer), len); + line[len] = 0; + eDebug("got new text subtitle @ buf_pos = %lld ns (in pts=%lld): '%s' ", buf_pos, buf_pos/11111, line); + gRGB rgbcol(0xD0,0xD0,0xD0); + page.type = SubtitlePage::Pango; + page.pango_page.m_elements.push_back(ePangoSubtitlePageElement(rgbcol, (const char*)line)); + page.pango_page.m_show_pts = buf_pos / 11111L; + page.pango_page.m_timeout = duration_ns / 1000000; + m_subtitle_pages.push_back(page); + if (m_subtitle_pages.size()==1) + pushSubtitles(); + } + else + { + eDebug("unsupported subpicture... ignoring"); + } + } gst_buffer_unref(buffer); } } @@ -1545,45 +1684,56 @@ void eServiceMP3::pullSubtitle() void eServiceMP3::pushSubtitles() { - ePangoSubtitlePage page; - pts_t running_pts; while ( !m_subtitle_pages.empty() ) { + SubtitlePage &frontpage = m_subtitle_pages.front(); + pts_t running_pts; + gint64 diff_ms = 0; + gint64 show_pts = 0; + getPlayPosition(running_pts); - page = m_subtitle_pages.front(); - gint64 diff_ms = ( page.show_pts - running_pts ) / 90; - eDebug("eServiceMP3::pushSubtitles show_pts = %lld running_pts = %lld diff = %lld", page.show_pts, running_pts, diff_ms); - if (diff_ms < -100) - { - GstFormat fmt = GST_FORMAT_TIME; - gint64 now; - if (gst_element_query_position(m_gst_playbin, &fmt, &now) != -1) - { - now /= 11111; - diff_ms = abs((now - running_pts) / 90); - eDebug("diff < -100ms check decoder/pipeline diff: decoder: %lld, pipeline: %lld, diff: %lld", running_pts, now, diff_ms); - if (diff_ms > 100000) - { - eDebug("high decoder/pipeline difference.. assume decoder has now started yet.. check again in 1sec"); - m_subtitle_sync_timer->start(1000, true); - break; - } + + if (m_decoder_time_valid_state < 4) { + ++m_decoder_time_valid_state; + if (m_prev_decoder_time == running_pts) + m_decoder_time_valid_state = 0; + if (m_decoder_time_valid_state < 4) { +// if (m_decoder_time_valid_state) +// eDebug("%d: decoder time not valid! prev %lld, now %lld\n", m_decoder_time_valid_state, m_prev_decoder_time/90, running_pts/90); +// else +// eDebug("%d: decoder time not valid! now %lld\n", m_decoder_time_valid_state, running_pts/90); + m_subtitle_sync_timer->start(25, true); + m_prev_decoder_time = running_pts; + break; } - else - eDebug("query position for decoder/pipeline check failed!"); - eDebug("subtitle to late... drop"); + } + + if (frontpage.type == SubtitlePage::Pango) + show_pts = frontpage.pango_page.m_show_pts; + + diff_ms = ( show_pts - running_pts ) / 90; + eDebug("check subtitle: decoder: %lld, show_pts: %lld, diff: %lld ms", running_pts/90, show_pts/90, diff_ms); + + if ( diff_ms < -100 ) + { + eDebug("subtitle too late... drop"); m_subtitle_pages.pop_front(); } else if ( diff_ms > 20 ) { -// eDebug("start recheck timer"); - m_subtitle_sync_timer->start(diff_ms > 1000 ? 1000 : diff_ms, true); + eDebug("start timer"); + m_subtitle_sync_timer->start(diff_ms, true); break; } else // immediate show { - if (m_subtitle_widget) - m_subtitle_widget->setPage(page); + if ( m_subtitle_widget ) + { + eDebug("show!\n"); + if ( frontpage.type == SubtitlePage::Pango) + m_subtitle_widget->setPage(frontpage.pango_page); + m_subtitle_widget->show(); + } m_subtitle_pages.pop_front(); } } @@ -1591,12 +1741,20 @@ void eServiceMP3::pushSubtitles() pullSubtitle(); } + RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple) { + eDebug ("eServiceMP3::enableSubtitles m_currentSubtitleStream=%i this=%p",m_currentSubtitleStream, this); ePyObject entry; int tuplesize = PyTuple_Size(tuple); int pid, type; gint text_pid = 0; + eSingleLocker l(m_subs_to_pull_lock); + +// GstPad *pad = 0; +// g_signal_emit_by_name (m_gst_playbin, "get-text-pad", m_currentSubtitleStream, &pad); +// gst_element_get_static_pad(m_gst_subtitlebin, "sink"); +// gulong subprobe_handler_id = gst_pad_add_buffer_probe (pad, G_CALLBACK (gstCBsubtitleDrop), NULL); if (!PyTuple_Check(tuple)) goto error_out; @@ -1613,10 +1771,11 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple) if (m_currentSubtitleStream != pid) { - eSingleLocker l(m_subs_to_pull_lock); g_object_set (G_OBJECT (m_gst_playbin), "current-text", pid, NULL); + eDebug ("eServiceMP3::enableSubtitles g_object_set current-text = %i", pid); m_currentSubtitleStream = pid; m_subs_to_pull = 0; + m_prev_decoder_time = -1; m_subtitle_pages.clear(); } @@ -1627,6 +1786,9 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple) g_object_get (G_OBJECT (m_gst_playbin), "current-text", &text_pid, NULL); eDebug ("eServiceMP3::switched to subtitle stream %i", text_pid); +// gst_pad_remove_buffer_probe (pad, subprobe_handler_id); + + m_event((iPlayableService*)this, evUpdatedInfo); return 0; @@ -1653,26 +1815,35 @@ PyObject *eServiceMP3::getCachedSubtitle() PyObject *eServiceMP3::getSubtitleList() { - eDebug("eServiceMP3::getSubtitleList"); - +// eDebug("eServiceMP3::getSubtitleList"); ePyObject l = PyList_New(0); - int stream_count[sizeof(subtype_t)]; - for ( unsigned int i = 0; i < sizeof(subtype_t); i++ ) - stream_count[i] = 0; - + int stream_idx = 0; + for (std::vector::iterator IterSubtitleStream(m_subtitleStreams.begin()); IterSubtitleStream != m_subtitleStreams.end(); ++IterSubtitleStream) { subtype_t type = IterSubtitleStream->type; - ePyObject tuple = PyTuple_New(5); - PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(2)); - PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(stream_count[type])); - PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(int(type))); - PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(0)); - PyTuple_SET_ITEM(tuple, 4, PyString_FromString((IterSubtitleStream->language_code).c_str())); - PyList_Append(l, tuple); - Py_DECREF(tuple); - stream_count[type]++; + switch(type) + { + case stUnknown: + case stVOB: + case stPGS: + break; + default: + { + ePyObject tuple = PyTuple_New(5); +// eDebug("eServiceMP3::getSubtitleList idx=%i type=%i, code=%s", stream_idx, int(type), (IterSubtitleStream->language_code).c_str()); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(2)); + PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(stream_idx)); + PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(int(type))); + PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(0)); + PyTuple_SET_ITEM(tuple, 4, PyString_FromString((IterSubtitleStream->language_code).c_str())); + PyList_Append(l, tuple); + Py_DECREF(tuple); + } + } + stream_idx++; } + eDebug("eServiceMP3::getSubtitleList finished"); return l; } @@ -1791,6 +1962,3 @@ void eServiceMP3::setPCMDelay(int delay) } } -#else -#warning gstreamer not available, not building media player -#endif diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 01f7cf7..f3cc6dd 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -1,7 +1,6 @@ #ifndef __servicemp3_h #define __servicemp3_h -#ifdef HAVE_GSTREAMER #include #include #include @@ -47,7 +46,7 @@ public: typedef struct _GstElement GstElement; typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC } audiotype_t; -typedef enum { stPlainText, stSSA, stSRT } subtype_t; +typedef enum { stUnknown, stPlainText, stSSA, stASS, stSRT, stVOB, stPGS } subtype_t; typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t; class eServiceMP3: public iPlayableService, public iPauseableService, @@ -168,12 +167,18 @@ public: int bufferPercent; int avgInRate; int avgOutRate; - long long bufferingLeft; + int64_t bufferingLeft; bufferInfo() :bufferPercent(0), avgInRate(0), avgOutRate(0), bufferingLeft(-1) { } }; + struct errorInfo + { + std::string error_message; + std::string missing_codec; + }; + private: static int pcm_delay; static int ac3_delay; @@ -190,35 +195,68 @@ private: eServiceReference m_ref; int m_buffer_size; bufferInfo m_bufferInfo; + errorInfo m_errorInfo; eServiceMP3(eServiceReference ref); Signal2 m_event; enum { stIdle, stRunning, stStopped, + }; + int m_state; + GstElement *m_gst_playbin; + GstTagList *m_stream_tags; + + struct Message + { + Message() + :type(-1) + {} + Message(int type) + :type(type) + {} + Message(int type, GstPad *pad) + :type(type) + { + d.pad=pad; + } + + int type; + union { + GstPad *pad; // for msg type 3 + } d; + }; + + eFixedMessagePump m_pump; + + audiotype_t gstCheckAudioPad(GstStructure* structure); + void gstBusCall(GstBus *bus, GstMessage *msg); + static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data); + static void gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data); + void gstTextpadHasCAPS_synced(GstPad *pad); + static void gstCBsubtitleAvail(GstElement *element, gpointer user_data); + GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type); + void gstPoll(const Message&); + static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data); + + struct SubtitlePage + { + enum { Unknown, Pango, Vob } type; + ePangoSubtitlePage pango_page; + eVobSubtitlePage vob_page; }; - int m_state; - GstElement *m_gst_playbin; - GstTagList *m_stream_tags; - eFixedMessagePump m_pump; - std::string m_error_message; - - audiotype_t gstCheckAudioPad(GstStructure* structure); - void gstBusCall(GstBus *bus, GstMessage *msg); - static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data); - static void gstCBsubtitleAvail(GstElement *element, gpointer user_data); - GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type); - void gstPoll(const int&); - static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data); - - std::list m_subtitle_pages; - ePtr m_subtitle_sync_timer; - - ePtr m_streamingsrc_timeout; - void pushSubtitles(); - void pullSubtitle(); - void sourceTimeout(); - int m_subs_to_pull; - sourceStream m_sourceinfo; + + std::list m_subtitle_pages; + ePtr m_subtitle_sync_timer; + + ePtr m_streamingsrc_timeout; + pts_t m_prev_decoder_time; + int m_decoder_time_valid_state; + + void pushSubtitles(); + void pullSubtitle(); + void sourceTimeout(); + int m_subs_to_pull; + sourceStream m_sourceinfo; eSingleLock m_subs_to_pull_lock; gulong m_subs_to_pull_handler_id; @@ -228,6 +266,5 @@ private: std::string m_useragent; RESULT trickSeek(gdouble ratio); }; -#endif #endif diff --git a/m4/.gitignore b/m4/.gitignore new file mode 100644 index 0000000..38066dd --- /dev/null +++ b/m4/.gitignore @@ -0,0 +1,5 @@ +libtool.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +lt~obsolete.m4 diff --git a/m4/ax_pkg_swig.m4 b/m4/ax_pkg_swig.m4 new file mode 100644 index 0000000..81226fb --- /dev/null +++ b/m4/ax_pkg_swig.m4 @@ -0,0 +1,133 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found]) +# +# DESCRIPTION +# +# This macro searches for a SWIG installation on your system. If found, +# then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is +# found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd. +# +# You can use the optional first argument to check if the version of the +# available SWIG is greater than or equal to the value of the argument. It +# should have the format: N[.N[.N]] (N is a number between 0 and 999. Only +# the first N is mandatory.) If the version argument is given (e.g. +# 1.3.17), AX_PKG_SWIG checks that the swig package is this version number +# or higher. +# +# As usual, action-if-found is executed if SWIG is found, otherwise +# action-if-not-found is executed. +# +# In configure.in, use as: +# +# AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ]) +# AX_SWIG_ENABLE_CXX +# AX_SWIG_MULTI_MODULE_SUPPORT +# AX_SWIG_PYTHON +# +# LICENSE +# +# Copyright (c) 2008 Sebastian Huber +# Copyright (c) 2008 Alan W. Irwin +# Copyright (c) 2008 Rafael Laboissiere +# Copyright (c) 2008 Andrew Collier +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AC_DEFUN([AX_PKG_SWIG],[ + AC_PATH_PROG([SWIG],[swig]) + if test -z "$SWIG" ; then + m4_ifval([$3],[$3],[:]) + elif test -n "$1" ; then + AC_MSG_CHECKING([SWIG version]) + [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] + AC_MSG_RESULT([$swig_version]) + if test -n "$swig_version" ; then + # Calculate the required version number components + [required=$1] + [required_major=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_major" ; then + [required_major=0] + fi + [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] + [required_minor=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_minor" ; then + [required_minor=0] + fi + [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] + [required_patch=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_patch" ; then + [required_patch=0] + fi + # Calculate the available version number components + [available=$swig_version] + [available_major=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_major" ; then + [available_major=0] + fi + [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] + [available_minor=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_minor" ; then + [available_minor=0] + fi + [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] + [available_patch=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_patch" ; then + [available_patch=0] + fi + # Convert the version tuple into a single number for easier comparison. + # Using base 100 should be safe since SWIG internally uses BCD values + # to encode its version number. + required_swig_vernum=`expr $required_major \* 10000 \ + \+ $required_minor \* 100 \+ $required_patch` + available_swig_vernum=`expr $available_major \* 10000 \ + \+ $available_minor \* 100 \+ $available_patch` + + if test $available_swig_vernum -lt $required_swig_vernum; then + AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version.]) + SWIG='' + m4_ifval([$3],[$3],[]) + else + AC_MSG_CHECKING([for SWIG library]) + SWIG_LIB=`$SWIG -swiglib` + AC_MSG_RESULT([$SWIG_LIB]) + m4_ifval([$2],[$2],[]) + fi + else + AC_MSG_WARN([cannot determine SWIG version]) + SWIG='' + m4_ifval([$3],[$3],[]) + fi + fi + AC_SUBST([SWIG_LIB]) +]) diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 new file mode 100644 index 0000000..2152a80 --- /dev/null +++ b/m4/ax_pthread.m4 @@ -0,0 +1,283 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + *-darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include + static void routine(void* a) {a=0;} + static void* start_routine(void* a) {return a;}], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th,0,start_routine,0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0); ], + [ax_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl AX_PTHREAD diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4 new file mode 100644 index 0000000..a62b860 --- /dev/null +++ b/m4/ax_python_devel.m4 @@ -0,0 +1,325 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PYTHON_DEVEL([version]) +# +# DESCRIPTION +# +# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it +# in your configure.ac. +# +# This macro checks for Python and tries to get the include path to +# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) +# output variables. It also exports $(PYTHON_EXTRA_LIBS) and +# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. +# +# You can search for some particular version of Python by passing a +# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please +# note that you *have* to pass also an operator along with the version to +# match, and pay special attention to the single quotes surrounding the +# version number. Don't use "PYTHON_VERSION" for this: that environment +# variable is declared as precious and thus reserved for the end-user. +# +# This macro should work for all versions of Python >= 2.1.0. As an end +# user, you can disable the check for the python version by setting the +# PYTHON_NOVERSIONCHECK environment variable to something else than the +# empty string. +# +# If you need to use this macro for an older Python version, please +# contact the authors. We're always open for feedback. +# +# LICENSE +# +# Copyright (c) 2009 Sebastian Huber +# Copyright (c) 2009 Alan W. Irwin +# Copyright (c) 2009 Rafael Laboissiere +# Copyright (c) 2009 Andrew Collier +# Copyright (c) 2009 Matteo Settenvini +# Copyright (c) 2009 Horst Knorr +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) +AC_DEFUN([AX_PYTHON_DEVEL],[ + # + # Allow the use of a (user set) custom python version + # + AC_ARG_VAR([PYTHON_VERSION],[The installed Python + version to use, for example '2.3'. This string + will be appended to the Python interpreter + canonical name.]) + + AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) + if test -z "$PYTHON"; then + AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) + PYTHON_VERSION="" + fi + + # + # Check for a version of Python >= 2.1.0 + # + AC_MSG_CHECKING([for a version of Python >= '2.1.0']) + ac_supports_python_ver=`$PYTHON -c "import sys; \ + ver = sys.version.split ()[[0]]; \ + print (ver >= '2.1.0')"` + if test "$ac_supports_python_ver" != "True"; then + if test -z "$PYTHON_NOVERSIONCHECK"; then + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([ +This version of the AC@&t@_PYTHON_DEVEL macro +doesn't work properly with versions of Python before +2.1.0. You may need to re-run configure, setting the +variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, +PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. +Moreover, to disable this check, set PYTHON_NOVERSIONCHECK +to something else than an empty string. +]) + else + AC_MSG_RESULT([skip at user request]) + fi + else + AC_MSG_RESULT([yes]) + fi + + # + # if the macro parameter ``version'' is set, honour it + # + if test -n "$1"; then + AC_MSG_CHECKING([for a version of Python $1]) + ac_supports_python_ver=`$PYTHON -c "import sys; \ + ver = sys.version.split ()[[0]]; \ + print (ver $1)"` + if test "$ac_supports_python_ver" = "True"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([this package requires Python $1. +If you have it installed, but it isn't the default Python +interpreter in your system path, please pass the PYTHON_VERSION +variable to configure. See ``configure --help'' for reference. +]) + PYTHON_VERSION="" + fi + fi + + # + # Check if you have distutils, else fail + # + AC_MSG_CHECKING([for the distutils Python package]) + ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` + if test -z "$ac_distutils_result"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot import Python module "distutils". +Please check your Python installation. The error was: +$ac_distutils_result]) + PYTHON_VERSION="" + fi + + # + # Check for Python include path + # + AC_MSG_CHECKING([for Python include path]) + if test -z "$PYTHON_CPPFLAGS"; then + python_path=`$PYTHON -c "import distutils.sysconfig; \ + print (distutils.sysconfig.get_python_inc ());"` + if test -n "${python_path}"; then + python_path="-I$python_path" + fi + PYTHON_CPPFLAGS=$python_path + fi + AC_MSG_RESULT([$PYTHON_CPPFLAGS]) + AC_SUBST([PYTHON_CPPFLAGS]) + + # + # Check for Python library path + # + AC_MSG_CHECKING([for Python library path]) + if test -z "$PYTHON_LDFLAGS"; then + # (makes two attempts to ensure we've got a version number + # from the interpreter) + ac_python_version=`cat<]], + [[Py_Initialize();]]) + ],[pythonexists=yes],[pythonexists=no]) + AC_LANG_POP([C]) + # turn back to default flags + CPPFLAGS="$ac_save_CPPFLAGS" + LIBS="$ac_save_LIBS" + + AC_MSG_RESULT([$pythonexists]) + + if test ! "x$pythonexists" = "xyes"; then + AC_MSG_FAILURE([ + Could not link test program to Python. Maybe the main Python library has been + installed in some non-standard library path. If so, pass it to configure, + via the LDFLAGS environment variable. + Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib" + ============================================================================ + ERROR! + You probably have to install the development version of the Python package + for your distribution. The exact name of this package varies among them. + ============================================================================ + ]) + PYTHON_VERSION="" + fi + + # + # all done! + # +]) diff --git a/m4/ax_swig_enable_cxx.m4 b/m4/ax_swig_enable_cxx.m4 new file mode 100644 index 0000000..348c15d --- /dev/null +++ b/m4/ax_swig_enable_cxx.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_swig_enable_cxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_SWIG_ENABLE_CXX +# +# DESCRIPTION +# +# Enable SWIG C++ support. This affects all invocations of $(SWIG). +# +# LICENSE +# +# Copyright (c) 2008 Sebastian Huber +# Copyright (c) 2008 Alan W. Irwin +# Copyright (c) 2008 Rafael Laboissiere +# Copyright (c) 2008 Andrew Collier +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AU_ALIAS([SWIG_ENABLE_CXX], [AX_SWIG_ENABLE_CXX]) +AC_DEFUN([AX_SWIG_ENABLE_CXX],[ + AC_REQUIRE([AX_PKG_SWIG]) + AC_REQUIRE([AC_PROG_CXX]) + SWIG="$SWIG -c++" +]) diff --git a/m4/ax_swig_python.m4 b/m4/ax_swig_python.m4 new file mode 100644 index 0000000..8fd3df5 --- /dev/null +++ b/m4/ax_swig_python.m4 @@ -0,0 +1,64 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_swig_python.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_SWIG_PYTHON([use-shadow-classes = {no, yes}]) +# +# DESCRIPTION +# +# Checks for Python and provides the $(AX_SWIG_PYTHON_CPPFLAGS), and +# $(AX_SWIG_PYTHON_OPT) output variables. +# +# $(AX_SWIG_PYTHON_OPT) contains all necessary SWIG options to generate +# code for Python. Shadow classes are enabled unless the value of the +# optional first argument is exactly 'no'. If you need multi module +# support (provided by the AX_SWIG_MULTI_MODULE_SUPPORT macro) use +# $(AX_SWIG_PYTHON_LIBS) to link against the appropriate library. It +# contains the SWIG Python runtime library that is needed by the type +# check system for example. +# +# LICENSE +# +# Copyright (c) 2008 Sebastian Huber +# Copyright (c) 2008 Alan W. Irwin +# Copyright (c) 2008 Rafael Laboissiere +# Copyright (c) 2008 Andrew Collier +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AU_ALIAS([SWIG_PYTHON], [AX_SWIG_PYTHON]) +AC_DEFUN([AX_SWIG_PYTHON],[ + AC_REQUIRE([AX_PKG_SWIG]) + AC_REQUIRE([AX_PYTHON_DEVEL]) + test "x$1" != "xno" || swig_shadow=" -noproxy" + AC_SUBST([AX_SWIG_PYTHON_OPT],[-python$swig_shadow]) + AC_SUBST([AX_SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS]) +]) diff --git a/m4/tuxbox.m4 b/m4/tuxbox.m4 new file mode 100644 index 0000000..985f757 --- /dev/null +++ b/m4/tuxbox.m4 @@ -0,0 +1,36 @@ +AC_DEFUN([TUXBOX_APPS_DVB],[ +AC_ARG_WITH(dvbincludes, + [ --with-dvbincludes=PATH path for dvb includes [[NONE]]], + [DVBINCLUDES="$withval"],[DVBINCLUDES=""]) + +if test "$DVBINCLUDES"; then + CPPFLAGS="$CPPFLAGS -I$DVBINCLUDES" +fi + +AC_CHECK_HEADERS(ost/dmx.h,[ + DVB_API_VERSION=1 + AC_MSG_NOTICE([found dvb version 1]) +]) + +if test -z "$DVB_API_VERSION"; then +AC_CHECK_HEADERS(linux/dvb/version.h,[ + AC_LANG_PREPROC_REQUIRE() + AC_REQUIRE([AC_PROG_EGREP]) + AC_LANG_CONFTEST([AC_LANG_SOURCE([[ +#include +version DVB_API_VERSION + ]])]) + DVB_API_VERSION=`(eval "$ac_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD | $EGREP "^version" | sed "s,version\ ,,"` + rm -f conftest* + + AC_MSG_NOTICE([found dvb version $DVB_API_VERSION]) +]) +fi + +if test "$DVB_API_VERSION"; then + AC_DEFINE(HAVE_DVB,1,[Define to 1 if you have the dvb includes]) + AC_DEFINE_UNQUOTED(HAVE_DVB_API_VERSION,$DVB_API_VERSION,[Define to the version of the dvb api]) +else + AC_MSG_ERROR([can't find dvb headers]) +fi +]) diff --git a/main/.gitignore b/main/.gitignore index c143770..aa0b008 100644 --- a/main/.gitignore +++ b/main/.gitignore @@ -1 +1,2 @@ -entries +enigma2 +version.h diff --git a/main/Makefile.am b/main/Makefile.am index 4f26387..a65b4ac 100644 --- a/main/Makefile.am +++ b/main/Makefile.am @@ -1,43 +1,30 @@ -INCLUDES = \ - -I$(top_srcdir)/include +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/include \ + -include Python.h \ + -include $(top_builddir)/enigma2_config.h + +AM_CXXFLAGS = \ + $(LIBSDL_CFLAGS) bin_PROGRAMS = enigma2 enigma2_SOURCES = \ - enigma.cpp bsod.cpp - -CLEANFILES = version.h - -bsod.o: version.h - -enigma.o: version.h - -# when there is no ../CVS/Entries, don't worry. -../CVS/Entries: - -../CVS/Root: + bsod.cpp \ + bsod.h \ + enigma.cpp \ + xmlgenerator.cpp \ + xmlgenerator.h \ + version_info.cpp \ + version_info.h \ + version.h -.PHONY: .svn/entries - -entries: .svn/entries - @if [ ! -f entries ]; then touch entries; fi - @if [ -f .svn/entries ] && ! diff -q entries .svn/entries 2>/dev/null; then \ - cp --no-preserve=mode .svn/entries entries; \ - fi; - -version.h: entries - > version.h - @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; +EXTRA_DIST = \ + enigma-dvbtest.cpp \ + enigma-gdi.cpp \ + enigma-gui.cpp \ + enigma-playlist.cpp \ + enigma-scan.cpp enigma2_LDADD_WHOLE = \ $(top_builddir)/lib/actions/libenigma_actions.a \ @@ -54,23 +41,41 @@ enigma2_LDADD_WHOLE = \ $(top_builddir)/lib/service/libenigma_service.a enigma2_LDADD = \ - @FREETYPE_LIBS@ \ - @ID3TAG_LIBS@ \ - @MAD_LIBS@ \ - @PNG_LIBS@ \ - @SDL_LIBS@ \ - @SIGC_LIBS@ \ - @DVBSI_LIBS@ \ - @FRIBIDI_LIBS@ \ - @GSTREAMER_LIBS@ \ - @GSTREAMERPBUTILS_LIBS@ \ - @JPEG_LIBS@ \ - @LIBUNGIF_LIBS@ \ - @XML2_LIBS@ \ - @XMLCCWRAP_LIBS@ \ - -ldl -lpthread -lcrypt -lresolv -lrt + @BASE_LIBS@ \ + @LIBGIF_LIBS@ \ + @LIBJPEG_LIBS@ \ + @LIBSDL_LIBS@ \ + @LIBXINE_LIBS@ \ + @LIBXMLCCWRAP_LIBS@ \ + @PTHREAD_LIBS@ \ + @PYTHON_LDFLAGS@ + +enigma2_LDFLAGS = -Wl,--export-dynamic + +if HAVE_GIT_DIR +GIT_DIR = $(top_srcdir)/.git +GIT = git --git-dir=$(GIT_DIR) + +if HAVE_FAKE_GIT_DIR +ENIGMA2_COMMIT_DATE = `grep '^CommitDate:' $(GIT_DIR)/last_commit_info | cut -d' ' -f2` +ENIGMA2_BRANCH = `cat $(GIT_DIR)/branch` +else +ENIGMA2_COMMIT_DATE = `$(GIT) log --no-color -n 1 --pretty=format:%cd --date=short` +ENIGMA2_BRANCH = `$(GIT) branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'` +ENIGMA2_REV = `$(GIT) describe --abbrev=7 --always --long --tags` +endif +endif + +BUILT_SOURCES = version-intermediate.h +.INTERMEDIATE: version-intermediate.h +.PHONY: version-intermediate.h +version-intermediate.h: + $(AM_V_GEN)touch $@ + -$(AM_V_at)[ -n "$(ENIGMA2_COMMIT_DATE)" ] && echo "#define ENIGMA2_COMMIT_DATE \"$(ENIGMA2_COMMIT_DATE)\"" >> $@ + -$(AM_V_at)[ -n "$(ENIGMA2_BRANCH)" ] && echo "#define ENIGMA2_BRANCH \"$(ENIGMA2_BRANCH)\"" >> $@ + -$(AM_V_at)[ -n "$(ENIGMA2_REV)" ] && echo "#define ENIGMA2_REV \"$(ENIGMA2_REV)\"" >> $@ + $(AM_V_at)([ -f version.h ] && diff -q version.h $@ >/dev/null) || $(INSTALL_HEADER) $@ version.h enigma2$(EXEEXT): $(enigma2_OBJECTS) $(enigma2_DEPENDENCIES) $(enigma2_LDADD_WHOLE) -# @rm -f enigma2$(EXEEXT) - $(CXXLINK) $(enigma2_LDFLAGS) $(enigma2_OBJECTS) -Wl,--export-dynamic -Wl,--whole-archive $(enigma2_LDADD_WHOLE) -Wl,--no-whole-archive $(enigma2_LDADD) $(LIBS) -# g++ -o enigma2$(EXEEXT) $(enigma2_LDFLAGS) $(enigma2_OBJECTS) -Wl,--export-dynamic -Wl,--whole-archive $(enigma2_LDADD_WHOLE) -Wl,--no-whole-archive $(enigma2_LDADD) $(LIBS) + $(AM_V_CXXLD)$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ $(enigma2_LDFLAGS) $(enigma2_OBJECTS) \ + -Wl,--whole-archive $(enigma2_LDADD_WHOLE) -Wl,--no-whole-archive $(enigma2_LDADD) $(LIBS) diff --git a/main/bsod.cpp b/main/bsod.cpp old mode 100755 new mode 100644 index 68b5d57..a119432 --- a/main/bsod.cpp +++ b/main/bsod.cpp @@ -1,47 +1,52 @@ -#include -#include -#include - +#include +#include +#include +#include #include -#include #include -#include -#include -#ifdef WITH_SDL -#include +#include + +#if defined(__MIPSEL__) +#include +#else +#warning "no oops support!" +#define NO_OOPS_SUPPORT #endif -#include "version.h" +#include "xmlgenerator.h" +#include "version_info.h" /************************************************/ #define CRASH_EMAILADDR "crashlog@dream-multimedia-tv.de" -#define STDBUFFER_SIZE 512 +#define INFOFILE "/maintainer.info" + #define RINGBUFFER_SIZE 16384 static char ringbuffer[RINGBUFFER_SIZE]; -static int ringbuffer_head; +static unsigned int ringbuffer_head; -static void addToLogbuffer(const char *data, int len) +static void addToLogbuffer(const char *data, unsigned int len) { while (len) { - int remaining = RINGBUFFER_SIZE - ringbuffer_head; - + unsigned int remaining = RINGBUFFER_SIZE - ringbuffer_head; + if (remaining > len) remaining = len; - + memcpy(ringbuffer + ringbuffer_head, data, remaining); len -= remaining; data += remaining; ringbuffer_head += remaining; - if (ringbuffer_head >= RINGBUFFER_SIZE) + ASSERT(ringbuffer_head <= RINGBUFFER_SIZE); + if (ringbuffer_head == RINGBUFFER_SIZE) ringbuffer_head = 0; } } -static std::string getLogBuffer() +static const std::string getLogBuffer() { - int begin = ringbuffer_head; + unsigned int begin = ringbuffer_head; while (ringbuffer[begin] == 0) { ++begin; @@ -50,12 +55,11 @@ static std::string getLogBuffer() if (begin == ringbuffer_head) return ""; } + if (begin < ringbuffer_head) return std::string(ringbuffer + begin, ringbuffer_head - begin); else - { return std::string(ringbuffer + begin, RINGBUFFER_SIZE - begin) + std::string(ringbuffer, ringbuffer_head); - } } static void addToLogbuffer(int level, const std::string &log) @@ -63,122 +67,67 @@ static void addToLogbuffer(int level, const std::string &log) addToLogbuffer(log.c_str(), log.size()); } -static std::string getConfigFileValue(const char *entry) +static const std::string getConfigString(const std::string &key, const std::string &defaultValue) { - std::string configfile = "/etc/enigma2/settings"; - std::string configvalue; - if (entry) - { - ePythonConfigQuery::getConfigValue(entry, configvalue); - if (configvalue != "") //we get at least the default value if python is still alive - { - return configvalue; - } - else // get value from enigma2 settings file - { - FILE *f = fopen(configfile.c_str(), "r"); - if (!f) - { - return "Error"; - } - while (1) - { - char line[1024]; - if (!fgets(line, 1024, f)) - break; - if (!strncmp(line, entry, strlen(entry) )) - { - if (strlen(line) && line[strlen(line)-1] == '\r') - line[strlen(line)-1] = 0; - if (strlen(line) && line[strlen(line)-1] == '\n') - line[strlen(line)-1] = 0; - std::string tmp = line; - int posEqual = tmp.find("=", 0); - configvalue = tmp.substr(posEqual+1); - } - } - fclose(f); - return configvalue; - } - } -} + std::string value; -static std::string getFileContent(const char *file) -{ - std::string filecontent; + ePythonConfigQuery::getConfigValue(key.c_str(), value); + //we get at least the default value if python is still alive + if (!value.empty()) + return value; - if (file) - { - FILE *f = fopen(file, "r"); - if (!f) - { - return "Error"; - } - while (1) - { - char line[1024]; - if (!fgets(line, 1024, f)) + value = defaultValue; + + // get value from enigma2 settings file + std::ifstream in(eEnv::resolve("${sysconfdir}/enigma2/settings").c_str()); + if (in.good()) { + do { + std::string line; + std::getline(in, line); + size_t size = key.size(); + if (!key.compare(0, size, line) && line[size] == '=') { + value = line.substr(size + 1); break; - std::string tmp = line; - std::string password; - int pwdpos = tmp.find(".password=", 0); - if( pwdpos != std::string::npos) - { - filecontent += tmp.substr(0,pwdpos +10); - for ( int pos = pwdpos +10; pos < tmp.length()-1; ++pos ) - { - filecontent += "X"; - } - filecontent += "\n"; } - else { - filecontent += line; - } - } - fclose(f); + } while (in.good()); + in.close(); } - return filecontent; -} -static std::string execCommand(char* cmd) { - FILE* pipe = popen(cmd, "r"); - if (!pipe) - return "Error"; - char buffer[STDBUFFER_SIZE]; - std::string result = ""; - while(!feof(pipe)) - { - if(!fgets(buffer,STDBUFFER_SIZE, pipe)) - break; - result += buffer; - } - pclose(pipe); - return result; + return value; } -extern std::string execCommand(); -extern std::string getConfigFileValue(); -extern std::string getFileContent(); -extern std::string getLogBuffer(); +static bool getConfigBool(const std::string &key, bool defaultValue) +{ + std::string value = getConfigString(key, defaultValue ? "true" : "false"); + const char *cvalue = value.c_str(); -#define INFOFILE "/maintainer.info" + if (!strcasecmp(cvalue, "true")) + return true; + if (!strcasecmp(cvalue, "false")) + return false; + + return defaultValue; +} void bsodFatal(const char *component) { - char logfile[128]; - sprintf(logfile, "/media/hdd/enigma2_crash_%u.log", (unsigned int)time(0)); - FILE *f = fopen(logfile, "wb"); + std::ostringstream os; + os << time(0); + + std::string logfile("/media/hdd/enigma2_crash_" + os.str() + ".log"); + + FILE *f = fopen(logfile.c_str(), "wb"); std::string lines = getLogBuffer(); /* find python-tracebacks, and extract " File "-strings */ size_t start = 0; - char crash_emailaddr[256] = CRASH_EMAILADDR; - char crash_component[256] = "enigma2"; + std::string crash_emailaddr = CRASH_EMAILADDR; + std::string crash_component = "enigma2"; if (component) - snprintf(crash_component, 256, component); + crash_component = component; else { while ((start = lines.find("\n File \"", start)) != std::string::npos) @@ -195,21 +144,12 @@ void bsodFatal(const char *component) if (end == std::string::npos) break; - if (end - start >= (256 - strlen(INFOFILE))) - continue; - char filename[256]; - snprintf(filename, 256, "%s%s", lines.substr(start, end - start).c_str(), INFOFILE); - FILE *cf = fopen(filename, "r"); - if (cf) - { - fgets(crash_emailaddr, sizeof crash_emailaddr, cf); - if (*crash_emailaddr && crash_emailaddr[strlen(crash_emailaddr)-1] == '\n') - crash_emailaddr[strlen(crash_emailaddr)-1] = 0; - - fgets(crash_component, sizeof crash_component, cf); - if (*crash_component && crash_component[strlen(crash_component)-1] == '\n') - crash_component[strlen(crash_component)-1] = 0; - fclose(cf); + + std::string filename(lines.substr(start, end - start) + INFOFILE); + std::ifstream in(filename.c_str()); + if (in.good()) { + std::getline(in, crash_emailaddr) && std::getline(in, crash_component); + in.close(); } } } @@ -217,207 +157,109 @@ void bsodFatal(const char *component) if (f) { time_t t = time(0); - char crashtime[STDBUFFER_SIZE]; - sprintf(crashtime, "%s",ctime(&t)); - if (strlen(crashtime) && crashtime[strlen(crashtime)-1] == '\n') - crashtime[strlen(crashtime)-1] = 0; - fprintf(f, "\n\n"); - fprintf(f, "\t\n"); - fprintf(f, "\t\t%s\n", crashtime); -#ifdef ENIGMA2_CHECKOUT_TAG - fprintf(f, "\t\t" ENIGMA2_CHECKOUT_TAG "\n"); -#else - fprintf(f, "\t\t" __DATE__ "\n"); -#endif -#ifdef ENIGMA2_CHECKOUT_ROOT - fprintf(f, "\t\t" ENIGMA2_CHECKOUT_ROOT "\n"); -#endif - fprintf(f, "\t\t%s\n", crash_emailaddr); - fprintf(f, "\t\t\n"); - std::string activeSkin = getConfigFileValue("config.skin.primary_skin"); - if (activeSkin != "Error") - { - if (activeSkin == "") - activeSkin = "Default Skin"; - fprintf(f, "\t\t%s\n", activeSkin.c_str()); - } - fprintf(f, "\t\n"); + struct tm tm; + char tm_str[32]; - fprintf(f, "\t\n"); - std::string model = getFileContent("/proc/stb/info/model"); - if (model != "Error") - { - char modelname[STDBUFFER_SIZE]; - sprintf(modelname, "%s",model.c_str()); - if (strlen(modelname) && modelname[strlen(modelname)-1] == '\n') - modelname[strlen(modelname)-1] = 0; - fprintf(f, "\t\t%s\n", modelname); - } - std::string kernel = getFileContent("/proc/cmdline"); - if (kernel != "Error") - { - char kernelcmd[STDBUFFER_SIZE]; - sprintf(kernelcmd, "%s",kernel.c_str()); - if (strlen(kernelcmd) && kernelcmd[strlen(kernelcmd)-1] == '\n') - kernelcmd[strlen(kernelcmd)-1] = 0; - fprintf(f, "\t\t%s\n", kernelcmd); - } - std::string sendAnonCrashlog = getConfigFileValue("config.plugins.crashlogautosubmit.sendAnonCrashlog"); - if (sendAnonCrashlog == "False" || sendAnonCrashlog == "false") // defaults to true... default anonymized crashlogs - { - std::string ca = getFileContent("/proc/stb/info/ca"); - if (ca != "Error") - { - char dreamboxca[STDBUFFER_SIZE]; - sprintf(dreamboxca, "%s",ca.c_str()); - if (strlen(dreamboxca) && dreamboxca[strlen(dreamboxca)-1] == '\n') - dreamboxca[strlen(dreamboxca)-1] = 0; - fprintf(f, "\t\t\n\t\t\n\t\t\n", dreamboxca); - } - std::string settings = getFileContent("/etc/enigma2/settings"); - if (settings != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", settings.c_str()); - } - } - std::string addNetwork = getConfigFileValue("config.plugins.crashlogautosubmit.addNetwork"); - if (addNetwork == "True" || addNetwork == "true") - { - std::string nwinterfaces = getFileContent("/etc/network/interfaces"); - if (nwinterfaces != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", nwinterfaces.c_str()); - } - std::string dns = getFileContent("/etc/resolv.conf"); - if (dns != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", dns.c_str()); - } - std::string defaultgw = getFileContent("/etc/default_gw"); - if (defaultgw != "Error") - { - char gateway[STDBUFFER_SIZE]; - sprintf(gateway, "%s",defaultgw.c_str()); - if (strlen(gateway) && gateway[strlen(gateway)-1] == '\n') - gateway[strlen(gateway)-1] = 0; - fprintf(f, "\t\t\n\t\t\n\t\t\n", gateway); - } - } - std::string addWlan = getConfigFileValue("config.plugins.crashlogautosubmit.addWlan"); - if (addWlan == "True" || addWlan == "true") - { - std::string wpasupplicant = getFileContent("/etc/wpa_supplicant.conf"); - if (wpasupplicant != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", wpasupplicant.c_str()); - } - } - std::string imageversion = getFileContent("/etc/image-version"); - if (imageversion != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", imageversion.c_str()); + localtime_r(&t, &tm); + strftime(tm_str, sizeof(tm_str), "%a %b %_d %T %Y", &tm); + + XmlGenerator xml(f); + + xml.open("opendreambox"); + + xml.open("enigma2"); + xml.string("crashdate", tm_str); + xml.string("compiledate", __DATE__); + xml.string("contactemail", crash_emailaddr); + xml.comment("Please email this crashlog to above address"); + + xml.string("skin", getConfigString("config.skin.primary_skin", "Default Skin")); + xml.string("sourcedate", enigma2_date); + xml.string("branch", enigma2_branch); + xml.string("rev", enigma2_rev); + xml.string("version", PACKAGE_VERSION); + xml.close(); + + xml.open("image"); + xml.stringFromFile("dreamboxmodel", "/proc/stb/info/model"); + xml.stringFromFile("kernelcmdline", "/proc/cmdline"); + xml.stringFromFile("nimsockets", "/proc/bus/nim_sockets"); + if (!getConfigBool("config.plugins.crashlogautosubmit.sendAnonCrashlog", true)) { + xml.cDataFromFile("dreamboxca", "/proc/stb/info/ca"); + xml.cDataFromFile("enigma2settings", eEnv::resolve("${sysconfdir}/enigma2/settings"), ".password="); } - std::string imageissue = getFileContent("/etc/issue.net"); - if (imageissue != "Error") - { - fprintf(f, "\t\t\n\t\t\n\t\t\n", imageissue.c_str()); + if (getConfigBool("config.plugins.crashlogautosubmit.addNetwork", false)) { + xml.cDataFromFile("networkinterfaces", "/etc/network/interfaces"); + xml.cDataFromFile("dns", "/etc/resolv.conf"); + xml.cDataFromFile("defaultgateway", "/etc/default_gw"); } - fprintf(f, "\t\n"); - - fprintf(f, "\t\n"); - std::string installedplugins = execCommand("ipkg list_installed | grep enigma2"); - fprintf(f, "\t\t\n\t\t\n\t\t\n", installedplugins.c_str()); - std::string dreambox = execCommand("ipkg list_installed | grep dream"); - fprintf(f, "\t\t\n\t\t\n\t\t\n", dreambox.c_str()); - std::string gstreamer = execCommand("ipkg list_installed | grep gst"); - fprintf(f, "\t\t\n\t\t\n\t\t\n", gstreamer.c_str()); - fprintf(f, "\t\n"); - - fprintf(f, "\t\n"); - std::string buffer = getLogBuffer(); - fprintf(f, "\t\t\n\t\t\n\t\t\n", buffer.c_str()); - std::string pythonmd5 = execCommand("find /usr/lib/enigma2/python/ -name \"*.py\" | xargs md5sum"); - fprintf(f, "\t\t\n\t\t\n\t\t\n", pythonmd5.c_str()); - fprintf(f, "\t\n"); - - fprintf(f, "\n\n"); + if (getConfigBool("config.plugins.crashlogautosubmit.addWlan", false)) + xml.cDataFromFile("wpasupplicant", "/etc/wpa_supplicant.conf"); + xml.cDataFromFile("imageversion", "/etc/image-version"); + xml.cDataFromFile("imageissue", "/etc/issue.net"); + xml.close(); + + xml.open("software"); + xml.cDataFromCmd("enigma2software", "opkg list_installed | grep enigma2"); + xml.cDataFromCmd("dreamboxsoftware", "opkg list_installed | grep dream"); + xml.cDataFromCmd("gstreamersoftware", "opkg list_installed | grep gst"); + xml.close(); + + xml.open("crashlogs"); + xml.cDataFromString("enigma2crashlog", getLogBuffer()); + xml.cDataFromCmd("pythonMD5sum", "find " + eEnv::resolve("${libdir}/enigma2/python/") + " -name \"*.py\" | xargs md5sum"); + xml.close(); + + xml.close(); + fclose(f); - } - -#ifdef WITH_SDL - ePtr my_dc; - gSDLDC::getInstance(my_dc); -#else - ePtr my_dc; - gFBDC::getInstance(my_dc); -#endif - - { - gPainter p(my_dc); - p.resetOffset(); - p.resetClip(eRect(ePoint(0, 0), my_dc->size())); -#ifdef ENIGMA2_CHECKOUT_TAG - if (ENIGMA2_CHECKOUT_TAG[0] == 'T') /* tagged checkout (release) */ - p.setBackgroundColor(gRGB(0x0000C0)); - else if (ENIGMA2_CHECKOUT_TAG[0] == 'D') /* dated checkout (daily experimental build) */ - { - srand(time(0)); - int r = rand(); - unsigned int col = 0; - if (r & 1) - col |= 0x800000; - if (r & 2) - col |= 0x008000; - if (r & 4) - col |= 0x0000c0; - p.setBackgroundColor(gRGB(col)); - } -#else - p.setBackgroundColor(gRGB(0x008000)); -#endif - p.setForegroundColor(gRGB(0xFFFFFF)); - - ePtr font = new gFont("Regular", 20); - p.setFont(font); - p.clear(); - - eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100); - - char text[512]; - snprintf(text, 512, "We are really sorry. Your Dreambox encountered " - "a software problem, and needs to be restarted. " - "Please send the logfile created in /hdd/ to %s.\n" - "Your Dreambox restarts in 10 seconds!\n" - "Component: %s", - crash_emailaddr, crash_component); - - p.renderText(usable_area, text, gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT); - - usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20); + ePtr my_dc; + gMainDC::getInstance(my_dc); - int i; + gPainter p(my_dc); + p.resetOffset(); + p.resetClip(eRect(ePoint(0, 0), my_dc->size())); + p.setBackgroundColor(gRGB(0x008000)); + p.setForegroundColor(gRGB(0xFFFFFF)); + + ePtr font = new gFont("Regular", 20); + p.setFont(font); + p.clear(); + + eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100); - size_t start = std::string::npos + 1; - for (i=0; i<20; ++i) + std::string text("We are really sorry. Your Dreambox encountered " + "a software problem, and needs to be restarted. " + "Please send the logfile created in /hdd/ to " + crash_emailaddr + ".\n" + "Your Dreambox restarts in 10 seconds!\n" + "Component: " + crash_component); + + p.renderText(usable_area, text.c_str(), gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT); + + usable_area = eRect(100, 170, my_dc->size().width() - 180, my_dc->size().height() - 20); + + int i; + + start = std::string::npos + 1; + for (i=0; i<20; ++i) + { + start = lines.rfind('\n', start - 1); + if (start == std::string::npos) { - start = lines.rfind('\n', start - 1); - if (start == std::string::npos) - { - start = 0; - break; - } + start = 0; + break; } - - font = new gFont("Regular", 14); - p.setFont(font); - - p.renderText(usable_area, - lines.substr(start), gPainter::RT_HALIGN_LEFT); - sleep(10); } + font = new gFont("Regular", 14); + p.setFont(font); + + p.renderText(usable_area, + lines.substr(start), gPainter::RT_HALIGN_LEFT); + sleep(10); + raise(SIGKILL); } @@ -444,16 +286,13 @@ void oops(const mcontext_t &context, int dumpcode) eDebug(" (end)"); } } -#else -#warning "no oops support!" -#define NO_OOPS_SUPPORT #endif void handleFatalSignal(int signum, siginfo_t *si, void *ctx) { +#ifndef NO_OOPS_SUPPORT ucontext_t *uc = (ucontext_t*)ctx; -#ifndef NO_OOPS_SUPPORT oops(uc->uc_mcontext, signum == SIGSEGV || signum == SIGABRT); #endif eDebug("-------"); @@ -463,7 +302,6 @@ void handleFatalSignal(int signum, siginfo_t *si, void *ctx) void bsodCatchSignals() { struct sigaction act; - act.sa_handler = SIG_DFL; act.sa_sigaction = handleFatalSignal; act.sa_flags = SA_RESTART | SA_SIGINFO; if (sigemptyset(&act.sa_mask) == -1) diff --git a/main/enigma-gdi.cpp b/main/enigma-gdi.cpp index 144e2d3..f21c870 100644 --- a/main/enigma-gdi.cpp +++ b/main/enigma-gdi.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -8,7 +9,7 @@ #include #include -#include +#include #include #include @@ -52,8 +53,8 @@ int main() eInit init; init.setRunlevel(eAutoInitNumbers::main); - ePtr my_dc; - gFBDC::getInstance(my_dc); + ePtr my_dc; + gMainDC::getInstance(my_dc); gPainter p(my_dc); @@ -67,7 +68,7 @@ int main() pal[a | 0x10] = (0x111111 * a) | 0xFF; p.setPalette(pal, 0, 256); - fontRenderClass::getInstance()->AddFont(FONTDIR "/arial.ttf", "Regular", 100); + fontRenderClass::getInstance()->AddFont(eEnv::resolve("${datadir}/fonts/arial.ttf"), "Regular", 100); p.resetClip(gRegion(eRect(0, 0, 720, 576))); diff --git a/main/enigma-gui.cpp b/main/enigma-gui.cpp index e53fcca..f3d1b17 100644 --- a/main/enigma-gui.cpp +++ b/main/enigma-gui.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include @@ -52,8 +52,8 @@ int main() eInit init; init.setRunlevel(eAutoInitNumbers::main); - ePtr my_dc; - gFBDC::getInstance(my_dc); + ePtr my_dc; + gMainDC::getInstance(my_dc); gPainter p(my_dc); @@ -67,7 +67,7 @@ int main() pal[a | 0x10] = (0x111111 * a) | 0xFF; p.setPalette(pal, 0, 256); - fontRenderClass::getInstance()->AddFont(FONTDIR "/arial.ttf", "Regular", 100); + fontRenderClass::getInstance()->AddFont(eEnv::resolve("${datadir}/fonts/arial.ttf"), "Regular", 100); eWidgetDesktop dsk(eSize(720, 576)); dsk.setDC(my_dc); diff --git a/main/enigma.cpp b/main/enigma.cpp index b8554d5..91645d8 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -9,15 +9,13 @@ #include #include #include +#include #include #include #include -#include +#include #include #include -#ifdef WITH_SDL -#include -#endif #include #include #include @@ -30,10 +28,9 @@ #include #include "bsod.h" +#include "version_info.h" -#ifdef HAVE_GSTREAMER #include -#endif #ifdef OBJECT_DEBUG int object_total_remaining; @@ -135,12 +132,10 @@ int main(int argc, char **argv) atexit(object_dump); #endif -#ifdef HAVE_GSTREAMER gst_init(&argc, &argv); -#endif // set pythonpath if unset - setenv("PYTHONPATH", LIBDIR "/enigma2/python", 0); + setenv("PYTHONPATH", eEnv::resolve("${libdir}/enigma2/python").c_str(), 0); printf("PYTHONPATH: %s\n", getenv("PYTHONPATH")); bsodLogInit(); @@ -149,15 +144,10 @@ int main(int argc, char **argv) eMain main; #if 1 -#ifdef WITH_SDL - ePtr my_dc; - gSDLDC::getInstance(my_dc); -#else - ePtr my_dc; - gFBDC::getInstance(my_dc); + ePtr my_dc; + gMainDC::getInstance(my_dc); - int double_buffer = my_dc->haveDoubleBuffering(); -#endif + //int double_buffer = my_dc->haveDoubleBuffering(); ePtr my_lcd_dc; gLCDDC::getInstance(my_lcd_dc); @@ -190,7 +180,7 @@ int main(int argc, char **argv) dsk_lcd.setDC(my_lcd_dc); ePtr m_pm; - loadPNG(m_pm, DATADIR "/enigma2/skin_default/pal.png"); + loadPNG(m_pm, eEnv::resolve("${datadir}/enigma2/skin_default/pal.png").c_str()); if (!m_pm) { eFatal("pal.png not found!"); @@ -213,14 +203,16 @@ int main(int argc, char **argv) ePtr wait[MAX_SPINNER]; for (i=0; isize())); p.clear(); + p.flush(); } return exit_code; @@ -276,11 +269,6 @@ eApplication *getApplication() return eApp; } -void runMainloop() -{ - eApp->runLoop(); -} - void quitMainloop(int exitCode) { FILE *f = fopen("/proc/stb/fp/was_timer_wakeup", "w"); @@ -305,22 +293,30 @@ void quitMainloop(int exitCode) eApp->quit(0); } -#include "version.h" +static void sigterm_handler(int num) +{ + quitMainloop(128 + num); +} + +void runMainloop() +{ + struct sigaction act; + + act.sa_handler = sigterm_handler; + act.sa_flags = SA_RESTART; + + if (sigemptyset(&act.sa_mask) == -1) + perror("sigemptyset"); + if (sigaction(SIGTERM, &act, 0) == -1) + perror("SIGTERM"); + + eApp->runLoop(); +} const char *getEnigmaVersionString() { - std::string date = -#ifdef ENIGMA2_LAST_CHANGE_DATE - ENIGMA2_LAST_CHANGE_DATE; -#else - __DATE__; -#endif - std::string branch = -#ifdef ENIGMA2_BRANCH - ENIGMA2_BRANCH; -#else - "HEAD"; -#endif + std::string date = enigma2_date; + std::string branch = enigma2_branch; return std::string(date + '-' + branch).c_str(); } diff --git a/main/version_info.cpp b/main/version_info.cpp new file mode 100644 index 0000000..f639eb8 --- /dev/null +++ b/main/version_info.cpp @@ -0,0 +1,18 @@ +#include "version_info.h" +#include "version.h" + +#ifndef ENIGMA2_COMMIT_DATE +#define ENIGMA2_COMMIT_DATE __DATE__ +#endif +const char *enigma2_date = ENIGMA2_COMMIT_DATE; + +#ifndef ENIGMA2_BRANCH +#define ENIGMA2_BRANCH "(no branch)" +#endif +const char *enigma2_branch = ENIGMA2_BRANCH; + +#ifndef ENIGMA2_REV +#define ENIGMA2_REV "" +#endif +const char *enigma2_rev = ENIGMA2_REV; + diff --git a/main/version_info.h b/main/version_info.h new file mode 100644 index 0000000..f93cf01 --- /dev/null +++ b/main/version_info.h @@ -0,0 +1,8 @@ +#ifndef __main_version_info_h__ +#define __main_version_info_h__ + +extern const char *enigma2_date; +extern const char *enigma2_branch; +extern const char *enigma2_rev; + +#endif diff --git a/main/xmlgenerator.cpp b/main/xmlgenerator.cpp new file mode 100644 index 0000000..eb4f157 --- /dev/null +++ b/main/xmlgenerator.cpp @@ -0,0 +1,188 @@ +#include +#include +#include "xmlgenerator.h" + +XmlGenerator::XmlGenerator(FILE *f) : m_file(f), m_indent(true), m_level(0) +{ + ::fprintf(m_file, "\n"); +} + +XmlGenerator::~XmlGenerator() +{ +} + +void XmlGenerator::vprint(const char *fmt, va_list ap, bool newline) +{ + unsigned int i; + + if (m_indent) + for (i = 0; i < m_level; i++) + ::fprintf(m_file, "\t"); + + ::vfprintf(m_file, fmt, ap); + + if (newline) + ::fprintf(m_file, "\n"); +} + +void XmlGenerator::print(const char *fmt, ...) +{ + va_list ap; + + ::va_start(ap, fmt); + vprint(fmt, ap, false); + ::va_end(ap); +} + +void XmlGenerator::printLn(const char *fmt, ...) +{ + va_list ap; + + ::va_start(ap, fmt); + vprint(fmt, ap, true); + ::va_end(ap); +} + +void XmlGenerator::open(const std::string &tag, bool newline) +{ + if (newline) { + printLn("<%s>", tag.c_str()); + } else { + print("<%s>", tag.c_str()); + m_indent = false; + } + + m_tags.push(tag); + m_level++; +} + +void XmlGenerator::open(const std::string &tag) +{ + open(tag, true); +} + +void XmlGenerator::close() +{ + ASSERT(!m_tags.empty()); + ASSERT(m_level > 0); + m_level--; + + printLn("", m_tags.top().c_str()); + m_indent = true; + + m_tags.pop(); +} + +void XmlGenerator::comment(const std::string &str) +{ + printLn("", str.c_str()); +} + +void XmlGenerator::commentFromErrno(const std::string &tag) +{ + open(tag); + comment(strerror(errno)); + close(); +} + +std::string XmlGenerator::cDataEscape(const std::string &str) +{ + const std::string search = "]]>"; + const std::string replace = "]]]]>"; + std::string ret; + size_t pos = 0, opos; + + for (;;) { + opos = pos; + pos = str.find(search, opos); + if (pos == std::string::npos) + break; + ret.append(str, opos, pos - opos); + ret.append(replace); + pos += search.size(); + } + + ret.append(str, opos, std::string::npos); + return ret; +} + +void XmlGenerator::cDataFromCmd(const std::string &tag, const std::string &cmd) +{ + FILE *pipe = ::popen(cmd.c_str(), "re"); + + if (pipe == 0) { + commentFromErrno(tag); + return; + } + + std::string result; + char *lineptr = NULL; + size_t n = 0; + + for (;;) { + ssize_t ret = ::getline(&lineptr, &n, pipe); + if (ret < 0) + break; + result.append(lineptr, ret); + } + + if (lineptr) + ::free(lineptr); + + ::pclose(pipe); + cDataFromString(tag, result); +} + +void XmlGenerator::cDataFromFile(const std::string &tag, const std::string &filename, const char *filter) +{ + std::ifstream in(filename.c_str()); + std::string line; + std::string content; + + if (!in.good()) { + commentFromErrno(tag); + return; + } + + while (std::getline(in, line)) + if (!filter || !line.find(filter)) + content += line + '\n'; + + in.close(); + cDataFromString(tag, content); +} + +void XmlGenerator::cDataFromString(const std::string &tag, const std::string &str) +{ + bool indent = false; + + open(tag); + printLn(""); + std::swap(m_indent, indent); + close(); +} + +void XmlGenerator::string(const std::string &tag, const std::string &str) +{ + open(tag, false); + print("%s", str.c_str()); + close(); +} + +void XmlGenerator::stringFromFile(const std::string &tag, const std::string &filename) +{ + std::ifstream in(filename.c_str()); + std::string line; + + if (!in.good()) { + commentFromErrno(tag); + return; + } + + std::getline(in, line); + in.close(); + string(tag, line); +} diff --git a/main/xmlgenerator.h b/main/xmlgenerator.h new file mode 100644 index 0000000..0dbb262 --- /dev/null +++ b/main/xmlgenerator.h @@ -0,0 +1,43 @@ +#ifndef _main_xmlgenerator_h__ +#define _main_xmlgenerator_h__ + +#include +#include +#include +#include + +class XmlGenerator +{ +private: + FILE *m_file; + bool m_indent; + unsigned int m_level; + std::stack m_tags; + + void vprint(const char *fmt, va_list ap, bool newline); + void __attribute__ ((__format__(__printf__, 2, 3))) print(const char *fmt, ...); + void __attribute__ ((__format__(__printf__, 2, 3))) printLn(const char *fmt, ...); + + void open(const std::string &tag, bool newline); + void commentFromErrno(const std::string &tag); + + std::string cDataEscape(const std::string &str); + +public: + XmlGenerator(FILE *f); + ~XmlGenerator(); + + void open(const std::string &tag); + void close(); + + void comment(const std::string &str); + + void cDataFromCmd(const std::string &tag, const std::string &cmd); + void cDataFromFile(const std::string &tag, const std::string &filename, const char *filter = 0); + void cDataFromString(const std::string &tag, const std::string &str); + + void string(const std::string &tag, const std::string &str); + void stringFromFile(const std::string &tag, const std::string &filename); +}; + +#endif diff --git a/mytest.py b/mytest.py index a3cfb5a..99695e0 100755 --- a/mytest.py +++ b/mytest.py @@ -10,7 +10,8 @@ from Tools.Profile import profile, profile_final profile("PYTHON_START") from enigma import runMainloop, eDVBDB, eTimer, quitMainloop, \ - getDesktop, ePythonConfigQuery, eAVSwitch, eServiceEvent + getDesktop, ePythonConfigQuery, eAVSwitch, eServiceEvent, \ + eEPGCache from tools import * profile("LANGUAGE") @@ -55,6 +56,11 @@ config.misc.isNextRecordTimerAfterEventActionAuto = ConfigYesNo(default=False) config.misc.useTransponderTime = ConfigYesNo(default=True) config.misc.startCounter = ConfigInteger(default=0) # number of e2 starts... config.misc.standbyCounter = NoSave(ConfigInteger(default=0)) # number of standby +config.misc.epgcache_filename = ConfigText(default = "/hdd/epg.dat") + +def setEPGCachePath(configElement): + eEPGCache.getInstance().setCacheFile(configElement.value) + #demo code for use of standby enter leave callbacks #def leaveStandby(): @@ -208,6 +214,7 @@ class Session: self.summary.show() c.addSummary(self.summary) + c.saveKeyboardMode() c.execBegin() # when execBegin opened a new dialog, don't bother showing the old one. @@ -219,6 +226,7 @@ class Session: self.in_exec = False self.current_dialog.execEnd() + self.current_dialog.restoreKeyboardMode() self.current_dialog.hide() if last: @@ -472,6 +480,8 @@ def runScreenTest(): else: session.open(screen, *args) + config.misc.epgcache_filename.addNotifier(setEPGCachePath) + runNextScreen(session, screensToRun) profile("Init:VolumeControl") diff --git a/po/.gitignore b/po/.gitignore new file mode 100644 index 0000000..6e85d37 --- /dev/null +++ b/po/.gitignore @@ -0,0 +1,2 @@ +*.mo +*.pot diff --git a/po/LINGUAS b/po/LINGUAS deleted file mode 100644 index 6b09e26..0000000 --- a/po/LINGUAS +++ /dev/null @@ -1 +0,0 @@ -ar ca cs da de el en es et fi fr fy hr hu is it lt lv nl no pl pt ru sv sk sl sr tr uk diff --git a/po/Makefile.am b/po/Makefile.am old mode 100755 new mode 100644 index ba04440..e7318f7 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -1,60 +1,45 @@ -DOMAIN=enigma2 -#GETTEXT=./pygettext.py -GETTEXT=xgettext +dist_noinst_SCRIPTS = xml2po.py -#MSGFMT = ./msgfmt.py -MSGFMT = msgfmt +LANGS = ar ca cs da de el en es et fi fr fy hr hu is it lt lv nl no pl pt ru sv sk sl sr tr uk +LANGMO = $(LANGS:=.mo) +LANGPO = $(LANGS:=.po) -LANGS := $(shell cat $(srcdir)/LINGUAS) -LANGPO := $(foreach LANG, $(LANGS),$(LANG).po) -LANGMO := $(foreach LANG, $(LANGS),$(LANG).mo) +EXTRA_DIST = $(LANGPO) -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 +if UPDATE_PO +# the TRANSLATORS: allows putting translation comments before the to-be-translated line. +enigma2-py.pot: $(top_srcdir)/*.py $(top_srcdir)/lib/python/*/*.py $(top_srcdir)/lib/python/Plugins/*/*/*.py + $(XGETTEXT) -L Python --from-code=UTF-8 --add-comments="TRANSLATORS:" -d @PACKAGE_NAME@ -s -o $@ $^ -merge: - for lang in $(LANGS); do \ - msgmerge --no-location -s -N -U $$lang.po enigma2.pot; \ - done +enigma2-xml.pot: $(srcdir)/xml2po.py $(top_srcdir)/data/*.xml $(top_srcdir)/lib/python/Plugins/SystemPlugins/*/*.xml + $(PYTHON) $^ > $@ +enigma2.pot: enigma2-py.pot enigma2-xml.pot + cat $^ | $(MSGUNIQ) --no-location -o $@ - -# the TRANSLATORS: allows putting translation comments before the to-be-translated line. -enigma2.pot: - $(GETTEXT) -L python --add-comments="TRANSLATORS:" -d enigma2 -s -o enigma2.pot ../lib/python/Screens/*.py ../lib/python/Components/*.py \ - ../lib/python/Tools/*.py \ - ../*.py \ - ../lib/python/Plugins/*/*/*.py - - ./xml2po.py ../data/ >> enigma2.pot - ./xml2po.py ../lib/python/Plugins/SystemPlugins/Videomode/ >> 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 - msguniq --no-location -o enigma2uniq.pot enigma2.pot - $(RM) enigma2.pot - mv enigma2uniq.pot enigma2.pot - -%.mo: %.po - $(MSGFMT) -o $@ $< +%.po: enigma2.pot + if [ -f $@ ]; then \ + $(MSGMERGE) --backup=none --no-location -s -N -U $@ $< && touch $@; \ + else \ + $(MSGINIT) -l $@ -o $@ -i $< --no-translator; \ + fi +endif -%.po: - msginit -l $@ -o $@ -i enigma2.pot --no-translator +.po.mo: + $(MSGFMT) -o $@ $< -CLEANFILES = $(foreach LANG, $(LANGS),$(LANG).mo) +BUILT_SOURCES = $(LANGMO) +CLEANFILES = $(LANGMO) enigma2-py.pot enigma2-xml.pot enigma2.pot -cleanall: - $(RM) enigma2.pot +dist-hook: $(LANGPO) -clean-local: - $(RM) -r $(LANGS) +install-data-local: $(LANGMO) + for lang in $(LANGS); do \ + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/po/$$lang/LC_MESSAGES; \ + $(INSTALL_DATA) $$lang.mo $(DESTDIR)$(pkgdatadir)/po/$$lang/LC_MESSAGES/@PACKAGE_NAME@.mo; \ + done -install-data-am: default +uninstall-local: for lang in $(LANGS); do \ - mkdir -p $(DESTDIR)$(pkgdatadir)/po/$$lang/LC_MESSAGES; \ - cp $$lang.mo $(DESTDIR)$(pkgdatadir)/po/$$lang/LC_MESSAGES/$(DOMAIN).mo; \ + $(RM) $(DESTDIR)$(pkgdatadir)/po/$$lang/LC_MESSAGES/@PACKAGE_NAME@.mo; \ done diff --git a/po/enigma2.pot b/po/enigma2.pot deleted file mode 100755 index 2e9f148..0000000 --- a/po/enigma2.pot +++ /dev/null @@ -1,13646 +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. -# -#: ../enigma2_experimental/lib/python/Screens/About.py:63 -#: ../enigma2_master/lib/python/Screens/About.py:63 -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-01 13:01+0000\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" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:148 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:148 -msgid "" -"\n" -"Advanced options and settings." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:233 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:560 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1171 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1688 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:233 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:560 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1171 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1687 -msgid "" -"\n" -"After pressing OK, please wait!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:131 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:131 -msgid "" -"\n" -"Backup your Dreambox settings." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:155 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:155 -msgid "" -"\n" -"Edit the upgrade source address." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:128 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:128 -msgid "" -"\n" -"Manage extensions or plugins for your Dreambox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:129 -msgid "" -"\n" -"Online update of your Dreambox software." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:121 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:121 -msgid "" -"\n" -"Press OK on your remote control to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:132 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:132 -msgid "" -"\n" -"Restore your Dreambox settings." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:130 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:130 -msgid "" -"\n" -"Restore your Dreambox with a new firmware." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:150 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:150 -msgid "" -"\n" -"Restore your backups by date." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:133 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:133 -msgid "" -"\n" -"Scan for local extensions and install them." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:151 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:151 -msgid "" -"\n" -"Select your backup device.\n" -"Current device: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:256 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:256 -msgid "" -"\n" -"System will restart after the restore!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:154 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:154 -msgid "" -"\n" -"View, install and remove available or installed packages." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:65 -msgid " " -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:314 -msgid " Results" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:876 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:876 -msgid " extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:225 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:225 -msgid " ms" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:676 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:688 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:676 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:688 -msgid " packages selected." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:204 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:209 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:630 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:674 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:685 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:204 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:209 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:630 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:674 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:685 -msgid " updates available." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:359 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:359 -msgid " wireless networks found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1280 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1281 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1430 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1432 -#: ../enigma2_master/lib/python/Components/NimManager.py:1280 -#: ../enigma2_master/lib/python/Components/NimManager.py:1281 -#: ../enigma2_master/lib/python/Components/NimManager.py:1430 -#: ../enigma2_master/lib/python/Components/NimManager.py:1432 -msgid "%H:%M" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Standby.py:125 -#: ../enigma2_master/lib/python/Screens/Standby.py:125 -#, python-format -msgid "%d jobs are running in the background!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:150 -#: ../enigma2_master/lib/python/Screens/EventView.py:150 -#, python-format -msgid "%d min" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:33 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:96 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:98 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:33 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:96 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:98 -#, python-format -msgid "%d services found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimeDateInput.py:40 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:111 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:122 -#: ../enigma2_master/lib/python/Screens/TimeDateInput.py:40 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:111 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:122 -msgid "%d.%B %Y" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:58 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:140 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:227 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:231 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:232 -#, python-format -msgid "%i ms" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/About.py:38 -#: ../enigma2_master/lib/python/Screens/About.py:38 -#, python-format -msgid "" -"%s\n" -"(%s, %d MB free)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:54 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:54 -#, python-format -msgid "%s (%s)\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:37 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:39 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:45 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:47 -#: ../enigma2_master/lib/python/Components/TimerList.py:37 -#: ../enigma2_master/lib/python/Components/TimerList.py:39 -#: ../enigma2_master/lib/python/Components/TimerList.py:45 -#: ../enigma2_master/lib/python/Components/TimerList.py:47 -msgid "(ZAP)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:585 -#: ../enigma2_master/lib/python/Components/NimManager.py:585 -msgid "(empty)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:347 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:347 -msgid "(show optional DVD audio menu)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:65 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:65 -msgid "* Only available if more than one interface is active." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:357 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:357 -msgid "1 wireless network found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1175 -#: ../enigma2_master/lib/python/Components/NimManager.py:1175 -msgid "1.0" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1175 -#: ../enigma2_master/lib/python/Components/NimManager.py:1175 -msgid "1.1" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1174 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1175 -#: ../enigma2_master/lib/python/Components/NimManager.py:1174 -#: ../enigma2_master/lib/python/Components/NimManager.py:1175 -msgid "1.2" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1171 -#: ../enigma2_master/lib/python/Components/NimManager.py:1171 -msgid "13 V" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:91 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:91 -msgid "16:10" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:83 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:83 -msgid "16:10 Letterbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:84 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:84 -msgid "16:10 PanScan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:81 -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:90 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:15 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:81 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:90 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:15 -msgid "16:9" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:85 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:85 -msgid "16:9 Letterbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:82 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:82 -msgid "16:9 always" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1171 -#: ../enigma2_master/lib/python/Components/NimManager.py:1171 -msgid "18 V" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:30 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:30 -msgid "30 minutes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:89 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:15 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:89 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:15 -msgid "4:3" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:79 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:79 -msgid "4:3 Letterbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:80 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:80 -msgid "4:3 PanScan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:30 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:30 -msgid "5 minutes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:30 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:30 -msgid "60 minutes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:54 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:54 -msgid "" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:54 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:54 -msgid "" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:54 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:54 -msgid "" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:90 -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:105 -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:137 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:64 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:90 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:105 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:137 -#: ../enigma2_master/lib/python/Components/TimerList.py:64 -msgid "" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Menu.py:155 -#: ../enigma2_experimental/lib/python/Screens/Menu.py:158 -#: ../enigma2_master/lib/python/Screens/Menu.py:155 -#: ../enigma2_master/lib/python/Screens/Menu.py:158 -msgid "??" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1173 -#: ../enigma2_master/lib/python/Components/NimManager.py:1173 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "A" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:115 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1406 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:115 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1406 -#, python-format -msgid "" -"A configuration file (%s) was modified since Installation.\n" -"Do you want to keep your version?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py:85 -#: ../enigma2_experimental/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py:86 -#: ../enigma2_master/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py:85 -#: ../enigma2_master/lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py:86 -msgid "A demo plugin for TPM usage." -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:300 -#: ../enigma2_master/RecordTimer.py:300 -msgid "" -"A finished record timer wants to set your\n" -"Dreambox to standby. Do that now?" -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:306 -#: ../enigma2_master/RecordTimer.py:306 -msgid "" -"A finished record timer wants to shut down\n" -"your Dreambox. Shutdown now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:96 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:96 -msgid "A graphical EPG for all services of an specific bouquet" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:267 -msgid "" -"A mount entry with this name already exists!\n" -"Update existing entry and continue?\n" -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:381 -#: ../enigma2_master/RecordTimer.py:381 -#, python-format -msgid "" -"A record has been started:\n" -"%s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1648 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1648 -msgid "" -"A recording is currently running.\n" -"What do you want to do?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:589 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:264 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:389 -#: ../enigma2_master/lib/python/Components/Task.py:389 -#, python-format -msgid "A required tool (%s) was not found." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:212 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:212 -msgid "A search for available updates is currently in progress." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:582 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:582 -msgid "" -"A second configured interface has been found.\n" -"\n" -"Do you want to disable the second network interface?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:128 -#: ../enigma2_experimental/SleepTimer.py:34 -#: ../enigma2_master/lib/python/Screens/TaskView.py:128 -#: ../enigma2_master/SleepTimer.py:34 -msgid "" -"A sleep timer wants to set your\n" -"Dreambox to standby. Do that now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:125 -#: ../enigma2_experimental/SleepTimer.py:29 -#: ../enigma2_master/lib/python/Screens/TaskView.py:125 -#: ../enigma2_master/SleepTimer.py:29 -msgid "" -"A sleep timer wants to shut down\n" -"your Dreambox. Shutdown now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1076 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1076 -msgid "A small overview of the available icon states and actions." -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:250 -#: ../enigma2_master/RecordTimer.py:250 -msgid "" -"A timer failed to record!\n" -"Disable TV and try again?\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:18 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:221 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:18 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:221 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "A/V Settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1149 -#: ../enigma2_master/lib/python/Components/NimManager.py:1149 -msgid "AA" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1149 -#: ../enigma2_master/lib/python/Components/NimManager.py:1149 -msgid "AB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:98 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:98 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "AC3 default" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:75 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:100 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:75 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:100 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "AC3 downmix" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:270 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:270 -msgid "Abort" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:81 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:81 -msgid "About..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:258 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:76 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:258 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:76 -msgid "Accesspoint:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:76 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:78 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:76 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:78 -msgid "Action:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:137 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1432 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:137 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1432 -msgid "Activate Picture in Picture" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:176 -msgid "Active" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:61 -msgid "" -"Active/\n" -"Inactive" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:885 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:885 -msgid "Adapter settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:240 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:44 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:187 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:240 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:44 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:187 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:76 -msgid "Add" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:199 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:199 -msgid "Add Bookmark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:126 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:126 -msgid "Add WLAN configuration?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:178 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:178 -msgid "Add a mark" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:73 -msgid "Add a new NFS or CIFS mount point to your Dreambox." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:62 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:193 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:62 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:193 -msgid "Add a new title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:125 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:125 -msgid "Add network configuration?" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:103 -msgid "Add new AutoTimer" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:73 -msgid "Add new network mount point" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:75 -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:222 -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:257 -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:373 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:40 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:71 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:107 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:167 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:576 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:611 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:662 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:75 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:222 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:257 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:373 -#: ../enigma2_master/lib/python/Screens/EventView.py:40 -#: ../enigma2_master/lib/python/Screens/EventView.py:71 -#: ../enigma2_master/lib/python/Screens/EventView.py:107 -#: ../enigma2_master/lib/python/Screens/EventView.py:167 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:576 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:611 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:662 -msgid "Add timer" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:44 -msgid "Add timer as disabled on conflict" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:62 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:80 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:62 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:80 -msgid "Add title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1760 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1760 -msgid "Add to bouquet" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1762 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1762 -msgid "Add to favourites" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:464 -msgid "Add zap timer instead of record timer?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1103 -#: ../enigma2_plugins/mytube/src/plugin.py:1341 -msgid "Added: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:179 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:179 -msgid "" -"Adds enigma2 settings and dreambox model informations like SN, rev... if " -"enabled." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:182 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:182 -msgid "Adds network configuration if enabled." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:185 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:185 -msgid "Adds wlan configuration if enabled." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:205 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:88 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:148 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:88 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:148 -msgid "Advanced Options" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:163 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:163 -msgid "Advanced Software" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:167 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:167 -msgid "Advanced Software Plugin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:397 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:397 -msgid "Advanced Video Enhancement Setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:230 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:230 -msgid "Advanced Video Setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:150 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:150 -msgid "Advanced restore" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:59 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:195 -#: ../enigma2_master/lib/python/Screens/TaskView.py:59 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:195 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:528 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:173 -msgid "After event" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:129 -msgid "Album" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:708 -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:850 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:207 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:526 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:708 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:850 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:207 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:526 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:180 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:200 -#: ../enigma2_plugins/mytube/src/plugin.py:71 -#: ../enigma2_plugins/mytube/src/plugin.py:91 -msgid "All" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1168 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1169 -#: ../enigma2_master/lib/python/Components/NimManager.py:1168 -#: ../enigma2_master/lib/python/Components/NimManager.py:1169 -msgid "All Satellites" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:168 -#: ../enigma2_plugins/mytube/src/plugin.py:59 -msgid "All Time" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:22 -msgid "All non-repeating timers" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:62 -msgid "Allow zapping via Webinterface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:53 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:53 -msgid "Always ask" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -msgid "Always ask before sending" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:546 -msgid "Ammount of recordings left" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:389 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:389 -msgid "An empty filename is illegal." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:480 -msgid "An error occured." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:347 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:180 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:300 -#: ../enigma2_master/lib/python/Components/Task.py:347 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:180 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:300 -msgid "An unknown error occured!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:124 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:124 -msgid "Anonymize crashlog?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:18 -#: ../enigma2_master/lib/python/Components/Language.py:18 -msgid "Arabic" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:568 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:568 -msgid "" -"Are you sure you want to activate this network configuration?\n" -"\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:271 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:271 -msgid "" -"Are you sure you want to delete\n" -"following backup:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Wizard.py:300 -#: ../enigma2_master/lib/python/Screens/Wizard.py:300 -msgid "Are you sure you want to exit this wizard?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:815 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:815 -msgid "" -"Are you sure you want to restart your network interfaces?\n" -"\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:256 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:256 -msgid "" -"Are you sure you want to restore\n" -"following backup:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:242 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:242 -msgid "" -"Are you sure you want to restore your Enigma2 backup?\n" -"Enigma2 will restart after the restore" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:269 -msgid "" -"Are you sure you want to save this network mount?\n" -"\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:125 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:125 -msgid "Artist" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:228 -#: ../enigma2_plugins/mytube/src/plugin.py:119 -msgid "Ascending" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:90 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:92 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:90 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:92 -msgid "Ask before shutdown:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:41 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:41 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:249 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:252 -#: ../enigma2_plugins/mytube/src/plugin.py:139 -#: ../enigma2_plugins/mytube/src/plugin.py:142 -msgid "Ask user" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:78 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:90 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:78 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Aspect Ratio" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:348 -#: ../enigma2_master/lib/python/Components/Network.py:348 -msgid "Atheros" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1672 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1672 -msgid "Audio Options..." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/plugin.py:36 -msgid "Audio Sync" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/plugin.py:35 -msgid "Audio Sync Setup" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:201 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:208 -#: ../enigma2_plugins/mytube/src/plugin.py:92 -#: ../enigma2_plugins/mytube/src/plugin.py:99 -msgid "Australia" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1211 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1211 -#: ../enigma2_plugins/mytube/src/plugin.py:1338 -msgid "Author: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:151 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:151 -msgid "Authoring mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:25 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:572 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:580 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:607 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:614 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:622 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:637 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:650 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:657 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:662 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:666 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:672 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:678 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1146 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:10 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:15 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:26 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:44 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:50 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:57 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:62 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:72 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:77 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:84 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:91 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:96 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:100 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:106 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:112 -#: ../enigma2_master/lib/python/Screens/Ci.py:25 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:572 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:580 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:607 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:614 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:622 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:637 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:650 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:657 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:662 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:666 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:672 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:678 -#: ../enigma2_master/lib/python/Components/NimManager.py:1146 -#: ../enigma2_master/lib/python/Tools/Transponder.py:10 -#: ../enigma2_master/lib/python/Tools/Transponder.py:15 -#: ../enigma2_master/lib/python/Tools/Transponder.py:26 -#: ../enigma2_master/lib/python/Tools/Transponder.py:44 -#: ../enigma2_master/lib/python/Tools/Transponder.py:50 -#: ../enigma2_master/lib/python/Tools/Transponder.py:57 -#: ../enigma2_master/lib/python/Tools/Transponder.py:62 -#: ../enigma2_master/lib/python/Tools/Transponder.py:72 -#: ../enigma2_master/lib/python/Tools/Transponder.py:77 -#: ../enigma2_master/lib/python/Tools/Transponder.py:84 -#: ../enigma2_master/lib/python/Tools/Transponder.py:91 -#: ../enigma2_master/lib/python/Tools/Transponder.py:96 -#: ../enigma2_master/lib/python/Tools/Transponder.py:100 -#: ../enigma2_master/lib/python/Tools/Transponder.py:106 -#: ../enigma2_master/lib/python/Tools/Transponder.py:112 -msgid "Auto" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:96 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:96 -msgid "Auto chapter split every ? minutes (0=never)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:97 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:97 -msgid "Auto flesh" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:95 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:95 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Auto scart switching" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:373 -msgid "AutoTimer Editor" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:790 -msgid "AutoTimer Filters" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:994 -msgid "AutoTimer Services" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:33 -msgid "AutoTimer Settings" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:110 -msgid "AutoTimer overview" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:92 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:92 -msgid "Automatic" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:933 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:933 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Automatic Scan" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:182 -#: ../enigma2_plugins/mytube/src/plugin.py:73 -msgid "Autos & Vehicles" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:63 -msgid "Autowrite timer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -msgid "Available format variables" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1173 -#: ../enigma2_master/lib/python/Components/NimManager.py:1173 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "B" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1149 -#: ../enigma2_master/lib/python/Components/NimManager.py:1149 -msgid "BA" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1149 -#: ../enigma2_master/lib/python/Components/NimManager.py:1149 -msgid "BB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1270 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1275 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1280 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1285 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1290 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:507 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:658 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1270 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1275 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1280 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1285 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1290 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:507 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:658 -msgid "Back" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:32 -#: ../enigma2_master/lib/python/Screens/TaskView.py:32 -msgid "Background" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:305 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:305 -msgid "Backup done." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:307 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:307 -msgid "Backup failed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:66 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:81 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:83 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:66 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:81 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:83 -msgid "Backup is running..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:131 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:131 -msgid "Backup system settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1172 -#: ../enigma2_master/lib/python/Components/NimManager.py:1172 -msgid "Band" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:411 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:140 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:411 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:140 -msgid "Bandwidth" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:537 -msgid "Begin of \"after event\" timespan" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:509 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:78 -msgid "Begin of timespan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:50 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:344 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:50 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:344 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -msgid "Begin time" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:262 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:80 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:262 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:80 -msgid "Bitrate:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:101 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:101 -msgid "Block noise reduction" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:99 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:99 -msgid "Blue boost" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:71 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:71 -msgid "Bookmarks" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1005 -msgid "Bouquets" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:202 -#: ../enigma2_plugins/mytube/src/plugin.py:93 -msgid "Brazil" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:92 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:85 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:92 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:85 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Brightness" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:157 -msgid "Browse network neighbourhood" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:35 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:894 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:935 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:956 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:66 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:122 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:35 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:894 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:935 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:956 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:66 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:122 -msgid "Burn DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:125 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:125 -msgid "Burn existing image to DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/plugin.py:15 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/plugin.py:15 -msgid "Burn to DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:49 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:49 -msgid "Bus: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1078 -#: ../enigma2_master/lib/python/Components/NimManager.py:1078 -msgid "C-Band" -msgstr "" - -#: ../enigma2_plugins/cdinfo/src/plugin.py:73 -msgid "CDInfo" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:71 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:166 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:71 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:166 -msgid "CI assignment" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:98 -msgid "CIFS share" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:71 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:71 -msgid "CVBS" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:965 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:69 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:48 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:476 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:965 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:69 -#: ../enigma2_master/lib/python/Tools/Transponder.py:48 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:476 -msgid "Cable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:179 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:179 -msgid "Cache Thumbnails" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:108 -msgid "Can't connect to server. Please check your network!" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:203 -#: ../enigma2_plugins/mytube/src/plugin.py:94 -msgid "Canada" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:171 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:94 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:128 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:239 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:375 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:57 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:334 -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:24 -#: ../enigma2_experimental/lib/python/Screens/Setup.py:84 -#: ../enigma2_experimental/lib/python/Screens/TimeDateInput.py:14 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:31 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:60 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:108 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:41 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:52 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:27 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:69 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:164 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:367 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:582 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:293 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:115 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:205 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:351 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:977 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1552 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:102 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:47 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:302 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:36 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:171 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:94 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:128 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:239 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:375 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:57 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:334 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:24 -#: ../enigma2_master/lib/python/Screens/Setup.py:84 -#: ../enigma2_master/lib/python/Screens/TimeDateInput.py:14 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:31 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:60 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:108 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:41 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:52 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:27 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:69 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:164 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:367 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:582 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:293 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:115 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:205 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:351 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:977 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1552 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:102 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:47 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:302 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:36 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:66 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:63 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:393 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:811 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1014 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:44 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:118 -#: ../enigma2_plugins/autotimer/src/AutoTimerPreview.py:59 -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:54 -#: ../enigma2_plugins/cdinfo/src/plugin.py:56 -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:81 -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:65 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:498 -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:34 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Cancel" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:48 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:48 -msgid "Capacity: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:437 -#: ../enigma2_master/lib/python/Components/Harddisk.py:437 -msgid "Card" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:19 -#: ../enigma2_master/lib/python/Components/Language.py:19 -msgid "Catalan" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:32 -msgid "Center screen at the lower border" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:26 -msgid "Center screen at the upper border" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:76 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:77 -msgid "Change active delay" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:469 -msgid "Change default recording offset?" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:76 -msgid "Change hostname" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:198 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:311 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:198 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:311 -msgid "Change pin code" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:90 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:90 -msgid "Change service PIN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:87 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:87 -msgid "Change service PINs" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:81 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:81 -msgid "Change setup PIN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:315 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:315 -msgid "Change step size" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:76 -msgid "Change the hostname of your Dreambox." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:756 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:756 -msgid "Changelog" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:83 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:261 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:273 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:284 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:185 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:21 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:83 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:261 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:273 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:284 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:185 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:21 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Channel" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:85 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Channel Selection" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:61 -msgid "Channel audio:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:333 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:333 -msgid "Channel not in services list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:187 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:187 -msgid "Channel:" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1004 -msgid "Channels" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:429 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:429 -msgid "Chap." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:430 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:430 -msgid "Chapter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:165 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:165 -msgid "Chapter:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:55 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:55 -msgid "Check" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:29 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:29 -msgid "Checking Filesystem..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:224 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:224 -msgid "Choose a wireless network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:152 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:152 -msgid "Choose backup files" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:151 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:151 -msgid "Choose backup location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:735 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:735 -msgid "Choose image to download" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:231 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:231 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:331 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:459 -msgid "Choose target folder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:155 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:155 -msgid "Choose upgrade source" -msgstr "" - -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:33 -#: ../enigma2_master/lib/python/Tools/Transponder.py:33 -msgid "Circular left" -msgstr "" - -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:34 -#: ../enigma2_master/lib/python/Tools/Transponder.py:34 -msgid "Circular right" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:27 -msgid "Classic" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:167 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:167 -msgid "Cleanup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:43 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:133 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:43 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:133 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Cleanup Wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:63 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:125 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:63 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:125 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:129 -msgid "Cleanup Wizard settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:129 -msgid "CleanupWizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:419 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:924 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:419 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:924 -msgid "Clear before scan" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:438 -msgid "Clear history on Exit:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:414 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:414 -msgid "Clear log" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:49 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:39 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:696 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1098 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1356 -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:51 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:186 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:60 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:235 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:57 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:33 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:417 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:525 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:78 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:399 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:495 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:30 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:171 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:471 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:553 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:680 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1075 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1154 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1465 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1676 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1972 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:95 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:205 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:49 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:39 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:696 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1098 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1356 -#: ../enigma2_master/lib/python/Screens/TaskView.py:51 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:186 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:60 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:235 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:57 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:33 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:417 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:525 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:78 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:399 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:495 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:30 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:171 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:471 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:553 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:680 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1075 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1154 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1465 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1676 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1944 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:95 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:205 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:398 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:562 -#: ../enigma2_plugins/mytube/src/plugin.py:281 -#: ../enigma2_plugins/mytube/src/plugin.py:1280 -#: ../enigma2_plugins/mytube/src/plugin.py:1466 -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:54 -#: ../enigma2_plugins/networkbrowser/src/MountView.py:63 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:107 -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:91 -#: ../enigma2_plugins/networkbrowser/src/UserManager.py:50 -msgid "Close" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:89 -msgid "Close and forget changes" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:101 -msgid "Close and save changes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:191 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:191 -msgid "Close title selection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:412 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:412 -msgid "Code rate high" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:413 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:413 -msgid "Code rate low" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:147 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:147 -msgid "Coderate HP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:146 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:146 -msgid "Coderate LP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:150 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:150 -msgid "Collection name" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:139 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:65 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:139 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:65 -msgid "Collection settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:91 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:91 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Color Format" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:189 -#: ../enigma2_plugins/mytube/src/plugin.py:80 -msgid "Comedy" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:315 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:327 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:315 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:327 -msgid "Command order" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:311 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:311 -msgid "Committed DiSEqC command" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:634 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:634 -msgid "Common Interface Assignment" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:860 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:860 -msgid "CommonInterface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:874 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:874 -msgid "Communication" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:438 -#: ../enigma2_master/lib/python/Components/Harddisk.py:438 -msgid "Compact Flash" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:535 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:536 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:535 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:536 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -msgid "Complete" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:34 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:34 -msgid "Complex (allows mixing audio tracks and aspects)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:106 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:160 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:194 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:258 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:361 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:106 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:160 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:194 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:258 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:361 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Configuration Mode" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/plugin.py:540 -msgid "Configuration for the Webinterface" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:71 -msgid "Configure AutoTimer behavior" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:406 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:406 -msgid "Configure your internal LAN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:405 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:405 -msgid "Configure your wireless LAN again" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:106 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1397 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:106 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1397 -msgid "Configuring" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:329 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:329 -msgid "Conflicting timer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:274 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:206 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:274 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:206 -msgid "Connect" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:466 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:466 -msgid "Connect to a Wireless Network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:142 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:299 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:142 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:299 -msgid "Connected to" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:163 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:163 -msgid "Connected!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:148 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:148 -msgid "Constellation" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:294 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:294 -msgid "Content does not fit on DVD!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:612 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:612 -msgid "Continue" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:525 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:525 -msgid "Continue playing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:89 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:145 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:89 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:145 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Contrast" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:646 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:646 -msgid "Could not connect to Dreambox .NFI Image Feed Server:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:293 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:293 -msgid "Could not load Medium! No disc inserted?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:222 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:222 -msgid "Could not open Picture in Picture" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1555 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1555 -#, python-format -msgid "Couldn't record due to conflicting timer %s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:420 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:420 -msgid "Crashlog settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:425 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:425 -msgid "CrashlogAutoSubmit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:425 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:425 -msgid "CrashlogAutoSubmit settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:91 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:91 -msgid "CrashlogAutoSubmit settings..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:339 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:339 -msgid "" -"Crashlogs found!\n" -"Send them to Dream Multimedia?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:35 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:900 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:941 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:124 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:35 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:900 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:941 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:124 -msgid "Create DVD-ISO" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:220 -msgid "Create a new timer using the classic editor" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:222 -msgid "Create a new timer using the wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Create movie folder failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:250 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:250 -#, python-format -msgid "Creating directory %s failed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Creating partition failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:20 -#: ../enigma2_master/lib/python/Components/Language.py:20 -msgid "Croatian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:986 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:986 -msgid "Current Transponder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:223 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:223 -msgid "Current device: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:362 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:362 -msgid "Current settings:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:225 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:113 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:330 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:225 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:113 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:330 -msgid "Current value: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:35 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:35 -msgid "Current version:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:738 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:738 -msgid "Currently installed image" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:287 -#, python-format -msgid "Custom (%s)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:554 -msgid "Custom location" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:513 -msgid "Custom offset" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:84 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:84 -msgid "Cut" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:409 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:409 -msgid "Cutlist editor..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:21 -#: ../enigma2_master/lib/python/Components/Language.py:21 -msgid "Czech" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:204 -#: ../enigma2_plugins/mytube/src/plugin.py:95 -msgid "Czech Republic" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1335 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1335 -msgid "DHCP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -msgid "DUAL LAYER DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:566 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:566 -msgid "DVB-S" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:567 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:567 -msgid "DVB-S2" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:65 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:57 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:65 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:57 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "DVD File Browser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:715 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:715 -msgid "DVD Player" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:102 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:102 -msgid "DVD Titlelist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:58 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:163 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:119 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:58 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:163 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:119 -msgid "DVD media toolbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:22 -#: ../enigma2_master/lib/python/Components/Language.py:22 -msgid "Danish" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimeDateInput.py:46 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:171 -#: ../enigma2_master/lib/python/Screens/TimeDateInput.py:46 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:171 -msgid "Date" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:93 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:93 -msgid "Decide if you want to enable or disable the Cleanup Wizard." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:162 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:162 -msgid "Decide what should be done when crashlogs are found." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:165 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:165 -msgid "Decide what should happen to the crashlogs after submission." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:79 -msgid "Decrease delay" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:83 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:85 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:87 -#, python-format -msgid "Decrease delay by %i ms (can be set)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:82 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:82 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Deep Standby" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:118 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:50 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:118 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:50 -msgid "Default" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:862 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:862 -msgid "Default Settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:91 -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:109 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:91 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:109 -msgid "Default movie location" -msgstr "" - -#: ../enigma2_plugins/cdinfo/src/plugin.py:58 -msgid "Defaults" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:241 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:133 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:120 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:207 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:241 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:133 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:120 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:207 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:75 -#: ../enigma2_plugins/networkbrowser/src/UserManager.py:52 -msgid "Delete" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:23 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:23 -msgid "Delete crashlogs" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:411 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:502 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:411 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:502 -msgid "Delete entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:145 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:663 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:722 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:145 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:663 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:722 -msgid "Delete failed!" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:64 -msgid "Delete mount" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:401 -#, python-format -msgid "" -"Delete no more configured satellite\n" -"%s?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:229 -#: ../enigma2_plugins/mytube/src/plugin.py:120 -msgid "Descending" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:142 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:20 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:81 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:142 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:20 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:81 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:493 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:86 -msgid "Description" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:153 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:153 -msgid "Deselect" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1178 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1178 -msgid "Details for plugin: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/About.py:34 -#: ../enigma2_master/lib/python/Screens/About.py:34 -msgid "Detected HDD:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/About.py:17 -#: ../enigma2_master/lib/python/Screens/About.py:17 -msgid "Detected NIMs:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1156 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_master/lib/python/Components/NimManager.py:1156 -msgid "DiSEqC A/B" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1156 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_master/lib/python/Components/NimManager.py:1156 -msgid "DiSEqC A/B/C/D" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:307 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:307 -msgid "DiSEqC mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:330 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:330 -msgid "DiSEqC repeats" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:568 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:568 -msgid "DiSEqC-Tester settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:189 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:189 -msgid "Dialing:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:103 -msgid "Digital contour removal" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:85 -msgid "Dir:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -msgid "Direct playback of linked titles without menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:388 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:388 -#, python-format -msgid "Directory %s nonexistent." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:43 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:43 -msgid "Directory browser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:146 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:416 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:436 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:146 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:416 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:436 -msgid "Disable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1430 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1430 -msgid "Disable Picture in Picture" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -msgid "Disable crashlog reporting" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:78 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:78 -msgid "Disable timer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:32 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:105 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:471 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:32 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:105 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:471 -msgid "Disabled" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:75 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:80 -msgid "Discard changes and close plugin" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:18 -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:23 -msgid "Discard changes and close screen" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:268 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:268 -msgid "Disconnect" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:86 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:86 -msgid "Display 16:9 content as" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:82 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:82 -msgid "Display 4:3 content as" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:83 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:83 -msgid "Display >16:9 content as" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:870 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:870 -msgid "Display and Userinterface" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:419 -msgid "Display search results by:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:153 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:153 -#, python-format -msgid "" -"Do you really want to REMOVE\n" -"the plugin \"%s\"?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:84 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:84 -msgid "" -"Do you really want to check the filesystem?\n" -"This could take lots of time!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:236 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:86 -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:204 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:128 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:205 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:590 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:655 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:708 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:236 -#: ../enigma2_master/lib/python/Screens/EventView.py:86 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:204 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:128 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:205 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:590 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:655 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:708 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:183 -#, python-format -msgid "Do you really want to delete %s?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:151 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:151 -#, python-format -msgid "" -"Do you really want to download\n" -"the plugin \"%s\"?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:376 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:376 -msgid "Do you really want to exit?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:82 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:269 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:269 -#, python-format -msgid "Do you really want to remove directory %s from the disk?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:224 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:224 -#, python-format -msgid "Do you really want to remove your bookmark of %s?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:434 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:255 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:434 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:255 -msgid "Do you want to burn this collection to DVD medium?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:560 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:560 -#, python-format -msgid "Do you want to download the image to %s ?" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:391 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:393 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:406 -msgid "Do you want to enter a username and password for this host?\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1280 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1789 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1280 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1787 -msgid "Do you want to install the package:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:608 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:608 -msgid "Do you want to play DVD in drive?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:418 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:418 -msgid "Do you want to preview this DVD before burning?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:921 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1287 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1302 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1440 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1796 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1818 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:921 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1287 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1302 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1440 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1794 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1816 -msgid "Do you want to reboot your Dreambox?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1273 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1781 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1273 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1779 -msgid "Do you want to remove the package:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:239 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:239 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Do you want to restore your settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1912 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1912 -msgid "Do you want to resume this playback?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:757 -msgid "Do you want to see more entries?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:168 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:168 -msgid "" -"Do you want to submit your email address and name so that we can contact you " -"if needed?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:233 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:233 -msgid "Do you want to update your Dreambox?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:37 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:136 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:37 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:136 -msgid "" -"Do you want to update your Dreambox?\n" -"After pressing OK, please wait!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1785 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1783 -msgid "Do you want to upgrade the package:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:21 -msgid "Don't ask, just send" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:102 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:102 -msgid "Don't stop current event but disable coming events" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1420 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1420 -#, python-format -msgid "Done - Installed or upgraded %d packages" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:58 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:58 -#, python-format -msgid "Done - Installed, upgraded or removed %d packages with %d errors" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:499 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:508 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:499 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:508 -msgid "Download" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:523 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:724 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:731 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:523 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:724 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:731 -#, python-format -msgid "Download %s from Server" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:31 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:812 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:20 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:24 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:31 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:812 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:20 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:24 -msgid "Download .NFI-Files for USB-Flasher" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:76 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:76 -msgid "Download Plugins" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:538 -msgid "Download Video" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:435 -msgid "Download location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:164 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:164 -msgid "Downloadable new plugins" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:83 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:73 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:101 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1374 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:83 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:73 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:101 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1374 -msgid "Downloading" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:122 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:122 -msgid "Downloading plugin information. Please wait..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1309 -msgid "Downloading screenshots. Please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -msgid "Dreambox format data DVD (HDTV compatible)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1006 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1006 -msgid "Dreambox software because updates are available." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1103 -#: ../enigma2_plugins/mytube/src/plugin.py:1335 -msgid "Duration: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:23 -#: ../enigma2_master/lib/python/Components/Language.py:23 -msgid "Dutch" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:100 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:100 -msgid "Dynamic contrast" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:973 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:397 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:51 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:484 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:973 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:397 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:51 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:484 -msgid "E" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:498 -msgid "EPG encoding" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:101 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:101 -#, python-format -msgid "ERROR - failed to scan (%s)!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1163 -#: ../enigma2_master/lib/python/Components/NimManager.py:1163 -msgid "East" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:424 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:34 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1466 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:424 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:34 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1466 -msgid "Edit" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:421 -msgid "Edit AutoTimer" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:832 -msgid "Edit AutoTimer filters" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1035 -msgid "Edit AutoTimer services" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:376 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:376 -msgid "Edit DNS" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:158 -#: ../enigma2_plugins/autotimer/src/plugin.py:163 -msgid "Edit Timers and scan for new Events" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:43 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:43 -msgid "Edit Title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:99 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:99 -msgid "Edit bouquets list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:128 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:128 -msgid "Edit chapters of current title" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:216 -msgid "Edit new timer defaults" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:88 -msgid "Edit selected AutoTimer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:96 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:96 -msgid "Edit services list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1353 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:510 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:66 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1353 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:510 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:66 -msgid "Edit settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:850 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:850 -msgid "Edit the Nameserver configuration of your Dreambox.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:846 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:846 -msgid "Edit the network configuration of your Dreambox.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:188 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:188 -msgid "Edit title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1591 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1591 -msgid "Edit upgrade source url." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1057 -msgid "Editing" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:45 -msgid "Editor for new AutoTimers" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:193 -#: ../enigma2_plugins/mytube/src/plugin.py:84 -msgid "Education" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:872 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:872 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Electronic Program Guide" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:138 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:408 -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:428 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:138 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:408 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:428 -msgid "Enable" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:61 -msgid "Enable /media" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:199 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:199 -msgid "Enable 5V for active antenna" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:75 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:75 -msgid "Enable Cleanup Wizard?" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:876 -msgid "Enable Filtering" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:65 -msgid "Enable HTTP Access" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:71 -msgid "Enable HTTP Authentication" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:76 -msgid "Enable HTTPS Access" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:81 -msgid "Enable HTTPS Authentication" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1056 -msgid "Enable Service Restriction" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:87 -msgid "Enable Streaming Authentication" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:73 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:73 -msgid "Enable parental control" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:41 -msgid "" -"Enable this to be able to access the AutoTimer Overview from within the " -"extension menu." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:76 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:76 -msgid "Enable timer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:30 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:109 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:475 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:30 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:109 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:475 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:492 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:128 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:85 -msgid "Enabled" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:461 -msgid "" -"Encoding the channel uses for it's EPG data. You only need to change this if " -"you're searching for special characters like the german umlauts." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -msgid "Encrypted: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:522 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:522 -msgid "Encryption" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:530 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:533 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:530 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:533 -msgid "Encryption Key" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:529 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:529 -msgid "Encryption Keytype" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:526 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:526 -msgid "Encryption Type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:263 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:81 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:263 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:81 -msgid "Encryption:" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:538 -msgid "End of \"after event\" timespan" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:510 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:79 -msgid "End of timespan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:51 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:345 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:51 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:345 -msgid "End time" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:181 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:181 -msgid "EndTime" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:16 -#: ../enigma2_master/lib/python/Components/Language.py:16 -msgid "English" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:80 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:80 -msgid "" -"Enigma2 Skinselector\n" -"\n" -"If you experience any problems please contact\n" -"stephan@reichholf.net\n" -"\n" -"© 2006 - Stephan Reichholf" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:526 -msgid "Enter IP to scan..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:379 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:379 -msgid "Enter main menu..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:108 -msgid "Enter new hostname for your Dreambox" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:215 -msgid "Enter options:" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:219 -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:141 -msgid "Enter password:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:19 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:19 -msgid "Enter pin code" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:213 -msgid "Enter share directory:" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:211 -msgid "Enter share name:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:198 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:198 -msgid "Enter the service pin" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:94 -msgid "Enter user and password for host: " -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:217 -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:139 -msgid "Enter username:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:171 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:171 -msgid "Enter your email address so that we can contact you if needed." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:577 -msgid "Enter your search term(s)" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:192 -#: ../enigma2_plugins/mytube/src/plugin.py:83 -msgid "Entertainment" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:284 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:224 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:614 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1430 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1756 -#: ../enigma2_master/lib/python/Components/Task.py:284 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:224 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:614 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1430 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1754 -msgid "Error" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/TuxboxPlugins/pluginrunner.py:34 -#: ../enigma2_master/lib/python/Plugins/Extensions/TuxboxPlugins/pluginrunner.py:34 -msgid "Error executing plugin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:282 -#: ../enigma2_master/lib/python/Components/Task.py:282 -#, python-format -msgid "" -"Error: %s\n" -"Retry?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:24 -#: ../enigma2_master/lib/python/Components/Language.py:24 -msgid "Estonian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Everything is fine" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:143 -msgid "Exact match" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:312 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:315 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:312 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:315 -msgid "Exceeds dual layer medium!" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:885 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:902 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:927 -msgid "Exclude" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:532 -msgid "Execute \"after event\" during timespan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Console.py:43 -#: ../enigma2_master/lib/python/Screens/Console.py:43 -msgid "Execution Progress:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Console.py:55 -#: ../enigma2_master/lib/python/Screens/Console.py:55 -msgid "Execution finished!!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:91 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:91 -msgid "Exif" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:32 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:130 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:525 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:32 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:130 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:525 -msgid "Exit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:180 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:180 -msgid "Exit editor" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:60 -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:66 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:60 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:66 -msgid "Exit input device selection." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:159 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:407 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:159 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:407 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Exit network wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:65 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:71 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:65 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:71 -msgid "Exit the cleanup wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:50 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:50 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:110 -msgid "Expert" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:908 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:908 -msgid "Extended Networksetup Plugin..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:904 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:904 -msgid "Extended Setup..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:141 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:141 -msgid "Extended Software" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:145 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:145 -msgid "Extended Software Plugin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:574 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:574 -msgid "Extensions management" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:377 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:379 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:406 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:145 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:447 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:449 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:85 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:87 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:377 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:379 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:406 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:145 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:447 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:449 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:85 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:87 -msgid "FEC" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:42 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:458 -#: ../enigma2_master/lib/python/Components/Task.py:42 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:458 -msgid "Failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Sensors.py:70 -#: ../enigma2_master/lib/python/Components/Sensors.py:70 -#, python-format -msgid "Fan %d" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:127 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:127 -#, python-format -msgid "Fan %d PWM" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:126 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:126 -#, python-format -msgid "Fan %d Voltage" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1165 -#: ../enigma2_master/lib/python/Components/NimManager.py:1165 -msgid "Fast" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:312 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:312 -msgid "Fast DiSEqC" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1165 -#: ../enigma2_master/lib/python/Components/NimManager.py:1165 -msgid "Fast epoch" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:711 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:528 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:711 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:528 -msgid "Favourites" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:417 -#: ../enigma2_plugins/mytube/src/plugin.py:476 -msgid "Fetching feed entries" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:478 -msgid "Fetching search entries" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Filesystem contains uncorrectable errors" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:181 -#: ../enigma2_plugins/mytube/src/plugin.py:72 -msgid "Film & Animation" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:877 -msgid "Filter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:42 -#: ../enigma2_master/lib/python/Components/Task.py:42 -msgid "Finished" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:218 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:218 -msgid "Finished configuring your network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:975 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:975 -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:132 -msgid "Finished restarting your network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:25 -#: ../enigma2_master/lib/python/Components/Language.py:25 -msgid "Finnish" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:167 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:167 -msgid "Flash" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:211 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:211 -msgid "Flashing failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:979 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:979 -msgid "Following tasks will be done after you press OK!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:135 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:135 -msgid "Format" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerResource.py:18 -#: ../enigma2_plugins/autotimer/src/plugin.py:116 -#, python-format -msgid "" -"Found a total of %d matching Events.\n" -"%d Timer were added and %d modified." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:181 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:181 -msgid "Frame size in full view" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:205 -#: ../enigma2_plugins/mytube/src/plugin.py:96 -msgid "France" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:26 -#: ../enigma2_master/lib/python/Components/Language.py:26 -msgid "French" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:263 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:277 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:288 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:372 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:402 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:409 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:138 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:442 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:80 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:263 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:277 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:288 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:372 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:402 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:409 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:138 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:442 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:80 -msgid "Frequency" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1458 -#: ../enigma2_master/lib/python/Components/NimManager.py:1458 -msgid "Frequency bands" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:182 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:182 -msgid "Frequency scan step size(khz)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1458 -#: ../enigma2_master/lib/python/Components/NimManager.py:1458 -msgid "Frequency steps" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Fri" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:167 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:167 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:48 -msgid "Friday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:44 -#: ../enigma2_master/lib/python/Components/Language.py:44 -msgid "Frisian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/About.py:23 -#: ../enigma2_master/lib/python/Screens/About.py:23 -#, python-format -msgid "Frontprocessor version: %d" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Fsck failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:102 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:102 -msgid "" -"GUI needs a restart to apply a new skin\n" -"Do you want to Restart the GUI now?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:188 -#: ../enigma2_plugins/mytube/src/plugin.py:79 -msgid "Gaming" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:366 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:401 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:404 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:502 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:366 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:401 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:404 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:502 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Gateway" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:102 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:102 -msgid "General AC3 Delay" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:103 -msgid "General PCM Delay" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:133 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:133 -msgid "Genre" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:71 -msgid "Genuine Dreambox" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:398 -#: ../enigma2_plugins/mytube/src/plugin.py:422 -#: ../enigma2_plugins/mytube/src/plugin.py:464 -msgid "Genuine Dreambox validation failed!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:17 -#: ../enigma2_master/lib/python/Components/Language.py:17 -msgid "German" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:206 -#: ../enigma2_plugins/mytube/src/plugin.py:97 -msgid "Germany" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:731 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:731 -msgid "Get latest experimental image" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:724 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:724 -msgid "Get latest release image" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:124 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:124 -msgid "Getting plugin information. Please wait..." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:54 -msgid "Global delay" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:195 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:253 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:195 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:253 -msgid "Goto 0" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:250 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:250 -msgid "Goto position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:95 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py:95 -msgid "Graphical Multi EPG" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:207 -#: ../enigma2_plugins/mytube/src/plugin.py:98 -msgid "Great Britain" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:27 -#: ../enigma2_master/lib/python/Components/Language.py:27 -msgid "Greek" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:98 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:98 -msgid "Green boost" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:150 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:150 -msgid "Guard Interval" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:416 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:416 -msgid "Guard interval mode" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:43 -msgid "Guess existing timer based on begin/end" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:237 -#: ../enigma2_plugins/mytube/src/plugin.py:128 -#: ../enigma2_plugins/mytube/src/plugin.py:790 -msgid "HD videos" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:70 -msgid "HTTP Port" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:80 -msgid "HTTPS Port" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:436 -#: ../enigma2_master/lib/python/Components/Harddisk.py:436 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Harddisk" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1484 -msgid "Help" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:517 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:517 -msgid "Hidden network SSID" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:75 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:77 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:83 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:85 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:430 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:432 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:438 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:440 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:75 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:77 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:83 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:85 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:430 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:432 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:438 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:440 -msgid "Hidden networkname" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:151 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:151 -msgid "Hierarchy Information" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:417 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:417 -msgid "Hierarchy mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:335 -#: ../enigma2_master/lib/python/Screens/Ci.py:335 -msgid "High bitrate support" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:283 -msgid "History" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:209 -#: ../enigma2_plugins/mytube/src/plugin.py:100 -msgid "Holland" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:210 -#: ../enigma2_plugins/mytube/src/plugin.py:101 -msgid "Hong Kong" -msgstr "" - -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:31 -#: ../enigma2_master/lib/python/Tools/Transponder.py:31 -msgid "Horizontal" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1624 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1624 -msgid "How many minutes do you want to record?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:119 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:119 -msgid "How to handle found crashlogs?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:194 -#: ../enigma2_plugins/mytube/src/plugin.py:85 -msgid "Howto & Style" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:91 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:91 -msgid "Hue" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:28 -#: ../enigma2_master/lib/python/Components/Language.py:28 -msgid "Hungarian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:364 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:497 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1341 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:364 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:497 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1341 -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:514 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "IP Address" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:84 -msgid "IP:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:299 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:299 -msgid "ISO file is too large for this filesystem!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:154 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:154 -msgid "ISO path" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:31 -#: ../enigma2_master/lib/python/Components/Language.py:31 -msgid "Icelandic" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:43 -#, python-format -msgid "" -"If this is enabled an existing timer will also be considered recording an " -"event if it records at least 80% of the it." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Scart.py:30 -#: ../enigma2_experimental/lib/python/Screens/Scart.py:32 -#: ../enigma2_master/lib/python/Screens/Scart.py:30 -#: ../enigma2_master/lib/python/Screens/Scart.py:32 -msgid "" -"If you see this, something is wrong with\n" -"your scart connection. Press OK to return." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:87 -#: ../enigma2_master/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 "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:220 -msgid "Import AutoTimer" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:213 -msgid "Import existing Timer" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:214 -msgid "Import from EPG" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:42 -#: ../enigma2_master/lib/python/Components/Task.py:42 -msgid "In Progress" -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:253 -#: ../enigma2_master/RecordTimer.py:253 -msgid "" -"In order to record a timer, the TV was switched to the recording service!\n" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:890 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:907 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:928 -msgid "Include" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:121 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:121 -msgid "Include your email and name (optional) in the mail?" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:78 -msgid "Increase delay" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:84 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:86 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:88 -#, python-format -msgid "Increase delay by %i ms (can be set)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:303 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:303 -msgid "Increased voltage" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:211 -#: ../enigma2_plugins/mytube/src/plugin.py:102 -msgid "India" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:250 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:250 -msgid "Info" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:322 -#: ../enigma2_master/lib/python/Screens/Ci.py:322 -msgid "Init" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:125 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:125 -msgid "Initial location in new timers" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:53 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:53 -msgid "Initialize" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:26 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:26 -msgid "Initializing Harddisk..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputBox.py:11 -#: ../enigma2_master/lib/python/Screens/InputBox.py:11 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Input" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:154 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:154 -msgid "Input device setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:662 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1215 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1973 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:662 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1215 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1945 -msgid "Install" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2006 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1978 -msgid "Install extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:133 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:133 -msgid "Install local extension" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:921 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:921 -msgid "Install or remove finished." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/DefaultWizard.py:107 -#: ../enigma2_master/lib/python/Screens/DefaultWizard.py:107 -msgid "Install settings, skins, software..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1287 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1287 -msgid "Installation finished." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:94 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1018 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1385 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:94 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1018 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1385 -msgid "Installing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1490 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1490 -msgid "Instant Record..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:95 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:95 -msgid "Instant record location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -msgid "Interface: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:49 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:49 -msgid "Intermediate" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:443 -#: ../enigma2_master/lib/python/Components/Harddisk.py:443 -msgid "Internal Flash" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:340 -#: ../enigma2_master/lib/python/Components/Network.py:340 -msgid "Internal LAN adapter." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:401 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:401 -msgid "Invalid Location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:275 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:275 -#, python-format -msgid "Invalid directory selected: %s" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:304 -msgid "Invalid response from Security service pls restart again" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:132 -msgid "Invalid response from server." -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:177 -#, python-format -msgid "Invalid response from server. Please report: %s" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:212 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:266 -msgid "Invalid selection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:373 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:403 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:410 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:142 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:443 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:81 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:373 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:403 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:410 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:142 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:443 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:81 -msgid "Inversion" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2025 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1997 -msgid "Ipkg" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:212 -#: ../enigma2_plugins/mytube/src/plugin.py:103 -msgid "Ireland" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:145 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:145 -msgid "Is this videomode ok?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:213 -#: ../enigma2_plugins/mytube/src/plugin.py:104 -msgid "Israel" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:32 -#: ../enigma2_master/lib/python/Components/Language.py:32 -msgid "Italian" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:214 -#: ../enigma2_plugins/mytube/src/plugin.py:105 -msgid "Italy" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:215 -#: ../enigma2_plugins/mytube/src/plugin.py:106 -msgid "Japan" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: display as fullscreen, even if this breaks the aspect) -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:100 -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:110 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:100 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:110 -msgid "Just Scale" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:264 -#, python-format -msgid "Key %(Key)s successfully set to %(delay)i ms" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:247 -#, python-format -msgid "Key %(key)s (current value: %(value)i ms)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1319 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1319 -msgid "LAN Adapter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:326 -#: ../enigma2_experimental/lib/python/Components/Network.py:329 -#: ../enigma2_master/lib/python/Components/Network.py:326 -#: ../enigma2_master/lib/python/Components/Network.py:329 -msgid "LAN connection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:244 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:244 -msgid "LNB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:249 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:249 -msgid "LOF" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:253 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:265 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:253 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:265 -msgid "LOF/H" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:252 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:264 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:252 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:264 -msgid "LOF/L" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:97 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:161 -#: ../enigma2_master/lib/python/Components/Language.py:97 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:161 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Language selection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:49 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:49 -msgid "Last config" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:116 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:116 -msgid "Last speed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:40 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:334 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:40 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:334 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Latitude" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:30 -#: ../enigma2_master/lib/python/Components/Language.py:30 -msgid "Latvian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:532 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:532 -msgid "Leave DVD Player?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:149 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:149 -msgid "Left" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: black bars on top/bottom) in doubt, keep english term. -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:96 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:96 -msgid "Letterbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:245 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:245 -msgid "Limit east" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:244 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:244 -msgid "Limit west" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:243 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:243 -msgid "Limits off" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:246 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:246 -msgid "Limits on" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:260 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:78 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:260 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:78 -msgid "Link Quality:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:867 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:146 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:867 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:146 -msgid "Link:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -msgid "Linked titles with a DVD menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/config.py:1138 -#: ../enigma2_experimental/lib/python/Components/FileList.py:177 -#: ../enigma2_experimental/lib/python/Components/FileList.py:397 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -#: ../enigma2_master/lib/python/Components/config.py:1138 -#: ../enigma2_master/lib/python/Components/FileList.py:177 -#: ../enigma2_master/lib/python/Components/FileList.py:397 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -msgid "List of Storage Devices" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:29 -#: ../enigma2_master/lib/python/Components/Language.py:29 -msgid "Lithuanian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:110 -msgid "Load" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:423 -msgid "Load feed on startup:" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:64 -msgid "Load movie-length" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1328 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1328 -msgid "Local Network" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:178 -msgid "Local share name" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:188 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:188 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:191 -msgid "Location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:133 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:133 -msgid "Location for instant recordings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:606 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:606 -msgid "Log results to harddisk" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HelpMenu.py:38 -#: ../enigma2_master/lib/python/Screens/HelpMenu.py:38 -msgid "Long Keypress" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/RecordingConfig.py:14 -#: ../enigma2_master/lib/python/Components/RecordingConfig.py:14 -msgid "Long filenames" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:38 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:332 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:38 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:332 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Longitude" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:476 -msgid "Lower bound of timespan." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:467 -msgid "" -"Lower bound of timespan. Nothing before this time will be matched. Offsets " -"are not taken into account!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:439 -#: ../enigma2_master/lib/python/Components/Harddisk.py:439 -msgid "MMC Card" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:175 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:175 -msgid "Make this mark an 'in' point" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:176 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:176 -msgid "Make this mark an 'out' point" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:177 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:177 -msgid "Make this mark just a mark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:70 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:128 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:70 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:128 -msgid "Manage extensions" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/plugin.py:33 -msgid "Manage network shares" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/plugin.py:33 -msgid "Manage your network shares..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2024 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2028 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1996 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2000 -msgid "Manage your receiver's software" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:469 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:469 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -msgid "Manual transponder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:271 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:282 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:271 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:282 -msgid "Manufacturer" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:155 -#, python-format -msgid "Match Timespan: %02d:%02d - %02d:%02d" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:494 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:87 -msgid "Match title" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:137 -#, python-format -msgid "Match title: %s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -msgid "Max. Bitrate: " -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:526 -msgid "Maximum duration (in m)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:473 -msgid "" -"Maximum event duration to match. If an event is longer than this ammount of " -"time (without offset) it won't be matched." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:964 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:964 -msgid "Media player" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:149 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:179 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:292 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:149 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:179 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:292 -msgid "Medium is not a writeable DVD!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:297 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:297 -msgid "Medium is not empty!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:168 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:156 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:158 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:159 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:160 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:161 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:168 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:156 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:158 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:159 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:160 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:161 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:205 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Menu" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:216 -#: ../enigma2_plugins/mytube/src/plugin.py:107 -msgid "Mexico" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Mkfs failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:110 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:62 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:110 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:62 -msgid "Mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:47 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:47 -msgid "Model: " -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:42 -msgid "Modify existing timers" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:380 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:405 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:414 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:136 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:450 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:88 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:380 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:405 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:414 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:136 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:450 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:88 -msgid "Modulation" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Mon" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:109 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:109 -msgid "Mon-Fri" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:163 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:163 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:44 -msgid "Monday" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:285 -msgid "Monthly" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:968 -msgid "More video entries." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:102 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:102 -msgid "Mosquito noise reduction" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:241 -#: ../enigma2_plugins/mytube/src/plugin.py:132 -#: ../enigma2_plugins/mytube/src/plugin.py:797 -msgid "Most discussed" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:243 -#: ../enigma2_plugins/mytube/src/plugin.py:134 -#: ../enigma2_plugins/mytube/src/plugin.py:798 -msgid "Most linked" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:795 -msgid "Most popular" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:245 -#: ../enigma2_plugins/mytube/src/plugin.py:136 -#: ../enigma2_plugins/mytube/src/plugin.py:796 -msgid "Most recent" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:244 -#: ../enigma2_plugins/mytube/src/plugin.py:135 -#: ../enigma2_plugins/mytube/src/plugin.py:800 -msgid "Most responded" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:238 -#: ../enigma2_plugins/mytube/src/plugin.py:129 -#: ../enigma2_plugins/mytube/src/plugin.py:794 -msgid "Most viewed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Mount failed" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:60 -msgid "Mount informations" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:192 -msgid "Mount options" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:180 -msgid "Mount type" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:64 -#: ../enigma2_plugins/networkbrowser/src/plugin.py:33 -msgid "MountManager" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:59 -msgid "" -"Mounted/\n" -"Unmounted" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:74 -msgid "Mountpoints management" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:69 -msgid "Mounts editor" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:108 -msgid "Mounts management" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1438 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1438 -msgid "Move Picture in Picture" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:236 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:236 -msgid "Move east" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:202 -msgid "Move plugin screen" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:22 -msgid "Move screen down" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:29 -msgid "Move screen to the center of your TV" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:19 -msgid "Move screen to the left" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:31 -msgid "Move screen to the lower left corner" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:33 -msgid "Move screen to the lower right corner" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:28 -msgid "Move screen to the middle of the left border" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:30 -msgid "Move screen to the middle of the right border" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:20 -msgid "Move screen to the right" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:25 -msgid "Move screen to the upper left corner" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:27 -msgid "Move screen to the upper right corner" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:21 -msgid "Move screen up" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:233 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:233 -msgid "Move west" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:98 -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:111 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:98 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:111 -msgid "Movie location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:213 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:601 -#: ../enigma2_master/lib/python/Screens/EventView.py:213 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:601 -msgid "Multi EPG" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:868 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:868 -msgid "Multimedia" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:333 -#: ../enigma2_master/lib/python/Screens/Ci.py:333 -msgid "Multiple service support" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:534 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:534 -msgid "Multisat" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:183 -#: ../enigma2_plugins/mytube/src/plugin.py:74 -msgid "Music" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1797 -msgid "My TubePlayer" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:525 -#: ../enigma2_plugins/mytube/src/plugin.py:531 -msgid "MyTube Settings" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:434 -msgid "MyTubePlayer" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:504 -#: ../enigma2_plugins/mytube/src/plugin.py:506 -#: ../enigma2_plugins/mytube/src/plugin.py:513 -msgid "MyTubePlayer Help" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:575 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:591 -msgid "MyTubePlayer active video downloads" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:412 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:415 -msgid "MyTubePlayer settings" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1350 -msgid "MyTubeVideoInfoScreen" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1493 -msgid "MyTubeVideohelpScreen" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:387 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:391 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:394 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:398 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:402 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:733 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:741 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:887 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:234 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:387 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:391 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:394 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:398 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:402 -#: ../enigma2_master/lib/python/Components/NimManager.py:733 -#: ../enigma2_master/lib/python/Components/NimManager.py:741 -#: ../enigma2_master/lib/python/Components/NimManager.py:887 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:234 -msgid "N/A" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:19 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:23 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:19 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py:23 -msgid "NFI Image Flashing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:202 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:202 -msgid "NFI image flashing completed. Press Yellow to Reboot!" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:97 -msgid "NFS share" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:112 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:112 -msgid "NTSC" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:141 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:141 -msgid "Name" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1347 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1347 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Nameserver" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:277 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:277 -#, python-format -msgid "Nameserver %d" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:886 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:886 -msgid "Nameserver settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:365 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:498 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:365 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:498 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Netmask" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:858 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:858 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:440 -#: ../enigma2_master/lib/python/Components/Harddisk.py:440 -msgid "Network Mount" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:515 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:520 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:515 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:520 -msgid "Network SSID" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py:12 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py:21 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py:12 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py:21 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Network Wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:418 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:418 -msgid "Network scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:887 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:887 -msgid "Network test" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1305 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1305 -msgid "Network test: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:372 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:865 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:144 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:372 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:865 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:144 -msgid "Network:" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/plugin.py:32 -msgid "NetworkBrowser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:150 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:913 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:150 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:913 -msgid "NetworkWizard" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:285 -msgid "Never" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:957 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:957 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:814 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1017 -msgid "New" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:320 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:320 -msgid "New PIN" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:217 -#: ../enigma2_plugins/mytube/src/plugin.py:108 -msgid "New Zealand" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:36 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:36 -msgid "New version:" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:191 -#: ../enigma2_plugins/mytube/src/plugin.py:82 -msgid "News & Politics" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:61 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:61 -msgid "Next" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:25 -#: ../enigma2_experimental/lib/python/Screens/Ci.py:27 -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:169 -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:176 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:272 -#: ../enigma2_master/lib/python/Screens/Ci.py:25 -#: ../enigma2_master/lib/python/Screens/Ci.py:27 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:169 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:176 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:272 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:292 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:176 -#: ../enigma2_plugins/mytube/src/plugin.py:67 -#: ../enigma2_plugins/mytube/src/plugin.py:620 -#: ../enigma2_plugins/mytube/src/plugin.py:626 ../enigma2_experimental/data/ -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/data/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_plugins/autotimer/src/ -msgid "No" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:296 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:296 -msgid "No (supported) DVDROM found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:70 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:425 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:454 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:70 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:425 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:454 -msgid "No Connection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1643 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1643 -msgid "No HDD found or HDD not initialized!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:454 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:454 -msgid "No Networks found" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2216 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2216 -msgid "" -"No data on transponder!\n" -"(Timeout reading PAT)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1209 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1209 -msgid "No description available." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:180 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:180 -msgid "No details for this image file" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaScanner/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaScanner/plugin.py:29 -msgid "No displayable files on this medium found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1530 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1530 -msgid "No event info found, recording indefinitely." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:950 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:986 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:950 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:986 -msgid "" -"No fast winding possible yet.. but you can use the number buttons to skip " -"forward/backward!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2214 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2214 -msgid "No free tuner!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:214 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:640 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:214 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:640 -msgid "No network connection available." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:193 -msgid "No network devices found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:338 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:346 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:338 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:346 -msgid "No networks found" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1427 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1427 -msgid "" -"No packages were upgraded yet. So you can check your network and try again." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1751 -msgid "No playable video found! Stop playing this movie?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:586 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:586 -msgid "No positioner capable frontend found." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:261 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:261 -msgid "No satellite frontend found!!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:431 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:431 -msgid "No tags are set on these movies." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:401 -msgid "No to all" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:601 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:601 -msgid "No tuner is configured for use with a diseqc positioner!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:744 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:744 -msgid "" -"No tuner is enabled!\n" -"Please setup your tuner settings before you start a service scan." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:159 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:159 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:157 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:157 -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 "" - -#: ../enigma2_plugins/mytube/src/plugin.py:483 -msgid "No videos to display" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:355 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:355 -msgid "No wireless networks found! Please refresh." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:33 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:33 -msgid "" -"No working local network adapter found.\n" -"Please verify that you have attached a network cable and your network is " -"configured correctly." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:32 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:32 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:706 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:706 -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 "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1744 -msgid "No, but play video again" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:177 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:177 -msgid "No, but restart from begin" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:621 -msgid "No, but switch to video entries." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:627 -msgid "No, but switch to video search." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:52 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:52 -msgid "No, never" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:278 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:278 -msgid "No, not now" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:279 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:279 -msgid "No, send them never" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:586 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:629 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:674 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1149 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1152 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1173 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1175 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1181 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:14 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:61 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:107 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:586 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:629 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:674 -#: ../enigma2_master/lib/python/Components/NimManager.py:1149 -#: ../enigma2_master/lib/python/Components/NimManager.py:1152 -#: ../enigma2_master/lib/python/Components/NimManager.py:1173 -#: ../enigma2_master/lib/python/Components/NimManager.py:1175 -#: ../enigma2_master/lib/python/Components/NimManager.py:1181 -#: ../enigma2_master/lib/python/Tools/Transponder.py:14 -#: ../enigma2_master/lib/python/Tools/Transponder.py:61 -#: ../enigma2_master/lib/python/Tools/Transponder.py:107 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:316 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:339 -#: ../enigma2_plugins/autotimer/src/plugin.py:20 -msgid "None" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: display as fullscreen, with stretching the left/right) -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:108 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:108 -msgid "Nonlinear" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:195 -#: ../enigma2_plugins/mytube/src/plugin.py:86 -msgid "Nonprofits & Activism" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1164 -#: ../enigma2_master/lib/python/Components/NimManager.py:1164 -msgid "North" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:33 -#: ../enigma2_master/lib/python/Components/Language.py:33 -msgid "Norwegian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:368 -#: ../enigma2_master/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 "" - -#: ../enigma2_plugins/mytube/src/plugin.py:485 -msgid "Not fetching feed entries" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:321 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:859 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:861 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:1009 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:1011 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py:90 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:321 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:859 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:861 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:1009 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:1011 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/VideoFinetune.py:147 -#: ../enigma2_master/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 "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:479 -msgid "Number of scheduled recordings left." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:172 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:91 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:58 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:335 -#: ../enigma2_experimental/lib/python/Screens/Setup.py:85 -#: ../enigma2_experimental/lib/python/Screens/TimeDateInput.py:13 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:30 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:61 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:109 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:221 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:42 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:53 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:165 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:583 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:352 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:103 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:48 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:303 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:37 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:172 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:91 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:58 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:335 -#: ../enigma2_master/lib/python/Screens/Setup.py:85 -#: ../enigma2_master/lib/python/Screens/TimeDateInput.py:13 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:30 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:61 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:109 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:221 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:42 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:53 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:165 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:583 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:352 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:48 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:303 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:37 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:67 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:394 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1015 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:45 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:119 -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:53 -#: ../enigma2_plugins/cdinfo/src/plugin.py:57 -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:35 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "OK" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:70 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:70 -msgid "OK, remove another extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:64 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:64 -msgid "OK, remove some extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:107 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:107 -msgid "OSD visibility" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1172 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:12 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:46 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:59 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:114 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:148 -#: ../enigma2_master/lib/python/Components/NimManager.py:1172 -#: ../enigma2_master/lib/python/Tools/Transponder.py:12 -#: ../enigma2_master/lib/python/Tools/Transponder.py:46 -#: ../enigma2_master/lib/python/Tools/Transponder.py:59 -#: ../enigma2_master/lib/python/Tools/Transponder.py:114 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:148 -msgid "Off" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:519 -msgid "Offset after recording (in m)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:518 -msgid "Offset before recording (in m)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1172 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:11 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:45 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:58 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:113 -#: ../enigma2_master/lib/python/Components/NimManager.py:1172 -#: ../enigma2_master/lib/python/Tools/Transponder.py:11 -#: ../enigma2_master/lib/python/Tools/Transponder.py:45 -#: ../enigma2_master/lib/python/Tools/Transponder.py:58 -#: ../enigma2_master/lib/python/Tools/Transponder.py:113 -msgid "On" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:294 -msgid "On any service" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:293 -msgid "On same service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1181 -#: ../enigma2_master/lib/python/Components/NimManager.py:1181 -msgid "One" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:21 -msgid "Only AutoTimers created during this session" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:420 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:420 -msgid "Only Free scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:978 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:978 -msgid "Only extensions." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:503 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:72 -msgid "Only match during timespan" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:164 -#, python-format -msgid "Only on Service: %s" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:95 -msgid "Open Context Menu" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:73 -msgid "Open plugin menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:175 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:175 -msgid "Optionally enter your name if you want to." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:137 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:137 -msgid "Orbital Position" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:42 -msgid "Outer Bound (+/-)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:502 -msgid "Override found with alternative service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:365 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:365 -msgid "Overwrite configuration files ?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:376 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:376 -msgid "Overwrite configuration files during software upgrade?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:112 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:112 -msgid "PAL" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:85 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:85 -msgid "PIDs" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:610 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1357 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1752 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:610 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1357 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1750 -msgid "Package list update" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:154 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:154 -msgid "Packet management" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1744 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1742 -msgid "Packet manager" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: cropped content on left/right) in doubt, keep english term -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:98 -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:106 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:98 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:106 -msgid "Pan&Scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/FileList.py:179 -#: ../enigma2_experimental/lib/python/Components/FileList.py:399 -#: ../enigma2_master/lib/python/Components/FileList.py:179 -#: ../enigma2_master/lib/python/Components/FileList.py:399 -msgid "Parent Directory" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:111 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:111 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Parental control" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:45 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:45 -msgid "Parental control setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:85 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:85 -msgid "Parental control type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:113 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:113 -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:197 -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:130 -msgid "Password" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:45 -msgid "Pause movie at end" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:190 -#: ../enigma2_plugins/mytube/src/plugin.py:81 -msgid "People & Blogs" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:184 -#: ../enigma2_plugins/mytube/src/plugin.py:75 -msgid "Pets & Animals" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:114 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:114 -msgid "Phone number" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:125 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:628 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:629 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:125 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:628 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:629 -msgid "PicturePlayer" -msgstr "" - -#. TRANSLATORS: (aspect ratio policy: black bars on left/right) in doubt, keep english term. -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:104 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:104 -msgid "Pillarbox" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:383 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:143 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:453 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:91 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:383 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:143 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:453 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:91 -msgid "Pilot" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:114 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:114 -msgid "Play" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:490 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1034 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:490 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1034 -msgid "Play Audio-CD..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:531 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:756 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:531 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:756 -msgid "Play DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1022 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1022 -msgid "Play Music..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1798 -msgid "Play YouTube movies" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:249 -#: ../enigma2_plugins/mytube/src/plugin.py:139 -msgid "Play next video" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:45 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:45 -msgid "Play recorded movies..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:249 -#: ../enigma2_plugins/mytube/src/plugin.py:139 -msgid "Play video again" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Please Reboot" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaScanner/plugin.py:48 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaScanner/plugin.py:48 -msgid "Please Select Medium to be Scanned" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:299 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:299 -msgid "Please add titles to the compilation." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1609 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1609 -msgid "Please change recording endtime" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:646 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:646 -msgid "Please check your network settings!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:602 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1359 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:602 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1359 -msgid "Please choose an extension..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/DefaultWizard.py:95 -#: ../enigma2_master/lib/python/Screens/DefaultWizard.py:95 -msgid "Please choose he package..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:56 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:56 -msgid "Please do not change any values unless you know what you are doing!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:186 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:186 -msgid "Please enter a name for the new bouquet" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:260 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:260 -msgid "Please enter a name for the new marker" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:377 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:377 -msgid "Please enter a new filename" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:608 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:608 -msgid "Please enter filename (empty = use current date)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:239 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:239 -msgid "Please enter name of the new directory" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:25 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:25 -msgid "Please enter the correct pin code" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:348 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:348 -msgid "Please enter the old PIN code" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:103 -msgid "Please enter your email address here:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:105 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:105 -msgid "Please enter your name here (optional):" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:485 -msgid "Please enter your search term." -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:383 -#: ../enigma2_master/RecordTimer.py:383 -msgid "" -"Please note that the previously selected media could not be accessed and " -"therefore the default directory is being used instead." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:283 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:264 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:283 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:264 -msgid "Please press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:21 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:21 -msgid "Please press OK!" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:299 -msgid "Please provide a Text to match" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:650 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:650 -msgid "Please select a playlist to delete..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:629 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:629 -msgid "Please select a playlist..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:483 -msgid "Please select a standard feed or try searching for videos." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:350 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:350 -msgid "Please select a subservice to record..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1769 -#: ../enigma2_experimental/lib/python/Screens/SubservicesQuickzap.py:116 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1769 -#: ../enigma2_master/lib/python/Screens/SubservicesQuickzap.py:116 -msgid "Please select a subservice..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:103 -msgid "Please select an NFI file and press green key to flash!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:143 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:151 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:143 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:151 -msgid "Please select an option below." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:268 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:268 -msgid "Please select medium to use as backup location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:428 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:428 -msgid "Please select tag to filter..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:373 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:373 -msgid "Please select the movie path..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PiPSetup.py:34 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:96 -#: ../enigma2_master/lib/python/Components/Language.py:96 -msgid "" -"Please use the UP and DOWN keys to select your language. Afterwards press " -"the OK button." -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:137 -msgid "Please wait (Step 2)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:617 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:617 -msgid "Please wait for activation of your network configuration..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:326 -msgid "Please wait for activation of your network mount..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:160 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:160 -msgid "Please wait while removing selected package..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:113 -msgid "Please wait while removing your network mount..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:236 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:236 -msgid "Please wait while scanning is in progress..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:93 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:93 -msgid "Please wait while searching for removable packages..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:289 -msgid "Please wait while updating your network mount..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:205 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:205 -msgid "Please wait while we configure your network..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:185 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:185 -msgid "Please wait while we prepare your network interfaces..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:228 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:274 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:228 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:274 -msgid "Please wait while we test your network..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:962 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:962 -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:119 -msgid "Please wait while your network is restarting..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1199 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1222 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1229 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:138 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:139 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:140 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:141 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:142 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:143 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1199 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1222 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1229 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:138 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:139 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:140 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:141 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:142 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:143 -msgid "Please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:185 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:67 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:404 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:185 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:67 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:404 -msgid "Please wait... Loading list..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:985 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:985 -msgid "Plugin manager activity information" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1082 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1082 -msgid "Plugin manager help" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:60 -#, python-format -msgid "Plugin: %(plugin)s , Version: %(version)s" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:218 -#: ../enigma2_plugins/mytube/src/plugin.py:109 -msgid "Poland" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:375 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:445 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:83 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:375 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:445 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:83 -msgid "Polarity" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:141 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1171 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:141 -#: ../enigma2_master/lib/python/Components/NimManager.py:1171 -msgid "Polarization" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:34 -#: ../enigma2_master/lib/python/Components/Language.py:34 -msgid "Polish" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:40 -msgid "Poll Interval (in h)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:39 -msgid "Poll automatically" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:25 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:25 -msgid "Port A" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:28 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:28 -msgid "Port B" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:30 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:30 -msgid "Port C" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:31 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:31 -msgid "Port D" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:35 -#: ../enigma2_master/lib/python/Components/Language.py:35 -msgid "Portuguese" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:535 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1157 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:535 -#: ../enigma2_master/lib/python/Components/NimManager.py:1157 -msgid "Positioner" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:192 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:192 -msgid "Positioner fine movement" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:191 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:191 -msgid "Positioner movement" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:605 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:611 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:605 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:611 -msgid "Positioner setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:194 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:194 -msgid "Positioner storage" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:474 -msgid "" -"Power state to change to after recordings. Select \"standard\" to not change " -"the default behavior of enigma2 or values changed by yourself." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:46 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:340 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:46 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:340 -msgid "Power threshold in mA" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:470 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:470 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:140 -msgid "Predefined transponder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:736 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:736 -msgid "Prepare another USB stick for image flashing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:21 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:21 -msgid "Preparing... Please wait" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:123 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:123 -msgid "Press INFO on your remote control for additional information." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:122 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:122 -msgid "Press MENU on your remote control for additional options." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:34 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:330 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:704 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1342 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:34 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:330 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:704 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1342 -msgid "Press OK on your remote control to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:31 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:31 -msgid "Press OK to activate the selected skin." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:243 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:374 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:243 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:374 -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:64 -msgid "Press OK to activate the settings." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:364 -msgid "Press OK to collapse this host" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/UserManager.py:51 -msgid "Press OK to edit selected settings." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:47 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:35 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:47 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:35 -#: ../enigma2_plugins/networkbrowser/src/MountView.py:62 -msgid "Press OK to edit the settings." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:366 -msgid "Press OK to expand this host" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:560 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:560 -#, python-format -msgid "Press OK to get further details for %s" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:360 -msgid "Press OK to mount this share!" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:111 -msgid "Press OK to mount!" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:90 -msgid "Press OK to save settings." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:934 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:934 -msgid "Press OK to scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:421 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:529 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:421 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:529 -msgid "Press OK to select a Provider." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:55 -msgid "Press OK to select." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:369 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:369 -msgid "Press OK to select/deselect a CAId." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:319 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:319 -msgid "Press OK to start the scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1974 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1946 -msgid "Press OK to toggle the selection." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:36 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:36 -msgid "Press yellow to set this interface as default interface." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:60 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:60 -msgid "Prev" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:212 -msgid "Preview" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerPreview.py:76 -msgid "Preview AutoTimer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:127 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:127 -msgid "Preview menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:358 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:358 -msgid "Primary DNS" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:248 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:248 -msgid "Priority" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:689 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:689 -msgid "Process" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:63 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:72 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:63 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:72 -msgid "Properties of current title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:83 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:83 -msgid "Protect services" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:79 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:79 -msgid "Protect setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:710 -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:846 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1460 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:710 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:846 -#: ../enigma2_master/lib/python/Components/NimManager.py:1460 -msgid "Provider" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:166 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:166 -msgid "Provider to scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:955 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:470 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:955 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:470 -msgid "Providers" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:163 -#: ../enigma2_plugins/mytube/src/plugin.py:54 -msgid "Published" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/SocketMMI/plugin.py:25 -#: ../enigma2_master/lib/python/Plugins/Extensions/SocketMMI/plugin.py:25 -msgid "Python frontend for /tmp/mmi.socket" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -msgid "Quick" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1760 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1762 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1765 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1760 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1762 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1765 -msgid "Quickzap" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:71 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:71 -msgid "RGB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:352 -#: ../enigma2_experimental/lib/python/Components/Network.py:354 -#: ../enigma2_master/lib/python/Components/Network.py:352 -#: ../enigma2_master/lib/python/Components/Network.py:354 -msgid "Ralink" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:441 -#: ../enigma2_master/lib/python/Components/Harddisk.py:441 -msgid "Ram Disk" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:592 -msgid "Random" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:164 -#: ../enigma2_plugins/mytube/src/plugin.py:55 -msgid "Rating" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1103 -msgid "Ratings: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:263 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:652 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:440 -#: ../enigma2_experimental/lib/python/Components/ConfigList.py:237 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:222 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:408 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:174 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:263 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:652 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:440 -#: ../enigma2_master/lib/python/Components/ConfigList.py:237 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:222 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:408 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:174 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:627 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:957 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1127 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:226 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:197 -msgid "Really close without saving settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:192 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:192 -msgid "Really delete done timers?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SubservicesQuickzap.py:127 -#: ../enigma2_master/lib/python/Screens/SubservicesQuickzap.py:127 -msgid "Really exit the subservices quickzap?" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:629 -msgid "Really quit MyTube Player?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Standby.py:130 -#: ../enigma2_master/lib/python/Screens/Standby.py:130 -msgid "Really reboot now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Standby.py:134 -#: ../enigma2_master/lib/python/Screens/Standby.py:134 -msgid "Really restart now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Standby.py:128 -#: ../enigma2_master/lib/python/Screens/Standby.py:128 -msgid "Really shutdown now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:223 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:223 -msgid "Reboot" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:240 -#: ../enigma2_plugins/mytube/src/plugin.py:131 -#: ../enigma2_plugins/mytube/src/plugin.py:799 -msgid "Recently featured" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Record" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:541 -msgid "Record a maximum of x times" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1066 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1119 -msgid "Record on" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1553 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1553 -#, python-format -msgid "Record time limited due to conflicting timer %s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:357 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:357 -msgid "Recorded files..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:117 -#: ../enigma2_master/lib/python/Screens/EventView.py:117 -msgid "Recording" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Standby.py:119 -#: ../enigma2_master/lib/python/Screens/Standby.py:119 -msgid "Recording(s) are in progress or coming up in few seconds!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:856 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:856 -msgid "Recordings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:321 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:321 -msgid "Reenter new PIN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:66 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:66 -msgid "Refresh Rate" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:976 -msgid "Related video entries." -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:161 -#: ../enigma2_plugins/mytube/src/plugin.py:52 -msgid "Relevance" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1677 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1677 -msgid "Reload" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:102 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:102 -msgid "Reload Black-/Whitelists" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:93 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:93 -msgid "Remember service PIN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:95 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:95 -msgid "Remember service PIN cancel" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1219 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1219 -msgid "Remove" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:93 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:206 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:93 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:206 -msgid "Remove Bookmark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:75 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:75 -msgid "Remove Plugins" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:179 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:179 -msgid "Remove a mark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:64 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:64 -msgid "Remove currently selected title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1302 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1796 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1302 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1794 -msgid "Remove finished." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:166 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:166 -msgid "Remove plugins" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:102 -msgid "Remove selected AutoTimer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:254 -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:370 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:104 -#: ../enigma2_experimental/lib/python/Screens/EventView.py:164 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:608 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:659 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:254 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:370 -#: ../enigma2_master/lib/python/Screens/EventView.py:104 -#: ../enigma2_master/lib/python/Screens/EventView.py:164 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:608 -#: ../enigma2_master/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py:659 -msgid "Remove timer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:64 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:293 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:64 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:293 -msgid "Remove title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:100 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1020 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1391 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:100 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1020 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1391 -msgid "Removing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:285 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:285 -#, python-format -msgid "Removing directory %s failed. (Maybe not empty.)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:92 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:92 -msgid "Rename" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:23 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:23 -msgid "Rename crashlogs" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:145 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:145 -msgid "Repeat Type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:104 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:104 -msgid "Repeating event currently recording... What do you want to do?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:151 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:151 -msgid "Repeats" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:549 -msgid "Require description to be unique" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -msgid "Required medium type:" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:109 -msgid "Rescan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:321 -#: ../enigma2_master/lib/python/Screens/Ci.py:321 -msgid "Reset" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:129 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:129 -msgid "Reset and renumerate title names" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:547 -msgid "Reset count" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:34 -msgid "Reset saved position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:250 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:250 -msgid "Reset video enhancement settings to system defaults?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:213 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:213 -msgid "Reset video enhancement settings to your last configuration?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:64 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:64 -msgid "Resolution" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:984 -msgid "Response video entries." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:103 -msgid "Restart GUI now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:888 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:888 -msgid "Restart network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1299 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1422 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1299 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1422 -msgid "Restart test" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:856 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:856 -msgid "Restart your network connection and interfaces.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:206 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:206 -msgid "Restore" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:237 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:237 -msgid "Restore backups" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:217 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:312 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:320 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:322 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:217 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:312 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:320 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:322 -msgid "Restore is running..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:264 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:264 -msgid "Restore running" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:132 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:132 -msgid "Restore system settings" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:475 -msgid "Restrict \"after event\" to a certain timespan?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:41 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:41 -msgid "Resume from last position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1912 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1912 -#, python-format -msgid "Resume position at %s" -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.) -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1921 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1921 -msgid "Resuming playback" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:527 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:527 -msgid "Return to file browser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:249 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:252 -#: ../enigma2_plugins/mytube/src/plugin.py:139 -#: ../enigma2_plugins/mytube/src/plugin.py:142 -msgid "Return to movie list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:45 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:43 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:45 -msgid "Return to previous service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:150 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/VideoEnhancement.py:150 -msgid "Right" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:382 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:144 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:452 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:90 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:382 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:144 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:452 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:90 -msgid "Rolloff" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:47 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:341 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:47 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:341 -msgid "Rotor turning speed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:95 -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:141 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:95 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:141 -msgid "Running" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:219 -#: ../enigma2_plugins/mytube/src/plugin.py:110 -msgid "Russia" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:36 -#: ../enigma2_master/lib/python/Components/Language.py:36 -msgid "Russian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:71 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:71 -msgid "S-Video" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -msgid "SINGLE LAYER DVD" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:259 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:77 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:259 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:77 -msgid "SSID:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Sat" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:22 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:147 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:363 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:371 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:387 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:40 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:8 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:430 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:67 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:22 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:147 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:363 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:371 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:387 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:40 -#: ../enigma2_master/lib/python/Tools/Transponder.py:8 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:430 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:67 -msgid "Satellite" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:68 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:74 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:68 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py:74 -msgid "Satellite Equipment Setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:864 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:864 -msgid "Satellite equipment" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:709 -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:848 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:709 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:848 -msgid "Satellites" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:273 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:279 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:273 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:279 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Satfinder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:516 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:516 -msgid "Sats" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:90 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:90 -msgid "Saturation" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:168 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:168 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:49 -msgid "Saturday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:25 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:112 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:221 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:224 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:70 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:58 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:368 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:79 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:116 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1553 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:25 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:112 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:221 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:224 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:70 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:58 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:368 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:79 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:116 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1553 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:64 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:812 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:74 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:399 -msgid "Save" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:608 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:608 -msgid "Save Playlist" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:82 -msgid "Save current delay to key" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:68 -msgid "Save to key" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:74 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:81 -msgid "Save values and close plugin" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:17 -#: ../enigma2_plugins/ac3lipsync/src/MovableScreen.py:24 -msgid "Save values and close screen" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:93 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:110 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:93 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:110 -msgid "Scaler sharpness" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:178 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:178 -msgid "Scaling Mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:930 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:930 -msgid "Scan " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaScanner/plugin.py:94 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaScanner/plugin.py:94 -msgid "Scan Files..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:499 -msgid "Scan NFS share" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:186 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:186 -msgid "Scan QAM128" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:183 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:183 -msgid "Scan QAM16" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:187 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:187 -msgid "Scan QAM256" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:184 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:184 -msgid "Scan QAM32" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:185 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:185 -msgid "Scan QAM64" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:189 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:189 -msgid "Scan SR6875" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:188 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:188 -msgid "Scan SR6900" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:897 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:897 -msgid "Scan Wireless Networks" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:190 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:191 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:190 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:191 -msgid "Scan additional SR" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:175 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:175 -msgid "Scan band EU HYPER" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:170 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:170 -msgid "Scan band EU MID" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:174 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:174 -msgid "Scan band EU SUPER" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:172 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:172 -msgid "Scan band EU UHF IV" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:173 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:173 -msgid "Scan band EU UHF V" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:169 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:169 -msgid "Scan band EU VHF I" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:171 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:171 -msgid "Scan band EU VHF III" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:178 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:178 -msgid "Scan band US HIGH" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:180 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:180 -msgid "Scan band US HYPER" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:176 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:176 -msgid "Scan band US LOW" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:177 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:177 -msgid "Scan band US MID" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:179 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:179 -msgid "Scan band US SUPER" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:500 -msgid "Scan range" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:852 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:852 -msgid "" -"Scan your network for wireless access points and connect to them using your " -"selected wireless device.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py:137 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py:137 -msgid "" -"Scans default lamedbs sorted by satellite with a connected dish positioner" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:196 -#: ../enigma2_plugins/mytube/src/plugin.py:87 -msgid "Science & Technology" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:438 -msgid "Search Term(s)" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:421 -msgid "Search category:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:235 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:235 -msgid "Search east" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/plugin.py:32 -msgid "Search for network shares" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/plugin.py:32 -msgid "Search for network shares..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:422 -msgid "Search region:" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:420 -msgid "Search restricted content:" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:500 -msgid "Search strictness" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:499 -msgid "Search type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:234 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:234 -msgid "Search west" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:607 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:607 -msgid "Searching for available updates. Please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:610 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:610 -msgid "Searching for new installed or removed packages. Please wait..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/NetworkBrowser.py:189 -msgid "Searching your network. Please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:359 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:359 -msgid "Secondary DNS" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:160 -msgid "Security service not running." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:50 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:40 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:155 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:50 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:40 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:155 -msgid "Select" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:462 -msgid "" -"Select \"exact match\" to enforce \"Match title\" to match exactly or " -"\"partial match\" if you only want to search for a part of the event title." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:51 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:51 -msgid "Select Location" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:59 -msgid "Select a timer to import" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:71 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:71 -msgid "Select audio track" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1103 -msgid "Select bouquet to record on" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:225 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:272 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:225 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:272 -msgid "Select channel to record from" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1097 -msgid "Select channel to record on" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:735 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:735 -msgid "Select desired image from feed list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:152 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:152 -msgid "Select files for backup." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:148 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:148 -msgid "Select files/folders to backup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:78 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:78 -msgid "Select input device" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:61 -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:67 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:61 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:67 -msgid "Select input device." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:802 -msgid "Select new feed to view." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:428 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:428 -msgid "Select provider to add..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:533 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:533 -msgid "Select service to add..." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:241 -#, python-format -msgid "Select the key you want to set to %i ms" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:483 -msgid "Select the location to save the recording to." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:925 -msgid "Select type of Filter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1495 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1495 -msgid "Select upgrade source to edit." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:463 -msgid "Select whether or not you want to enforce case correctness." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:528 -#: ../enigma2_plugins/mytube/src/plugin.py:543 -msgid "Select your choice." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:23 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:23 -msgid "Send DiSEqC" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:34 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:34 -msgid "Send DiSEqC only on satellite change" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:33 -msgid "Seperate titles with a main menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:313 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:313 -msgid "Sequence repeat" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:37 -#: ../enigma2_master/lib/python/Components/Language.py:37 -msgid "Serbian" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:182 -msgid "Server IP" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:184 -msgid "Server share" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:53 -msgid "Service delay" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1793 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1793 -msgid "Service has been added to the favourites." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1799 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1799 -msgid "Service has been added to the selected bouquet." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2218 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2218 -msgid "" -"Service invalid!\n" -"(Timeout reading PMT)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2217 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2217 -msgid "" -"Service not found!\n" -"(SID not found in PAT)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2223 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2223 -msgid "" -"Service unavailable!\n" -"Check tuner configuration!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:84 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:84 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Serviceinfo" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:959 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:959 -msgid "Services" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:178 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:178 -msgid "Set End Time" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:33 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:33 -msgid "Set Voltage and 22KHz" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:95 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:95 -msgid "Set available internal memory threshold for the warning." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:89 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:90 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:91 -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:92 -#, python-format -msgid "Set delay to %i ms (can be set)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:65 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:65 -msgid "Set interface as default Interface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:193 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:193 -msgid "Set limits" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:522 -msgid "Set maximum duration" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:458 -msgid "Set this NO to disable this AutoTimer." -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3main.py:252 -msgid "Setting key canceled" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:65 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:82 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:153 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:65 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:82 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:153 -msgid "Settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:63 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:63 -#: ../enigma2_plugins/autotimer/src/AutoTimerOverview.py:215 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Setup" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/plugin.py:35 -msgid "Setup for the Audio Sync Plugin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:151 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:151 -#, python-format -msgid "" -"Shall the USB stick wizard proceed and program the image file %s into flash " -"memory?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:96 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:96 -msgid "Sharpness" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:187 -#: ../enigma2_plugins/mytube/src/plugin.py:78 -msgid "Short Movies" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/RecordingConfig.py:13 -#: ../enigma2_master/lib/python/Components/RecordingConfig.py:13 -msgid "Short filenames" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:466 -msgid "Should this AutoTimer be restricted to a timespan?" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:472 -msgid "Should this AutoTimer only match up to a certain event duration?" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:482 -msgid "" -"Should timers created by this AutoTimer be recorded to a custom location?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1322 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1332 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1338 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1344 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1350 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1322 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1332 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1338 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1344 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1350 -msgid "Show Info" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:899 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:899 -msgid "Show WLAN Status" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:41 -msgid "Show in extension menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:255 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:255 -msgid "Show services beginning with" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:46 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:46 -msgid "Show the radio player..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:47 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:47 -msgid "Show the tv player..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:854 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:854 -msgid "Shows the state of your wireless LAN connection.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:84 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:84 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Shutdown" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:43 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:43 -msgid "Shutdown Dreambox after" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:261 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:79 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:261 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:79 -msgid "Signal Strength:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:276 -msgid "Signal: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:192 -#: ../enigma2_master/lib/python/Screens/EventView.py:192 -msgid "Similar" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:186 -#: ../enigma2_master/lib/python/Screens/EventView.py:186 -msgid "Similar broadcasts:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:48 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:48 -msgid "Simple" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:34 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py:34 -msgid "Simple titleset (compatibility for legacy players)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1155 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_master/lib/python/Components/NimManager.py:1155 -msgid "Single" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:212 -#: ../enigma2_master/lib/python/Screens/EventView.py:212 -msgid "Single EPG" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:534 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:534 -msgid "Single satellite" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:534 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:535 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:536 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:534 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:535 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:536 -msgid "Single transponder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:115 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:115 -msgid "Singlestep (GOP)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:128 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py:128 -msgid "Skin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:854 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:854 -msgid "Skins" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:85 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:87 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:85 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:87 -msgid "Sleep timer action:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:177 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:177 -msgid "Slideshow Interval (sec.)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:300 -#: ../enigma2_experimental/lib/python/Screens/Ci.py:304 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:55 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:59 -#: ../enigma2_master/lib/python/Screens/Ci.py:300 -#: ../enigma2_master/lib/python/Screens/Ci.py:304 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:55 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:59 -#, python-format -msgid "Slot %d" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:38 -#: ../enigma2_master/lib/python/Components/Language.py:38 -msgid "Slovakian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:39 -#: ../enigma2_master/lib/python/Components/Language.py:39 -msgid "Slovenian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1165 -#: ../enigma2_master/lib/python/Components/NimManager.py:1165 -msgid "Slow" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:866 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:866 -msgid "Software" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:193 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2017 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2024 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2028 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:193 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1989 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1996 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:2000 -msgid "Software management" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:339 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:339 -msgid "Software manager setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:130 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:130 -msgid "Software restore" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:129 -msgid "Software update" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:480 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:480 -msgid "Softwaremanager information" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:52 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:52 -msgid "Some plugins are not available:\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:250 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:250 -msgid "Sorry MediaScanner is not installed!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:244 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:244 -msgid "Sorry no backups found!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:86 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:88 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:86 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py:88 -msgid "" -"Sorry your backup destination is not writeable.\n" -"Please choose an other one." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:755 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:755 -msgid "Sorry, no Details available!" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:722 -msgid "Sorry, video is not available!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:301 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:301 -msgid "" -"Sorry, your backup destination is not writeable.\n" -"\n" -"Please choose another one." -msgstr "" - -#. TRANSLATORS: This must fit into the header button in the EPG-List -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:213 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:213 -msgid "Sort A-Z" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerPreview.py:82 -msgid "Sort AutoTimer" -msgstr "" - -#. TRANSLATORS: This must fit into the header button in the EPG-List -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:210 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:210 -#: ../enigma2_plugins/autotimer/src/AutoTimerPreview.py:80 -msgid "Sort Time" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1164 -#: ../enigma2_master/lib/python/Components/NimManager.py:1164 -msgid "South" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:220 -#: ../enigma2_plugins/mytube/src/plugin.py:111 -msgid "South Korea" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:221 -#: ../enigma2_plugins/mytube/src/plugin.py:112 -msgid "Spain" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:40 -#: ../enigma2_master/lib/python/Components/Language.py:40 -msgid "Spanish" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:94 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:94 -msgid "Split preview mode" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:185 -#: ../enigma2_plugins/mytube/src/plugin.py:76 -msgid "Sports" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:87 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:55 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:60 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:87 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:55 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:60 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Standby" -msgstr "" - -#: ../enigma2_experimental/mytest.py:384 ../enigma2_master/mytest.py:384 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Standby / Restart" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:129 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:129 -#, python-format -msgid "Standby Fan %d PWM" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:128 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:128 -#, python-format -msgid "Standby Fan %d Voltage" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:60 -msgid "Start Webinterface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:41 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:41 -msgid "Start from the beginning" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1659 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1659 -msgid "Start recording?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1357 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1357 -msgid "Start test" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:426 -msgid "Start with following feed:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:175 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:175 -msgid "StartTime" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:153 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:153 -msgid "Starting on" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:282 -msgid "Std. Feeds" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:240 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:240 -msgid "Step east" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:43 -msgid "Step in ms for arrow keys" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:48 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:49 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:50 -#, python-format -msgid "Step in ms for key %i" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:45 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:46 -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:47 -#, python-format -msgid "Step in ms for keys '%s'" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:239 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:239 -msgid "Step west" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:228 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:229 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:230 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:231 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:228 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:229 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:230 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:231 -msgid "Stop" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1233 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1233 -msgid "Stop Timeshift?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:101 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:101 -msgid "Stop current event and disable coming events" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEdit.py:100 -#: ../enigma2_master/lib/python/Screens/TimerEdit.py:100 -msgid "Stop current event but not coming events" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:181 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:181 -#: ../enigma2_plugins/mytube/src/plugin.py:1749 -msgid "Stop playing this movie?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1186 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1358 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1186 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1358 -msgid "Stop test" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:597 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:597 -msgid "Stop testing plane after # failed transponders" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:601 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:601 -msgid "Stop testing plane after # successful transponders" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:249 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:249 -msgid "Store position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:355 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:355 -msgid "Stored position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1686 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1686 -msgid "Subservice list..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:118 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:173 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:118 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:173 -msgid "Subtitle selection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:52 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:159 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:52 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:159 -msgid "Subtitles" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Sun" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:169 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:169 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:50 -msgid "Sunday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1435 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1435 -msgid "Swap Services" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:222 -#: ../enigma2_plugins/mytube/src/plugin.py:113 -msgid "Sweden" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:41 -#: ../enigma2_master/lib/python/Components/Language.py:41 -msgid "Swedish" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1691 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1691 -msgid "Switch to next subservice" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1692 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1692 -msgid "Switch to previous subservice" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:550 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:550 -msgid "Switchable tuner types:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:374 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:404 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:444 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:82 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:374 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:404 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:444 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:82 -msgid "Symbol Rate" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:139 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:139 -msgid "Symbolrate" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:366 -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:135 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:437 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:75 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:852 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:366 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:135 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:437 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:75 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:852 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "System" -msgstr "" - -#. TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline) -#: ../enigma2_experimental/lib/python/Screens/About.py:58 -#: ../enigma2_master/lib/python/Screens/About.py:58 -msgid "TRANSLATOR_INFO" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:298 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:298 -msgid "TS file is too large for ISO9660 level 1!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:295 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:295 -msgid "Table of content for collection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:322 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:322 -msgid "Tag 1" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:327 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:327 -msgid "Tag 2" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:334 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:189 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:334 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:189 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:556 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:200 -msgid "Tags" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:484 -msgid "Tags the Timer/Recording will have." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1347 -msgid "Tags: " -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:223 -#: ../enigma2_plugins/mytube/src/plugin.py:114 -msgid "Taiwan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:166 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:169 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:166 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py:169 -msgid "Temperature and Fan control" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:967 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:81 -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:70 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:478 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:967 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:81 -#: ../enigma2_master/lib/python/Tools/Transponder.py:70 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:478 -msgid "Terrestrial" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:198 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:198 -msgid "Terrestrial provider" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:682 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:682 -msgid "Test DiSEqC settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:593 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:593 -msgid "Test Type" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:80 -msgid "Test again" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:848 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:848 -msgid "Test the network configuration of your Dreambox.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py:47 -#: ../enigma2_master/lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py:47 -msgid "Test-Messagebox?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:353 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:353 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:225 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:225 -msgid "" -"The NetworkWizard extension is not installed!\n" -"Please install it." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:367 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:367 -msgid "The PIN code has been changed successfully." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:369 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:369 -msgid "The PIN codes you entered are different." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/PluginBrowser.py:95 -#: ../enigma2_master/lib/python/Screens/PluginBrowser.py:95 -msgid "" -"The Softwaremanagement extension is not installed!\n" -"Please install it." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:601 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:601 -msgid "" -"The USB stick was prepared to be bootable.\n" -"Now you can download an NFI image file!" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:480 -msgid "" -"The counter can automatically be reset to the limit at certain intervals." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:48 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:48 -#, python-format -msgid "" -"The directory %s is not writable.\n" -"Make sure you select a writable directory instead." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:45 -msgid "" -"The editor to be used for new AutoTimers. This can either be the Wizard or " -"the classic editor." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:716 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:716 -#, 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 "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaScanner/plugin.py:35 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaScanner/plugin.py:35 -msgid "The following files were found..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:283 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:283 -msgid "The installation of the default services lists is finished." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/DefaultWizard.py:40 -#: ../enigma2_master/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 "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:644 -msgid "The match attribute is mandatory." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:27 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:27 -msgid "The md5sum validation failed, the file may be corrupted!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:149 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:149 -msgid "The package:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:258 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:258 -#, python-format -msgid "The path %s already exists." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:205 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:37 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:238 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:205 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:37 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:238 -msgid "The pin code you entered is wrong." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:528 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:528 -#, python-format -msgid "The results have been written to %s." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:107 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:107 -msgid "The sleep timer has been activated." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:110 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:110 -msgid "The sleep timer has been disabled." -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:501 -#: ../enigma2_master/RecordTimer.py:501 -msgid "The timer file (timers.xml) is corrupt and could not be loaded." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:750 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:777 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:798 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:924 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:750 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:777 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:798 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:924 -msgid "" -"The wireless LAN plugin is not installed!\n" -"Please install it." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:614 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:614 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "" -"The wizard can backup your current settings. Do you want to do a backup now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:207 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:207 -#, python-format -msgid "" -"The wizard found a configuration backup. Do you want to restore your old " -"settings from %s?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:204 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:209 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:630 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:674 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:685 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:204 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:209 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:630 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:674 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:685 -msgid "There are at least " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:678 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:691 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:678 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:691 -msgid "There are currently no outstanding actions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:632 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:632 -msgid "There are no updates available." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:142 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:150 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:142 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:150 -msgid "There are now " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:364 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:364 -msgid "" -"There might not be enough Space on the selected Partition.\n" -"Do you really want to continue?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:614 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1756 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:614 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1754 -msgid "There was an error downloading the packetlist. Please try again." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:480 -msgid "There was an error getting the feed entries. Please try again." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:141 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:141 -msgid "There was an error. The package:" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:130 -msgid "" -"There's a certificate update available for your dreambox. Would you like to " -"apply this update now?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:178 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:178 -msgid "" -"This DVD RW medium is already formatted - reformatting will erase all " -"content on the disc." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:280 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:286 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:280 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:286 -#, python-format -msgid "This Dreambox can't decode %s streams!" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:169 -#: ../enigma2_plugins/mytube/src/plugin.py:60 -msgid "This Month" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:170 -#: ../enigma2_plugins/mytube/src/plugin.py:61 -msgid "This Week" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:459 -msgid "" -"This is a name you can give the AutoTimer. It will be shown in the Overview " -"and the Preview." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:40 -msgid "" -"This is the delay in hours that the AutoTimer will wait after a search to " -"search the EPG again." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1488 -msgid "This is the help screen. Feed me with something to display." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:460 -msgid "" -"This is what will be looked for in event titles. Note that looking for e.g. " -"german umlauts can be tricky as you have to know the encoding the channel " -"uses." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:693 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:693 -msgid "" -"This plugin creates a USB stick which can be used to update the firmware of " -"your Dreambox without the need for a network or WLAN connection.\n" -"First, a USB stick needs to be prepared so that it becomes bootable.\n" -"In the next step, an NFI image file can be downloaded from the update server " -"and saved on the USB stick.\n" -"If you already have a prepared bootable USB stick, please insert it now. " -"Otherwise plug in a USB stick with a minimum size of 64 MB!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1101 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1101 -msgid "This plugin is installed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1103 -msgid "This plugin is not installed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1105 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1105 -msgid "This plugin will be installed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1107 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1107 -msgid "This plugin will be removed." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:42 -msgid "This setting controls the behavior when a timer matches a found event." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1287 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1287 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1272 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1272 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1282 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1282 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1277 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1277 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1267 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1267 -msgid "This test detects your configured LAN-Adapter." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:44 -msgid "" -"This toggles the behavior on timer conflicts. If an AutoTimer matches an " -"event that conflicts with an existing timer it will not ignore this event " -"but add it disabled." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1181 -#: ../enigma2_master/lib/python/Components/NimManager.py:1181 -msgid "Three" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:254 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:266 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:254 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:266 -msgid "Threshold" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Thu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:61 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:61 -msgid "Thumbnails" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:166 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:166 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:47 -msgid "Thursday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimeDateInput.py:47 -#: ../enigma2_master/lib/python/Screens/TimeDateInput.py:47 -msgid "Time" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:471 -msgid "Time in minutes to append to recording." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:470 -msgid "Time in minutes to prepend to recording." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:143 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:143 -msgid "Timer Type" -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:523 -#: ../enigma2_master/RecordTimer.py:523 -msgid "" -"Timer overlap in timers.xml detected!\n" -"Please recheck it!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:93 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:93 -msgid "Timer record location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:30 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:32 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:30 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:32 -msgid "Timer status:" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:501 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:182 -#: ../enigma2_plugins/autotimer/src/AutoTimerWizard.py:88 -msgid "Timer type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/RecordPaths.py:100 -#: ../enigma2_master/lib/python/Screens/RecordPaths.py:100 -msgid "Timeshift location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1203 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1203 -msgid "Timeshift not possible!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:19 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:158 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:80 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:431 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:127 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py:19 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:158 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:80 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:97 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:431 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:127 -msgid "Title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:63 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:294 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:63 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:294 -msgid "Title properties" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:171 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:171 -msgid "Titleset mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:634 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:634 -msgid "" -"To update your Dreambox firmware, please follow these steps:\n" -"1) Turn off your box with the rear power switch and make sure the bootable " -"USB stick is plugged in.\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 "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:336 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:10 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:336 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:10 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:171 -#: ../enigma2_plugins/mytube/src/plugin.py:62 -msgid "Today" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:158 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:158 -msgid "Tone Amplitude" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:304 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:304 -msgid "Tone mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:310 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:310 -msgid "Toneburst" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1155 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:515 -#: ../enigma2_master/lib/python/Components/NimManager.py:1155 -msgid "Toneburst A/B" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:242 -#: ../enigma2_plugins/mytube/src/plugin.py:133 -#: ../enigma2_plugins/mytube/src/plugin.py:793 -msgid "Top favorites" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:239 -#: ../enigma2_plugins/mytube/src/plugin.py:130 -#: ../enigma2_plugins/mytube/src/plugin.py:792 -msgid "Top rated" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:79 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:79 -msgid "Track" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:149 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:149 -msgid "Transmission Mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:415 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:415 -msgid "Transmission mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:86 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:455 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:93 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:86 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:455 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:93 -msgid "Transponder" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:134 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:134 -msgid "Transponder Type" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:186 -#: ../enigma2_plugins/mytube/src/plugin.py:77 -msgid "Travel & Events" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputBox.py:175 -#: ../enigma2_master/lib/python/Screens/InputBox.py:175 -msgid "Tries left:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:159 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:159 -msgid "Try to find used Transponders in cable network.. please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:261 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:261 -msgid "Try to find used transponders in cable network.. please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1752 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1750 -msgid "Trying to download a new packetlist. Please wait..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:417 -#: ../enigma2_plugins/mytube/src/plugin.py:476 -msgid "Trying to download the Youtube feed entries. Please wait..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:478 -msgid "Trying to download the Youtube search results. Please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Tue" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:164 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:164 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:45 -msgid "Tuesday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:190 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:222 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:428 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:65 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:190 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:222 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:428 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:65 -msgid "Tune" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2215 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2215 -msgid "Tune failed!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:124 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:133 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:510 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:341 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:137 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:124 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:133 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:510 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:341 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:137 -msgid "Tuner" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:528 -#: ../enigma2_master/lib/python/Components/NimManager.py:528 -msgid "Tuner " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceInfo.py:87 -#: ../enigma2_master/lib/python/Screens/ServiceInfo.py:87 -msgid "Tuner status" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:102 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:102 -msgid "Tuner type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:42 -#: ../enigma2_master/lib/python/Components/Language.py:42 -msgid "Turkish" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1181 -#: ../enigma2_master/lib/python/Components/NimManager.py:1181 -msgid "Two" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:272 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:283 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:272 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:283 -msgid "Type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:352 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:355 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:358 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:352 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:355 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:358 -msgid "Type of scan" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:537 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1159 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:537 -#: ../enigma2_master/lib/python/Components/NimManager.py:1159 -msgid "USALS" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:442 -#: ../enigma2_master/lib/python/Components/Harddisk.py:442 -msgid "USB Stick" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:118 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:736 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:118 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:736 -msgid "USB stick wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Language.py:43 -#: ../enigma2_master/lib/python/Components/Language.py:43 -msgid "Ukrainian" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:75 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:75 -msgid "" -"Unable to complete filesystem check.\n" -"Error: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:73 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:73 -msgid "" -"Unable to initialize harddisk.\n" -"Error: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:328 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:328 -msgid "Uncommitted DiSEqC command" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:668 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:668 -msgid "Undo install" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:666 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:666 -msgid "Undo uninstall" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1077 -#: ../enigma2_master/lib/python/Components/NimManager.py:1077 -msgid "Unicable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1138 -#: ../enigma2_master/lib/python/Components/NimManager.py:1138 -msgid "Unicable LNB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1139 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1196 -#: ../enigma2_master/lib/python/Components/NimManager.py:1139 -#: ../enigma2_master/lib/python/Components/NimManager.py:1196 -msgid "Unicable Martix" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:660 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:660 -msgid "Uninstall" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:224 -#: ../enigma2_plugins/mytube/src/plugin.py:115 -msgid "United States" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1076 -#: ../enigma2_master/lib/python/Components/NimManager.py:1076 -msgid "Universal LNB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:358 -#: ../enigma2_master/lib/python/Components/Network.py:358 -msgid "Unknown network adapter." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerSettings.py:39 -msgid "" -"Unless this is enabled AutoTimer will NOT automatically look for events " -"matching your AutoTimers but only when you leave the GUI with the green " -"button." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Harddisk.py:236 -#: ../enigma2_master/lib/python/Components/Harddisk.py:236 -msgid "Unmount failed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:459 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:469 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:459 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py:469 -msgid "Unsupported" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:33 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:686 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:33 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:686 -msgid "Update" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:167 -msgid "Update done..." -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:170 -msgid "" -"Update done... The genuine dreambox test will now be rerun and should not " -"ask you to update again." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:638 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:638 -msgid "Updatefeed not available." -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:150 -msgid "" -"Updating failed. Nothing is broken, just the update couldn't be applied." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:46 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:145 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:46 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:145 -msgid "Updating finished. Here is the result:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:607 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:607 -msgid "Updating software catalog" -msgstr "" - -#: ../enigma2_plugins/genuinedreambox/src/plugin.py:118 -msgid "Updating, please wait..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:52 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:151 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:52 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py:151 -msgid "Updating... Please wait... This can take some minutes..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1440 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1818 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1440 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1816 -msgid "Upgrade finished." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ipkg.py:88 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1022 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1379 -#: ../enigma2_master/lib/python/Screens/Ipkg.py:88 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1022 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1379 -msgid "Upgrading" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1338 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1338 -msgid "Upgrading Dreambox... Please wait" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:477 -msgid "Upper bound of timespan." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:468 -msgid "" -"Upper bound of timespan. Nothing after this time will be matched. Offsets " -"are not taken into account!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:28 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:319 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:28 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:319 -msgid "Use" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:494 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:494 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Use DHCP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:490 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:490 -msgid "Use Interface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:43 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:337 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:43 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:337 -msgid "Use Power Measurement" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:552 -msgid "Use a custom location" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:499 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:499 -msgid "Use a gateway" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:60 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:60 -msgid "Use the Networkwizard to configure selected network adapter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:858 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:858 -msgid "Use the Networkwizard to configure your Network\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputDeviceSetup.py:252 -#: ../enigma2_master/lib/python/Screens/InputDeviceSetup.py:252 -msgid "Use this input device settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:397 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:397 -msgid "Use this settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:164 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:164 -msgid "Use this video enhancement settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:93 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:93 -msgid "Use time of currently running service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:352 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:352 -msgid "Use usals for this sat" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:163 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:163 -msgid "Used service scan type" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1079 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1140 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1196 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1198 -#: ../enigma2_master/lib/python/Components/NimManager.py:1079 -#: ../enigma2_master/lib/python/Components/NimManager.py:1140 -#: ../enigma2_master/lib/python/Components/NimManager.py:1196 -#: ../enigma2_master/lib/python/Components/NimManager.py:1198 -msgid "User defined" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:75 -msgid "User management" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/UserManager.py:60 -msgid "Usermanager" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/Modem/plugin.py:112 -#: ../enigma2_master/lib/python/Plugins/Extensions/Modem/plugin.py:112 -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:195 -#: ../enigma2_plugins/networkbrowser/src/UserDialog.py:128 -msgid "Username" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:173 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:173 -msgid "VMGM (intro trailer)" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:398 -#: ../enigma2_plugins/mytube/src/plugin.py:422 -#: ../enigma2_plugins/mytube/src/plugin.py:464 -msgid "" -"Verify your Dreambox authenticity by running the genuine dreambox plugin!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Tools/Transponder.py:32 -#: ../enigma2_master/lib/python/Tools/Transponder.py:32 -msgid "Vertical" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:33 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:33 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -msgid "Video Fine-Tuning" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:38 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:38 -msgid "Video Fine-Tuning Wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:56 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:56 -msgid "Video Output" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:230 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:230 -msgid "Video Setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:233 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:233 -msgid "Video Wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:310 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:310 -msgid "Video enhancement preview" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:392 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:392 -msgid "Video enhancement settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:58 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:58 -msgid "Video enhancement setup" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:428 -msgid "Videobrowser exit behavior:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:397 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py:397 -msgid "Videoenhancement Setup" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:427 -msgid "Videoplayer stop/exit behavior:" -msgstr "" - -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:162 -#: ../enigma2_plugins/mytube/src/plugin.py:53 -msgid "View Count" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1003 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1003 -msgid "View Movies..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:622 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:622 -msgid "View Photos..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:1427 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:1427 -msgid "View Rass interactive..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1013 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:1013 -msgid "View Video CD..." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:539 -msgid "View active downloads" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:671 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:671 -msgid "View details" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:876 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:876 -msgid "View list of available " -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:860 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:860 -msgid "View list of available CommonInterface extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:870 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:870 -msgid "View list of available Display and Userinterface extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:872 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:872 -msgid "View list of available EPG extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:864 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:864 -msgid "View list of available Satellite equipment extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:874 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:874 -msgid "View list of available communication extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:862 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:862 -msgid "View list of available default settings" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:868 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:868 -msgid "View list of available multimedia extensions." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:858 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:858 -msgid "View list of available networking extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:856 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:856 -msgid "View list of available recording extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:854 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:854 -msgid "View list of available skins" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:866 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:866 -msgid "View list of available software extensions" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:852 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:852 -msgid "View list of available system extensions" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:533 -msgid "View related videos" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:534 -msgid "View response videos" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:2128 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:2128 -msgid "View teletext..." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:74 -msgid "View, edit or delete mountpoints on your Dreambox." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountManager.py:75 -msgid "View, edit or delete usernames and passwords for your network." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1103 -#: ../enigma2_plugins/mytube/src/plugin.py:1344 -msgid "Views: " -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:302 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:302 -msgid "Voltage mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:971 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:395 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:49 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:482 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:971 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:395 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:49 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:482 -msgid "W" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:431 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:431 -msgid "WEP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:348 -#: ../enigma2_experimental/lib/python/Components/Network.py:350 -#: ../enigma2_experimental/lib/python/Components/Network.py:352 -#: ../enigma2_experimental/lib/python/Components/Network.py:354 -#: ../enigma2_experimental/lib/python/Components/Network.py:356 -#: ../enigma2_master/lib/python/Components/Network.py:348 -#: ../enigma2_master/lib/python/Components/Network.py:350 -#: ../enigma2_master/lib/python/Components/Network.py:352 -#: ../enigma2_master/lib/python/Components/Network.py:354 -#: ../enigma2_master/lib/python/Components/Network.py:356 -msgid "WLAN adapter." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:333 -#: ../enigma2_experimental/lib/python/Components/Network.py:336 -#: ../enigma2_master/lib/python/Components/Network.py:333 -#: ../enigma2_master/lib/python/Components/Network.py:336 -msgid "WLAN connection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:432 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:432 -msgid "WPA" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:434 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:434 -msgid "WPA or WPA2" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:433 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:433 -msgid "WPA2" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:93 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/plugin.py:93 -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "WSS on 4:3" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/AC3setup.py:44 -msgid "Wait time in ms before activation:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Task.py:42 -#: ../enigma2_master/lib/python/Components/Task.py:42 -msgid "Waiting" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:76 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py:76 -msgid "Warn if free space drops below (kB):" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/plugin.py:540 -msgid "Webinterface" -msgstr "" - -#: ../enigma2_plugins/webinterface/src/WebIfConfig.py:93 -msgid "Webinterface: Main Setup" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_experimental/lib/python/Components/EpgList.py:38 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:24 -#: ../enigma2_experimental/lib/python/Tools/FuzzyDate.py:13 -#: ../enigma2_master/lib/python/Screens/EpgSelection.py:326 -#: ../enigma2_master/lib/python/Components/EpgList.py:38 -#: ../enigma2_master/lib/python/Components/TimerList.py:24 -#: ../enigma2_master/lib/python/Tools/FuzzyDate.py:13 -msgid "Wed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:165 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:124 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:165 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:46 -msgid "Wednesday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:160 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:160 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:52 -msgid "Weekday" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:51 -msgid "Weekend" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:285 -msgid "Weekly (Monday)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:285 -msgid "Weekly (Sunday)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:207 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:207 -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 "" - -#: ../enigma2_plugins/mytube/src/plugin.py:272 -msgid "" -"Welcome to the MyTube Youtube Player.\n" -"\n" -"Use the Bouqet+ button to navigate to the search field and the Bouqet- to " -"navigate to the video entries.\n" -"\n" -"To play a movie just press OK on your remote control.\n" -"\n" -"Press info to see the movie description.\n" -"\n" -"Press the Menu button for additional options.\n" -"\n" -"The Help button shows this help again." -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:271 -msgid "" -"Welcome to the MyTube Youtube Player.\n" -"\n" -"While entering your search term(s) you will get suggestions displayed " -"matching your search term.\n" -"\n" -"To select a suggestion press DOWN on your remote, select the desired result " -"and press OK on your remote to start the search.\n" -"\n" -"Press exit to get back to the input field." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1163 -#: ../enigma2_master/lib/python/Components/NimManager.py:1163 -msgid "West" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:120 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:120 -msgid "What to do with submitted crashlogs?" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:481 -msgid "" -"When this option is enabled the AutoTimer won't match events where another " -"timer with the same description already exists in the timer list." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/FactoryReset.py:5 -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:522 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:522 -msgid "Where to save temporary timeshift recordings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:466 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:466 -msgid "Wireless LAN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1326 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1326 -msgid "Wireless Network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:116 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:116 -msgid "Wireless Network State" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:465 -msgid "" -"With this option enabled the channel to record on can be changed to a " -"alternative service it is restricted to." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:478 -msgid "" -"With this option you can restrict the AutoTimer to a certain ammount of " -"scheduled recordings. Set this to 0 to disable this functionality." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:28 -msgid "Wizard" -msgstr "" - -#: ../enigma2_experimental/RecordTimer.py:376 -#: ../enigma2_master/RecordTimer.py:376 -msgid "Write error while recording. Disk full?\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:295 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:295 -msgid "Write failed!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:75 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:75 -msgid "YPbPr" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:131 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:131 -msgid "Year" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:25 -#: ../enigma2_experimental/lib/python/Screens/Ci.py:27 -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:168 -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:173 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:276 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:272 -#: ../enigma2_master/lib/python/Screens/Ci.py:25 -#: ../enigma2_master/lib/python/Screens/Ci.py:27 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:168 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:173 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:276 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:561 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:717 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:272 -#: ../enigma2_plugins/mytube/src/MyTubeSearch.py:175 -#: ../enigma2_plugins/mytube/src/plugin.py:66 -#: ../enigma2_plugins/mytube/src/plugin.py:619 -#: ../enigma2_plugins/mytube/src/plugin.py:625 -#: ../enigma2_plugins/mytube/src/plugin.py:1743 ../enigma2_experimental/data/ -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/data/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_plugins/autotimer/src/ -msgid "Yes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:401 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:401 -msgid "Yes to all" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:51 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:51 -msgid "Yes, always" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:175 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:175 -msgid "Yes, and delete this movie" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:277 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:277 -msgid "Yes, and don't ask again" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1745 -msgid "Yes, but play next video" -msgstr "" - -#: ../enigma2_plugins/mytube/src/plugin.py:1746 -msgid "Yes, but play previous video" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:174 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:174 -msgid "Yes, returning to movie list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1105 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1105 -msgid "You can cancel the installation." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1107 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1107 -msgid "You can cancel the removal." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1103 -msgid "You can install this plugin." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:215 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:215 -msgid "You can only burn Dreambox recordings!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1101 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1101 -msgid "You can remove this plugin." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:211 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:130 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:710 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:211 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:130 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:710 -msgid "You cannot delete this!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:282 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:282 -msgid "You didn't select a channel to record from." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:653 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:241 -#, python-format -msgid "" -"You entered \"%s\" as Text to match.\n" -"Do you want to remove trailing whitespaces?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:715 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:715 -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 "" - -#: ../enigma2_experimental/lib/python/Screens/InputBox.py:104 -#: ../enigma2_master/lib/python/Screens/InputBox.py:104 -#, python-format -msgid "You have to wait %s!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:257 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:257 -msgid "" -"Your Dreambox is now ready to use.\n" -"\n" -"Your internet connection is working now.\n" -"\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:705 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:705 -msgid "Your Dreambox will restart after pressing OK on your remote control." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:325 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:325 -msgid "" -"Your collection exceeds the size of a single layer medium, you will need a " -"blank dual layer DVD!" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:87 -#, python-format -msgid "" -"Your config file is not well-formed:\n" -"%s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:239 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:376 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:239 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:376 -msgid "Your current collection will get lost!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1429 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1429 -msgid "" -"Your dreambox isn't connected to the internet properly. Please check it and " -"try again." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:122 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:122 -msgid "Your email address:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:34 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py:34 -msgid "" -"Your frontprocessor firmware must be upgraded.\n" -"Press OK to start upgrade." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:123 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py:123 -msgid "Your name (optional):" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:632 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:634 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:632 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:634 -msgid "Your network configuration has been activated." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:339 -msgid "Your network mount has been activated." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountView.py:128 -msgid "Your network mount has been removed." -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:301 -msgid "Your network mount has been updated." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceStopScreen.py:33 -#: ../enigma2_master/lib/python/Screens/ServiceStopScreen.py:33 -msgid "Zap back to previously tuned service?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:158 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py:158 -msgid "Zap back to service before positioner setup?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:217 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Satfinder/plugin.py:217 -msgid "Zap back to service before satfinder?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:406 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:442 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:463 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:406 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:442 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:463 -msgid "Zap back to service before tuner setup?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/Network.py:350 -#: ../enigma2_master/lib/python/Components/Network.py:350 -msgid "Zydas" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:565 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:565 -msgid "[alternative edit]" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:569 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:569 -msgid "[bouquet edit]" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:571 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:571 -msgid "[favourite edit]" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:663 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:663 -msgid "[move mode]" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:645 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:645 -msgid "a gui to assign services/providers to common interface modules" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:641 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:641 -msgid "a gui to assign services/providers/caids to common interface modules" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:171 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:171 -msgid "abort alternatives edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:165 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:165 -msgid "abort bouquet edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:168 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:168 -msgid "abort favourites edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:55 -#: ../enigma2_master/lib/python/Components/TimerList.py:55 -msgid "about to start" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:249 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:249 -msgid "activate current configuration" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:338 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:338 -msgid "activate network adapter configuration" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/plugin.py:164 -#: ../enigma2_plugins/autotimer/src/plugin.py:165 -msgid "add AutoTimer..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:122 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:122 -msgid "add Provider" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:121 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:121 -msgid "add Service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:255 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:255 -msgid "add a nameserver entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:158 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:158 -msgid "add alternatives" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:408 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:408 -msgid "add bookmark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:140 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:140 -msgid "add bouquet" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:493 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:493 -msgid "add directory to playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:154 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:154 -msgid "add file to playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:495 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:495 -msgid "add files to playlist" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:427 -msgid "add filters" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:148 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:148 -msgid "add marker" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1652 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1662 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1652 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1662 -msgid "add recording (enter recording duration)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1653 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1663 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1653 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1663 -msgid "add recording (enter recording endtime)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1651 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1661 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1651 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1661 -msgid "add recording (indefinitely)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1650 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1660 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1650 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1660 -msgid "add recording (stop after current event)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:120 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:120 -msgid "add service to bouquet" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:123 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:123 -msgid "add service to favourites" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:433 -msgid "add services" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:110 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:110 -msgid "add to parental protection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:63 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:543 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1434 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:63 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:543 -#: ../enigma2_master/lib/python/Components/NimManager.py:1434 -msgid "advanced" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:75 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:75 -msgid "alphabetic sort" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:124 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:124 -msgid "assigned CAIds:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:126 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:126 -msgid "assigned Services/Provider:" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:87 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:87 -#, python-format -msgid "audio track (%s) format" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:88 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:88 -#, python-format -msgid "audio track (%s) language" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:52 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:52 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -msgid "audio tracks" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:241 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:29 -msgid "auto" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:142 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:150 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:142 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:150 -msgid "available" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:173 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:56 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:173 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:56 -msgid "back" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:160 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:160 -msgid "background image" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:183 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:183 -msgid "backgroundcolor" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:23 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:23 -msgid "better" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -msgid "black" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:33 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:33 -msgid "blacklist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -msgid "blue" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:85 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:85 -#, python-format -msgid "burn audio track (%s)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:181 -msgid "case-insensitive search" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:181 -msgid "case-sensitive search" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1654 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1654 -msgid "change recording (duration)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1655 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1655 -msgid "change recording (endtime)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:101 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py:101 -msgid "chapters" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:577 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:577 -msgid "circular left" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:578 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:578 -msgid "circular right" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:171 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:501 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:171 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:501 -msgid "clear playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:28 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:28 -msgid "complex" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1395 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1409 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1395 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1409 -msgid "confirmed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1384 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1440 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:295 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1384 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1440 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:295 -msgid "connected" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:756 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:504 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:756 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py:504 -msgid "continue" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:129 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:129 -msgid "copy to bouquets" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:141 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:141 -msgid "could not be removed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:412 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:412 -msgid "create directory" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:103 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py:103 -#, python-format -msgid "currently installed image: %s" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:109 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:109 -msgid "daily" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -msgid "day" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:813 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:1016 -msgid "delete" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:69 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:71 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:69 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:71 -msgid "delete cut" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:498 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:498 -msgid "delete file" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:170 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:170 -msgid "delete playlist entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:509 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:509 -msgid "delete saved playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:69 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:69 -msgid "delete..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1207 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1207 -msgid "description" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/config.py:449 -#: ../enigma2_master/lib/python/Components/config.py:449 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:128 -msgid "disable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:160 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:160 -msgid "disable move mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1213 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1501 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:69 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1213 -#: ../enigma2_master/lib/python/Components/NimManager.py:1501 -#: ../enigma2_master/lib/python/Components/TimerList.py:69 -msgid "disabled" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1369 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1388 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1435 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1369 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1388 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1435 -msgid "disconnected" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:28 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:28 -msgid "do not change" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1656 -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:51 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1656 -#: ../enigma2_master/lib/python/Screens/TaskView.py:51 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:238 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:26 -msgid "do nothing" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1664 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1664 -msgid "don't record" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:62 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:66 -#: ../enigma2_master/lib/python/Components/TimerList.py:62 -#: ../enigma2_master/lib/python/Components/TimerList.py:66 -msgid "done!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:154 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:154 -msgid "edit alternatives" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:425 -msgid "edit filters" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:431 -msgid "edit services" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:576 -#: ../enigma2_master/lib/python/Components/NimManager.py:576 -msgid "empty" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/config.py:449 -#: ../enigma2_master/lib/python/Components/config.py:449 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:128 -msgid "enable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:150 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:150 -msgid "enable bouquet edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:152 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:152 -msgid "enable favourite edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:146 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:146 -msgid "enable move mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1209 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:548 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1448 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1488 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1209 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:548 -#: ../enigma2_master/lib/python/Components/NimManager.py:1448 -#: ../enigma2_master/lib/python/Components/NimManager.py:1488 -msgid "enabled" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:170 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:170 -msgid "end alternatives edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:164 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:164 -msgid "end bouquet edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:64 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:66 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:64 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:66 -msgid "end cut here" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:167 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:167 -msgid "end favourites edit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:463 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:319 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:368 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:294 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:340 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:365 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:463 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:319 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:368 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:294 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:340 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:365 -msgid "enter hidden network SSID" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:68 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:508 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1436 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:68 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:508 -#: ../enigma2_master/lib/python/Components/NimManager.py:1436 -msgid "equal to" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:180 -msgid "exact match" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:346 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:346 -msgid "exit DVD player or return to file browser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:155 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:155 -msgid "exit mediaplayer" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:237 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:237 -msgid "exit movielist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:248 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:254 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:248 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:254 -msgid "exit nameserver configuration" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:337 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:343 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:337 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:343 -msgid "exit network adapter configuration" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:52 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:58 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:52 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:58 -msgid "exit network interface list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:718 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:724 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:718 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:724 -msgid "exit networkadapter setup menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:628 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:628 -msgid "fileformats (BMP, PNG, JPG, GIF)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:237 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:237 -msgid "filename" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/VideoTune/plugin.py:37 -msgid "fine-tune your display" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:342 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:342 -msgid "forward to the next chapter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:322 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:332 -msgid "free" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/DiskInfo.py:30 -#: ../enigma2_master/lib/python/Components/DiskInfo.py:30 -msgid "free diskspace" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:48 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:99 -#: ../enigma2_master/lib/python/Screens/TaskView.py:48 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:99 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:240 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:27 -msgid "go to deep standby" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:51 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_master/lib/python/Screens/TaskView.py:51 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:102 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:239 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:28 -msgid "go to standby" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:83 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:83 -msgid "grab this frame as bitmap" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -msgid "green" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:63 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:63 -msgid "hear radio..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:85 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:85 -msgid "hide extended description" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:505 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:505 -msgid "hide player" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:575 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:575 -msgid "horizontal" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:25 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:25 -msgid "hour" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:25 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:26 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:25 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:26 -msgid "hours" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:54 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:59 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:54 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:59 -msgid "immediate shutdown" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:796 -msgid "in Description" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:795 -msgid "in Shortdescription" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:794 -msgid "in Title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:327 -#: ../enigma2_experimental/lib/python/Screens/Ci.py:351 -#: ../enigma2_master/lib/python/Screens/Ci.py:327 -#: ../enigma2_master/lib/python/Screens/Ci.py:351 -msgid "init module" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:57 -msgid "init modules" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:79 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:79 -msgid "insert mark here" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:345 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:345 -msgid "jump back to the previous title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:344 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:344 -msgid "jump forward to the next title" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:166 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:166 -msgid "jump to listbegin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:167 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:167 -msgid "jump to listend" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1883 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1883 -msgid "jump to next marked position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1882 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1882 -msgid "jump to previous marked position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:141 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:141 -msgid "leave movie player..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:80 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:80 -msgid "left" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -msgid "length" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:490 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:490 -msgid "list of EPG views..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:80 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:80 -msgid "list style compact" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:79 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:79 -msgid "list style compact with description" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:78 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:78 -msgid "list style default" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:81 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:81 -msgid "list style single line" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:506 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:506 -msgid "load playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TunerInfo.py:77 -#: ../enigma2_master/lib/python/Components/TunerInfo.py:77 -msgid "locked" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:72 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:507 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1439 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:72 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:507 -#: ../enigma2_master/lib/python/Components/NimManager.py:1439 -msgid "loopthrough to" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:539 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1159 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:539 -#: ../enigma2_master/lib/python/Components/NimManager.py:1159 -msgid "manual" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:147 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:223 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:181 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:71 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:165 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:147 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:223 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:181 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/TitleList.py:71 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:165 -msgid "menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:860 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:860 -msgid "menulist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:39 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:41 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:47 -#: ../enigma2_experimental/lib/python/Components/TimerList.py:49 -#: ../enigma2_master/lib/python/Components/TimerList.py:39 -#: ../enigma2_master/lib/python/Components/TimerList.py:41 -#: ../enigma2_master/lib/python/Components/TimerList.py:47 -#: ../enigma2_master/lib/python/Components/TimerList.py:49 -#: ../enigma2_plugins/autotimer/src/AutoTimerPreview.py:52 -msgid "mins" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:23 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:23 -msgid "minute" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputBox.py:104 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:44 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:23 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:24 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:25 -#: ../enigma2_master/lib/python/Screens/InputBox.py:104 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:44 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:23 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:24 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:25 -msgid "minutes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:117 -msgid "month" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:32 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:32 -msgid "move PiP to main picture" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:713 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:713 -msgid "move down to last entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:711 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:711 -msgid "move down to next entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:712 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:712 -msgid "move up to first entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:710 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:710 -msgid "move up to previous entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1138 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1139 -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1140 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1138 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1139 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1140 -msgid "movie list" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/AVSwitch.py:112 -#: ../enigma2_master/lib/python/Components/AVSwitch.py:112 -msgid "multinorm" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:30 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:30 -msgid "never" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:299 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:299 -msgid "next channel" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:301 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:301 -msgid "next channel in history" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MessageBox.py:44 -#: ../enigma2_experimental/lib/python/Screens/MessageBox.py:46 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:923 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:92 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:114 -#: ../enigma2_experimental/lib/python/Components/config.py:439 -#: ../enigma2_master/lib/python/Screens/MessageBox.py:44 -#: ../enigma2_master/lib/python/Screens/MessageBox.py:46 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:923 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:92 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:114 -#: ../enigma2_master/lib/python/Components/config.py:439 -msgid "no" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:231 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:234 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:231 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:234 -msgid "no CAId selected" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:62 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:62 -msgid "no CI slots found" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/HarddiskSetup.py:100 -#: ../enigma2_master/lib/python/Screens/HarddiskSetup.py:100 -msgid "no HDD found" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:189 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:189 -msgid "no Services/Providers selected" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:325 -#: ../enigma2_experimental/lib/python/Screens/Ci.py:349 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:55 -#: ../enigma2_master/lib/python/Screens/Ci.py:325 -#: ../enigma2_master/lib/python/Screens/Ci.py:349 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:55 -msgid "no module found" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:22 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:22 -msgid "no standby" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:15 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:15 -msgid "no timeout" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/About.py:40 -#: ../enigma2_master/lib/python/Screens/About.py:40 -msgid "none" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:61 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:512 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:61 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:512 -msgid "not configured" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TunerInfo.py:79 -#: ../enigma2_master/lib/python/Components/TunerInfo.py:79 -msgid "not locked" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:587 -#: ../enigma2_master/lib/python/Components/NimManager.py:587 -msgid "not supported" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1219 -#: ../enigma2_master/lib/python/Components/NimManager.py:1219 -msgid "not used" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:546 -#: ../enigma2_experimental/lib/python/Components/FileList.py:200 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1161 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1433 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1449 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1489 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:546 -#: ../enigma2_master/lib/python/Components/FileList.py:200 -#: ../enigma2_master/lib/python/Components/NimManager.py:1161 -#: ../enigma2_master/lib/python/Components/NimManager.py:1433 -#: ../enigma2_master/lib/python/Components/NimManager.py:1449 -#: ../enigma2_master/lib/python/Components/NimManager.py:1489 -msgid "nothing connected" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:140 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:140 -msgid "of a DUAL layer medium used." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:143 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:143 -msgid "of a SINGLE layer medium used." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:570 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:605 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:612 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:635 -#: ../enigma2_experimental/lib/python/Components/config.py:444 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:28 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:570 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:605 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:612 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:635 -#: ../enigma2_master/lib/python/Components/config.py:444 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:28 -msgid "off" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:571 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:606 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:613 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:636 -#: ../enigma2_experimental/lib/python/Components/config.py:444 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:28 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:571 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:606 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:613 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:636 -#: ../enigma2_master/lib/python/Components/config.py:444 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:28 -msgid "on" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:146 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py:146 -msgid "on READ ONLY medium." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:797 -msgid "on Weekday" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:103 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:103 -msgid "once" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:344 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:344 -msgid "open nameserver configuration" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:302 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:302 -msgid "open servicelist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:297 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:297 -msgid "open servicelist(down)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:296 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:296 -msgid "open servicelist(up)" -msgstr "" - -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:180 -msgid "partial match" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:137 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:137 -msgid "pass" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:755 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:161 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:755 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:161 -msgid "pause" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:160 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:160 -msgid "play entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:164 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:164 -msgid "play from next mark or playlist entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:163 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:163 -msgid "play from previous mark or playlist entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:93 -#: ../enigma2_master/lib/python/Screens/Ci.py:93 -msgid "please press OK when ready" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/Process.py:462 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:473 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/Process.py:462 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:473 -msgid "please wait, loading picture..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:298 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:298 -msgid "previous channel" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:300 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:300 -msgid "previous channel in history" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:97 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:97 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:187 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:182 -msgid "record" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:60 -#: ../enigma2_master/lib/python/Components/TimerList.py:60 -msgid "recording..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -msgid "red" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:256 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:256 -msgid "remove a nameserver entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:74 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:74 -msgid "remove after this position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:156 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:156 -msgid "remove all alternatives" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:131 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:131 -msgid "remove all new found flags" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:73 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:73 -msgid "remove before this position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:418 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:418 -msgid "remove bookmark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:413 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:413 -msgid "remove directory" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:133 -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:141 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:133 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:141 -msgid "remove entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:112 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:112 -msgid "remove from parental protection" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:135 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:135 -msgid "remove new found flag" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:126 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:126 -msgid "remove selected satellite" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:81 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:81 -msgid "remove this mark" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:92 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:92 -msgid "repeat playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:103 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:103 -msgid "repeated" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:343 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:343 -msgid "rewind to the previous chapter" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:80 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:80 -msgid "right" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:94 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:94 -msgid "save last directory on exit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:508 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:508 -msgid "save playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:93 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:93 -msgid "save playlist on exit" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:96 -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:98 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:96 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:98 -msgid "scan done!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ServiceScan.py:33 -#: ../enigma2_master/lib/python/Components/ServiceScan.py:33 -#, python-format -msgid "scan in progress - %d%% done!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ServiceScan.py:48 -#: ../enigma2_master/lib/python/Screens/ServiceScan.py:48 -msgid "scan state" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:15 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:15 -msgid "second" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:70 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:509 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1437 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:70 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:509 -#: ../enigma2_master/lib/python/Components/NimManager.py:1437 -msgid "second cable of motorized LNB" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InputBox.py:104 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:15 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:16 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:17 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:22 -#: ../enigma2_master/lib/python/Screens/InputBox.py:104 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:15 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:16 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:17 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:22 -msgid "seconds" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:127 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:127 -msgid "select" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:123 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:123 -msgid "select CAId" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:381 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py:381 -msgid "select CAId's" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:53 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:59 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:53 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:59 -msgid "select interface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:719 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:719 -msgid "select menu entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:238 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:238 -msgid "select movie" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:217 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:217 -msgid "select the movie path" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:118 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:147 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:118 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:147 -msgid "service PIN" -msgstr "" - -#: ../enigma2_plugins/ac3lipsync/src/plugin.py:36 -msgid "sets the Audio Delay (LipSync)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:120 -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:140 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:120 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:140 -msgid "setup PIN" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:340 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:340 -msgid "show DVD main menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:489 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:489 -msgid "show EPG..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:180 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:180 -msgid "show Infoline" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:229 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:229 -msgid "show all" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:155 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:155 -msgid "show alternatives" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:402 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:224 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:178 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:402 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:224 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:178 -msgid "show event details" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:87 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:87 -msgid "show extended description" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:230 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:230 -msgid "show first selected tag" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:231 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:231 -msgid "show second selected tag" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:53 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:58 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:53 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:58 -msgid "show shutdown menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:600 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:600 -msgid "show single service EPG..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:232 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:232 -msgid "show tag menu" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ChannelSelection.py:103 -#: ../enigma2_master/lib/python/Screens/ChannelSelection.py:103 -msgid "show transponder info" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:172 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:504 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:172 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:504 -msgid "shuffle playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TaskView.py:50 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:101 -#: ../enigma2_master/lib/python/Screens/TaskView.py:50 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:101 -msgid "shut down" -msgstr "" - -#: ../enigma2_experimental/SleepTimer.py:14 ../enigma2_master/SleepTimer.py:14 -msgid "shutdown" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:62 -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:541 -#: ../enigma2_experimental/lib/python/Components/NimManager.py:1434 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:23 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:62 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:541 -#: ../enigma2_master/lib/python/Components/NimManager.py:1434 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:23 -msgid "simple" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:760 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:760 -msgid "skip backward" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:761 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:761 -msgid "skip backward (enter time)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:758 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:758 -msgid "skip forward" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:759 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:759 -msgid "skip forward (enter time)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:182 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:182 -msgid "slide picture in loop" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:73 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:73 -msgid "sort by date" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ParentalControlSetup.py:249 -#: ../enigma2_master/lib/python/Screens/ParentalControlSetup.py:249 -msgid "special characters" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/RecordingConfig.py:12 -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:31 -#: ../enigma2_master/lib/python/Components/RecordingConfig.py:12 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:31 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:238 -msgid "standard" -msgstr "" - -#: ../enigma2_experimental/SleepTimer.py:14 ../enigma2_master/SleepTimer.py:14 -msgid "standby" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:59 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/CutListEditor/plugin.py:61 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:59 -#: ../enigma2_master/lib/python/Plugins/Extensions/CutListEditor/plugin.py:61 -msgid "start cut here" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/settings.py:96 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/settings.py:96 -msgid "start directory" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1175 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1175 -msgid "start timeshift" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/AudioSelection.py:80 -#: ../enigma2_master/lib/python/Screens/AudioSelection.py:80 -msgid "stereo" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:32 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:32 -msgid "stop PiP" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:162 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:162 -msgid "stop entry" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1649 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1649 -msgid "stop recording" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1176 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1176 -msgid "stop timeshift" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/UsageConfig.py:31 -#: ../enigma2_master/lib/python/Components/UsageConfig.py:31 -msgid "swap PiP and main picture" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:141 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:407 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:141 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:407 -msgid "switch to bookmarks" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:142 -#: ../enigma2_experimental/lib/python/Screens/LocationBox.py:417 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:169 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:500 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:142 -#: ../enigma2_master/lib/python/Screens/LocationBox.py:417 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:169 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:500 -msgid "switch to filelist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:168 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:496 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:168 -#: ../enigma2_master/lib/python/Plugins/Extensions/MediaPlayer/plugin.py:496 -msgid "switch to playlist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:350 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:350 -msgid "switch to the next angle" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:348 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:348 -msgid "switch to the next audio track" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:349 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:349 -msgid "switch to the next subtitle language" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:156 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py:156 -msgid "template file" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:184 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:184 -msgid "textcolor" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:200 -#: ../enigma2_experimental/lib/python/Screens/MovieSelection.py:121 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:200 -#: ../enigma2_master/lib/python/Screens/MovieSelection.py:121 -msgid "this recording" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:111 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:111 -msgid "this service is protected by a parental control pin" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1884 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1884 -msgid "toggle a cut mark at the current position" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:341 -#: ../enigma2_master/lib/python/Plugins/Extensions/DVDPlayer/plugin.py:341 -msgid "toggle time, chapter, audio, subtitle info" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Satconfig.py:552 -#: ../enigma2_master/lib/python/Screens/Satconfig.py:552 -msgid "tuner is not supported" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:338 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:346 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:294 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:340 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:338 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py:346 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:294 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py:340 -msgid "unavailable" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1399 -#: ../enigma2_experimental/lib/python/Screens/NetworkSetup.py:1413 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1399 -#: ../enigma2_master/lib/python/Screens/NetworkSetup.py:1413 -msgid "unconfirmed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1199 -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1204 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1199 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1204 -msgid "unknown" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/EventView.py:123 -#: ../enigma2_master/lib/python/Screens/EventView.py:123 -msgid "unknown service" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:30 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:29 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:30 -msgid "until standby/restart" -msgstr "" - -#: ../enigma2_plugins/networkbrowser/src/MountEdit.py:186 -msgid "use as HDD replacement" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:109 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:109 -msgid "user defined" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:576 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:576 -msgid "vertical" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBarGenerics.py:1307 -#: ../enigma2_master/lib/python/Screens/InfoBarGenerics.py:1307 -msgid "view extensions..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/InfoBar.py:62 -#: ../enigma2_master/lib/python/Screens/InfoBar.py:62 -msgid "view recordings..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/Ci.py:32 -#: ../enigma2_master/lib/python/Screens/Ci.py:32 -msgid "wait for ci..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:21 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:21 -#: ../enigma2_master/lib/python/Plugins/Extensions/SocketMMI/SocketMMI.py:28 -msgid "wait for mmi..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:53 -#: ../enigma2_master/lib/python/Components/TimerList.py:53 -msgid "waiting" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:149 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py:149 -msgid "was removed successfully" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:109 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:109 -msgid "weekly" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/ParentalControl.py:33 -#: ../enigma2_master/lib/python/Components/ParentalControl.py:33 -msgid "whitelist" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:261 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py:261 -msgid "working" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_experimental/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:28 -#: ../enigma2_master/lib/python/Plugins/Extensions/PicturePlayer/plugin.py:29 -msgid "yellow" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/MessageBox.py:44 -#: ../enigma2_experimental/lib/python/Screens/MessageBox.py:46 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:923 -#: ../enigma2_experimental/lib/python/Screens/SleepTimerEdit.py:90 -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:114 -#: ../enigma2_experimental/lib/python/Components/config.py:439 -#: ../enigma2_master/lib/python/Screens/MessageBox.py:44 -#: ../enigma2_master/lib/python/Screens/MessageBox.py:46 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:923 -#: ../enigma2_master/lib/python/Screens/SleepTimerEdit.py:90 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:114 -#: ../enigma2_master/lib/python/Components/config.py:439 -msgid "yes" -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_experimental/lib/python/Screens/ScanSetup.py:923 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:537 -#: ../enigma2_master/lib/python/Screens/ScanSetup.py:923 -msgid "yes (keep feeds)" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1425 -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py:1425 -msgid "" -"your dreambox might be unusable now. Please consult the manual for further " -"assistance before rebooting your dreambox." -msgstr "" - -#: ../enigma2_experimental/lib/python/Screens/TimerEntry.py:97 -#: ../enigma2_master/lib/python/Screens/TimerEntry.py:97 -#: ../enigma2_plugins/autotimer/src/AutoTimerEditor.py:187 -#: ../enigma2_plugins/autotimer/src/AutoTimerImporter.py:182 -msgid "zap" -msgstr "" - -#: ../enigma2_experimental/lib/python/Components/TimerList.py:58 -#: ../enigma2_master/lib/python/Components/TimerList.py:58 -msgid "zapped" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#000000" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#0064c7" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#25062748" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#389416" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#80000000" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#80ffffff" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#bab329" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#f23d21" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#ffffff" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "#ffffffff" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "0" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "1" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "12V output" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "2" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "3" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "4" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "5" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "6" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "7" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "8" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "9" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "About" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Action on long powerbutton press" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Action on short powerbutton press" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Activate network settings" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/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 "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Alpha" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Alternative radio mode" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Alternative services tuner priority" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Audio" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "BER" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "BER:" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Behavior of 'pause' when paused" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Behavior of 0 key in PiP-mode" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Behavior when a movie is started" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Behavior when a movie is stopped" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Behavior when a movie reaches the end" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"By pressing the OK Button on your remote control, the info bar is being " -"displayed." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "C" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Change bouquets in quickzap" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Channellist menu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Choose Tuner" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Choose bouquet" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Choose your Skin" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Command execution..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Common Interface" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Composition of the recording filenames" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Continue in background" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Custom skip time for '1'/'3'-keys" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Custom skip time for '4'/'6'-keys" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Custom skip time for '7'/'9'-keys" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Customize" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "D" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Default services lists" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Delay" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "DiSEqC" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Dish" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Display Setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Do you want to do a service scan?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Do you want to do another manual service scan?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Do you want to enable the parental control feature on your dreambox?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Do you want to install default sat lists?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Do you want to view a tutorial?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Downloadable plugins" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "EPG Selection" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Enable multiple bouquets" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Enter Fast Forward at speed" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Enter Rewind at speed" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Eventview" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Exit wizard" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Extensions" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Factory reset" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Fast Forward speeds" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Filesystem Check" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Finetune" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Frame repeat count during non-smooth winding" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "General AC3 delay (ms)" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "General PCM delay (ms)" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Harddisk setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Harddisk standby after" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Index" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "InfoBar" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Infobar timeout" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Information" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Initialization" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Input devices" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Installing Software..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Installing default sat lists... Please wait..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Installing defaults... Please wait..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Installing package content... Please wait..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Job View" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Keyboard" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Keyboard Map" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Keyboard Setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Keymap" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Language" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Limited character set for recording filenames" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Load Length of Movies in Movielist" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Lock:" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "MORE" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Main menu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Mainmenu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Manual Scan" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Margin after record" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Margin before record (minutes)" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "MediaPlayer" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Message" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Message..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Modulator" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Movielist menu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Mute" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "NEXT" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "NOW" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Nameserver Setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Network Configuration..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Network Setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Network setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Network test..." -msgstr "" - -#: ../enigma2_experimental/data/ -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/data/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "No, just start my dreambox" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "No, scan later manually" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Now Playing" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "OSD Settings" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Parental control services Editor" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "PiPSetup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Pin code needed" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"Please be aware, that anyone can disable the parental control, if you have " -"not set a PIN." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Please choose the default services lists you want to install." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Please set up tuner B" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Please set up tuner C" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Please set up tuner D" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Plugin browser" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Plugins" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "RC Menu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "RF output" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Radio" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Reception Settings" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Recording paths" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Recordings always have priority" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Repeat" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Restart" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Restart GUI" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Rewind speeds" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "SNR" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "SNR:" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Sat / Dish Setup" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Seek" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Select HDD" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Select Network Adapter" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Select a movie" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Service" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Service Scan" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Service Searching" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Service scan" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Setup Mode" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show Message when Recording starts" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show blinking clock in display during recording" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show event-progress in channel selection" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show infobar on channel change" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show infobar on event change" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show infobar on skip forward/backward" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Show positioner movement" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Sleep Timer" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Slow Motion speeds" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Sound" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Soundcarrier" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Subservices" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "TV System" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Test mode" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/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 "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "The package doesn't contain anything." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "There are no default services lists in your image." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "There are no default settings in your image." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "This is step number 2." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Time/Date Input" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer Edit" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer Editor" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer entry" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer log" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer sanity error" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timer selection" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timeshift" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Timezone" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Translation" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Translation:" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Tuner Slot" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Tuner configuration" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "UnhandledKey" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Use non-smooth winding at speeds above" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Use power measurement" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"Use the left and right buttons to change an option.\n" -"\n" -"Please set up tuner A" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"Use the up/down keys on your remote control to select an option. After that, " -"press OK." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Use wizard to set up basic features" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "VCR scart" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Virtual KeyBoard" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Volume" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Welcome..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/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 "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "What do you want to scan?" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Yes, do a manual scan now" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Yes, do an automatic scan now" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Yes, do another manual scan now" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "Yes, view the tutorial" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"You can choose some default settings now. Please select the settings you " -"want to be installed." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "You can choose, what you want to install..." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "You chose not to install any default services lists." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"You chose not to install any default settings. You can however install the " -"default settings later in the settings menu." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "" -"You chose not to install anything. Please press OK finish the install wizard." -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/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 "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "config menu" -msgstr "" - -#: ../enigma2_experimental/data/ ../enigma2_master/data/ -msgid "help..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "No picture on TV? Press EXIT and retry." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Refresh rate selection." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select refresh rate" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select video input with up/down buttons" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Select video mode" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/Videomode/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/Videomode/ -msgid "Video mode selection." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Exit the wizard" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Install a new image with a USB stick" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Install a new image with your web browser" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "No backup needed" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "No, do nothing." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "OK, guide me through the upgrade process" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "The backup failed. Please choose a different backup location." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "The wizard is finished now." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Where do you want to backup your settings?" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Yes, backup my settings!" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Yes, perform a shutdown now." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Yes, restore the settings now" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "" -"You have chosen to backup your settings. Please press OK to start the backup " -"now." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "" -"You have chosen to restore your settings. Enigma2 will restart after " -"restore. Please press OK to start the restore now." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -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 "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "" -"Your backup succeeded. We will now continue to explain the further upgrade " -"process." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/SoftwareManager/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/SoftwareManager/ -msgid "Your dreambox is shutting down. Please stand by..." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Package removal failed.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Package removed successfully.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Please select an extension to remove." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Remove failed." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Removed successfully." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "Select package" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/CleanupWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/CleanupWizard/ -msgid "" -"Welcome to the cleanup wizard.\n" -"\n" -"We have detected that your available internal memory has dropped below 2MB.\n" -"To ensure stable operation of your Dreambox, the internal memory should be " -"cleaned up.\n" -"You can use this wizard to remove some extensions.\n" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Configure interface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Configure nameservers" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Configure your network again" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Please configure or verify your Nameservers by filling out the required " -"values.\n" -"When you are ready press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Please configure your internet connection by filling out the required " -"values.\n" -"When you are ready press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Please follow the instructions on the TV" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Please select the network interface that you want to use for your internet " -"connection.\n" -"\n" -"Please press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Please select the wireless network that you want to connect to.\n" -"\n" -"Please press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Select interface" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "Select wireless network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Thank you for using the wizard.\n" -"Please press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"The wireless LAN plugin is not installed!\n" -"Please install it and choose what you want to do next." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Welcome.\n" -"\n" -"If you want to connect your Dreambox to the Internet, this wizard will guide " -"you through the basic network setup of your Dreambox.\n" -"\n" -"Press OK to start configuring your network" -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Your Dreambox is now ready to use.\n" -"\n" -"Your internet connection is working now.\n" -"\n" -"Please press OK to continue." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Your internet connection is not working!\n" -"Please choose what you want to do next." -msgstr "" - -#: ../enigma2_experimental/lib/python/Plugins/SystemPlugins/NetworkWizard/ -#: ../enigma2_master/lib/python/Plugins/SystemPlugins/NetworkWizard/ -msgid "" -"Your wireless LAN internet connection could not be started!\n" -"Have you attached your USB WLAN Stick?\n" -"\n" -"Please choose what you want to do next." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "Abort this Wizard." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "Create a new AutoTimer." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"Filters are another powerful tool when matching events. An AutoTimer can be " -"restricted to certain Weekdays or only match an event with a text inside eg " -"it's Description.\n" -"Press BLUE to add a new restriction and YELLOW to remove the selected one." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"It's possible to restrict an AutoTimer to certain Services or Bouquets or to " -"deny specific ones.\n" -"An Event will only match this AutoTimer if it's on a specific and not denied " -"Service (inside a Bouquet).\n" -"Press BLUE to add a new restriction and YELLOW to remove the selected one." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "No, remove them." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"Thank you for using the wizard. Your new AutoTimer has been added to the " -"List.\n" -"Please press OK to continue." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"The Timer will not be added to the List.\n" -"Please press OK to close this Wizard." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"The Timespan of an AutoTimer is the first 'advanced' attribute. If a " -"timespan is specified an event will only match this AutoTimer if it lies " -"inside of this timespan." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"Welcome.\n" -"\n" -"This Wizard will help you to create a new AutoTimer by providing " -"descriptions for common settings." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "Yes, keep them." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"You can set the basic properties of an AutoTimer here.\n" -"While 'Name' is just a human-readable name displayed in the Overview, 'Match " -"in title' is what is looked for in the EPG." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"You did not provide a valid 'Match in title' Attribute for your new " -"AutoTimer.\n" -"As this is a mandatory Attribute you cannot continue without doing so." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"You successfully configured a new AutoTimer. Do you want to add it to the " -"list?\n" -"\n" -"You can go back a step by pressing EXIT on your remote." -msgstr "" - -#: ../enigma2_plugins/autotimer/src/ -msgid "" -"Your 'Match in title' Attribute ends with a Whitespace.\n" -"Please confirm if this was intentional, if not they will be removed." -msgstr "" - -#: ../meta_skins/skin_basic-hd.xml -msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir" -msgstr "" - -#: ../meta_skins/skin_basic-hd.xml -msgid "BASIC-HD Skin by Ismail Demir" -msgstr "" - -#: ../meta_skins/skin_brushedalu-hd.xml -msgid "A nice looking HD skin in Brushed Alu Design from Kerni." -msgstr "" - -#: ../meta_skins/skin_brushedalu-hd.xml -msgid "Kerni's BrushedAlu-HD skin" -msgstr "" - -#: ../meta_skins/skin_dmm-hd.xml ../meta_skins/skin_dreammm-hd.xml -#: ../meta_skins/skin_elgato-hd.xml ../meta_skins/skin_ultraviolet.xml -#: ../meta_skins/skin_yads-hd.xml -msgid "a HD skin from Kerni" -msgstr "" - -#: ../meta_skins/skin_dmm-hd.xml -msgid "Kerni's dmm-HD skin" -msgstr "" - -#: ../meta_skins/skin_dreammm-hd.xml -msgid "Kerni's DreamMM-HD skin" -msgstr "" - -#: ../meta_skins/skin_dreamtv-hd.xml ../meta_skins/skin_dtv-hd-reloaded.xml -#: ../meta_skins/skin_dtv-hd.xml -msgid "A nice looking HD skin from Kerni" -msgstr "" - -#: ../meta_skins/skin_dreamtv-hd.xml -msgid "Kerni's dreamTV-HD skin" -msgstr "" - -#: ../meta_skins/skin_dtv-hd-reloaded.xml -msgid "Kerni's dTV-HD-Reloaded skin" -msgstr "" - -#: ../meta_skins/skin_dtv-hd.xml -msgid "Kerni's dTV-HD skin" -msgstr "" - -#: ../meta_skins/skin_elgato-hd.xml -msgid "Kerni's Elgato-HD skin" -msgstr "" - -#: ../meta_skins/skin_kerni-hd1.xml -msgid "Kerni-HD1 skin" -msgstr "" - -#: ../meta_skins/skin_kerni-hd1.xml -msgid "Kernis HD1 skin" -msgstr "" - -#: ../meta_skins/skin_kerni-hd1r2.xml -msgid "Kerni-HD1R2 skin" -msgstr "" - -#: ../meta_skins/skin_kerni-hd1r2.xml -msgid "redesigned Kerni-HD1 skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.blackbox.xml -msgid "Nemesis BlackBox Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.blackbox.xml -msgid "Nemesis BlackBox Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.extended.xml -msgid "Nemesis Blueline.Extended Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.extended.xml -msgid "Nemesis Blueline.Extended Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.single.xml -msgid "Nemesis Blueline Single Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.single.xml -msgid "Nemesis Blueline Single Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.xml -msgid "Nemesis Blueline Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.blueline.xml -msgid "Nemesis Blueline Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.chromeline.cobolt.xml -msgid "Nemesis ChromeLine Cobolt Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.chromeline.cobolt.xml -msgid "Nemesis ChromeLine Cobolt Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.chromeline.xml -msgid "Nemesis ChromeLine Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.chromeline.xml -msgid "Nemesis ChromeLine Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.flatline.blue.xml -msgid "Nemesis Flatline Blue Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.flatline.blue.xml -msgid "Nemesis Flatline Blue Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.flatline.xml -msgid "Nemesis Flatline Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.flatline.xml -msgid "Nemesis Flatline Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.glassline.xml -msgid "Nemesis GlassLine Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.glassline.xml -msgid "Nemesis GlassLine Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.extended.xml -msgid "Nemesis Greenline Extended Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.extended.xml -msgid "Nemesis Greenline Extended Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.single.xml -msgid "Nemesis Greenline Single Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.single.xml -msgid "Nemesis Greenline Single Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.xml -msgid "Nemesis Greenline Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.greenline.xml -msgid "Nemesis Greenline Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.extended.xml -msgid "Nemesis Greyline Extended Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.extended.xml -msgid "Nemesis Greyline Extended Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.single.xml -msgid "Nemesis Greyline Single Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.single.xml -msgid "Nemesis Greyline Single Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.xml -msgid "Nemesis Greyline Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.greyline.xml -msgid "Nemesis Greyline Skin" -msgstr "" - -#: ../meta_skins/skin_nemesis.shadowline.xml -msgid "Nemesis ShadowLine Skin for the Dreambox" -msgstr "" - -#: ../meta_skins/skin_nemesis.shadowline.xml -msgid "Nemesis ShadowLine Skin" -msgstr "" - -#: ../meta_skins/skin_simple.xml ../meta_skins/skin_swain-hd.xml -#: ../meta_skins/skin_swain.xml -msgid "A nice looking skin from Kerni" -msgstr "" - -#: ../meta_skins/skin_simple.xml -msgid "Kerni's simple skin" -msgstr "" - -#: ../meta_skins/skin_swain-hd.xml -msgid "Kerni's SWAIN-HD skin" -msgstr "" - -#: ../meta_skins/skin_swain.xml -msgid "Kerni's SWAIN skin" -msgstr "" - -#: ../meta_skins/skin_ultraviolet.xml -msgid "Kerni's UltraViolet skin" -msgstr "" - -#: ../meta_skins/skin_vali-xd.xml -msgid "Vali-XD skin" -msgstr "" - -#: ../meta_skins/skin_vali-xd.xml -msgid "The skin is in KingSize-definition 1024x576" -msgstr "" - -#: ../meta_skins/skin_vali.hd.nano.xml -msgid "Vali.HD.nano skin" -msgstr "" - -#: ../meta_skins/skin_vali.hd.nano.xml -msgid "A BackToTheRoots-Skin .. or good old times." -msgstr "" - -#: ../meta_skins/skin_vali.hd.nano.xml -msgid "A BackToTheRoots-Skin ... or good old times." -msgstr "" - -#: ../meta_skins/skin_yads-hd.xml -msgid "Kerni's YADS-HD skin" -msgstr "" - -#: ../meta_plugins/plugin_aihdcontrol.xml -msgid "First generate your skin-style with the Ai.HD-Control plugin." -msgstr "" - -#: ../meta_plugins/plugin_aihdcontrol.xml -msgid "Ai.HD skin-style control plugin" -msgstr "" - -#: ../meta_plugins/plugin_antiscrollbar.xml -msgid "" -"With AntiScrollbar you can cover up annoying ticker lines (e.g. in news " -"channels)." -msgstr "" - -#: ../meta_plugins/plugin_antiscrollbar.xml -msgid "Overlay for scrolling bars" -msgstr "" - -#: ../meta_plugins/plugin_ardmediathek.xml -msgid "Access to the ARD-Mediathek online video database." -msgstr "" - -#: ../meta_plugins/plugin_ardmediathek.xml -msgid "Access to the ARD-Mediathek" -msgstr "" - -#: ../meta_plugins/plugin_audiosync.xml -msgid "" -"AudoSync allows delaying the sound output (Bitstream/PCM) so that it is " -"synchronous to the picture." -msgstr "" - -#: ../meta_plugins/plugin_audiosync.xml -msgid "Set Bitstream/PCM audio delays" -msgstr "" - -#: ../meta_plugins/plugin_automatictimerlistcleanup.xml -msgid "Cleanup timerlist automatically." -msgstr "" - -#: ../meta_plugins/plugin_automatictimerlistcleanup.xml -msgid "Cleanup timerlist automatically" -msgstr "" - -#: ../meta_plugins/plugin_automaticvolumeadjustment.xml -msgid "Automatic volume adjustment" -msgstr "" - -#: ../meta_plugins/plugin_automaticvolumeadjustment.xml -msgid "Automatic volume adjustment for ac3/dts services." -msgstr "" - -#: ../meta_plugins/plugin_autoresolution.xml -msgid "Automatically change video resolution" -msgstr "" - -#: ../meta_plugins/plugin_autoresolution.xml -msgid "" -"Automatically changes the output resolution depending on the video " -"resolution you are watching." -msgstr "" - -#: ../meta_plugins/plugin_autotimer.xml -msgid "" -"AutoTimer scans the EPG and creates Timers depending on user-defined search " -"criteria." -msgstr "" - -#: ../meta_plugins/plugin_autotimer.xml -msgid "Automatically create timer events based on keywords" -msgstr "" - -#: ../meta_plugins/plugin_babelzapper.xml -msgid "Control your dreambox with only the MUTE button" -msgstr "" - -#: ../meta_plugins/plugin_babelzapper.xml -msgid "Control your dreambox with only the MUTE button." -msgstr "" - -#: ../meta_plugins/plugin_bitrateviewer.xml -msgid "Shows average bitrate of video and audio" -msgstr "" - -#: ../meta_plugins/plugin_bonjour.xml -msgid "Bonjour/Avahi control plugin." -msgstr "" - -#: ../meta_plugins/plugin_bonjour.xml -msgid "Bonjour/Avahi control plugin" -msgstr "" - -#: ../meta_plugins/plugin_cdinfo.xml -msgid "" -"CDInfo enables gathering album and track details from CDDB and CD-Text when " -"playing Audio CDs in Mediaplayer." -msgstr "" - -#: ../meta_plugins/plugin_cdinfo.xml -msgid "Get AudioCD info from CDDB and CD-Text" -msgstr "" - -#: ../meta_plugins/plugin_dreamirc.xml -msgid "IRC Client for Enigma2" -msgstr "" - -#: ../meta_plugins/plugin_dreamirc.xml -msgid "Simple IRC GroupChat client for e2 #dm8000-vip channel" -msgstr "" - -#: ../meta_plugins/plugin_dvdbackup.xml -msgid "Create a backup of your Video-DVD" -msgstr "" - -#: ../meta_plugins/plugin_dvdbackup.xml -msgid "Create a backup of your Video DVD on your DreamBox hard drive." -msgstr "" - -#: ../meta_plugins/plugin_dyndns.xml -msgid "A client for www.dyndns.org" -msgstr "" - -#: ../meta_plugins/plugin_eibox.xml -msgid "Visualization for the European Installation Bus" -msgstr "" - -#: ../meta_plugins/plugin_eibox.xml -msgid "" -"Visualize and control your lights, dimmers, blinds, thermostats etc. through " -"EIB/KNX. (linknx server required)" -msgstr "" - -#: ../meta_plugins/plugin_elektro.xml -msgid "Sets your Dreambox into Deep-Standby" -msgstr "" - -#: ../meta_plugins/plugin_elektro.xml -msgid "" -"The Elektro Power Save plugin puts the box from standby to sleep mode (Deep " -"Standby) at certain times.\n" -"This only happens if the box is in standby and no recording is running or " -"sheduled in the next 20 minutes.\n" -"The box automatically wakes up for recordings or at the end of the sleep " -"time. You therefore don't have to wait until it is on again." -msgstr "" - -#: ../meta_plugins/plugin_emailclient.xml -msgid "IMAP4 e-mail viewer for the Dreambox" -msgstr "" - -#: ../meta_plugins/plugin_emailclient.xml -msgid "Emailclient is an IMAP4 e-mail viewer for the Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_epgrefresh.xml -msgid "" -"EPGRefresh will automatically switch to user-defined channels when the box " -"is idleing\n" -"(in standby mode without any running recordings) to perform updates of the " -"epg information on these channels." -msgstr "" - -#: ../meta_plugins/plugin_epgrefresh.xml -msgid "Automatically refresh EPG" -msgstr "" - -#: ../meta_plugins/plugin_epgsearch.xml -msgid "Search through the EPG" -msgstr "" - -#: ../meta_plugins/plugin_epgsearch.xml -msgid "With EPGSearch you can search through the EPG and create timers." -msgstr "" - -#: ../meta_plugins/plugin_filebrowser.xml -msgid "Manage local files" -msgstr "" - -#: ../meta_plugins/plugin_filebrowser.xml -msgid "Copy, rename, delete, move local files on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_fritzcall.xml -msgid "Callmonitor for the Fritz!Box routers" -msgstr "" - -#: ../meta_plugins/plugin_fritzcall.xml -msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_ftpbrowser.xml -msgid "A basic ftp client" -msgstr "" - -#: ../meta_plugins/plugin_ftpbrowser.xml -msgid "" -"FTPBrowser allows uploading and downloading files between your Dreambox and " -"a server using the file transfer protocol." -msgstr "" - -#: ../meta_plugins/plugin_genuinedreambox.xml -msgid "With Genuine Dreambox you can verify the authenticity of your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_genuinedreambox.xml -msgid "Genuine Dreambox verification" -msgstr "" - -#: ../meta_plugins/plugin_googlemaps.xml -msgid "View Google maps" -msgstr "" - -#: ../meta_plugins/plugin_googlemaps.xml -msgid "View Google maps with your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_growlee.xml -msgid "redirect notifications to Growl" -msgstr "" - -#: ../meta_plugins/plugin_growlee.xml -msgid "" -"Growlee allows your Dreambox to send short messages using the growl " -"protocol\n" -"like Recording started notifications to a PC running a growl client" -msgstr "" - -#: ../meta_plugins/plugin_httpproxy.xml -msgid "use your Dreambox as Web proxy." -msgstr "" - -#: ../meta_plugins/plugin_httpproxy.xml -msgid "use your Dreambox as Web proxy" -msgstr "" - -#: ../meta_plugins/plugin_imdb.xml -msgid "" -"With IMDb you can download and displays movie information (rating, poster, " -"cast, synopsis etc.) about the selected event." -msgstr "" - -#: ../meta_plugins/plugin_imdb.xml -msgid "Displays movie information from the InternetMovieDatabase" -msgstr "" - -#: ../meta_plugins/plugin_kiddytimer.xml -msgid "KiddyTimer allows to control your kids's daily tv usage." -msgstr "" - -#: ../meta_plugins/plugin_kiddytimer.xml -msgid "Control your kids's tv usage" -msgstr "" - -#: ../meta_plugins/plugin_lastfm.xml -msgid "Play music from Last.fm." -msgstr "" - -#: ../meta_plugins/plugin_lastfm.xml -msgid "Play music from Last.fm" -msgstr "" - -#: ../meta_plugins/plugin_letterbox.xml -msgid "Zoom into letterboxed/anamorph movies." -msgstr "" - -#: ../meta_plugins/plugin_letterbox.xml -msgid "Zoom into letterboxed/anamorph movies" -msgstr "" - -#: ../meta_plugins/plugin_logomanager.xml -msgid "Manage logos to display at boottime" -msgstr "" - -#: ../meta_plugins/plugin_logomanager.xml -msgid "Manage logos to display at boot time or while in radio mode." -msgstr "" - -#: ../meta_plugins/plugin_mediadownloader.xml -msgid "A simple downloading application for other plugins" -msgstr "" - -#: ../meta_plugins/plugin_mediadownloader.xml -msgid "To be used as simple downloading application by other Plugins." -msgstr "" - -#: ../meta_plugins/plugin_merlinepg.xml -msgid "A graphical EPG interface" -msgstr "" - -#: ../meta_plugins/plugin_merlinepg.xml -msgid "A graphical EPG interface." -msgstr "" - -#: ../meta_plugins/plugin_merlinmusicplayer.xml -msgid "Merlin Music Player and iDream" -msgstr "" - -#: ../meta_plugins/plugin_merlinmusicplayer.xml -msgid "" -"Manage your music files in a database, play it with Merlin Music Player." -msgstr "" - -#: ../meta_plugins/plugin_meteoitalia.xml -msgid "Italian Weather forecast on Dreambox from www.google.it." -msgstr "" - -#: ../meta_plugins/plugin_meteoitalia.xml -msgid "Italian Weather forecast on Dreambox" -msgstr "" - -#: ../meta_plugins/plugin_mosaic.xml -msgid "Preview screenshots of running tv shows." -msgstr "" - -#: ../meta_plugins/plugin_mosaic.xml -msgid "Preview screenshots of running tv shows" -msgstr "" - -#: ../meta_plugins/plugin_moviecut.xml -msgid "Cut your movies" -msgstr "" - -#: ../meta_plugins/plugin_moviecut.xml -msgid "Cut your movies." -msgstr "" - -#: ../meta_plugins/plugin_movielistpreview.xml -msgid "Create preview pictures of your Movies" -msgstr "" - -#: ../meta_plugins/plugin_movielistpreview.xml -msgid "" -"Movielist Preview creates screenshots of recordings and shows them inside " -"the movielist." -msgstr "" - -#: ../meta_plugins/plugin_movieretitle.xml -msgid "Rename your movies" -msgstr "" - -#: ../meta_plugins/plugin_movieretitle.xml -msgid "With MovieRetitle you can rename your movies." -msgstr "" - -#: ../meta_plugins/plugin_movieselectionquickbutton.xml -msgid "assign color buttons to plugins from MOVIELIST" -msgstr "" - -#: ../meta_plugins/plugin_movieselectionquickbutton.xml -msgid "assign color buttons (red/green/yellow/blue) to plugins from MOVIELIST." -msgstr "" - -#: ../meta_plugins/plugin_movietagger.xml -msgid "" -"MovieTagger adds tags to recorded movies to sort a large list of movies." -msgstr "" - -#: ../meta_plugins/plugin_movietagger.xml -msgid "add tags to recorded movies" -msgstr "" - -#: ../meta_plugins/plugin_multirc.xml -msgid "control multiple Dreamboxes with different RCs" -msgstr "" - -#: ../meta_plugins/plugin_multirc.xml -msgid "Use and control multiple Dreamboxes with different RCs." -msgstr "" - -#: ../meta_plugins/plugin_mytube.xml -msgid "Direct playback of Youtube videos" -msgstr "" - -#: ../meta_plugins/plugin_mytube.xml -msgid "" -"With MyTube you can play YouTube videos directly on your TV without a PC." -msgstr "" - -#: ../meta_plugins/plugin_ncidclient.xml -msgid "" -"NCID Client shows incoming voice calls promoted by any NCID server (e.g. " -"Vodafone Easybox) on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_ncidclient.xml -msgid "Callmonitor for NCID-based call notification" -msgstr "" - -#: ../meta_plugins/plugin_netcaster.xml -msgid "Player for Network and Internet Streams" -msgstr "" - -#: ../meta_plugins/plugin_netcaster.xml -msgid "Player for Network and Internet Streams." -msgstr "" - -#: ../meta_plugins/plugin_networkbrowser.xml -msgid "Browse for and connect to network shares" -msgstr "" - -#: ../meta_plugins/plugin_networkbrowser.xml -msgid "Browse for nfs/cifs shares and connect to them." -msgstr "" - -#: ../meta_plugins/plugin_ofdb.xml -msgid "Movie informations from the Online Film Datenbank" -msgstr "" - -#: ../meta_plugins/plugin_ofdb.xml -msgid "Movie information from the Online Film Datenbank (German)." -msgstr "" - -#: ../meta_plugins/plugin_orfat.xml -msgid "Video streaming from the orf.at web page" -msgstr "" - -#: ../meta_plugins/plugin_orfat.xml -msgid "Streaming modules for the orf.at iptv web page." -msgstr "" - -#: ../meta_plugins/plugin_partnerbox.xml -msgid "Remote timer and remote TV player" -msgstr "" - -#: ../meta_plugins/plugin_partnerbox.xml -msgid "" -"Partnerbox allows editing a remote Dreambox's record timers and stream its " -"TV program." -msgstr "" - -#: ../meta_plugins/plugin_passwordchanger.xml -#: ../meta_plugins/plugin_setpasswd.xml -msgid "GUI to change the ftp and telnet-password" -msgstr "" - -#: ../meta_plugins/plugin_passwordchanger.xml -msgid "" -"GUI that allows user to change the ftp-/telnet-password of the Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_permanentclock.xml -msgid "PermanentClock shows the clock permanently on the screen." -msgstr "" - -#: ../meta_plugins/plugin_permanentclock.xml -msgid "Shows the clock permanently on the screen" -msgstr "" - -#: ../meta_plugins/plugin_podcast.xml -msgid "PodCast streams podcasts to your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_podcast.xml -msgid "Stream podcasts" -msgstr "" - -#: ../meta_plugins/plugin_porncenter.xml -msgid "Adult streaming plugin" -msgstr "" - -#: ../meta_plugins/plugin_porncenter.xml -msgid "Adult streaming plugin." -msgstr "" - -#: ../meta_plugins/plugin_quickbutton.xml -msgid "assign long key-press on color buttons to plugins or E2 functions" -msgstr "" - -#: ../meta_plugins/plugin_quickbutton.xml -msgid "" -"assign long key-press (red/green/yellow/blue) to plugins or E2 functions." -msgstr "" - -#: ../meta_plugins/plugin_reconstructapsc.xml -msgid "Reconstruct .ap and .sc files" -msgstr "" - -#: ../meta_plugins/plugin_reconstructapsc.xml -msgid "Reconstruct missing or corrupt .ap and .sc files of recorded movies." -msgstr "" - -#: ../meta_plugins/plugin_remotetimer.xml -msgid "Create timers on remote Dreamboxes." -msgstr "" - -#: ../meta_plugins/plugin_remotetimer.xml -msgid "Create remote timers" -msgstr "" - -#: ../meta_plugins/plugin_rsdownloader.xml -msgid "Allows user to download files from rapidshare in the background." -msgstr "" - -#: ../meta_plugins/plugin_rsdownloader.xml -msgid "Download files from Rapidshare" -msgstr "" - -#: ../meta_plugins/plugin_seekbar.xml -msgid "Replace the minute input for the seek functions with a seekbar." -msgstr "" - -#: ../meta_plugins/plugin_seekbar.xml -msgid "Replace the rewind input with a seekbar" -msgstr "" - -#: ../meta_plugins/plugin_setpasswd.xml -msgid "GUI that allows user to change the ftp- / telnet password." -msgstr "" - -#: ../meta_plugins/plugin_shoutcast.xml -msgid "Listen and record internet radio" -msgstr "" - -#: ../meta_plugins/plugin_shoutcast.xml -msgid "Listen and record shoutcast internet radio on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_simplerss.xml -msgid "RSS viewer" -msgstr "" - -#: ../meta_plugins/plugin_simplerss.xml -msgid "SimpleRSS allows reading RSS newsfeeds on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_startupservice.xml -msgid "Define a startup service" -msgstr "" - -#: ../meta_plugins/plugin_startupservice.xml -msgid "Define a startup service for your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_startuptostandby.xml -msgid "set enigma2 to standby-mode after startup" -msgstr "" - -#: ../meta_plugins/plugin_startuptostandby.xml -msgid "" -"After a reboot or power outage, StartupToStandby will bring your Dreambox to " -"standby-mode." -msgstr "" - -#: ../meta_plugins/plugin_tageditor.xml -msgid "Edit tags of recorded movies." -msgstr "" - -#: ../meta_plugins/plugin_tageditor.xml -msgid "Edit tags of recorded movies" -msgstr "" - -#: ../meta_plugins/plugin_trafficinfo.xml -msgid "TrafficInfo shows german traffic information." -msgstr "" - -#: ../meta_plugins/plugin_trafficinfo.xml -msgid "German traffic information" -msgstr "" - -#: ../meta_plugins/plugin_unwetterzentrale.xml -msgid "German storm information" -msgstr "" - -#: ../meta_plugins/plugin_unwetterzentrale.xml -msgid "UnwetterInfo shows german storm information." -msgstr "" - -#: ../meta_plugins/plugin_virtualzap.xml -msgid "see service-epg (and PiP) from channels in an infobar" -msgstr "" - -#: ../meta_plugins/plugin_virtualzap.xml -msgid "See service-epg (and PiP) from other channels in an infobar." -msgstr "" - -#: ../meta_plugins/plugin_vlcplayer.xml -msgid "Play videos from PC on your Dreambox" -msgstr "" - -#: ../meta_plugins/plugin_vlcplayer.xml -msgid "" -"Enigma2 Plugin to play AVI/DIVX/WMV/etc. videos from PC on your Dreambox. " -"Needs a running VLC from www.videolan.org on your pc." -msgstr "" - -#: ../meta_plugins/plugin_vxdcontrol.xml -msgid "Customize Vali-XD skins by yourself." -msgstr "" - -#: ../meta_plugins/plugin_vxdcontrol.xml -msgid "Customize Vali-XD skins" -msgstr "" - -#: ../meta_plugins/plugin_weatherplugin.xml -msgid "Weatherforecast on your Dreambox" -msgstr "" - -#: ../meta_plugins/plugin_weatherplugin.xml -msgid "WeatherPlugin shows weatherforecasts on your Dreambox." -msgstr "" - -#: ../meta_plugins/plugin_webcamviewer.xml -msgid "Show webcam pictures on your TV Screen" -msgstr "" - -#: ../meta_plugins/plugin_webcamviewer.xml -msgid "With WebcamViewer you can watch webcams on your TV Screen." -msgstr "" - -#: ../meta_plugins/plugin_webinterface.xml -msgid "Control your Dreambox with your Web browser." -msgstr "" - -#: ../meta_plugins/plugin_webinterface.xml -msgid "Control your Dreambox with your browser" -msgstr "" - -#: ../meta_plugins/plugin_werbezapper.xml -msgid "Zap between commercials" -msgstr "" - -#: ../meta_plugins/plugin_werbezapper.xml -msgid "" -"With Werbezapper you can bridge commercials by creating short timers\n" -"(between 1 and 9 minutes long) which will automatically zap back to the " -"original channel after execution." -msgstr "" - -#: ../meta_plugins/plugin_youtubeplayer.xml -msgid "" -"With YouTubePlayer you can watch YouTube-Videos on the Dreambox.\n" -"This plugin requires a PC with the VLC program running." -msgstr "" - -#: ../meta_plugins/plugin_youtubeplayer.xml -msgid "Playback of Youtube through a PC" -msgstr "" - -#: ../meta_plugins/plugin_zaphistorybrowser.xml -msgid "" -"Shows a list containing the zapping-history and allows user to zap to the " -"entries or to modify them." -msgstr "" - -#: ../meta_plugins/plugin_zaphistorybrowser.xml -msgid "Shows a list of recent zap entries" -msgstr "" - -#: ../meta_plugins/plugin_zapstatistic.xml -msgid "ZapStatistic shows the watched services with some statistics." -msgstr "" - -#: ../meta_plugins/plugin_zapstatistic.xml -msgid "Shows statistics of watched services" -msgstr "" - -#: ../meta_plugins/plugin_zdfmediathek.xml -msgid "Watch streams from ZDF Mediathek" -msgstr "" - -#: ../meta_plugins/plugin_zdfmediathek.xml -msgid "ZDFMediathek allows you to watch streams from ZDF Mediathek." -msgstr "" - -#: ../meta_experimental/plugin_cleanupwizard.xml -msgid "Automatically informs you on low internal memory" -msgstr "" - -#: ../meta_experimental/plugin_cleanupwizard.xml -msgid "" -"The CleanupWizard informs you when the internal free memory of your dreambox " -"has dropped below a definable threshold.You can use this wizard to remove " -"some plugins." -msgstr "" - -#: ../meta_experimental/plugin_commoninterfaceassignment.xml -msgid "" -"With the CommonInterfaceAssignment plugin it is possible to use differentCI " -"modules in your Dreambox and assign dedicated providers/services or caids to " -"each of them.\n" -"This allows watching a scrambled service while recording another one." -msgstr "" - -#: ../meta_experimental/plugin_commoninterfaceassignment.xml -msgid "Assigning providers/services/caids to a CI module" -msgstr "" - -#: ../meta_experimental/plugin_crashlogautosubmit.xml -msgid "Automatically send crashlogs to Dream Multimedia" -msgstr "" - -#: ../meta_experimental/plugin_crashlogautosubmit.xml -msgid "" -"With the CrashlogAutoSubmit plugin it is possible to automaticallymail " -"crashlogs found on your hard drive to Dream Multimedia." -msgstr "" - -#: ../meta_experimental/plugin_cutlisteditor.xml -msgid "CutListEditor allows you to edit your movies" -msgstr "" - -#: ../meta_experimental/plugin_cutlisteditor.xml -msgid "" -"CutListEditor allows you to edit your movies.\n" -"Seek to the start of the stuff you want to cut away. Press OK, select 'start " -"cut'.\n" -"Then seek to the end, press OK, select 'end cut'. That's it." -msgstr "" - -#: ../meta_experimental/plugin_defaultservicesscanner.xml -msgid "" -"With the DefaultServicesScanner plugin you can scan default lamedbs sorted " -"by satellite with a connected dish positioner." -msgstr "" - -#: ../meta_experimental/plugin_defaultservicesscanner.xml -msgid "Scans default lamedbs sorted by satellite" -msgstr "" - -#: ../meta_experimental/plugin_diseqctester.xml -msgid "Test your DiSEqC equipment" -msgstr "" - -#: ../meta_experimental/plugin_diseqctester.xml -msgid "" -"With the DiseqcTester plugin you can test your satellite equipment for " -"DiSEqC compatibility and errors." -msgstr "" - -#: ../meta_experimental/plugin_dvdburn.xml -msgid "" -"With DVDBurn you can make compilations of records from your Dreambox hard " -"drive.\n" -"Optionally you can add customizable menus. You can record the compilation to " -"a standard-compliant DVD that can be played on conventinal DVD players.\n" -"HDTV recordings can only be burned in proprietary dreambox format." -msgstr "" - -#: ../meta_experimental/plugin_dvdburn.xml -msgid "Burn your recordings to DVD" -msgstr "" - -#: ../meta_experimental/plugin_dvdplayer.xml -msgid "" -"DVDPlayer plays your DVDs on your Dreambox.\n" -"With 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." -msgstr "" - -#: ../meta_experimental/plugin_dvdplayer.xml -msgid "DVDPlayer plays your DVDs on your Dreambox" -msgstr "" - -#: ../meta_experimental/plugin_frontprocessorupgrade.xml -msgid "Internal firmware updater" -msgstr "" - -#: ../meta_experimental/plugin_frontprocessorupgrade.xml -msgid "" -"This system tool is internally used to program the hardware with firmware " -"updates." -msgstr "" - -#: ../meta_experimental/plugin_graphmultiepg.xml -msgid "" -"GraphMultiEPG shows a graphical timeline EPG.\n" -"Shows a nice overview of all running und upcoming tv shows." -msgstr "" - -#: ../meta_experimental/plugin_graphmultiepg.xml -msgid "GraphMultiEPG shows a graphical timeline EPG" -msgstr "" - -#: ../meta_experimental/plugin_hotplug.xml -msgid "Hotplugging for removeable devices" -msgstr "" - -#: ../meta_experimental/plugin_hotplug.xml -msgid "" -"The Hotplug plugin notifies your system of newly added or removed devices." -msgstr "" - -#: ../meta_experimental/plugin_mediaplayer.xml -msgid "Plays your favorite music and videos" -msgstr "" - -#: ../meta_experimental/plugin_mediaplayer.xml -msgid "" -"Mediaplayer plays your favorite music and videos.\n" -"Play all your favorite music and video files, organize them in playlists, " -"view cover and album information." -msgstr "" - -#: ../meta_experimental/plugin_mediascanner.xml -msgid "Scan devices for playable media files" -msgstr "" - -#: ../meta_experimental/plugin_mediascanner.xml -msgid "" -"MediaScanner scans devices for playable media files and displays a menu with " -"possible actions like viewing pictures or playing movies." -msgstr "" - -#: ../meta_experimental/plugin_networkwizard.xml -msgid "Step by step network configuration" -msgstr "" - -#: ../meta_experimental/plugin_networkwizard.xml -msgid "" -"With the NetworkWizard you can easily configure your network step by step." -msgstr "" - -#: ../meta_experimental/plugin_nfiflash.xml -msgid "Restore your Dreambox with a USB stick" -msgstr "" - -#: ../meta_experimental/plugin_nfiflash.xml -msgid "" -"With the NFIFlash plugin 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." -msgstr "" - -#: ../meta_experimental/plugin_pictureplayer.xml -msgid "Display your photos on the TV" -msgstr "" - -#: ../meta_experimental/plugin_pictureplayer.xml -msgid "" -"The PicturePlayer displays your photos on the TV.\n" -"You can view them as thumbnails or slideshow." -msgstr "" - -#: ../meta_experimental/plugin_positionersetup.xml -msgid "PositionerSetup helps you installing a motorized dish" -msgstr "" - -#: ../meta_experimental/plugin_positionersetup.xml -msgid "" -"With the PositionerSetup plugin it is easy to install and configure a " -"motorized dish." -msgstr "" - -#: ../meta_experimental/plugin_satelliteequipmentcontrol.xml -msgid "" -"With the SatelliteEquipmentControl plugin it is possible to fine-tune DiSEqC-" -"settings." -msgstr "" - -#: ../meta_experimental/plugin_satelliteequipmentcontrol.xml -msgid "SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings" -msgstr "" - -#: ../meta_experimental/plugin_satfinder.xml -msgid "" -"The Satfinder plugin helps you to align your dish.\n" -"It shows you informations about signal rate and errors." -msgstr "" - -#: ../meta_experimental/plugin_satfinder.xml -msgid "Satfinder helps you to align your dish" -msgstr "" - -#: ../meta_experimental/plugin_skinselector.xml -msgid "SkinSelector shows a menu with selectable skins" -msgstr "" - -#: ../meta_experimental/plugin_skinselector.xml -msgid "" -"The SkinSelector shows a menu with selectable skins.\n" -"It's now easy to change the look and feel of your Dreambox." -msgstr "" - -#: ../meta_experimental/plugin_socketmmi.xml -msgid "Frontend for /tmp/mmi.socket" -msgstr "" - -#: ../meta_experimental/plugin_socketmmi.xml -msgid "Python frontend for /tmp/mmi.socket." -msgstr "" - -#: ../meta_experimental/plugin_softwaremanager.xml -msgid "SoftwareManager manages your Dreambox software" -msgstr "" - -#: ../meta_experimental/plugin_softwaremanager.xml -msgid "" -"The SoftwareManager manages your Dreambox software.\n" -"It's easy to update your receiver's software, install or remove plugins or " -"even backup and restore your system settings." -msgstr "" - -#: ../meta_experimental/plugin_tempfancontrol.xml -msgid "Control your system fan" -msgstr "" - -#: ../meta_experimental/plugin_tempfancontrol.xml -msgid "Control your internal system fan." -msgstr "" - -#: ../meta_experimental/plugin_tuxboxplugins.xml -msgid "Execute TuxboxPlugins" -msgstr "" - -#: ../meta_experimental/plugin_tuxboxplugins.xml -msgid "Allows the execution of TuxboxPlugins." -msgstr "" - -#: ../meta_experimental/plugin_videoenhancement.xml -msgid "VideoEnhancement provides advanced video enhancement settings" -msgstr "" - -#: ../meta_experimental/plugin_videoenhancement.xml -msgid "" -"The VideoEnhancement plugin provides advanced video enhancement settings." -msgstr "" - -#: ../meta_experimental/plugin_videomode.xml -msgid "Videomode provides advanced video mode settings" -msgstr "" - -#: ../meta_experimental/plugin_videomode.xml -msgid "The Videomode plugin provides advanced video mode settings." -msgstr "" - -#: ../meta_experimental/plugin_videotune.xml -msgid "VideoTune helps fine-tuning your tv display" -msgstr "" - -#: ../meta_experimental/plugin_videotune.xml -msgid "" -"The VideoTune helps fine-tuning your tv display.\n" -"You can control brightness and contrast of your tv." -msgstr "" - -#: ../meta_experimental/plugin_wirelesslan.xml -msgid "" -"The WirelessLan plugin helps you configuring your WLAN network interface." -msgstr "" - -#: ../meta_experimental/plugin_wirelesslan.xml -msgid "Configure your WLAN network interface" -msgstr "" diff --git a/skin.py b/skin.py index b490f73..19da203 100755 --- a/skin.py +++ b/skin.py @@ -284,8 +284,8 @@ def loadSingleSkinData(desktop, skin, path_prefix): else: bpp = 32 #print "Resolution:", xres,yres,bpp - from enigma import gFBDC - gFBDC.getInstance().setResolution(xres, yres) + from enigma import gMainDC + gMainDC.getInstance().setResolution(xres, yres) desktop.resize(eSize(xres, yres)) if bpp != 32: # load palette (not yet implemented) diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 0000000..fcadf30 --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +enigma2.sh diff --git a/tools/Makefile.am b/tools/Makefile.am index 82301a6..9e69b46 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1,9 +1,7 @@ -libopen.so.0.0: libopen.c - $(CXX) -Wall -W libopen.c -O2 -nostartfiles -shared -fPIC -Wl,-soname,libopen.so.0 -o libopen.so.0.0 -ldl +bin_SCRIPTS = enigma2.sh +lib_LTLIBRARIES = libopen.la -all: libopen.so.0.0 +libopen_la_SOURCES = libopen.c +libopen_la_LIBADD = @LIBDL_LIBS@ -CLEANFILES = libopen.so.0.0 - -install: all - $(INSTALL) libopen.so.0.0 $(DESTDIR)/usr/lib +EXTRA_DIST = enigma2.sh.in diff --git a/tools/enigma2.sh.in b/tools/enigma2.sh.in new file mode 100755 index 0000000..2f9292a --- /dev/null +++ b/tools/enigma2.sh.in @@ -0,0 +1,55 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +datarootdir=@datarootdir@ + +if [ -x @bindir@/showiframe -a -f @datadir@/backdrop.mvi ]; then + @bindir@/showiframe @datadir@/backdrop.mvi +fi + +# hook to execute scripts always before enigma2 start +if [ -x @bindir@/enigma2_pre_start.sh ]; then + @bindir@/enigma2_pre_start.sh +fi + +if [ -d /home/root ]; then + cd /home/root +fi + +LIBS=@libdir@/libopen.so.0.0.0 + +#check for dreambox specific passthrough helper lib +if [ -e @libdir@/libpassthrough.so ]; then + LIBS="$LIBS @libdir@/libpassthrough.so" +fi + +LD_PRELOAD=$LIBS @bindir@/enigma2 + +# enigma2 exit codes: +# +# 0 - restart enigma +# 1 - halt +# 2 - reboot +# +# >128 signal + +ret=$? +case $ret in + 1) + /sbin/halt + ;; + 2) + /sbin/reboot + ;; + 4) + /sbin/rmmod lcd + /usr/sbin/fpupgrade --upgrade 2>&1 | tee /home/root/fpupgrade.log + sleep 1; + /sbin/rmmod fp + /sbin/modprobe fp + /sbin/reboot + ;; + *) + ;; +esac