Merge commit 'dm/experimental' into test branch
authorschon <schon@dev03-server>
Tue, 15 Mar 2011 07:05:31 +0000 (16:05 +0900)
committerschon <schon@dev03-server>
Tue, 15 Mar 2011 07:05:31 +0000 (16:05 +0900)
Conflicts:
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Screens/SleepTimerEdit.py

102 files changed:
RecordTimer.py
data/encoding.conf [changed mode: 0644->0755]
data/keymap.xml
lib/base/console.cpp
lib/driver/rcconsole.cpp
lib/dvb/decoder.cpp
lib/dvb/demux.cpp
lib/dvb/demux.h
lib/dvb/dvb.cpp
lib/dvb/dvb.h
lib/dvb/frontend.cpp
lib/dvb/idvb.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/gdi/bcm.cpp
lib/gdi/fb.cpp
lib/gdi/fb.h
lib/python/Components/DreamInfoHandler.py
lib/python/Components/Ipkg.py
lib/python/Components/PluginComponent.py
lib/python/Components/Sources/ServiceEvent.py
lib/python/Plugins/DemoPlugins/TPMDemo/plugin.py
lib/python/Plugins/DemoPlugins/TestPlugin/plugin.py
lib/python/Plugins/Extensions/CutListEditor/plugin.py
lib/python/Plugins/Extensions/DVDBurn/Process.py
lib/python/Plugins/Extensions/DVDBurn/plugin.py
lib/python/Plugins/Extensions/DVDPlayer/keymap.xml
lib/python/Plugins/Extensions/DVDPlayer/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h
lib/python/Plugins/Extensions/GraphMultiEPG/plugin.py
lib/python/Plugins/Extensions/MediaPlayer/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/Extensions/MediaScanner/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/Extensions/Modem/plugin.py
lib/python/Plugins/Extensions/PicturePlayer/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/Extensions/SocketMMI/plugin.py
lib/python/Plugins/Extensions/TuxboxPlugins/plugin.py
lib/python/Plugins/Plugin.py
lib/python/Plugins/SystemPlugins/CleanupWizard/CleanupWizard.py
lib/python/Plugins/SystemPlugins/CleanupWizard/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/DefaultServicesScanner/plugin.py
lib/python/Plugins/SystemPlugins/DiseqcTester/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/plugin.py
lib/python/Plugins/SystemPlugins/Hotplug/plugin.py
lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/NetworkWizard/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py
lib/python/Plugins/SystemPlugins/PositionerSetup/plugin.py
lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/plugin.py
lib/python/Plugins/SystemPlugins/Satfinder/plugin.py
lib/python/Plugins/SystemPlugins/SkinSelector/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/VideoEnhancement/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/VideoTune/plugin.py
lib/python/Plugins/SystemPlugins/Videomode/plugin.py [changed mode: 0755->0644]
lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py [changed mode: 0755->0644]
lib/python/Screens/AudioSelection.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/PluginBrowser.py
lib/python/Screens/SleepTimerEdit.py
lib/python/Screens/Standby.py
lib/python/Screens/TimerEdit.py
lib/python/Tools/Directories.py
lib/service/servicemp3.cpp
lib/service/servicemp3.h
main/bsod.cpp
main/enigma.cpp
po/ar.po
po/ca.po
po/cs.po
po/da.po
po/de.po
po/el.po
po/en.po
po/es.po
po/et.po
po/fi.po
po/fr.po
po/fy.po
po/hr.po
po/hu.po
po/is.po
po/it.po
po/lt.po
po/lv.po
po/nl.po
po/no.po
po/pl.po
po/pt.po
po/ru.po
po/sk.po
po/sl.po
po/sr.po
po/sv.po
po/tr.po
po/uk.po
tools/enigma2.sh.in

index 9626a11..d3ccd75 100755 (executable)
@@ -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)
old mode 100644 (file)
new mode 100755 (executable)
index a3cefe6..36f619d
@@ -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
index d7d4721..11fa9c6 100755 (executable)
                <device name="Console">
                        <key id="KEY_ASCII" mapto="gotAsciiCode" flags="mr" />
                </device>
+               <device name="SDL">
+                       <key id="KEY_ASCII" mapto="gotAsciiCode" flags="mr" />
+               </device>
        </map>
 
        <map context="InputBoxActions">
index 43f9f61..0018768 100644 (file)
@@ -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;
index 97a6e7c..77f4322 100644 (file)
@@ -103,7 +103,7 @@ class eRCConsoleInit
        eRCConsoleDriver driver;
        eRCConsole device;
 public:
-       eRCConsoleInit(): driver("/dev/vc/0"), device(&driver)
+       eRCConsoleInit(): driver("/dev/tty0"), device(&driver)
        {
        }
 };
index 8ed9f43..a89f72b 100644 (file)
@@ -1302,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;
index 0c736c5..f4d8618 100644 (file)
@@ -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)
index d43c41b..e73982e 100644 (file)
@@ -26,7 +26,8 @@ public:
        RESULT getCADemuxID(uint8_t &id) { id = demux; return 0; }
        RESULT flush();
        RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn);
-       
+       int openDVR(int flags);
+
        int getRefCount() { return ref; }
 private:
        int adapter, demux, source;
index fbca6f3..61924ad 100755 (executable)
@@ -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)
@@ -464,7 +466,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
 
        ePtr<eDVBRegisteredDemux> 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 +522,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
                        }
                }
        }
-       else if (m_boxtype == DM8000)
+       else if (m_boxtype == DM8000 || m_boxtype == DM500HD || m_boxtype == DM800SE || m_boxtype == DM7020HD)
        {
                cap |= capHoldDecodeReference; // this is checked in eDVBChannel::getDemux
                for (; i != m_demux.end(); ++i, ++n)
@@ -1804,14 +1806,28 @@ RESULT eDVBChannel::playSource(ePtr<iTsSource> &source, const char *streaminfo_f
                /* (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<eDVBAllocatedDemux> &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();
index f612aff..3349014 100644 (file)
@@ -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;
 
index 013e23b..47e1ab5 100755 (executable)
@@ -1878,11 +1878,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];
index e56a2c7..86936f8 100644 (file)
@@ -636,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)
index 4ad4e76..e5e6331 100644 (file)
@@ -44,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);
                
@@ -842,7 +849,10 @@ int eDVBServicePMTHandler::tuneExt(eServiceReferenceDVB &ref, int use_decode_dem
                if (m_pvr_channel)
                {
                        m_pvr_channel->setCueSheet(cue);
-                       if (source)
+
+                       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());
index 1888e05..0c44f35 100644 (file)
@@ -86,8 +86,8 @@ class eDVBServicePMTHandler: public Object
        eUsePtr<iDVBChannel> m_channel;
        eUsePtr<iDVBPVRChannel> m_pvr_channel;
        ePtr<eDVBResourceManager> m_resourceManager;
-       ePtr<iDVBDemux> m_demux;
-       
+       ePtr<iDVBDemux> m_demux, m_pvr_demux_tmp;
+
        void channelStateChanged(iDVBChannel *);
        ePtr<eConnection> m_channelStateChanged_connection;
        void channelEvent(iDVBChannel *, int event);
index 1021994..b215b10 100644 (file)
@@ -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())
index cde3e35..7ee555c 100644 (file)
@@ -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);
        }
index 5447380..fcb5ff2 100644 (file)
@@ -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
index 03d5215..8e9c29d 100755 (executable)
@@ -397,7 +397,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()
index 7144777..cc55965 100755 (executable)
@@ -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:
index 5e439fd..c6ad584 100755 (executable)
@@ -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:
@@ -67,6 +74,7 @@ class PluginComponent:
                                                        plugins = [ plugins ]
 
                                                for p in plugins:
+                                                       p.path = path
                                                        p.updateIcon(path)
                                                        new_plugins.append(p)
 
@@ -81,12 +89,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 +122,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 = [ ]
index 93c733b..8a0a66a 100644 (file)
@@ -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,))
index 2c078d3..dcaa1f6 100644 (file)
@@ -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
index 69f935e..4ef4a87 100644 (file)
@@ -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)
index 0627df3..141c04a 100644 (file)
@@ -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)
index f1f5e73..816551c 100755 (executable)
@@ -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:
index bd856b4..f5d2fa6 100644 (file)
@@ -13,5 +13,5 @@ def main_add(session, service, **kwargs):
 
 def Plugins(**kwargs):
        descr = _("Burn to DVD")
-       return [PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_MOVIELIST, fnc=main_add, icon="dvdburn.png"),
-               PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main, icon="dvdburn.png") ]
+       return [PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_MOVIELIST, needsRestart = True, fnc=main_add, icon="dvdburn.png"),
+               PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = True, fnc=main, icon="dvdburn.png") ]
index 7b7f205..bf57e75 100644 (file)
@@ -8,7 +8,8 @@
                        <key id="KEY_PREVIOUS" mapto="prevChapter" flags="m" />
                        <key id="KEY_NEXT" mapto="nextChapter" flags="m" />
                        <key id="KEY_TV" mapto="tv" flags="m" />
-                       <key id="KEY_AUDIO" mapto="dvdAudioMenu" flags="m" />
+                       <key id="KEY_AUDIO" mapto="AudioSelection" flags="m" />
+                       <key id="KEY_AUDIO" mapto="dvdAudioMenu" flags="l" />
                        <key id="KEY_RADIO" mapto="nextAudioTrack" flags="m" />
                        <key id="KEY_TEXT" mapto="nextSubtitleTrack" flags="m" />
                        <key id="KEY_VIDEO" mapto="nextAngle" flags="m" />
old mode 100755 (executable)
new mode 100644 (file)
index 7f330eb..1cee0aa
@@ -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
@@ -195,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
        
@@ -269,6 +269,8 @@ 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()
@@ -348,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")),
@@ -540,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)
 
@@ -769,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)]
index 5fbfb0a..6d1397d 100644 (file)
@@ -397,6 +397,61 @@ RESULT eServiceDVD::subtitle(ePtr<iSubtitleOutput> &ptr)
        return 0;
 }
 
+RESULT eServiceDVD::audioTracks(ePtr<iAudioTrackSelection> &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<iServiceKeys> &ptr)
 {
        ptr=this;
@@ -623,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)
        {
@@ -648,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*/)
@@ -659,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()
index c751a39..80cfcf0 100644 (file)
@@ -26,7 +26,7 @@ public:
        RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &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<iAudioChannelSelection> &ptr) { ptr = 0; return -1; }
-       RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; }
+       RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
        RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
        RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
        RESULT timeshift(ePtr<iTimeshiftService> &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);
 
index adb7015..9f901e9 100644 (file)
@@ -1,6 +1,6 @@
 from Plugins.Plugin import PluginDescriptor
 from GraphMultiEpg import GraphMultiEPG
-from Screens.ChannelSelection import BouquetSelector
+from Screens.ChannelSelection import SilentBouquetSelector
 from enigma import eServiceCenter, eServiceReference
 from ServiceReference import ServiceReference
 
@@ -79,20 +79,20 @@ def main(session, servicelist, **kwargs):
        global Servicelist
        Servicelist = servicelist
        bouquets = Servicelist.getBouquetList()
+       root = Servicelist.getRoot()
        if bouquets is None:
                cnt = 0
        else:
                cnt = len(bouquets)
-       if cnt > 1: # show bouquet list
+       if cnt > 1: # create 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]):
+               bouquetSel = SilentBouquetSelector(bouquets, True, Servicelist.getBouquetNumOffset(root))
+       if cnt >= 1: # open current bouquet
+               if not openBouquetEPG(root):
                        cleanup()
 
 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)]
old mode 100755 (executable)
new mode 100644 (file)
index 13599a0..75fba2d
@@ -1046,6 +1046,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)
        ]
old mode 100755 (executable)
new mode 100644 (file)
index 0cefa35..76bbb26
@@ -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)
                ]
index e57e4f5..0b397c1 100644 (file)
@@ -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)
old mode 100755 (executable)
new mode 100644 (file)
index 5d1c2cb..169a8c8
@@ -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)]
index 387c830..568cde2 100644 (file)
@@ -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) ]
+
index 05085ea..e124ffd 100644 (file)
@@ -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
 
index 5a676cd..d87e6e9 100755 (executable)
@@ -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
index d8de354..797010c 100755 (executable)
@@ -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:
old mode 100755 (executable)
new mode 100644 (file)
index f8677bb..157aa75
@@ -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
 
old mode 100755 (executable)
new mode 100644 (file)
index 38ed1d2..5f2f82a
@@ -640,10 +640,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 )]
old mode 100755 (executable)
new mode 100644 (file)
index 6eb09f3..25a06eb
@@ -422,6 +422,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)]
 
index 4d0a992..d26881e 100644 (file)
@@ -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)
old mode 100755 (executable)
new mode 100644 (file)
index 5b7edcf..4dcf6c6
@@ -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)]
index 38b80c9..6cb30de 100644 (file)
@@ -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
 
index 1f379f1..84cbbcb 100644 (file)
@@ -297,4 +297,4 @@ def autostart(reason, **kwargs):
                        reactor.listenUNIX("/tmp/hotplug.socket", factory)
 
 def Plugins(**kwargs):
-       return PluginDescriptor(name = "Hotplug", description = "listens to hotplug events", where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart)
+       return PluginDescriptor(name = "Hotplug", description = "listens to hotplug events", where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = True, fnc = autostart)
old mode 100755 (executable)
new mode 100644 (file)
index 1eba1dd..b654476
@@ -20,6 +20,7 @@ def Plugins(**kwargs):
                description=_("Download .NFI-Files for USB-Flasher"),
                icon = "flash.png",
                where = PluginDescriptor.WHERE_SOFTWAREMANAGER,
+               needsRestart = False,
                fnc={"SoftwareSupported": NFICallFnc, "menuEntryName": lambda x: _("NFI Image Flashing"),
                        "menuEntryDescription": lambda x: _("Download .NFI-Files for USB-Flasher")}),
-               PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)]
+               PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan)]
old mode 100755 (executable)
new mode 100644 (file)
index 49ec7da..56cebdb
@@ -18,5 +18,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
index b0c52c8..8f9757f 100755 (executable)
@@ -10,7 +10,7 @@ from os import popen
 
 class Upgrade(Screen):
        skin = """
-               <screen position="100,100" size="550,400" title="IPKG upgrade..." >
+               <screen position="100,100" size="550,400" title="opkg upgrade..." >
                        <widget name="text" position="0,0" size="550,400" font="Regular;15" />
                </screen>"""
                
@@ -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 = """
-               <screen position="100,100" size="550,400" title="IPKG upgrade..." >
+               <screen position="100,100" size="550,400" title="opkg upgrade..." >
                        <widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
                </screen>"""
                
@@ -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)]
index 3cc9e75..be246db 100644 (file)
@@ -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 []
index ec472e7..3a8c75c 100644 (file)
@@ -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 []
index d4fe6b5..e737466 100644 (file)
@@ -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 []
old mode 100755 (executable)
new mode 100644 (file)
index 30cbb6b..fd2b5e1
@@ -131,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)
index 055d6ba..7c508f9 100755 (executable)
@@ -205,7 +205,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 +241,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"
                                self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback)
                        else:
                                self.InstallMetaPackageCB(True)
@@ -264,13 +264,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 +330,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 +343,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()
old mode 100755 (executable)
new mode 100644 (file)
index b968d79..dce5179
@@ -809,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):
@@ -921,17 +923,20 @@ 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 STB?"), MessageBox.TYPE_YESNO)
-
-       def ExecuteReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       self.reloadPluginlist()
+               self.reloadPluginlist()
+               restartRequired = plugins.restartRequired
+               if restartRequired:
+                       self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
+               else:
                        self.selectedFiles = []
                        self.detailsClosed(True)
+
+       def ExecuteReboot(self, result):
                if result:
                        quitMainloop(3)
+               else:
+                       self.selectedFiles = []
+                       self.detailsClosed(True)
 
        def reloadPluginlist(self):
                plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
@@ -1287,30 +1292,24 @@ 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 STB?"), MessageBox.TYPE_YESNO)
-
-       def UpgradeReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
+               self.reloadPluginlist()
+               restartRequired = plugins.restartRequired
+               if restartRequired:
+                       self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your STB?"), 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 STB?"), 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))
@@ -1375,7 +1374,7 @@ class UpdatePlugin(Screen):
                                self.updating = True
                                self.activityTimer.start(100, False)
                                self.package.setText(_("Package list update"))
-                               self.status.setText(_("Upgrading Dreambox... Please wait"))
+                               self.status.setText(_("Upgrading STB... Please wait"))
                                self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
                        else:
                                self.package.setText(_("Your network is not working. Please try again."))
@@ -1517,7 +1516,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
@@ -1708,7 +1707,6 @@ class PacketManager(Screen, NumericalTextInput):
                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')
-               self.opkgAvail = fileExists('/usr/bin/opkg')
 
                self.ipkg = IpkgComponent()
                self.ipkg.addCallback(self.ipkgCallback)
@@ -1862,7 +1860,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
@@ -1885,7 +1883,7 @@ class PacketManager(Screen, NumericalTextInput):
 
                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):
@@ -1898,13 +1896,10 @@ class PacketManager(Screen, NumericalTextInput):
                                        l = len(tokens)
                                        version = l > 1 and tokens[1].strip() or ""
                                        self.installed_packetlist[name] = version
-               if self.opkgAvail:
-                       if not self.Console:
-                               self.Console = Console()
-                       cmd = "opkg list-upgradable"
-                       self.Console.ePopen(cmd, self.OpkgListUpgradeable_Finished)
-               else:
-                       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:
@@ -1920,6 +1915,8 @@ class PacketManager(Screen, NumericalTextInput):
        
        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))    
@@ -1949,16 +1946,10 @@ class PacketManager(Screen, NumericalTextInput):
                        for x in self.packetlist:
                                status = ""
                                if self.installed_packetlist.has_key(x[0]):
-                                       if self.opkgAvail:
-                                               if self.upgradeable_packages.has_key(x[0]):
-                                                       status = "upgradeable"
-                                               else:
-                                                       status = "installed"
+                                       if self.upgradeable_packages.has_key(x[0]):
+                                               status = "upgradeable"
                                        else:
-                                               if self.installed_packetlist[x[0]] == x[1]:
-                                                       status = "installed"
-                                               else:
-                                                       status = "upgradeable"
+                                               status = "installed"
                                else:
                                        status = "installable"
                                self.list.append(self.buildEntryComponent(x[0], x[1], x[2], status))    
@@ -2042,9 +2033,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
old mode 100755 (executable)
new mode 100644 (file)
index 42fe82d..48f871f
@@ -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)
 
old mode 100755 (executable)
new mode 100644 (file)
index 7953d38..cde3930
@@ -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
index 1b62206..9e90c72 100644 (file)
@@ -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))
        ]
old mode 100755 (executable)
new mode 100644 (file)
index 085f2e6..e7805fc
@@ -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
old mode 100755 (executable)
new mode 100644 (file)
index a13c797..adf47f0
@@ -463,4 +463,4 @@ def configStrings(iface):
                        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'
 
 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..."})
index e41a3f3..ab1344d 100644 (file)
@@ -76,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)
@@ -136,7 +140,7 @@ class AudioSelection(Screen, ConfigListScreen):
                                        language = _("<unknown>")
                                        selected = ""
 
-                                       if sel and x[:4] == sel[:4]:
+                                       if sel and x == sel:
                                                selected = _("Running")
                                                selectedidx = idx
                                        
@@ -218,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):
index c07e349..912d678 100755 (executable)
@@ -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
index 0432930..d55e661 100755 (executable)
@@ -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
@@ -555,18 +555,15 @@ class InfoBarEPG:
 
        def openMultiServiceEPG(self, withCallback=True):
                bouquets = self.servicelist.getBouquetList()
+               root = self.servicelist.getRoot()
                if bouquets is None:
                        cnt = 0
                else:
                        cnt = len(bouquets)
-               if cnt > 1: # show bouquet list
-                       if withCallback:
-                               self.bouquetSel = self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True)
-                               self.dlg_stack.append(self.bouquetSel)
-                       else:
-                               self.bouquetSel = self.session.open(BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True)
-               elif cnt == 1:
-                       self.openBouquetEPG(bouquets[0][1], withCallback)
+               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:
@@ -1353,6 +1350,7 @@ class InfoBarExtensions:
                        answer[1][1]()
 
 from Tools.BoundFunction import boundFunction
+import inspect
 
 # depends on InfoBarExtensions
 
@@ -1364,9 +1362,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):
@@ -1524,28 +1526,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
index 49df843..d423f46 100755 (executable)
@@ -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()
index e5c9260..1305b62 100755 (executable)
@@ -108,6 +108,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:
index 1a7ebbd..94a56ee 100644 (file)
@@ -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
index 5435498..572f14b 100644 (file)
@@ -88,7 +88,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():
@@ -176,7 +178,7 @@ class TimerEditList(Screen):
                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)
+               list.sort(key = lambda x: x[0].begin)
 
        def showLog(self):
                cur=self["timerlist"].getCurrent()
index 518db49..8e4d004 100755 (executable)
@@ -57,7 +57,7 @@ defaultPaths = {
                SCOPE_USERETC: ("", PATH_DONTCREATE), # user home directory
                
                SCOPE_DEFAULTDIR: (eEnv.resolve("${datadir}/enigma2/defaults/"), PATH_CREATE),
-               SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE),
+               SCOPE_DEFAULTPARTITION: ("/dev/mtdblock6", PATH_DONTCREATE),
                SCOPE_DEFAULTPARTITIONMOUNTDIR: (eEnv.resolve("${datadir}/enigma2/dealer"), PATH_CREATE),
                SCOPE_METADIR: (eEnv.resolve("${datadir}/meta"), PATH_CREATE),
        }
index f96b8c4..be55d0c 100644 (file)
@@ -20,9 +20,6 @@
 #include <sys/stat.h>
 
 #define HTTP_TIMEOUT 10
-static GstStaticPadTemplate subsinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS("text/plain; text/x-pango-markup; video/x-dvd-subpicture; subpicture/x-pgs"));
-//             int ret = gst_pad_set_caps (ghostpad, caps2);
-//             gst_caps_unref(caps2);));
 
 // eServiceFactoryMP3
 
@@ -222,7 +219,6 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
        m_seekTimeout = eTimer::create(eApp);
        m_subtitle_sync_timer = eTimer::create(eApp);
        m_streamingsrc_timeout = 0;
-       m_subtitle_hide_timer = eTimer::create(eApp);
        m_stream_tags = 0;
        m_currentAudioStream = -1;
        m_currentSubtitleStream = 0;
@@ -232,10 +228,10 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
        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_subtitle_hide_timer->timeout, eServiceMP3::hideSubtitles);
        CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll);
        m_aspect = m_width = m_height = m_framerate = m_progressive = -1;
 
@@ -332,7 +328,7 @@ 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);
 
@@ -341,57 +337,19 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
 
        g_free(uri);
 
-       m_gst_subtitlebin = gst_bin_new("subtitle_bin");
-       
-       if ( m_gst_playbin )
+       GstElement *subsink = gst_element_factory_make("appsink", "subtitle_sink");
+       if (!subsink)
+               eDebug("eServiceMP3::sorry, can't play: missing gst-plugin-appsink");
+       else
        {
-               GstElement *appsink = gst_element_factory_make("appsink", "subtitle_sink");
-
-               if (!appsink)
-                       eDebug("eServiceMP3::sorry, can't play: missing gst-plugin-appsink");
-
-               GstElement *dvdsubdec = gst_element_factory_make("dvdsubdec", "vobsubtitle_decoder");
-               if ( dvdsubdec )
-               {
-                       gst_bin_add_many(GST_BIN(m_gst_subtitlebin), dvdsubdec, appsink, NULL);
-                       g_object_set (G_OBJECT (dvdsubdec), "singlebuffer", TRUE, NULL);
-               }
-               else
-               {
-                       eDebug("eServiceMP3::missing gst-plugin-dvdsub, no vob subtitle support!");
-                       gst_bin_add(GST_BIN(m_gst_subtitlebin), appsink);
-               }
-
-               GstPadTemplate *templ;
-               templ = gst_static_pad_template_get (&subsinktemplate);
-  
-               GstPad *ghostpad = gst_ghost_pad_new_no_target_from_template("sink", templ);
-               gst_element_add_pad (m_gst_subtitlebin, ghostpad);
-
-               GstCaps* caps = gst_caps_from_string("text/plain; text/x-pango-markup; video/x-raw-rgb; subpicture/x-pgs");
-               g_object_set (G_OBJECT (appsink), "caps", caps, NULL);
-               gst_caps_unref(caps);
-               
-               g_object_set (G_OBJECT (appsink), "async", FALSE, NULL);
-               g_object_set (G_OBJECT (appsink), "sync", TRUE, NULL);
-               g_object_set (G_OBJECT (appsink), "emit-signals", TRUE, NULL);
-               g_object_set (G_OBJECT (appsink), "ts-offset", 0 * GST_SECOND, NULL);
-
-               g_object_set_data (G_OBJECT (ghostpad), "application-instance", this);
-               g_signal_connect (G_OBJECT (ghostpad), "notify::caps", G_CALLBACK (gstGhostpadHasCAPS), this);
-               gst_pad_set_getcaps_function (ghostpad, gstGhostpadGetCAPS);
-               gst_pad_set_acceptcaps_function (ghostpad, gstGhostpadAcceptCAPS);
-               m_ghost_pad_buffer_alloc = GST_PAD_BUFFERALLOCFUNC(ghostpad);
-               m_ghost_pad_chain_function = GST_PAD_CHAINFUNC(ghostpad);
-               m_ghost_pad_subtitle_sink_event = GST_PAD_EVENTFUNC(ghostpad);
-               gst_pad_set_bufferalloc_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadBufferAlloc));
-               gst_pad_set_event_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadSinkEvent));
-               gst_pad_set_chain_function (ghostpad, GST_DEBUG_FUNCPTR(gstGhostpadChainFunction));
-               m_gst_prev_subtitle_caps = gst_caps_new_empty();
-               
-               g_object_set (G_OBJECT (m_gst_playbin), "text-sink", m_gst_subtitlebin, NULL);
-               m_subs_to_pull_handler_id = g_signal_connect (appsink, "new-buffer", G_CALLBACK (gstCBsubtitleAvail), this);
+               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; video/x-dvd-subpicture; subpicture/x-pgs"), NULL);
+               g_object_set (G_OBJECT (m_gst_playbin), "text-sink", subsink, NULL);
                
+       }
+
+       if ( m_gst_playbin )
+       {
                gst_bus_set_sync_handler(gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin)), gstBusSyncHandler, this);
                char srt_filename[strlen(filename)+1];
                strncpy(srt_filename,filename,strlen(filename)-3);
@@ -402,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 )
                {
@@ -418,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;
        }
 
@@ -428,8 +382,7 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
 eServiceMP3::~eServiceMP3()
 {
        // disconnect subtitle callback
-       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
-//     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
+       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
 
        if (appsink)
        {
@@ -438,7 +391,6 @@ eServiceMP3::~eServiceMP3()
        }
 
        delete m_subtitle_widget;
-       gst_caps_unref(this->m_gst_prev_subtitle_caps);
 
        // disconnect sync handler callback
        gst_bus_set_sync_handler(gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin)), NULL, NULL);
@@ -984,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 "";
        }
@@ -1214,18 +1166,18 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *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))
        {
@@ -1254,8 +1206,7 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                                }       break;
                                case GST_STATE_CHANGE_READY_TO_PAUSED:
                                {
-                                       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
-//                                     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_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);
@@ -1419,51 +1370,66 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                                
                                GstPad* pad = 0;
                                g_signal_emit_by_name (m_gst_playbin, "get-text-pad", i, &pad);
-                               if ( subs.type != stSRT )
-                                       subs.type = getSubtitleType(pad, g_codec);
+                               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);
                        }
                        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"))
+                                       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, "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);
+                                               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, "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_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);
+                                               }
                                        }
                                }
                        }
@@ -1576,7 +1542,7 @@ void eServiceMP3::gstPoll(const Message &msg)
        {
                GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (m_gst_playbin));
                GstMessage *message;
-               while (message = gst_bus_pop(bus))
+               while ((message = gst_bus_pop(bus)))
                {
                        gstBusCall(bus, message);
                        gst_message_unref (message);
@@ -1585,7 +1551,7 @@ void eServiceMP3::gstPoll(const Message &msg)
        else if (msg.type == 2)
                pullSubtitle();
        else if (msg.type == 3)
-               gstGhostpadHasCAPS_synced(msg.d.pad);
+               gstTextpadHasCAPS_synced(msg.d.pad);
        else
                eDebug("gstPoll unhandled Message %d\n", msg.type);
 }
@@ -1600,170 +1566,7 @@ void eServiceMP3::gstCBsubtitleAvail(GstElement *appsink, gpointer user_data)
        _this->m_pump.send(Message(2));
 }
 
-gboolean eServiceMP3::gstGhostpadSinkEvent(GstPad * pad, GstEvent * event)
-{
-//     eDebug("eServiceMP3::gstGhostpadSinkEvent %s", gst_structure_get_name (event->structure));
-
-//     eServiceMP3 *_this = (eServiceMP3*) (gst_pad_get_parent (pad));
-       eServiceMP3 *_this = (eServiceMP3*) g_object_get_data (G_OBJECT (pad), "application-instance");
-       gboolean ret;
-       GstFormat format;
-
-       if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB && event->structure && strcmp (gst_structure_get_name (event->structure), "subtitleoverlay-flush-subtitle") == 0)
-       {
-               eDebug ("Custom subtitle flush event");
-//             GST_SUBTITLE_OVERLAY_LOCK (self);
-//             self->subtitle_flush = TRUE;
-//             self->subtitle_error = FALSE;
-//             if (self->subtitle_block_pad)
-//             gst_pad_set_blocked_async_full (self->subtitle_block_pad, TRUE,
-//                     _pad_blocked_cb, gst_object_ref (self),
-//                     (GDestroyNotify) gst_object_unref);
-//             if (self->video_block_pad)
-//             gst_pad_set_blocked_async_full (self->video_block_pad, TRUE,
-//                     _pad_blocked_cb, gst_object_ref (self),
-//                     (GDestroyNotify) gst_object_unref);
-//             GST_SUBTITLE_OVERLAY_UNLOCK (self);
-// 
-               gst_event_unref (event);
-               event = NULL;
-               ret = TRUE;
-               goto out;
-       } else if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT)
-       {
-               gst_event_parse_new_segment_full (event, NULL, NULL, NULL, &format, NULL, NULL, NULL);
-               if (_this->m_gst_subtitle_segment.format != GST_FORMAT_UNDEFINED && _this->m_gst_subtitle_segment.format != format)
-               {
-                       eDebug("Subtitle segment format changed: %s -> %s", gst_format_get_name(_this->m_gst_subtitle_segment.format), gst_format_get_name(format));
-                       gst_segment_init (&_this->m_gst_subtitle_segment, GST_FORMAT_UNDEFINED);
-               }
-       }
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_FLUSH_STOP:
-      eDebug("Resetting subtitle segment because of flush-stop");
-      gst_segment_init (&_this->m_gst_subtitle_segment, GST_FORMAT_UNDEFINED);
-      /* fall through */
-    case GST_EVENT_FLUSH_START:    
-    case GST_EVENT_NEWSEGMENT:
-    case GST_EVENT_EOS:
-//     eDebug("GST_EVENT_FLUSH_START GST_EVENT_NEWSEGMENT GST_EVENT_EOS");
-      /* Add our event marker to make sure no events from here go ever outside
-       * the element, they're only interesting for our internal elements */
-//       event =
-//           GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST
-//               (event)));
-//       if (!event->structure) {
-//         event->structure =
-//             gst_structure_id_empty_new (_subtitle_overlay_event_marker_id);
-//         gst_structure_set_parent_refcount (event->structure,
-//             &event->mini_object.refcount);
-//       }
-//       gst_structure_id_set (event->structure, _subtitle_overlay_event_marker_id,
-//           G_TYPE_BOOLEAN, TRUE, NULL);
-      break;
-    default:
-           eDebug("GST_EVENT_TYPE other: %i", GST_EVENT_TYPE (event));
-      break;
-  }
-
-  ret = _this->m_ghost_pad_subtitle_sink_event (pad, gst_event_ref (event));
-// eDebug("original EVENTFUNC returned %i", ret);
-
-  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
-    gboolean update;
-    gdouble rate, applied_rate;
-    gint64 start, stop, position;
-    
-    GST_DEBUG_OBJECT (pad, "Newsegment event: %" GST_PTR_FORMAT,
-        event->structure);
-    gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
-        &format, &start, &stop, &position);
-
-    GST_DEBUG_OBJECT (pad, "Old subtitle segment: %" GST_SEGMENT_FORMAT,
-        &_this->m_gst_subtitle_segment);
-    if (_this->m_gst_subtitle_segment.format != format) {
-      GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
-          gst_format_get_name (_this->m_gst_subtitle_segment.format),
-          gst_format_get_name (format));
-      gst_segment_init (&_this->m_gst_subtitle_segment, format);
-    }
-
-    gst_segment_set_newsegment_full (&_this->m_gst_subtitle_segment, update, rate,
-        applied_rate, format, start, stop, position);
-    GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
-        &_this->m_gst_subtitle_segment);
-  }
-  gst_event_unref (event);
-// 
-out:
-//   gst_object_unref (_this);
-  return ret;
-}
-
-GstCaps* eServiceMP3::gstGhostpadGetCAPS(GstPad * pad)
-{
-//     eDebug("eServiceMP3::gstGhostpadGetCAPS");
-       return gst_static_pad_template_get_caps(&subsinktemplate);
-}
-
-gboolean eServiceMP3::gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps)
-{
-       GstCaps *templ_caps = gst_static_pad_template_get_caps (&subsinktemplate);
-       gboolean ret = gst_caps_can_intersect (templ_caps, caps);
-
-//     eDebug("gstGhostpadAcceptCAPS templ=%s, given=%s ret=%i", gst_caps_to_string(templ_caps), gst_caps_to_string(caps), ret);
-       gst_caps_unref (templ_caps);
-
-       return ret;
-}
-
-void eServiceMP3::gstGhostpadLink(gpointer user_data, GstCaps * caps)
-{
-       GstStructure *s;
-       GstPad *sinkpad;
-       eServiceMP3 *_this = (eServiceMP3*)user_data;
-
-       // FIXME: Need to cache events from the ghostpad and pass them forward
-       // now... and keep track of the segment and pass newsegment events
-       // downstream.
-       s = gst_caps_get_structure (caps, 0);
-
-       GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
-       GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
-       GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
-       
-       gst_ghost_pad_set_target(GST_GHOST_PAD(ghostpad), NULL);
-       gst_element_unlink(dvdsubdec, appsink);
-       int ret = -1;
-  
-       if ( gst_structure_has_name (s, "video/x-dvd-subpicture") && dvdsubdec )
-       {
-               sinkpad = gst_element_get_static_pad (dvdsubdec, "sink");
-               ret = gst_element_link_pads (dvdsubdec, "src", appsink, "sink");
-//             eDebug("gstGhostpadLink:: dvdsubdec+appsink = %i", ret);
-       }
-       else
-       {
-               sinkpad = gst_element_get_static_pad (appsink, "sink");
-//             eDebug("gstGhostpadLink:: appsink");
-       }
-
-       gst_ghost_pad_set_target (GST_GHOST_PAD(ghostpad), sinkpad);
-}
-
-GstFlowReturn eServiceMP3::gstGhostpadBufferAlloc(GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf)
-{
-       eServiceMP3 *_this = (eServiceMP3*) g_object_get_data (G_OBJECT (pad), "application-instance");
-
-//     eDebug("eServiceMP3::gstGhostpadBufferAlloc prevcaps=%s newcaps=%s", gst_caps_to_string(_this->m_gst_prev_subtitle_caps), gst_caps_to_string(caps));
-       if (!GST_PAD_CAPS (pad) || !gst_caps_is_equal (_this->m_gst_prev_subtitle_caps, caps))
-               gstGhostpadLink (_this, caps);
-
-       return _this->m_ghost_pad_buffer_alloc (pad, offset, size, caps, buf);
-}
-
-void eServiceMP3::gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data)
+void eServiceMP3::gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data)
 {
        eServiceMP3 *_this = (eServiceMP3*)user_data;
 
@@ -1773,13 +1576,13 @@ void eServiceMP3::gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer
 }
 
 // after messagepump
-void eServiceMP3::gstGhostpadHasCAPS_synced(GstPad *pad)
+void eServiceMP3::gstTextpadHasCAPS_synced(GstPad *pad)
 {
        GstCaps *caps;
 
        g_object_get (G_OBJECT (pad), "caps", &caps, NULL);
 
-//     eDebug("gstGhostpadHasCAPS:: signal::caps = %s", gst_caps_to_string(caps));
+       eDebug("gstTextpadHasCAPS:: signal::caps = %s", gst_caps_to_string(caps));
 
        if (caps)
        {
@@ -1807,8 +1610,7 @@ void eServiceMP3::gstGhostpadHasCAPS_synced(GstPad *pad)
                                gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang);
 
                        subs.language_code = std::string(g_lang);
-                       GstPad *ghostpad = gst_element_get_static_pad(m_gst_subtitlebin, "sink");
-                       subs.type = getSubtitleType(ghostpad);
+                       subs.type = getSubtitleType(pad);
 
                        if (!m_subtitleStreams.empty())
                                m_subtitleStreams[m_currentSubtitleStream] = subs;
@@ -1820,127 +1622,18 @@ void eServiceMP3::gstGhostpadHasCAPS_synced(GstPad *pad)
 
 //             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));
 
-               if (!GST_PAD_CAPS (pad) || !gst_caps_is_equal (m_gst_prev_subtitle_caps, caps))
-                       gstGhostpadLink(this, caps);
-
-               m_gst_prev_subtitle_caps = gst_caps_copy(caps);
-
                gst_caps_unref (caps);
        }
 
        gst_object_unref (pad);
 }
 
-GstFlowReturn eServiceMP3::gstGhostpadChainFunction(GstPad * pad, GstBuffer * buffer)
-{
-       GstFlowReturn ret = GST_FLOW_OK;
-       
-       eServiceMP3 *_this = (eServiceMP3*)g_object_get_data (G_OBJECT (pad), "application-instance");
-
-//     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("gstGhostpadChainFunction buffer: '%s' caps: %s ", line, gst_caps_to_string(GST_BUFFER_CAPS(buffer)));
-
-       ret = _this->m_ghost_pad_chain_function(pad, buffer);
-//     eDebug("original chain func returns %i", ret);
-       return ret;
-}
-
-
-// void eServiceMP3::gstCBsubtitleLink(GObject *obj, GParamSpec *pspec, gpointer user_data)
-// {
-// 
-//     eServiceMP3 *_this = (eServiceMP3*)user_data;
-//     eDebug("gstCBsubtitleCAPS:: m_currentSubtitleStream=%i, m_subtitleStreams.size()=%i", _this->m_currentSubtitleStream, _this->m_subtitleStreams.size());
-// 
-//     if ( _this->m_currentSubtitleStream >= (int)_this->m_subtitleStreams.size() )
-//     {
-//             eDebug("return invalid stream count");
-//             return;
-//     }
-// 
-//     subtitleStream subs = _this->m_subtitleStreams[_this->m_currentSubtitleStream];
-//     
-//     if ( subs.type == stUnknown )
-//     {
-//             GstTagList *tags;
-//             eDebug("gstCBsubtitleCAPS::m_subtitleStreams[%i].type == stUnknown...", _this->m_currentSubtitleStream);
-//             
-//             gchar *g_lang;
-//             g_signal_emit_by_name (_this->m_gst_playbin, "get-text-tags", _this->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(GST_PAD(obj));
-//             
-//             _this->m_subtitleStreams[_this->m_currentSubtitleStream] = subs;
-// 
-//             g_free (g_lang);
-//     }
-// 
-//     gstCBsubtitleLink(subs.type, _this);
-// }
-
-// void eServiceMP3::gstCBsubtitleLink(subtype_t type, gpointer user_data)
-// {
-//     eServiceMP3 *_this = (eServiceMP3*)user_data;
-//     
-//     if ( type == stVOB )
-//     {
-//             GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
-//             GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
-//             GstPad *subdecsinkpad = gst_element_get_static_pad (dvdsubdec, "sink");
-//             int ret = gst_ghost_pad_set_target((GstGhostPad*)ghostpad, subdecsinkpad);
-//             GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
-//             ret += gst_element_link(dvdsubdec, appsink);
-//             eDebug("gstCBsubtitleLink:: dvdsubdec=%p, subdecsinkpad=%p, ghostpad=%p, set target & link=%i", dvdsubdec, subdecsinkpad, ghostpad, ret);
-//     }
-//     else if ( type < stVOB && type > stUnknown )
-//     {
-//             GstPad *ghostpad = gst_element_get_static_pad(_this->m_gst_subtitlebin, "sink");
-//             GstElement *appsink = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "subtitle_sink");
-//             GstPad *appsinkpad = gst_element_get_static_pad (appsink, "sink");
-//             GstElement *dvdsubdec = gst_bin_get_by_name(GST_BIN(_this->m_gst_subtitlebin), "vobsubtitle_decoder");
-//             gst_element_unlink(dvdsubdec, appsink);
-//             int ret = gst_ghost_pad_set_target((GstGhostPad*)ghostpad, appsinkpad);
-//             eDebug("gstCBsubtitleLink:: appsink=%p, appsinkpad=%p, ghostpad=%p, set target=%i", appsink, appsinkpad, ghostpad, ret);
-//     }
-//     else
-//     {
-//             eDebug("gstCBsubtitleLink:: unsupported subtitles");
-//     }
-// }
-/*
-gboolean eServiceMP3::gstCBsubtitleDrop(GstPad *pad, GstBuffer *buffer, gpointer user_data)
-{
-       eDebug("gstCBsubtitleDrop");
-       
-       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("dropping buffer '%s' ", line);
-       return false;
-}*/
-
-
 void eServiceMP3::pullSubtitle()
 {
-       GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_subtitlebin), "subtitle_sink");
-//     GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink");
-
-       if (appsink)
+       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)
                {
@@ -1948,7 +1641,7 @@ void eServiceMP3::pullSubtitle()
                        {
                                eSingleLocker l(m_subs_to_pull_lock);
                                --m_subs_to_pull;
-                               g_signal_emit_by_name (appsink, "pull-buffer", &buffer);
+                               g_signal_emit_by_name (sink, "pull-buffer", &buffer);
                        }
                        if (buffer)
                        {
@@ -1975,19 +1668,6 @@ void eServiceMP3::pullSubtitle()
                                                if (m_subtitle_pages.size()==1)
                                                        pushSubtitles();
                                        }
-                                       else if ( m_subtitleStreams[m_currentSubtitleStream].type == stVOB )
-                                       {
-                                               SubtitlePage page;
-                                               eDebug("got new subpicture @ buf_pos = %lld ns (in pts=%lld), duration=%lld ns, len=%i bytes. ", buf_pos, buf_pos/11111, duration_ns, len);
-                                               page.type = SubtitlePage::Vob;
-                                               page.vob_page.m_pixmap = new gPixmap(eSize(720, 576), 32, 1);
-                                               memcpy(page.vob_page.m_pixmap->surface->data, GST_BUFFER_DATA(buffer), len);
-                                               page.vob_page.m_show_pts = buf_pos / 11111L;
-                                               page.vob_page.m_timeout = duration_ns / 1000;
-                                               m_subtitle_pages.push_back(page);
-                                               if (m_subtitle_pages.size()==1)
-                                                       pushSubtitles();
-                                       }
                                        else
                                        {
                                                eDebug("unsupported subpicture... ignoring");
@@ -1996,7 +1676,7 @@ void eServiceMP3::pullSubtitle()
                                gst_buffer_unref(buffer);
                        }
                }
-               gst_object_unref(appsink);
+               gst_object_unref(sink);
        }
        else
                eDebug("no subtitle sink!");
@@ -2009,7 +1689,7 @@ void eServiceMP3::pushSubtitles()
                SubtitlePage &frontpage = m_subtitle_pages.front();
                pts_t running_pts;
                gint64 diff_ms = 0;
-               gint64 show_pts;
+               gint64 show_pts = 0;
 
                getPlayPosition(running_pts);
 
@@ -2030,8 +1710,6 @@ void eServiceMP3::pushSubtitles()
 
                if (frontpage.type == SubtitlePage::Pango)
                        show_pts = frontpage.pango_page.m_show_pts;
-               else
-                       show_pts = frontpage.vob_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);
@@ -2054,12 +1732,6 @@ void eServiceMP3::pushSubtitles()
                                eDebug("show!\n");
                                if ( frontpage.type == SubtitlePage::Pango)
                                        m_subtitle_widget->setPage(frontpage.pango_page);
-                               else
-                               {
-                                       m_subtitle_widget->setPixmap(frontpage.vob_page.m_pixmap, eRect(0, 0, 720, 576));
-                                       eDebug("blit vobsub pixmap... hide in %i ms", frontpage.vob_page.m_timeout);
-                                       m_subtitle_hide_timer->start(frontpage.vob_page.m_timeout, true);
-                               }
                                m_subtitle_widget->show();
                        }
                        m_subtitle_pages.pop_front();
@@ -2069,16 +1741,10 @@ void eServiceMP3::pushSubtitles()
                pullSubtitle();
 }
 
-void eServiceMP3::hideSubtitles()
-{
-//     eDebug("eServiceMP3::hideSubtitles()");
-       if ( m_subtitle_widget )
-               m_subtitle_widget->hide();
-}
 
 RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
 {
-//     eDebug ("eServiceMP3::enableSubtitles m_currentSubtitleStream=%i this=%p",m_currentSubtitleStream, this);
+       eDebug ("eServiceMP3::enableSubtitles m_currentSubtitleStream=%i this=%p",m_currentSubtitleStream, this);
        ePyObject entry;
        int tuplesize = PyTuple_Size(tuple);
        int pid, type;
@@ -2103,11 +1769,10 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
                goto error_out;
        type = PyInt_AsLong(entry);
 
-//     eDebug ("eServiceMP3::enableSubtitles new pid=%i",pid);
        if (m_currentSubtitleStream != pid)
        {
                g_object_set (G_OBJECT (m_gst_playbin), "current-text", pid, NULL);
-//             eDebug ("eServiceMP3::enableSubtitles g_object_set current-text = %i", pid);
+               eDebug ("eServiceMP3::enableSubtitles g_object_set current-text = %i", pid);
                m_currentSubtitleStream = pid;
                m_subs_to_pull = 0;
                m_prev_decoder_time = -1;
@@ -2157,15 +1822,25 @@ PyObject *eServiceMP3::getSubtitleList()
        for (std::vector<subtitleStream>::iterator IterSubtitleStream(m_subtitleStreams.begin()); IterSubtitleStream != m_subtitleStreams.end(); ++IterSubtitleStream)
        {
                subtype_t type = IterSubtitleStream->type;
-               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);
+               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");
index c620151..f3cc6dd 100644 (file)
@@ -173,6 +173,12 @@ public:
                {
                }
        };
+       struct errorInfo
+       {
+               std::string error_message;
+               std::string missing_codec;
+       };
+
 private:
        static int pcm_delay;
        static int ac3_delay;
@@ -189,64 +195,48 @@ private:
        eServiceReference m_ref;
        int m_buffer_size;
        bufferInfo m_bufferInfo;
+       errorInfo m_errorInfo;
        eServiceMP3(eServiceReference ref);
        Signal2<void,iPlayableService*,int> m_event;
        enum
        {
                stIdle, stRunning, stStopped,
-       };
-       int m_state;
-       GstElement *m_gst_playbin;
-       GstElement *m_gst_subtitlebin;
-       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<Message> 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 gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
-       static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
-       static GstCaps* gstGhostpadGetCAPS (GstPad * pad);
-       static gboolean gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps);
-       static void gstGhostpadLink(gpointer user_data, GstCaps * caps);
-       static GstFlowReturn gstGhostpadBufferAlloc(GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf);
-       static void gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data);
-       static gboolean gstGhostpadSinkEvent(GstPad * pad, GstEvent * event);
-       static GstFlowReturn gstGhostpadChainFunction(GstPad * pad, GstBuffer * buffer);
-/*     static void gstCBsubtitleCAPS(GObject *obj, GParamSpec *pspec, gpointer user_data);
-       static void gstCBsubtitleLink(subtype_t type, gpointer user_data);
-       static gboolean gstCBsubtitleDrop(GstPad *pad, GstBuffer *buffer, gpointer user_data);*/
+        };
+        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<Message> 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&);
-       void gstGhostpadHasCAPS_synced(GstPad *pad);
-
-       GstPadBufferAllocFunction m_ghost_pad_buffer_alloc;
-       GstPadChainFunction m_ghost_pad_chain_function;
-       GstPadEventFunction m_ghost_pad_subtitle_sink_event;
-       GstCaps *m_gst_prev_subtitle_caps;
-       GstSegment m_gst_subtitle_segment;
-       GstPadEventFunction m_gst_sink_event;
+        static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
 
        struct SubtitlePage
        {
@@ -255,19 +245,18 @@ private:
                eVobSubtitlePage vob_page;
        };
 
-       std::list<SubtitlePage> m_subtitle_pages;
-       ePtr<eTimer> m_subtitle_sync_timer;
-       ePtr<eTimer> m_subtitle_hide_timer;
-       ePtr<eTimer> m_streamingsrc_timeout;
-       pts_t m_prev_decoder_time;
-       int m_decoder_time_valid_state;
-
-       void pushSubtitles();
-       void pullSubtitle();
-       void hideSubtitles();
-       void sourceTimeout();
-       int m_subs_to_pull;
-       sourceStream m_sourceinfo;
+        std::list<SubtitlePage> m_subtitle_pages;
+        ePtr<eTimer> m_subtitle_sync_timer;
+        
+        ePtr<eTimer> 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;
 
index 2666b9c..f55939e 100644 (file)
@@ -204,9 +204,9 @@ void bsodFatal(const char *component)
                xml.close();
 
                xml.open("software");
-               xml.cDataFromCmd("enigma2software", "ipkg list_installed | grep enigma2");
-               xml.cDataFromCmd("dreamboxsoftware", "ipkg list_installed | grep dream");
-               xml.cDataFromCmd("gstreamersoftware", "ipkg list_installed | grep gst");
+               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");
index 1cdd867..91645d8 100644 (file)
@@ -251,8 +251,9 @@ int main(int argc, char **argv)
 
        {
                gPainter p(my_lcd_dc);
-               p.resetClip(eRect(0, 0, 132, 64));
+               p.resetClip(eRect(ePoint(0, 0), my_lcd_dc->size()));
                p.clear();
+               p.flush();
        }
 
        return exit_code;
index a560b90..2f6ebf5 100755 (executable)
--- a/po/ar.po
+++ b/po/ar.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-08-20 00:08+0200\n"
 "Last-Translator: Hazem <moustafagamal@hotmail.com>\n"
 "Language-Team: Arabic <moustafagamal@hotmail.com>\n"
@@ -4336,6 +4336,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index b214073..ed5e7b1 100755 (executable)
--- a/po/ca.po
+++ b/po/ca.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ca\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2007-08-14 10:23+0200\n"
 "Last-Translator: Oriol Pellicer <oriol@elsud.org>\n"
 "Language-Team: \n"
@@ -4741,6 +4741,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 5b6da82..9c492d6 100755 (executable)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-09-28 18:09+0100\n"
 "Last-Translator: ws79 <ws79@centrum.cz>\n"
 "Language-Team: \n"
@@ -4740,6 +4740,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 5a8c2f2..266b005 100755 (executable)
--- a/po/da.po
+++ b/po/da.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Enigma2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-04-13 21:10+0200\n"
 "Last-Translator: Ingmar <dreambox@ingmar.dk>\n"
 "Language-Team: jazzydane <dreambox@ingmar.dk>\n"
@@ -4804,6 +4804,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index ea948b5..49fe3d8 100755 (executable)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-11-01 14:20+0100\n"
 "Last-Translator: Mladen Horvat <acid-burn@opendreambox.org>\n"
 "Language-Team: none\n"
@@ -4935,6 +4935,9 @@ msgstr "Leute & Blogs"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock zeigt die Uhrzeit permanent auf Ihrem Fernseher an."
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Tiere"
index f18ce12..92b1125 100755 (executable)
--- a/po/el.po
+++ b/po/el.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-07-17 12:13+0100\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -4747,6 +4747,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index fb3e76c..e4dc8ed 100755 (executable)
--- a/po/en.po
+++ b/po/en.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2005-11-17 20:53+0100\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -4855,6 +4855,9 @@ msgstr "People & Blogs"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Pets & Animals"
index 165d285..c80f022 100755 (executable)
--- a/po/es.po
+++ b/po/es.po
@@ -7,14 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2009-08-21 18:08+0100\n"
-"Last-Translator: José Juan Zapater <josej@zapater.fdns.net>\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
+"PO-Revision-Date: 2011-02-01 00:10+0200\n"
+"Last-Translator: Jose Juan <jzapater@gmail.com>\n"
 "Language-Team: none\n"
+"Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Spanish\n"
 "X-Poedit-SourceCharset: iso-8859-1\n"
 "X-Poedit-Country: SPAIN\n"
@@ -137,16 +139,15 @@ msgstr ""
 msgid " "
 msgstr " "
 
-#
 msgid " Results"
-msgstr ""
+msgstr "Resultados"
 
 #
 msgid " extensions."
 msgstr "extensiones."
 
 msgid " ms"
-msgstr ""
+msgstr "ms"
 
 #
 msgid " packages selected."
@@ -223,10 +224,9 @@ msgstr "¡%d canales encontrados!"
 msgid "%d.%B %Y"
 msgstr "%d/%B/%Y"
 
-#
 #, python-format
 msgid "%i ms"
-msgstr ""
+msgstr "%i ms"
 
 #
 #, python-format
@@ -399,16 +399,16 @@ msgid "A"
 msgstr "A"
 
 msgid "A BackToTheRoots-Skin .. or good old times."
-msgstr ""
+msgstr "Una Piel BackToTheRoots .. or buenos momentos antiguos"
 
 msgid "A BackToTheRoots-Skin ... or good old times."
-msgstr ""
+msgstr "Una Piel BackToTheRoots ... o buenos momentos anteriores"
 
 msgid "A basic ftp client"
-msgstr ""
+msgstr "Un cliente ftp básico"
 
 msgid "A client for www.dyndns.org"
-msgstr ""
+msgstr "Un cliente para www.dyndns.org"
 
 #
 #, python-format
@@ -420,7 +420,7 @@ msgstr ""
 "¿Quiere conservar su versión?"
 
 msgid "A demo plugin for TPM usage."
-msgstr ""
+msgstr "Un plugin de demo para el uso de TPM"
 
 #
 msgid ""
@@ -443,25 +443,26 @@ msgid "A graphical EPG for all services of an specific bouquet"
 msgstr "Un EPG gráfico para todos los canales de una lista específica"
 
 msgid "A graphical EPG interface"
-msgstr ""
+msgstr "Un interfaz EPG gráfico"
 
 msgid "A graphical EPG interface."
-msgstr ""
+msgstr "Un interfaz EPG gráfico."
 
-#
 msgid ""
 "A mount entry with this name already exists!\n"
 "Update existing entry and continue?\n"
 msgstr ""
+"¡Ya existe un punto de montaje con ese nombre!\n"
+"¿Actualizar el existente y continuar?\n"
 
 msgid "A nice looking HD skin from Kerni"
-msgstr ""
+msgstr "Una bonita piel HD de Kerni"
 
 msgid "A nice looking HD skin in Brushed Alu Design from Kerni."
-msgstr ""
+msgstr "Una bonita piel HD en diseño aluminio depillado."
 
 msgid "A nice looking skin from Kerni"
-msgstr ""
+msgstr "Una bonita piel de Kerni"
 
 #
 #, python-format
@@ -516,7 +517,7 @@ msgstr ""
 "¿Quiere desabilitar el segundo interface de red?"
 
 msgid "A simple downloading application for other plugins"
-msgstr ""
+msgstr "Una aplicación simple de descargas para otros plugins"
 
 #
 msgid ""
@@ -583,10 +584,10 @@ msgid "About..."
 msgstr "Acerca de..."
 
 msgid "Access to the ARD-Mediathek"
-msgstr ""
+msgstr "Acceso al ARD-Mediathek"
 
 msgid "Access to the ARD-Mediathek online video database."
-msgstr ""
+msgstr "Acceso a la base de datos de video online de ARD-Mediathek."
 
 #
 msgid "Accesspoint:"
@@ -596,9 +597,8 @@ msgstr "Punto de Acceso:"
 msgid "Action on long powerbutton press"
 msgstr "Acción dejando pulsado el encendido"
 
-#
 msgid "Action on short powerbutton press"
-msgstr ""
+msgstr "Acción al pulsar poco rato el botón de power"
 
 #
 msgid "Action:"
@@ -612,15 +612,15 @@ msgstr "Activar PiP"
 msgid "Activate network settings"
 msgstr "Activar configuración de red"
 
-#
 msgid "Active"
-msgstr ""
+msgstr "Activo"
 
-#
 msgid ""
 "Active/\n"
 "Inactive"
 msgstr ""
+"Activo/\n"
+"Inactivo"
 
 #
 msgid "Adapter settings"
@@ -642,9 +642,8 @@ msgstr "¿Añadir configuración WLAN?"
 msgid "Add a mark"
 msgstr "Añadir marca"
 
-#
 msgid "Add a new NFS or CIFS mount point to your Dreambox."
-msgstr ""
+msgstr "Añadir a tu Dreambox un punto de montaje NFS o CIFS"
 
 #
 msgid "Add a new title"
@@ -658,9 +657,8 @@ msgstr "¿Añadir configuración de red?"
 msgid "Add new AutoTimer"
 msgstr "Añadir nueva AutoProgramación"
 
-#
 msgid "Add new network mount point"
-msgstr ""
+msgstr "Añadir un nuevo punto de montaje de red"
 
 #
 msgid "Add timer"
@@ -682,13 +680,11 @@ msgstr "Añadir a la lista"
 msgid "Add to favourites"
 msgstr "Añadir a favoritos"
 
-#
 msgid "Add zap timer instead of record timer?"
-msgstr ""
+msgstr "¿Añadir programación de zapeo en lugar de grabación?"
 
-#
 msgid "Added: "
-msgstr ""
+msgstr "Añadido:"
 
 #
 msgid ""
@@ -719,10 +715,10 @@ msgstr ""
 "use una tecla numérica para seleccionar otras pantallas de test."
 
 msgid "Adult streaming plugin"
-msgstr ""
+msgstr "Plugin de streaming adulto"
 
 msgid "Adult streaming plugin."
-msgstr ""
+msgstr "Plugin de streaming adulto."
 
 #
 msgid "Advanced Options"
@@ -752,6 +748,8 @@ msgid ""
 "After a reboot or power outage, StartupToStandby will bring your Dreambox to "
 "standby-mode."
 msgstr ""
+"Después de un reinicio o un fallo de corriente, IniciarAReposo te llevará el "
+"Dreambox al modo reposo."
 
 #
 msgid "After event"
@@ -766,7 +764,7 @@ msgstr ""
 "individualmente. Mire el manual de su dreambox para saber cómo."
 
 msgid "Ai.HD skin-style control plugin"
-msgstr ""
+msgstr "Plugin para controlar el estilo de la piel Ai.HD"
 
 #
 msgid "Album"
@@ -780,9 +778,8 @@ msgstr "Todo"
 msgid "All Satellites"
 msgstr "Todos satélites"
 
-#
 msgid "All Time"
-msgstr ""
+msgstr "Todo el Tiempo"
 
 #
 msgid "All non-repeating timers"
@@ -793,10 +790,10 @@ msgid "Allow zapping via Webinterface"
 msgstr "Permitir zapear via interface web"
 
 msgid "Allows the execution of TuxboxPlugins."
-msgstr ""
+msgstr "Permite la ejecución del TuxboxPlugins."
 
 msgid "Allows user to download files from rapidshare in the background."
-msgstr ""
+msgstr "Permite al usuario descargar ficheros de rapidshare en segundo plano."
 
 #
 msgid "Alpha"
@@ -811,7 +808,7 @@ msgid "Alternative services tuner priority"
 msgstr "Prioridad de sintonizadores alternativa"
 
 msgid "Always ask"
-msgstr ""
+msgstr "Preguntar siempre"
 
 #
 msgid "Always ask before sending"
@@ -825,9 +822,8 @@ msgstr "Cantidad de grabaciones que quedan"
 msgid "An empty filename is illegal."
 msgstr "Un nombre de fichero vacío es ilegal."
 
-#
 msgid "An error occured."
-msgstr ""
+msgstr "Ha ocurrido un error."
 
 #
 msgid "An unknown error occured!"
@@ -885,19 +881,19 @@ msgstr ""
 "¿Está seguro que quiere restaurar su backup Enigma2?Enigma2 reiniciará "
 "después de restaurar"
 
-#
 msgid ""
 "Are you sure you want to save this network mount?\n"
 "\n"
 msgstr ""
+"¿Está seguro que quiere guardar este montaje de red?\n"
+"\n"
 
 #
 msgid "Artist"
 msgstr "Artista"
 
-#
 msgid "Ascending"
-msgstr ""
+msgstr "Ascendente"
 
 #
 msgid "Ask before shutdown:"
@@ -912,10 +908,10 @@ msgid "Aspect Ratio"
 msgstr "Relación de aspecto"
 
 msgid "Assigning providers/services/caids to a CI module"
-msgstr ""
+msgstr "Asignando proveedores/servicios/caids al módulo CI"
 
 msgid "Atheros"
-msgstr ""
+msgstr "Atheros"
 
 #
 msgid "Audio"
@@ -925,22 +921,21 @@ msgstr "Sonido"
 msgid "Audio Options..."
 msgstr "Opciones de sonido..."
 
-#
 msgid "Audio Sync"
-msgstr ""
+msgstr "Sincronización de audio"
 
-#
 msgid "Audio Sync Setup"
-msgstr ""
+msgstr "Configuración de sincronización de audio"
 
 msgid ""
 "AudoSync allows delaying the sound output (Bitstream/PCM) so that it is "
 "synchronous to the picture."
 msgstr ""
+"Sincronización de audio permite retrasar la salida de audio (Bitstream/PCM), "
+"para que así se sincronize con la imagen."
 
-#
 msgid "Australia"
-msgstr ""
+msgstr "Australia"
 
 #
 msgid "Author: "
@@ -990,6 +985,8 @@ msgid ""
 "AutoTimer scans the EPG and creates Timers depending on user-defined search  "
 "criteria."
 msgstr ""
+"AutoProgramación escanea el EPG y crea Programaciones dependiendo del "
+"criterio de búsqueda definido por el usuario."
 
 #
 msgid "Automatic"
@@ -1000,34 +997,35 @@ msgid "Automatic Scan"
 msgstr "Búsqueda automática"
 
 msgid "Automatic volume adjustment"
-msgstr ""
+msgstr "Ajuste de volumen automático"
 
 msgid "Automatic volume adjustment for ac3/dts services."
-msgstr ""
+msgstr "Ajuste de volumen automático para canales ac3/dts."
 
 msgid "Automatically change video resolution"
-msgstr ""
+msgstr "Cambiar la resolución de video automáticamente"
 
 msgid ""
 "Automatically changes the output resolution depending on the video "
 "resolution you are watching."
 msgstr ""
+"Cambiar la resolución de salida automáticamente dependiendo de la resolución "
+"que está viendo."
 
 msgid "Automatically create timer events based on keywords"
-msgstr ""
+msgstr "Crear programaciones automáticamente basadas en palabras"
 
 msgid "Automatically informs you on low internal memory"
-msgstr ""
+msgstr "Informar automáticamente de memoria baja"
 
 msgid "Automatically refresh EPG"
-msgstr ""
+msgstr "Refrescar automáticamente el EPG"
 
 msgid "Automatically send crashlogs to Dream Multimedia"
-msgstr ""
+msgstr "Enviar automáticamente a Dream Multimedia los logs de fallos"
 
-#
 msgid "Autos & Vehicles"
-msgstr ""
+msgstr "Coches"
 
 #
 msgid "Autowrite timer"
@@ -1046,10 +1044,10 @@ msgid "BA"
 msgstr "BA"
 
 msgid "BASIC-HD Skin by Ismail Demir"
-msgstr ""
+msgstr "Piel BASIC-HD por Ismail Demir"
 
 msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
-msgstr ""
+msgstr "Piel BASIC-HD para images Dreambox creada por Ismail Demir"
 
 #
 msgid "BB"
@@ -1140,10 +1138,10 @@ msgid "Blue boost"
 msgstr "Impulso azul"
 
 msgid "Bonjour/Avahi control plugin"
-msgstr ""
+msgstr "plugin de control Bonjour/Avahi"
 
 msgid "Bonjour/Avahi control plugin."
-msgstr ""
+msgstr "plugin de control Bonjour/Avahi."
 
 #
 msgid "Bookmarks"
@@ -1153,23 +1151,21 @@ msgstr "Marcadores"
 msgid "Bouquets"
 msgstr "Listas"
 
-#
 msgid "Brazil"
-msgstr ""
+msgstr "Brasil"
 
 #
 msgid "Brightness"
 msgstr "Brillo"
 
 msgid "Browse for and connect to network shares"
-msgstr ""
+msgstr "Examinar y conectar a carpetas de red"
 
 msgid "Browse for nfs/cifs shares and connect to them."
-msgstr ""
+msgstr "Examinar y conectar a carpetas nfs/cifs compartidas."
 
-#
 msgid "Browse network neighbourhood"
-msgstr ""
+msgstr "Examinar la red próxima"
 
 #
 msgid "Burn DVD"
@@ -1179,13 +1175,11 @@ msgstr "Grabar DVD"
 msgid "Burn existing image to DVD"
 msgstr "Graba una imagen existente a DVD"
 
-#
-#, fuzzy
 msgid "Burn to DVD"
 msgstr "Grabar a DVD..."
 
 msgid "Burn your recordings to DVD"
-msgstr ""
+msgstr "Grabar sus grabaciones a DVD"
 
 #
 msgid "Bus: "
@@ -1206,22 +1200,22 @@ msgstr "C"
 msgid "C-Band"
 msgstr "Banda-C"
 
-#, fuzzy
 msgid "CDInfo"
-msgstr "Info"
+msgstr "CDInfo"
 
 msgid ""
 "CDInfo enables gathering album and track details from CDDB and CD-Text when "
 "playing Audio CDs in Mediaplayer."
 msgstr ""
+"CDInfo habilita la información de los detalles del álbum y pista desde CDDB "
+"y CD-Text cuando se reproducen los CDs de audio en el reproductor de medios."
 
 #
 msgid "CI assignment"
 msgstr "Asignación CI"
 
-#
 msgid "CIFS share"
-msgstr ""
+msgstr "compartir CIFS"
 
 #
 msgid "CVBS"
@@ -1236,18 +1230,16 @@ msgid "Cache Thumbnails"
 msgstr "Cache de Miniaturas"
 
 msgid "Callmonitor for NCID-based call notification"
-msgstr ""
+msgstr "Notificación de llamada NCID"
 
 msgid "Callmonitor for the Fritz!Box routers"
-msgstr ""
+msgstr "Monitor de llamada para los routers Fritz!Box"
 
-#, fuzzy
 msgid "Can't connect to server. Please check your network!"
 msgstr "Por favor, ¡chequee su configuración de red!"
 
-#
 msgid "Canada"
-msgstr ""
+msgstr "Canadá"
 
 #
 msgid "Cancel"
@@ -1265,53 +1257,47 @@ msgstr "Tarjeta"
 msgid "Catalan"
 msgstr "Catalán"
 
-#
 msgid "Center screen at the lower border"
-msgstr ""
+msgstr "Centrar la pantalla al borde inferior"
 
-#
 msgid "Center screen at the upper border"
-msgstr ""
+msgstr "Centrar la pantalla al borde superior"
 
-#
 msgid "Change active delay"
-msgstr ""
+msgstr "Cambiar el retardo activo"
 
 #
 msgid "Change bouquets in quickzap"
 msgstr "Cambiar de lista en zapin rápido"
 
-#
 msgid "Change default recording offset?"
-msgstr ""
+msgstr "¿Quiere cambiar el retardo de grabación por defecto?"
 
-#
 msgid "Change hostname"
-msgstr ""
+msgstr "Cambiar el nombre de la máquina"
 
 #
 msgid "Change pin code"
 msgstr "Cambiar código pin"
 
 msgid "Change service PIN"
-msgstr ""
+msgstr "Cambiar el PIN de servicio"
 
 msgid "Change service PINs"
-msgstr ""
+msgstr "Cambiar los PINs de servicio"
 
 msgid "Change setup PIN"
-msgstr ""
+msgstr "Cambiar el PIN de configuración"
 
 #
 msgid "Change step size"
 msgstr "Cambiar tamaño"
 
-#
 msgid "Change the hostname of your Dreambox."
-msgstr ""
+msgstr "Cambiar el nombre de la máquina de su Dreambox."
 
 msgid "Changelog"
-msgstr ""
+msgstr "Novedades"
 
 #
 msgid "Channel"
@@ -1321,9 +1307,8 @@ msgstr "Canal"
 msgid "Channel Selection"
 msgstr "Selección de Canal"
 
-#
 msgid "Channel audio:"
-msgstr ""
+msgstr "Canal de audio:"
 
 #
 msgid "Channel not in services list"
@@ -1382,7 +1367,7 @@ msgid "Choose bouquet"
 msgstr "Elegir lista"
 
 msgid "Choose image to download"
-msgstr ""
+msgstr "Elegir imagen para descargar"
 
 #
 msgid "Choose target folder"
@@ -1421,10 +1406,10 @@ msgid "Cleanup Wizard settings"
 msgstr "Configuración de Asistente de limpieza"
 
 msgid "Cleanup timerlist automatically"
-msgstr ""
+msgstr "Limpiar la lista de programaciones automáticamente"
 
 msgid "Cleanup timerlist automatically."
-msgstr ""
+msgstr "Limpiar la lista de programaciones automáticamente."
 
 #
 msgid "CleanupWizard"
@@ -1434,9 +1419,8 @@ msgstr "LimpiarAsistente"
 msgid "Clear before scan"
 msgstr "Limpiar antes de buscar"
 
-#
 msgid "Clear history on Exit:"
-msgstr ""
+msgstr "Limpiar la historia al Salir:"
 
 #
 msgid "Clear log"
@@ -1486,9 +1470,8 @@ msgstr "Configuración de la colección"
 msgid "Color Format"
 msgstr "Formato de Color"
 
-#
 msgid "Comedy"
-msgstr ""
+msgstr "Comedia"
 
 #
 msgid "Command execution..."
@@ -1531,7 +1514,7 @@ msgid "Complex (allows mixing audio tracks and aspects)"
 msgstr "Complejo (permite mexclar pistas de audio y aspectos)"
 
 msgid "Composition of the recording filenames"
-msgstr ""
+msgstr "Composición de los nombre de ficheros de grabación"
 
 #
 msgid "Configuration Mode"
@@ -1554,7 +1537,7 @@ msgid "Configure nameservers"
 msgstr "Configurar DNSs"
 
 msgid "Configure your WLAN network interface"
-msgstr ""
+msgstr "Configurar el interfaz de la red WLAN"
 
 #
 msgid "Configure your internal LAN"
@@ -1617,28 +1600,28 @@ msgid "Contrast"
 msgstr "Contraste"
 
 msgid "Control your Dreambox with your Web browser."
-msgstr ""
+msgstr "Controlar su Dreambox con su navegador Web."
 
 msgid "Control your Dreambox with your browser"
-msgstr ""
+msgstr "Controlar su Dreambox con su navegador"
 
 msgid "Control your dreambox with only the MUTE button"
-msgstr ""
+msgstr "Controla su dreambox con sólo su botón MUTE"
 
 msgid "Control your dreambox with only the MUTE button."
-msgstr ""
+msgstr "Controlar su dreambox con sólo su botón MUTE."
 
 msgid "Control your internal system fan."
-msgstr ""
+msgstr "Controlar el ventilador interno del sistema."
 
 msgid "Control your kids's tv usage"
-msgstr ""
+msgstr "Controlar el uso de la tv por los niños"
 
 msgid "Control your system fan"
-msgstr ""
+msgstr "Controlar el ventilador del sistema"
 
 msgid "Copy, rename, delete, move local files on your Dreambox."
-msgstr ""
+msgstr "Copiar, renombrar, borrar, mover ficheros locales en su Dreambox."
 
 #
 msgid "Could not connect to Dreambox .NFI Image Feed Server:"
@@ -1686,10 +1669,10 @@ msgid "Create DVD-ISO"
 msgstr "Crear DVD-ISO"
 
 msgid "Create a backup of your Video DVD on your DreamBox hard drive."
-msgstr ""
+msgstr "Crear una copia de su DVD en su disco duro de su Dreambox."
 
 msgid "Create a backup of your Video-DVD"
-msgstr ""
+msgstr "Crear una copia de su DVD-Video"
 
 #
 msgid "Create a new AutoTimer."
@@ -1708,13 +1691,13 @@ msgid "Create movie folder failed"
 msgstr "Falló la creación de la carpeta de películas"
 
 msgid "Create preview pictures of your Movies"
-msgstr ""
+msgstr "Crear imágenes de previsualización de sus Películas"
 
 msgid "Create remote timers"
-msgstr ""
+msgstr "Crear programaciones remotas"
 
 msgid "Create timers on remote Dreamboxes."
-msgstr ""
+msgstr "Crear programaciones en sus Dreamboxes remotos."
 
 #
 #, python-format
@@ -1734,7 +1717,7 @@ msgid "Current Transponder"
 msgstr "Transponder actual"
 
 msgid "Current device: "
-msgstr ""
+msgstr "Dispositivo actual:"
 
 #
 msgid "Current settings:"
@@ -1749,7 +1732,7 @@ msgid "Current version:"
 msgstr "Versión actual:"
 
 msgid "Currently installed image"
-msgstr ""
+msgstr "Imagen actualmente instalada"
 
 #
 #, python-format
@@ -1781,23 +1764,23 @@ msgid "Customize"
 msgstr "Configurar"
 
 msgid "Customize Vali-XD skins"
-msgstr ""
+msgstr "Pieles por Vali-XD"
 
 msgid "Customize Vali-XD skins by yourself."
-msgstr ""
+msgstr "Personalizar pieles Vali-XD por si mismo."
 
 #
 msgid "Cut"
 msgstr "Cortar"
 
 msgid "Cut your movies"
-msgstr ""
+msgstr "Recortar sus películas"
 
 msgid "Cut your movies."
-msgstr ""
+msgstr "Recortar sus películas."
 
 msgid "CutListEditor allows you to edit your movies"
-msgstr ""
+msgstr "CutListEditor permite editar sus películas"
 
 msgid ""
 "CutListEditor allows you to edit your movies.\n"
@@ -1805,6 +1788,10 @@ msgid ""
 "cut'.\n"
 "Then seek to the end, press OK, select 'end cut'. That's it."
 msgstr ""
+"CutListEditor permite editar sus películas.\n"
+"Ir al inicio a partir del que quiere recortar. Pulse OK, seleccione 'corte "
+"inicial'.\n"
+"Después vaya al final y pulse OK, selecciones 'corte final'. Eso es todo."
 
 #
 msgid "Cutlist editor..."
@@ -1814,9 +1801,8 @@ msgstr "Editor de listas de corte..."
 msgid "Czech"
 msgstr "Checo"
 
-#
 msgid "Czech Republic"
-msgstr ""
+msgstr "República Checa"
 
 #
 msgid "D"
@@ -1826,9 +1812,8 @@ msgstr "D"
 msgid "DHCP"
 msgstr "DHCP"
 
-#
 msgid "DUAL LAYER DVD"
-msgstr ""
+msgstr "DVD DOBLE CAPA"
 
 #
 msgid "DVB-S"
@@ -1855,13 +1840,16 @@ msgid "DVD media toolbox"
 msgstr "Barra de disco DVD"
 
 msgid "DVDPlayer plays your DVDs on your Dreambox"
-msgstr ""
+msgstr "DVDPlayer reproduce sus DVDs en su Dreambox"
 
 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 ""
+"DVDPlayer reproduce sus DVDs en su Dreambox.\n"
+"Con el DVDPlayer puede reproducir sus DVDs en su Dreambox desde el DVD o "
+"incluso desde un fichero iso o una carpeta video_ts de su disco duro o red."
 
 #
 msgid "Danish"
@@ -1883,14 +1871,12 @@ msgstr "Decidir qué hacer cuando un crashlog sea encontrado."
 msgid "Decide what should happen to the crashlogs after submission."
 msgstr "Decidir qué hacer después de enviar el crashlog."
 
-#
 msgid "Decrease delay"
-msgstr ""
+msgstr "Reducir retardo"
 
-#
 #, python-format
 msgid "Decrease delay by %i ms (can be set)"
-msgstr ""
+msgstr "Reducir retardo en %i ms (puede ser puesto)"
 
 #
 msgid "Deep Standby"
@@ -1912,16 +1898,14 @@ msgstr "Ubicación por defecto de películas"
 msgid "Default services lists"
 msgstr "Lista de canales por defecto"
 
-#
-#, fuzzy
 msgid "Defaults"
 msgstr "Por defecto"
 
 msgid "Define a startup service"
-msgstr ""
+msgstr "Definir un canal de inicio"
 
 msgid "Define a startup service for your Dreambox."
-msgstr ""
+msgstr "Definir un canal de inicio para su Dreambox."
 
 #
 msgid "Delay"
@@ -1943,9 +1927,8 @@ msgstr "Borrar entrada"
 msgid "Delete failed!"
 msgstr "¡Falló el borrado!"
 
-#
 msgid "Delete mount"
-msgstr ""
+msgstr "Borrar montaje"
 
 #
 #, python-format
@@ -1956,9 +1939,8 @@ msgstr ""
 "No borrar más satélite configurado\n"
 "%s?"
 
-#
 msgid "Descending"
-msgstr ""
+msgstr "Descendiendo"
 
 #
 msgid "Description"
@@ -1969,7 +1951,7 @@ msgid "Deselect"
 msgstr "Deseleccionar"
 
 msgid "Details for plugin: "
-msgstr ""
+msgstr "Detalles del plugin:"
 
 #
 msgid "Detected HDD:"
@@ -2011,12 +1993,11 @@ msgstr "Marcando:"
 msgid "Digital contour removal"
 msgstr "Borrar contorno digital"
 
-#
 msgid "Dir:"
-msgstr ""
+msgstr "Dir:"
 
 msgid "Direct playback of Youtube videos"
-msgstr ""
+msgstr "Reproduce directamente los videos de Youtube"
 
 #
 msgid "Direct playback of linked titles without menu"
@@ -2051,13 +2032,11 @@ msgstr "Desactivar programación"
 msgid "Disabled"
 msgstr "Desactivado"
 
-#
 msgid "Discard changes and close plugin"
-msgstr ""
+msgstr "Descartar cambios y cerrar plugin"
 
-#
 msgid "Discard changes and close screen"
-msgstr ""
+msgstr "Descartar cambios y cerrar pantalla"
 
 #
 msgid "Disconnect"
@@ -2087,15 +2066,14 @@ msgstr "Configurar Pantalla"
 msgid "Display and Userinterface"
 msgstr "Pantalla e Interfaz de usuario"
 
-#
 msgid "Display search results by:"
-msgstr ""
+msgstr "Visualizar los resultados de búsqueda por:"
 
 msgid "Display your photos on the TV"
-msgstr ""
+msgstr "Visualizar sus fotos en su TV"
 
 msgid "Displays movie information from the InternetMovieDatabase"
-msgstr ""
+msgstr "Visualizar información de la película desde la InternetMovieDatabase"
 
 #
 #, python-format
@@ -2164,15 +2142,15 @@ msgstr "¿Quiere hacer otra búsqueda manual?"
 
 #, python-format
 msgid "Do you want to download the image to %s ?"
-msgstr ""
+msgstr "¿Quiere descargar la imagen a %s?"
 
 #
 msgid "Do you want to enable the parental control feature on your dreambox?"
 msgstr "¿Quiere activar el control de adultos en su dreambox?"
 
-#
 msgid "Do you want to enter a username and password for this host?\n"
 msgstr ""
+"¿Quiere introducir un nombre de usuario y contraseña para esta máquina?\n"
 
 #
 msgid "Do you want to install default sat lists?"
@@ -2206,9 +2184,8 @@ msgstr "¿Quiere restaurar su configuración?"
 msgid "Do you want to resume this playback?"
 msgstr "¿Quiere continuar esta reproducción?"
 
-#
 msgid "Do you want to see more entries?"
-msgstr ""
+msgstr "¿Quiere ver más entradas?"
 
 #
 msgid ""
@@ -2262,7 +2239,7 @@ msgstr "Descargar"
 
 #, python-format
 msgid "Download %s from Server"
-msgstr ""
+msgstr "Descargar %s desde el Servidor"
 
 #
 msgid "Download .NFI-Files for USB-Flasher"
@@ -2272,16 +2249,14 @@ msgstr "Descargar ficheros .NFI para el USB-Flasher"
 msgid "Download Plugins"
 msgstr "Descargar Plugins"
 
-#
 msgid "Download Video"
-msgstr ""
+msgstr "Descargar Video"
 
 msgid "Download files from Rapidshare"
-msgstr ""
+msgstr "Descargar ficheros desde Rapidshare"
 
-#
 msgid "Download location"
-msgstr ""
+msgstr "Localización de la descarga"
 
 #
 msgid "Downloadable new plugins"
@@ -2299,9 +2274,8 @@ msgstr "Descargando"
 msgid "Downloading plugin information. Please wait..."
 msgstr "Descargando información del plugin. Espere..."
 
-#
 msgid "Downloading screenshots. Please wait..."
-msgstr ""
+msgstr "Descargando pantallazos. Por favor, espere..."
 
 #
 msgid "Dreambox format data DVD (HDTV compatible)"
@@ -2311,9 +2285,8 @@ msgstr "Formato dreambox DVD (HDTV compatible)"
 msgid "Dreambox software because updates are available."
 msgstr "Actualizaciones del software Dreambox están disponibles."
 
-#
 msgid "Duration: "
-msgstr ""
+msgstr "Duración:"
 
 #
 msgid "Dutch"
@@ -2341,6 +2314,10 @@ msgid ""
 "(in standby mode without any running recordings) to perform updates of the "
 "epg information on these channels."
 msgstr ""
+"EPGRefresh automáticamente cambia a los canales definidos por el usuario "
+"cuando está desocupado\n"
+"(en modo reposo si hay alguna grabación ejecutándose) para realizar "
+"actualizaciones en la información del epg de esos canales."
 
 #
 #, python-format
@@ -2379,9 +2356,8 @@ msgstr "Editar Programaciones y buscar nuevos Eventos"
 msgid "Edit Title"
 msgstr "Editar Título"
 
-#
 msgid "Edit bouquets list"
-msgstr ""
+msgstr "Editar lista de canales"
 
 #
 msgid "Edit chapters of current title"
@@ -2404,10 +2380,10 @@ msgid "Edit settings"
 msgstr "Editar configuración"
 
 msgid "Edit tags of recorded movies"
-msgstr ""
+msgstr "Editar etiquetas de películas grabadas"
 
 msgid "Edit tags of recorded movies."
-msgstr ""
+msgstr "Editar etiquetas de películas grabadas."
 
 #
 msgid "Edit the Nameserver configuration of your Dreambox.\n"
@@ -2433,24 +2409,22 @@ msgstr "Editando"
 msgid "Editor for new AutoTimers"
 msgstr "Editor para nuevas AutoProgramaciones"
 
-#
 msgid "Education"
-msgstr ""
+msgstr "Educación"
 
 #
 msgid "Electronic Program Guide"
 msgstr "Guía de Programación Electrónica"
 
 msgid "Emailclient is an IMAP4 e-mail viewer for the Dreambox."
-msgstr ""
+msgstr "Emailclient es un visor de e-mail IMAP4 para su Dreambox."
 
 #
 msgid "Enable"
 msgstr "Activar"
 
-#
 msgid "Enable /media"
-msgstr ""
+msgstr "Habilitar /media"
 
 #
 msgid "Enable 5V for active antenna"
@@ -2464,29 +2438,24 @@ msgstr "¿Activar el Asistente de Limpieza?"
 msgid "Enable Filtering"
 msgstr "Activar Filtro"
 
-#
 msgid "Enable HTTP Access"
-msgstr ""
+msgstr "Habilitar Acceso HTTP"
 
-#
 msgid "Enable HTTP Authentication"
-msgstr ""
+msgstr "Habilitar Autenticación HTTP"
 
-#
 msgid "Enable HTTPS Access"
-msgstr ""
+msgstr "Habilitar Acceso HTTPS"
 
-#
 msgid "Enable HTTPS Authentication"
-msgstr ""
+msgstr "Habilitar Autenticación HTTPS"
 
 #
 msgid "Enable Service Restriction"
 msgstr "Activar Restricción de Canales"
 
-#
 msgid "Enable Streaming Authentication"
-msgstr ""
+msgstr "Habilitar Autenticación en Streaming"
 
 #
 msgid "Enable multiple bouquets"
@@ -2496,11 +2465,11 @@ msgstr "Habilitar multiples listas"
 msgid "Enable parental control"
 msgstr "Activar el control de adultos"
 
-#
 msgid ""
 "Enable this to be able to access the AutoTimer Overview from within the "
 "extension menu."
 msgstr ""
+"Activar esto para activar el acceso al AutoTimer desde el menú de extensión."
 
 #
 msgid "Enable timer"
@@ -2510,11 +2479,12 @@ msgstr "Activar programación"
 msgid "Enabled"
 msgstr "Activado"
 
-#
 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 ""
+"Codificar el canal a usar desde su dato del EPG. Sólo necesita cambiar esto "
+"si está buscando por caracteres especiales como los umlauts alemanes."
 
 #
 msgid "Encrypted: "
@@ -2564,6 +2534,8 @@ 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 ""
+"El plugin de Enigma2 para reproducir videos AVI/DIVX/WMV/etc. desde el pc en "
+"su Dreambox. Necesita una ejecución de VLC en su pc (www.videolan.org)."
 
 #
 msgid ""
@@ -2585,9 +2557,8 @@ msgstr ""
 msgid "Enter Fast Forward at speed"
 msgstr "Introduzca velocidad de avance hacia delante"
 
-#
 msgid "Enter IP to scan..."
-msgstr ""
+msgstr "Introduzca la IP a escanear..."
 
 #
 msgid "Enter Rewind at speed"
@@ -2597,53 +2568,43 @@ msgstr "Introduzca velocidad de avance hacia atrás"
 msgid "Enter main menu..."
 msgstr "Entre al menú principal..."
 
-#
 msgid "Enter new hostname for your Dreambox"
-msgstr ""
+msgstr "Introduzca el nombre de su Dreambox"
 
-#
 msgid "Enter options:"
-msgstr ""
+msgstr "Introduzca opciones:"
 
-#
 msgid "Enter password:"
-msgstr ""
+msgstr "Introduzca contraseña:"
 
-#
 msgid "Enter pin code"
-msgstr ""
+msgstr "Introduzca código pin"
 
-#
 msgid "Enter share directory:"
-msgstr ""
+msgstr "Introduzca el directorio compartido:"
 
-#
 msgid "Enter share name:"
-msgstr ""
+msgstr "Introduza el nombre compartido:"
 
 #
 msgid "Enter the service pin"
 msgstr "Ponga el pin del canal"
 
-#
 msgid "Enter user and password for host: "
-msgstr ""
+msgstr "Introduzca el usuario y la contraseña para la máquina:"
 
-#
 msgid "Enter username:"
-msgstr ""
+msgstr "Introduzca nombre de usuario:"
 
 #
 msgid "Enter your email address so that we can contact you if needed."
 msgstr "Introduzca su email para que contactemos con usted si es necesario."
 
-#
 msgid "Enter your search term(s)"
-msgstr ""
+msgstr "Introduzca los términos a buscar:"
 
-#
 msgid "Entertainment"
-msgstr ""
+msgstr "Entretenimiento"
 
 #
 msgid "Error"
@@ -2678,10 +2639,8 @@ msgstr "Todo está bien"
 msgid "Exact match"
 msgstr "Coincidencia exacta"
 
-#
-#, fuzzy
 msgid "Exceeds dual layer medium!"
-msgstr "¡excede el disco de doble capa!"
+msgstr "¡Excede el disco de doble capa!"
 
 #
 msgid "Exclude"
@@ -2692,7 +2651,7 @@ msgid "Execute \"after event\" during timespan"
 msgstr "Ejectuar el después del Evento durante el Tiempo"
 
 msgid "Execute TuxboxPlugins"
-msgstr ""
+msgstr "Ejecuta TuxboxPlugins"
 
 #
 msgid "Execution Progress:"
@@ -2715,7 +2674,7 @@ msgid "Exit editor"
 msgstr "Salir del editor"
 
 msgid "Exit input device selection."
-msgstr ""
+msgstr "Sale de la selección de dispositivo de entrada."
 
 #
 msgid "Exit network wizard"
@@ -2769,6 +2728,8 @@ msgid ""
 "FTPBrowser allows uploading and downloading files between your Dreambox and "
 "a server using the file transfer protocol."
 msgstr ""
+"FTPBrowser permite subir y bajar ficheros entre su Dreambox y un servidor "
+"usando el protocolo de transferencia de ficheros."
 
 #
 msgid "Factory reset"
@@ -2813,25 +2774,21 @@ msgstr "Época rápida"
 msgid "Favourites"
 msgstr "Favoritos"
 
-#
 msgid "Fetching feed entries"
-msgstr ""
+msgstr "Descargando las entradas"
 
-#
 msgid "Fetching search entries"
-msgstr ""
+msgstr "Descargando las entradas de búsqueda"
 
-#
 msgid "Filesystem Check"
-msgstr ""
+msgstr "Chequear sistema de ficheros"
 
 #
 msgid "Filesystem contains uncorrectable errors"
 msgstr "El sistema de archivos contiene errores graves"
 
-#
 msgid "Film & Animation"
-msgstr ""
+msgstr "Cine y animación"
 
 #
 msgid "Filter"
@@ -2871,7 +2828,7 @@ msgid "Finnish"
 msgstr "Finlandés"
 
 msgid "First generate your skin-style with the Ai.HD-Control plugin."
-msgstr ""
+msgstr "Primero genera su piel de estilo Ai.HD-Control"
 
 #
 msgid "Flash"
@@ -2906,9 +2863,8 @@ msgstr "Contador de tramas sin problemas de sombras"
 msgid "Frame size in full view"
 msgstr "Tamaño de trama en vista completa"
 
-#
 msgid "France"
-msgstr ""
+msgstr "Francia"
 
 #
 msgid "French"
@@ -2944,9 +2900,10 @@ msgstr "Frisón"
 
 msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox."
 msgstr ""
+"FritzCall muestra sus llamadas de entrada a su Fritz!Box en su Dreambox."
 
 msgid "Frontend for /tmp/mmi.socket"
-msgstr ""
+msgstr "Frontend para /tmp/mmi.socket"
 
 #
 #, python-format
@@ -2966,18 +2923,19 @@ msgstr ""
 "¿Quiere Reiniciar el GUI ahora?"
 
 msgid "GUI that allows user to change the ftp- / telnet password."
-msgstr ""
+msgstr "GUI que permite al usuario cambiar la contraseña para ftp/telnet."
 
 msgid ""
 "GUI that allows user to change the ftp-/telnet-password of the Dreambox."
 msgstr ""
+"GUI que permite al usuario cambiar la contraseña del ftp/telnet en su "
+"Dreambox."
 
 msgid "GUI to change the ftp and telnet-password"
-msgstr ""
+msgstr "GUI para cambiar la contraseña al ftp y telnet"
 
-#
 msgid "Gaming"
-msgstr ""
+msgstr "Juegos"
 
 #
 msgid "Gateway"
@@ -3003,46 +2961,43 @@ msgstr "Retardo general PCM (ms)"
 msgid "Genre"
 msgstr "Género"
 
-#
 msgid "Genuine Dreambox"
-msgstr ""
+msgstr "Dreambox Genuino"
 
 msgid "Genuine Dreambox validation failed!"
-msgstr ""
+msgstr "Falló la validación del Dreambox Genuino"
 
 msgid "Genuine Dreambox verification"
-msgstr ""
+msgstr "Verificación de Dreambox Genuino"
 
 #
 msgid "German"
 msgstr "Alemán"
 
 msgid "German storm information"
-msgstr ""
+msgstr "Información alemana de tormentas"
 
 msgid "German traffic information"
-msgstr ""
+msgstr "Información alemana del tráfico"
 
-#
 msgid "Germany"
-msgstr ""
+msgstr "Alemania"
 
 msgid "Get AudioCD info from CDDB and CD-Text"
-msgstr ""
+msgstr "Conseguir información AudioCD desde CDDB y CD-Text"
 
 msgid "Get latest experimental image"
-msgstr ""
+msgstr "Conseguir la última imagen experimental"
 
 msgid "Get latest release image"
-msgstr ""
+msgstr "Conseguir la última version de la imagen "
 
 #
 msgid "Getting plugin information. Please wait..."
 msgstr "Leyendo información del complemento. Espere..."
 
-#
 msgid "Global delay"
-msgstr ""
+msgstr "Retardo global"
 
 #
 msgid "Goto 0"
@@ -3053,20 +3008,21 @@ msgid "Goto position"
 msgstr "Ir a la posición"
 
 msgid "GraphMultiEPG shows a graphical timeline EPG"
-msgstr ""
+msgstr "GraphMultiEPG muestra un gráfico de la línea de tiempo del EPG"
 
 msgid ""
 "GraphMultiEPG shows a graphical timeline EPG.\n"
 "Shows a nice overview of all running und upcoming tv shows."
 msgstr ""
+"GraphMultiEPG muestra un gráfico de tiempos del EPG.\n"
+"Muestra una vista general de todos programas actuales y siguientes."
 
 #
 msgid "Graphical Multi EPG"
 msgstr "Multi EPG Gráfico"
 
-#
 msgid "Great Britain"
-msgstr ""
+msgstr "Gran Bretaña"
 
 #
 msgid "Greek"
@@ -3081,6 +3037,10 @@ msgid ""
 "protocol\n"
 "like Recording started notifications to a PC running a growl client"
 msgstr ""
+"Growlee permite que su Dreambox envíe mensajes cortos usando el protocolo "
+"growl\n"
+"como la notificación de  inicio de una grabación a un PC ejecutando un "
+"cliente growl"
 
 #
 msgid "Guard Interval"
@@ -3094,17 +3054,14 @@ msgstr "Modo intervalo seguro"
 msgid "Guess existing timer based on begin/end"
 msgstr "Las programaciones existentes están basadas en Inicio/Fin"
 
-#
 msgid "HD videos"
-msgstr ""
+msgstr "Videos HD"
 
-#
 msgid "HTTP Port"
-msgstr ""
+msgstr "Puerto HTTP"
 
-#
 msgid "HTTPS Port"
-msgstr ""
+msgstr "Puerto HTTPS"
 
 #
 msgid "Harddisk"
@@ -3118,9 +3075,8 @@ msgstr "Configuración del disco duro"
 msgid "Harddisk standby after"
 msgstr "Disco duro en reposo después"
 
-#
 msgid "Help"
-msgstr ""
+msgstr "Ayuda"
 
 #
 msgid "Hidden network SSID"
@@ -3142,24 +3098,21 @@ msgstr "Modo jerárquico"
 msgid "High bitrate support"
 msgstr "Soporte de bitrate alto"
 
-#
 msgid "History"
-msgstr ""
+msgstr "Historia"
 
-#
 msgid "Holland"
-msgstr ""
+msgstr "Holanda"
 
-#
 msgid "Hong Kong"
-msgstr ""
+msgstr "Hong Kong"
 
 #
 msgid "Horizontal"
 msgstr "Horizontal"
 
 msgid "Hotplugging for removeable devices"
-msgstr ""
+msgstr "Conexión en caliente de dispositivos removibles"
 
 #
 msgid "How many minutes do you want to record?"
@@ -3169,9 +3122,8 @@ msgstr "¿Cuántos minutos quiere grabar?"
 msgid "How to handle found crashlogs?"
 msgstr "¿Cómo quiere manejar los crashlogs?"
 
-#
 msgid "Howto & Style"
-msgstr ""
+msgstr "Cómo hacer y Estilo"
 
 #
 msgid "Hue"
@@ -3182,18 +3134,17 @@ msgid "Hungarian"
 msgstr "Húngaro"
 
 msgid "IMAP4 e-mail viewer for the Dreambox"
-msgstr ""
+msgstr "Visor de e-mail IMAP4 para su Dreambox"
 
 #
 msgid "IP Address"
 msgstr "Dirección IP"
 
-#
 msgid "IP:"
-msgstr ""
+msgstr "IP:"
 
 msgid "IRC Client for Enigma2"
-msgstr ""
+msgstr "Cliente IRC para Enigma2"
 
 #
 msgid "ISO file is too large for this filesystem!"
@@ -3207,12 +3158,13 @@ msgstr "ruta ISO"
 msgid "Icelandic"
 msgstr "Islandés"
 
-#
 #, 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 ""
+"Si activa esto, una grabación existente también será considerada grabación "
+"si el evento graba al menos el 80% de ella."
 
 #
 msgid ""
@@ -3272,14 +3224,12 @@ msgstr "Incluir"
 msgid "Include your email and name (optional) in the mail?"
 msgstr "¿Incluir su email y nombre (opcional) en el email?"
 
-#
 msgid "Increase delay"
-msgstr ""
+msgstr "Incrementar retardo"
 
-#
 #, python-format
 msgid "Increase delay by %i ms (can be set)"
-msgstr ""
+msgstr "Incrementar retardo por %i ms (puede ser puesto)"
 
 #
 msgid "Increased voltage"
@@ -3289,9 +3239,8 @@ msgstr "Voltaje incrementado"
 msgid "Index"
 msgstr "Índice"
 
-#
 msgid "India"
-msgstr ""
+msgstr "India"
 
 #
 msgid "Info"
@@ -3317,9 +3266,8 @@ msgstr "Iniciar"
 msgid "Initial location in new timers"
 msgstr "Ruta inicial en nuevas programaciones"
 
-#
 msgid "Initialization"
-msgstr ""
+msgstr "Inicialización"
 
 #
 msgid "Initialize"
@@ -3334,10 +3282,10 @@ msgid "Input"
 msgstr "Entrada"
 
 msgid "Input device setup"
-msgstr ""
+msgstr "Configuración del dispositivo de entrada"
 
 msgid "Input devices"
-msgstr ""
+msgstr "Dispositivos de entrada"
 
 #
 msgid "Install"
@@ -3412,10 +3360,10 @@ msgid "Internal Flash"
 msgstr "Flash Interna"
 
 msgid "Internal LAN adapter."
-msgstr ""
+msgstr "Adaptador de RED interna"
 
 msgid "Internal firmware updater"
-msgstr ""
+msgstr "Actualización de firmware interno"
 
 #
 msgid "Invalid Location"
@@ -3426,25 +3374,22 @@ msgstr "Localización inválida"
 msgid "Invalid directory selected: %s"
 msgstr "Directorio seleccionado inválido: %s"
 
-#
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 304
 msgid "Invalid response from Security service pls restart again"
 msgstr ""
+"Respuesta no válida del canal de Seguridad, por favor reinicie de nuevo"
 
-#
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 132
 msgid "Invalid response from server."
-msgstr ""
+msgstr "Respuesta no válida del servidor."
 
-#
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 177
 #, python-format
 msgid "Invalid response from server. Please report: %s"
-msgstr ""
+msgstr "Respuesta no válida del servidor. Por favor reporte: %s"
 
-#
 msgid "Invalid selection"
-msgstr ""
+msgstr "Selección no válida"
 
 #
 msgid "Inversion"
@@ -3454,17 +3399,15 @@ msgstr "Inversión"
 msgid "Ipkg"
 msgstr "Ipkg"
 
-#
 msgid "Ireland"
-msgstr ""
+msgstr "Irlanda"
 
 #
 msgid "Is this videomode ok?"
 msgstr "¿Es este modo de video ok?"
 
-#
 msgid "Israel"
-msgstr ""
+msgstr "Israel"
 
 #
 msgid ""
@@ -3486,18 +3429,16 @@ msgid "Italian"
 msgstr "Italiano"
 
 msgid "Italian Weather forecast on Dreambox"
-msgstr ""
+msgstr "Previsión italiana del tiempo en su Dreambox"
 
 msgid "Italian Weather forecast on Dreambox from www.google.it."
-msgstr ""
+msgstr "Previsión italiana del tiempo en su Dreambox desde www.google.it."
 
-#
 msgid "Italy"
-msgstr ""
+msgstr "Italia"
 
-#
 msgid "Japan"
-msgstr ""
+msgstr "Japón"
 
 #
 msgid "Job View"
@@ -3509,59 +3450,57 @@ msgid "Just Scale"
 msgstr "Sólo escala"
 
 msgid "Kerni's BrushedAlu-HD skin"
-msgstr ""
+msgstr "Pien Kerni's BrushedAlu-HD"
 
 msgid "Kerni's DreamMM-HD skin"
-msgstr ""
+msgstr "Piel Kerni's DreamMM-HD"
 
 msgid "Kerni's Elgato-HD skin"
-msgstr ""
+msgstr "Piel Kerni's Elgato-HD"
 
 msgid "Kerni's SWAIN skin"
-msgstr ""
+msgstr "Piel Kerni's SWAIN"
 
 msgid "Kerni's SWAIN-HD skin"
-msgstr ""
+msgstr "Piel Kerni's SWAIN-HD"
 
 msgid "Kerni's UltraViolet skin"
-msgstr ""
+msgstr "Piel Kerni's UltraViolet"
 
 msgid "Kerni's YADS-HD skin"
-msgstr ""
+msgstr "Piel Kerni's YADS-HD"
 
 msgid "Kerni's dTV-HD skin"
-msgstr ""
+msgstr "Piel Kerni's dTV-HD"
 
 msgid "Kerni's dTV-HD-Reloaded skin"
-msgstr ""
+msgstr "Piel Kerni's dTV-HD-Reloaded"
 
 msgid "Kerni's dmm-HD skin"
-msgstr ""
+msgstr "Piel Kerni's dmm-HD"
 
 msgid "Kerni's dreamTV-HD skin"
-msgstr ""
+msgstr "Piel Kerni's dreamTV-HD skin"
 
 msgid "Kerni's simple skin"
-msgstr ""
+msgstr "Piel Kerni's simple"
 
 msgid "Kerni-HD1 skin"
-msgstr ""
+msgstr "Piel Kerni-HD1"
 
 msgid "Kerni-HD1R2 skin"
-msgstr ""
+msgstr "Piel Kerni-HD1R2"
 
 msgid "Kernis HD1 skin"
-msgstr ""
+msgstr "Piel Kernis HD1"
 
-#
 #, python-format
 msgid "Key %(Key)s successfully set to %(delay)i ms"
-msgstr ""
+msgstr "Tecla %(Key)s puesto correctamente a %(delay)i ms"
 
-#
 #, python-format
 msgid "Key %(key)s (current value: %(value)i ms)"
-msgstr ""
+msgstr "Tecla %(key)s (valor actual: %(value)i ms)"
 
 #
 msgid "Keyboard"
@@ -3580,14 +3519,14 @@ msgid "Keymap"
 msgstr "Mapa de teclado"
 
 msgid "KiddyTimer allows to control your kids's daily tv usage."
-msgstr ""
+msgstr "KiddyTimer permite controlar el uso diario de la tv de sus hijos."
 
 #
 msgid "LAN Adapter"
 msgstr "Adaptador de red"
 
 msgid "LAN connection"
-msgstr ""
+msgstr "Conexión de red local"
 
 #
 msgid "LNB"
@@ -3679,10 +3618,10 @@ msgid "List of Storage Devices"
 msgstr "Listar dispositivos de almacenamiento"
 
 msgid "Listen and record internet radio"
-msgstr ""
+msgstr "Escuche y grabe radio internet"
 
 msgid "Listen and record shoutcast internet radio on your Dreambox."
-msgstr ""
+msgstr "Escuche y grabe shoutcast de radios de internet en su Dreambox."
 
 #
 msgid "Lithuanian"
@@ -3696,9 +3635,8 @@ msgstr "Cargar"
 msgid "Load Length of Movies in Movielist"
 msgstr "Calcular longitud de Películas en la lista"
 
-#
 msgid "Load feed on startup:"
-msgstr ""
+msgstr "Cargar fuente al arrancar:"
 
 #
 msgid "Load movie-length"
@@ -3708,9 +3646,8 @@ msgstr "Cargar la longitud de las películas"
 msgid "Local Network"
 msgstr "Red Local"
 
-#
 msgid "Local share name"
-msgstr ""
+msgstr "Nombre compartido local"
 
 #
 msgid "Location"
@@ -3733,21 +3670,21 @@ msgid "Long Keypress"
 msgstr "Pulsar tecla largo"
 
 msgid "Long filenames"
-msgstr ""
+msgstr "Nombres de ficheros largos"
 
 #
 msgid "Longitude"
 msgstr "Longitud"
 
-#
 msgid "Lower bound of timespan."
-msgstr ""
+msgstr "Límite inferior del intervalo de tiempo."
 
-#
 msgid ""
 "Lower bound of timespan. Nothing before this time will be matched. Offsets "
 "are not taken into account!"
 msgstr ""
+"Límite inferior de tiempo. Nada antes de este tiempo coincidirá. ¡El "
+"intervalo de inicio no es tenido en cuenta!"
 
 #
 msgid "MMC Card"
@@ -3782,25 +3719,25 @@ msgid "Manage extensions"
 msgstr "Manejar extensiones"
 
 msgid "Manage local files"
-msgstr ""
+msgstr "Manejar ficheros locales"
 
 msgid "Manage logos to display at boot time or while in radio mode."
-msgstr ""
+msgstr "Manejar logos a visualizar al arranque o mientras está en modo radio."
 
 msgid "Manage logos to display at boottime"
-msgstr ""
+msgstr "Manejar logos a visualizar al arranque"
 
-#
 msgid "Manage network shares"
-msgstr ""
+msgstr "Manejar unidades de red"
 
 msgid ""
 "Manage your music files in a database, play it with Merlin Music Player."
 msgstr ""
+"Manejar sus ficheros de música en una base de datos, reproduciéndolo con el "
+"Reproductor de Música Merlin."
 
-#
 msgid "Manage your network shares..."
-msgstr ""
+msgstr "Manejar sus unidades compartidas en red..."
 
 #
 msgid "Manage your receiver's software"
@@ -3848,11 +3785,12 @@ msgstr "Max. Bitrate: "
 msgid "Maximum duration (in m)"
 msgstr "Máxima Duración (en m)"
 
-#
 msgid ""
 "Maximum event duration to match. If an event is longer than this ammount of "
 "time (without offset) it won't be matched."
 msgstr ""
+"Máxima duración del evento para coincidir. Si un evento es más largo que "
+"esta cantidad de tiempo (sin adelanto) no coincidirá."
 
 #
 msgid "Media player"
@@ -4842,6 +4780,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index f6fe726..b607aa0 100755 (executable)
--- a/po/et.po
+++ b/po/et.po
@@ -6,14 +6,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-12-30 09:00+0200\n"
 "Last-Translator: Arvo <arvo@softshark.ee>\n"
 "Language-Team: none\n"
-"Language: et\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 
@@ -4563,6 +4563,9 @@ msgstr "Inimesed & blogid"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock näitab ekraanil pidevalt kellaaega."
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Loomad & Lemmikloomad"
index 2ed03a9..c0e53f6 100755 (executable)
--- a/po/fi.po
+++ b/po/fi.po
@@ -3,14 +3,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-12-19 14:53+0200\n"
 "Last-Translator: Timo <timojarvenpaa@hotmail.com>\n"
 "Language-Team: none\n"
-"Language: fi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Finnish\n"
@@ -4619,6 +4619,9 @@ msgstr "Ihmiset ja blogit"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock näyttää kellon pysyvästi kuvaruudulla."
 
+msgid "Persian"
+msgstr ""
+
 msgid "Pets & Animals"
 msgstr "Lemmikit ja eläimet"
 
index c20a6e6..ea368df 100755 (executable)
--- a/po/fr.po
+++ b/po/fr.po
@@ -3,9 +3,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: enigma 2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2011-01-26 12:50+0200\n"
-"Last-Translator: Mladen <acid-burn@opendreambox.org>\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
+"PO-Revision-Date: 2011-02-09 20:34+0200\n"
+"Last-Translator: Remi <remi.jarrige0293@orange.fr>\n"
 "Language-Team: french\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
@@ -4805,6 +4805,9 @@ msgstr "Peuple & Blogs"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock affiche l'horloge permanente sur l'écran."
 
+msgid "Persian"
+msgstr "Iranien"
+
 #
 msgid "Pets & Animals"
 msgstr "Animaux & Sauvages"
index a5c1a6c..5ed3e0e 100755 (executable)
--- a/po/fy.po
+++ b/po/fy.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: fy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-12-29 16:22+0100\n"
 "Last-Translator: gerrit <gerrit@nedlinux.nl>\n"
 "Language-Team: gerrit <fy@li.org>\n"
@@ -4777,6 +4777,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 90700ea..0d0187c 100755 (executable)
--- a/po/hr.po
+++ b/po/hr.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-01-27 23:38+0100\n"
 "Last-Translator: Jurica <jurica@clarkdigital.com>\n"
 "Language-Team:  <jurica@dream-multimedia.eu>\n"
@@ -4728,6 +4728,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 07ba6f7..a1971ca 100755 (executable)
--- a/po/hu.po
+++ b/po/hu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-11-26 15:36+0100\n"
 "Last-Translator: MediaVox-Extrasat <info@mediavox.hu>\n"
 "Language-Team: none\n"
@@ -4766,6 +4766,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 05e191e..4dbdde3 100755 (executable)
--- a/po/is.po
+++ b/po/is.po
@@ -5,14 +5,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Icelandic translation v.1.44\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-11-18 19:57+0200\n"
 "Last-Translator: Baldur <bsveinsson@gmail.com>\n"
 "Language-Team: Polar Team/LT Team <baddi@oreind.is>\n"
-"Language: is\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: is\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Icelandic\n"
@@ -4355,6 +4355,9 @@ msgstr "Fólk & blogg"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 msgid "Pets & Animals"
 msgstr "Dýralíf"
 
index d8e2881..ea377f1 100755 (executable)
--- a/po/it.po
+++ b/po/it.po
@@ -4,14 +4,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: enigma2 v2.6 Italian Locale\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2010-10-30 14:41+0200\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
+"PO-Revision-Date: 2011-02-06 00:32+0200\n"
 "Last-Translator: spaeleus <spaeleus@croci.org>\n"
 "Language-Team: WWW.LINSAT.NET <spaeleus@croci.org>\n"
+"Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Italian\n"
@@ -1547,7 +1547,7 @@ msgid "Configure nameservers"
 msgstr "Configurare i nameserver"
 
 msgid "Configure your WLAN network interface"
-msgstr "Plugin per la configurazione di una rete locale wireless"
+msgstr "Plugin per la configurazione di una interfaccia di rete WLAN"
 
 #
 msgid "Configure your internal LAN"
@@ -4843,6 +4843,9 @@ msgstr "Gente & Blog"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "Plugin per visualizzare un orologio in modo permanente sullo schermo."
 
+msgid "Persian"
+msgstr "Persiano"
+
 msgid "Pets & Animals"
 msgstr "Cuccioli & Animali"
 
index e723632..fe69c5c 100755 (executable)
--- a/po/lt.po
+++ b/po/lt.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2010-11-07 22:38+0200\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
+"PO-Revision-Date: 2011-01-28 21:11+0200\n"
 "Last-Translator: Audronis <audrgrin@takas.lt>\n"
 "Language-Team: Adga / enigma2 (c) <audrgrin@takas.lt>\n"
 "Language: lt\n"
@@ -18,13 +18,12 @@ msgstr ""
 "X-Poedit-SourceCharset: utf-8\n"
 "X-Poedit-Country: LITHUANIA\n"
 
-#
 msgid ""
 "\n"
 "Advanced options and settings."
 msgstr ""
 "\n"
-"Išplėstiniai pasirinkimai ir nustatymai."
+"Išplėstinės funkcijos ir nustatymai."
 
 #
 msgid ""
@@ -187,10 +186,9 @@ msgstr "#ffffffff"
 msgid "%H:%M"
 msgstr "%H:%M"
 
-#
 #, python-format
 msgid "%d jobs are running in the background!"
-msgstr "%d darbas yra veikiantis fone!"
+msgstr "%d darbai, veikiantys fone!"
 
 #, python-format
 msgid "%d min"
@@ -275,7 +273,7 @@ msgid "16:10 Letterbox"
 msgstr "16:10 Letterbox"
 
 msgid "16:10 PanScan"
-msgstr "16:10 PanScan"
+msgstr "16:10 Panoraminis Skanavimas"
 
 #
 msgid "16:9"
@@ -316,7 +314,7 @@ msgid "4:3 Letterbox"
 msgstr "4:3 Letterbox"
 
 msgid "4:3 PanScan"
-msgstr "4:3 PanScan"
+msgstr "4:3 Panoraminis skanavimas"
 
 #
 msgid "5"
@@ -401,7 +399,6 @@ msgstr ""
 "Baigtas įrašymas pagal laikmatį nori nustatyti Jūsų\n"
 "imtuvą išjungimui. Padaryti tai dabar?"
 
-#
 msgid ""
 "A finished record timer wants to shut down\n"
 "your Dreambox. Shutdown now?"
@@ -619,23 +616,18 @@ msgstr "Pridėti žymeklį"
 msgid "Add a new NFS or CIFS mount point to your Dreambox."
 msgstr "Pridėti naują NFS arba CIFS pajungimo tašką jūsų Dreambox'ui."
 
-#
 msgid "Add a new title"
-msgstr "Pridėkite naują pavadinimą"
+msgstr "Pridėti naują pavadinimą"
 
-#
 msgid "Add network configuration?"
 msgstr "Pridėti tinklo konfigūraciją?"
 
-#
 msgid "Add new AutoTimer"
 msgstr "Pridėti naują Auto Laikmatį"
 
-#
 msgid "Add new network mount point"
 msgstr "Pridėti naują tinklo pajungimo tašką"
 
-#
 msgid "Add timer"
 msgstr "Laikmatis"
 
@@ -692,32 +684,26 @@ msgstr ""
 "bandomuosius ekranus."
 
 msgid "Adult streaming plugin"
-msgstr "Suaugusiųjų transliacijos priedas"
+msgstr "Transliacijos tik suaugusiems priedas"
 
 msgid "Adult streaming plugin."
-msgstr "Suaugusiųjų transliacijos priedas."
+msgstr "Transliacijos tik suaugusiems priedas."
 
-#
 msgid "Advanced Options"
-msgstr "Išplėstiniai nustatymai"
+msgstr "Išplėstinės funkcijos"
 
-#
 msgid "Advanced Software"
 msgstr "Išplėstinė programinė įranga"
 
-#
 msgid "Advanced Software Plugin"
 msgstr "Išplėstinė programinės įrangos papildoma programa"
 
-#
 msgid "Advanced Video Enhancement Setup"
-msgstr "Išplėstas vaizdo stiprinimo valdymas"
+msgstr "Išplėstinis vaizdo gerinimo valdymas"
 
-#
 msgid "Advanced Video Setup"
 msgstr "Išplėstiniai vaizdo nustatymai"
 
-#
 msgid "Advanced restore"
 msgstr "Išplėstinis atkūrimas"
 
@@ -725,12 +711,11 @@ msgid ""
 "After a reboot or power outage, StartupToStandby will bring your Dreambox to "
 "standby-mode."
 msgstr ""
-"Po perkrovimo ar elektros energijos nutraukimo, StartupToStandby nukels jūsų "
-"Dreambox į budėjimo režimą."
+"Po perkrovimo ar elektros energijos nutraukimo, StartupToStandby perkels "
+"jūsų Dreambox į budėjimo režimą."
 
-#
 msgid "After event"
-msgstr "Po įvykio"
+msgstr "Po užduoties"
 
 #
 msgid ""
@@ -1002,23 +987,18 @@ msgstr "Automatiškai atnaujinti EPG"
 msgid "Automatically send crashlogs to Dream Multimedia"
 msgstr "Automatiškai siųsti crashlogs į Dream Multimediją"
 
-#
 msgid "Autos & Vehicles"
-msgstr "Automobiliai ir Transporto priemonės"
+msgstr "Automobiliai ir transporto priemonės"
 
-#
 msgid "Autowrite timer"
 msgstr "Automatinis laikamačio perrašymas"
 
-#
 msgid "Available format variables"
-msgstr "Galimi formatai"
+msgstr "Galimi kintami formatai"
 
-#
 msgid "B"
 msgstr "B"
 
-#
 msgid "BA"
 msgstr "BA"
 
@@ -1028,11 +1008,9 @@ msgstr "BASIC-HD Tema nuo Ismail Demir"
 msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
 msgstr "BASIC-HD tema dėl Dreambox atvaizdų sukurta Ismail Demir"
 
-#
 msgid "BB"
 msgstr "BB"
 
-#
 msgid "BER"
 msgstr "BER"
 
@@ -4335,6 +4313,9 @@ msgstr "Liaudis ir Blogai"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock rodo laikrodį ilgam ant ekrano."
 
+msgid "Persian"
+msgstr "Persų"
+
 msgid "Pets & Animals"
 msgstr "Numylėtiniai ir Gyvūnai"
 
index 00c7da2..b733ef1 100755 (executable)
--- a/po/lv.po
+++ b/po/lv.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2009-02-25 20:35+0200\n"
 "Last-Translator: Ivo Grinbergs <ivog@apollo.lv>\n"
 "Language-Team: Ivo / enigma2 (c) <ivog@apolllo.lv>\n"
@@ -4816,6 +4816,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 37250cf..91f983a 100755 (executable)
--- a/po/nl.po
+++ b/po/nl.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: enigma2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
-"PO-Revision-Date: 2011-01-26 11:56+0200\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
+"PO-Revision-Date: 2011-01-28 09:34+0200\n"
 "Last-Translator: Benny <Benny.DeTandt@gmail.com>\n"
 "Language-Team: <Benny.DeTandt@gmail.com>\n"
 "Language: nl\n"
@@ -522,7 +522,7 @@ msgstr ""
 "Wilt u de tweede netwerk interface uitschakelen?"
 
 msgid "A simple downloading application for other plugins"
-msgstr ""
+msgstr "Een eenvoudige downloadapplicatie voor andere plugins"
 
 #
 msgid ""
@@ -753,6 +753,8 @@ msgid ""
 "After a reboot or power outage, StartupToStandby will bring your Dreambox to "
 "standby-mode."
 msgstr ""
+"Na een reboot of stroomuitval, brengt StartupToStandby uw Dreambox in stand-"
+"by."
 
 #
 msgid "After event"
@@ -793,10 +795,12 @@ msgid "Allow zapping via Webinterface"
 msgstr "Zappen via Webinterface toestaan"
 
 msgid "Allows the execution of TuxboxPlugins."
-msgstr ""
+msgstr "Maakt het uitvoeren van TuxboxPlugins mogelijk."
 
 msgid "Allows user to download files from rapidshare in the background."
 msgstr ""
+"Maakt het mogelijk om op de achtergrond bestanden van RapidShare te "
+"downloaden."
 
 #
 msgid "Alpha"
@@ -912,7 +916,7 @@ msgid "Aspect Ratio"
 msgstr "Beeldverhouding"
 
 msgid "Assigning providers/services/caids to a CI module"
-msgstr ""
+msgstr "Toewijzen van zenders/kanalen/caids aan een CI-module"
 
 msgid "Atheros"
 msgstr "Atheros"
@@ -937,6 +941,8 @@ msgid ""
 "AudoSync allows delaying the sound output (Bitstream/PCM) so that it is "
 "synchronous to the picture."
 msgstr ""
+"AudioSync kan geluid (Bitstream/PCM) vertragen zodat het synchroon loopt met "
+"het beeld."
 
 #
 msgid "Australia"
@@ -990,6 +996,8 @@ msgid ""
 "AutoTimer scans the EPG and creates Timers depending on user-defined search  "
 "criteria."
 msgstr ""
+"AutoTimer scant de EPG en creëert Timers afhankelijk van de door de "
+"gebruiker gedefinieerde zoekcriteria."
 
 #
 msgid "Automatic"
@@ -1012,9 +1020,11 @@ msgid ""
 "Automatically changes the output resolution depending on the video "
 "resolution you are watching."
 msgstr ""
+"Verandert automatisch de output resolutie, afhankelijk van de videoresolutie "
+"waar u naar kijkt."
 
 msgid "Automatically create timer events based on keywords"
-msgstr ""
+msgstr "Maakt automatisch timers aan op basis van trefwoorden"
 
 msgid "Automatically informs you on low internal memory"
 msgstr "Automatisch informeert u over weinig intern geheugen"
@@ -1422,10 +1432,10 @@ msgid "Cleanup Wizard settings"
 msgstr "Cleanup Wizard instellingen"
 
 msgid "Cleanup timerlist automatically"
-msgstr ""
+msgstr "Ruimt de timerlijst automatisch op"
 
 msgid "Cleanup timerlist automatically."
-msgstr ""
+msgstr "Ruimt de timerlijst automatisch op."
 
 #
 msgid "CleanupWizard"
@@ -1710,7 +1720,7 @@ msgid "Create movie folder failed"
 msgstr "Aanmaken van de opnamemap is mislukt"
 
 msgid "Create preview pictures of your Movies"
-msgstr ""
+msgstr "Maakt voorbeeld miniaturen aan van uw films"
 
 msgid "Create remote timers"
 msgstr ""
@@ -1807,6 +1817,11 @@ msgid ""
 "cut'.\n"
 "Then seek to the end, press OK, select 'end cut'. That's it."
 msgstr ""
+"Met CutListEditor kunt u uw opnames bewerken.\n"
+"Ga naar het begin van het deel dat u wilt knippen. Druk op 'OK', kies 'start "
+"cut'.\n"
+"Ga vervolgens naar het einde van het deel dat u wilt knippen, druk op 'OK', "
+"kies 'end cut'. Dat is alles. "
 
 #
 msgid "Cutlist editor..."
@@ -1864,9 +1879,6 @@ msgid ""
 "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 ""
-"DVD-speler speelt uw DVD's af op uw Dreambox.\n"
-"Met de DVD-speler kunt u DVD's afspelen op uw Dreambox, maar ook een ISO-"
-"bestand en een Video-ts map op uw harde schijf of van uw netwerk."
 
 #
 msgid "Danish"
@@ -1922,10 +1934,10 @@ msgid "Defaults"
 msgstr "Standaard"
 
 msgid "Define a startup service"
-msgstr ""
+msgstr "Bepaal de status na opstarten"
 
 msgid "Define a startup service for your Dreambox."
-msgstr ""
+msgstr "Bepaal de status na het opstarten van uw Dreambox."
 
 #
 msgid "Delay"
@@ -1973,7 +1985,7 @@ msgid "Deselect"
 msgstr "Deselecteer"
 
 msgid "Details for plugin: "
-msgstr "Details voor plugin:"
+msgstr "Details voor plugin: "
 
 #
 msgid "Detected HDD:"
@@ -2339,6 +2351,10 @@ msgid ""
 "(in standby mode without any running recordings) to perform updates of the "
 "epg information on these channels."
 msgstr ""
+"EPGRefresh zal automatisch op de door de u ingestelde kanalen afstemmen als "
+"de ontvanger niet in gebruik is\n"
+"(in standby zonder dat er een opname loopt) om de EPG-gegevens van die "
+"kanalen in te lezen. "
 
 #
 #, python-format
@@ -2686,7 +2702,7 @@ msgid "Execute \"after event\" during timespan"
 msgstr "Uitvoeren na gebeurtenis gedurende tijdspanne"
 
 msgid "Execute TuxboxPlugins"
-msgstr ""
+msgstr "Voer TuxboxPlugins uit"
 
 #
 msgid "Execution Progress:"
@@ -2934,7 +2950,7 @@ msgid "Frisian"
 msgstr "Fries"
 
 msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox."
-msgstr ""
+msgstr "FritzCall toont inkomende gesprekken op uw Dreambox."
 
 msgid "Frontend for /tmp/mmi.socket"
 msgstr ""
@@ -2957,14 +2973,16 @@ msgstr ""
 "de nieuwe skin te activeren. Nu herstarten?"
 
 msgid "GUI that allows user to change the ftp- / telnet password."
-msgstr ""
+msgstr "Gebruikersinterface voor het aanpassen van het FTP-/telnet-wachtwoord."
 
 msgid ""
 "GUI that allows user to change the ftp-/telnet-password of the Dreambox."
 msgstr ""
+"Gebruikersinterface voor het aanpassen van het FTP-/telnet-wachtwoord van uw "
+"Dreambox."
 
 msgid "GUI to change the ftp and telnet-password"
-msgstr ""
+msgstr "Gebruikersinterface voor het aanpassen van het FTP-/telnet-wachtwoord."
 
 #
 msgid "Gaming"
@@ -3018,7 +3036,7 @@ msgid "Germany"
 msgstr "Duitsland"
 
 msgid "Get AudioCD info from CDDB and CD-Text"
-msgstr ""
+msgstr "Toont AudioCD-informatie van de CDDB en van CD-tekst"
 
 msgid "Get latest experimental image"
 msgstr "Ontvang het laatste experimentele image"
@@ -3043,12 +3061,14 @@ msgid "Goto position"
 msgstr "Naar positie draaien"
 
 msgid "GraphMultiEPG shows a graphical timeline EPG"
-msgstr ""
+msgstr "GraphMultiEPG toont de EPG op een grafische tijdschaal"
 
 msgid ""
 "GraphMultiEPG shows a graphical timeline EPG.\n"
 "Shows a nice overview of all running und upcoming tv shows."
 msgstr ""
+"GraphMultiEPG toont de EPG op een grafische tijdschaal.\n"
+"Geeft een mooi overzicht van alle lopende en komende programma's."
 
 #
 msgid "Graphical Multi EPG"
@@ -3149,7 +3169,7 @@ msgid "Horizontal"
 msgstr "Horizontaal"
 
 msgid "Hotplugging for removeable devices"
-msgstr ""
+msgstr "Hotplugging voor verwijderbare opslagmedia"
 
 #
 msgid "How many minutes do you want to record?"
@@ -3475,10 +3495,10 @@ msgid "Italian"
 msgstr "Italiaans"
 
 msgid "Italian Weather forecast on Dreambox"
-msgstr ""
+msgstr "Italiaanse weersverwachting op uw Dreambox"
 
 msgid "Italian Weather forecast on Dreambox from www.google.it."
-msgstr ""
+msgstr "Italiaanse weersverwachting van www.google.it op uw Dreambox"
 
 #
 msgid "Italy"
@@ -3787,6 +3807,8 @@ msgstr "Beheer gedeelde netwerkmappen"
 msgid ""
 "Manage your music files in a database, play it with Merlin Music Player."
 msgstr ""
+"Beheer muziekbestanden in een database, speel die af met de Merlin Music "
+"Player."
 
 msgid "Manage your network shares..."
 msgstr "Beheer uw netwerkverbindingen."
@@ -4074,11 +4096,14 @@ msgstr "Opname locatie"
 msgid ""
 "MovieTagger adds tags to recorded movies to sort a large list of movies."
 msgstr ""
+"MovieTagger voegt tags toe aan opnames om die gemakkelijk te kunnen sorteren."
 
 msgid ""
 "Movielist Preview creates screenshots of recordings and shows them inside "
 "the movielist."
 msgstr ""
+"Movielist Preview maakt schermafbeeldingen van opnames en toont die in de "
+"opnamelijst."
 
 #
 msgid "Movielist menu"
@@ -4820,6 +4845,9 @@ msgstr "Mensen & Blogs"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock toont de klok permanent op het scherm."
 
+msgid "Persian"
+msgstr ""
+
 msgid "Pets & Animals"
 msgstr "Huisdieren & Dieren"
 
@@ -8341,10 +8369,10 @@ msgid "Watch streams from ZDF Mediathek"
 msgstr ""
 
 msgid "WeatherPlugin shows weatherforecasts on your Dreambox."
-msgstr ""
+msgstr "WeatherPlugin toont de weersverwachting op uw Dreambox."
 
 msgid "Weatherforecast on your Dreambox"
-msgstr ""
+msgstr "De weersverwachting op uw Dreambox."
 
 #
 msgid "Webinterface"
@@ -8418,10 +8446,17 @@ msgid ""
 "\n"
 "The Help button shows this help again."
 msgstr ""
-"Welkom bij de MyTube Youtube speler.Gebruik de boeket+ toets om te navigeren "
-"naar het zoekveld en de boeket- om te navigeren naar de video inzendingen."
-"Voor het afspelen van een film druk op OK van uw afstandsbediening.Druk op "
-"info om de film beschrijving te zien.Druk op de menu knop voor extra opties."
+"Welkom bij de MyTube Youtube speler.\n"
+"\n"
+"Gebruik de boeket+ toets om te navigeren naar het zoekveld en de boeket- om "
+"te navigeren naar de video inzendingen.\n"
+"\n"
+"Voor het afspelen van een film druk op OK van uw afstandsbediening.\n"
+"\n"
+"Druk op info om de film beschrijving te zien.\n"
+"\n"
+"Druk op de menu knop voor extra opties.\n"
+"\n"
 "De knop Help geeft deze hulp weer."
 
 msgid ""
@@ -8435,9 +8470,15 @@ msgid ""
 "\n"
 "Press exit to get back to the input field."
 msgstr ""
-"Welkom bij de MyTube Youtube speler.Tijdens het invoeren van je zoekterm(en) "
-"krijg je suggesties weergegeven die overeenkomen met uw zoekterm.Druk op "
-"exit om terug te keren naar het zoek veld."
+"Welkom bij de MyTube Youtube speler.\n"
+"\n"
+"Tijdens het invoeren van je zoekterm(en) krijg je suggesties weergegeven die "
+"overeenkomen met uw zoekterm.\n"
+"\n"
+"Om een suggestie te selecteren druk op DOWN van uw afstandsbediening, "
+"selecteer het gewenste resultaat en druk op OK om het zoeken te starten.\n"
+"\n"
+"Druk op exit om terug te keren naar het zoek veld."
 
 #
 msgid ""
@@ -8517,6 +8558,8 @@ 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 ""
+"Als deze optie is ingesteld zal AutoTimer geen gebeurtenissen koppelen als "
+"een andere timer met dezelfde beschrijving al bestaat."
 
 #
 msgid ""
@@ -8559,6 +8602,8 @@ msgid ""
 "With AntiScrollbar you can cover up annoying ticker lines (e.g. in news "
 "channels)."
 msgstr ""
+"Met de AntiScrollbar kunt u hinderlijke 'ticker lines' (b.v. bij "
+"nieuwskanalen) verbergen."
 
 msgid ""
 "With DVDBurn you can make compilations of records from your Dreambox hard "
@@ -8567,17 +8612,27 @@ msgid ""
 "a standard-compliant DVD that can be played on conventinal DVD players.\n"
 "HDTV recordings can only be burned in proprietary dreambox format."
 msgstr ""
+"Met DVDBurn kunt u compilaties maken van opnames op de schijf van uw "
+"ontvanger.\n"
+"Optioneel kunt u aanpasbare menu's toevoegen. De compilatie kan worden "
+"opgeslagen op een standaard DVD die op een convetionele DVD-speler kan "
+"worden afgespeeld.\n"
+"HDTV opnames kunnen alleen maar worden opgeslagen in het standaard .ts-"
+"formaat."
 
 msgid "With EPGSearch you can search through the EPG and create timers."
-msgstr ""
+msgstr "Met EPGSearch kunt u de EPG doorzoeken en timers aanmaken."
 
 msgid "With Genuine Dreambox you can verify the authenticity of your Dreambox."
 msgstr ""
+"Met Genuine Dreambox kunt u de authenticiteit van uw Dreambox verifieren."
 
 msgid ""
 "With IMDb you can download and displays movie information (rating, poster, "
 "cast, synopsis etc.) about the selected event."
 msgstr ""
+"Met IMDB kunt u informatie binnenhalen en vertonen (waardering, poster, "
+"cast, beschrijving etc) over de geselecteerde opname."
 
 msgid "With MovieRetitle you can rename your movies."
 msgstr "Met MovieRetitle kunt u de naam van uw films wijzigen."
@@ -8607,6 +8662,10 @@ msgid ""
 "each of them.\n"
 "This allows watching a scrambled service while recording another one."
 msgstr ""
+"Met de CommonInterfaceAssignment plugin kunt u aan elke CI-module in uw "
+"ontvanger specifieke providers/services/caids toewijzen.\n"
+"Dit maakt het mogelijk naar een versleutelde uitzending te kijken en "
+"tegelijkertijd een andere op te nemen."
 
 msgid ""
 "With the CrashlogAutoSubmit plugin it is possible to automaticallymail "
@@ -8617,21 +8676,28 @@ msgid ""
 "With the DefaultServicesScanner plugin you can scan default lamedbs sorted "
 "by satellite with a connected dish positioner."
 msgstr ""
+"Met de DefaultServicesScanner plugin kunt u met een gemotoriseerde schotel "
+"de default lamedbs scannen op volgorde van satellieten."
 
 msgid ""
 "With the DiseqcTester plugin you can test your satellite equipment for "
 "DiSEqC compatibility and errors."
 msgstr ""
+"Met de DiseqcTester plugin kunt u uw installatie controleren op DiSEqC-"
+"compatibiliteit en -fouten."
 
 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 ""
+"Met de NFIFlash plugin kunt u een USB-stick met een Dreambox-image "
+"gereedmaken.\n"
+"U kunt dan uw Dreambox flashen met het image op de stick."
 
 msgid ""
 "With the NetworkWizard you can easily configure your network step by step."
-msgstr ""
+msgstr "Met de NetworkWizard kunt u stap-voor-stap uw netwerk configureren."
 
 msgid ""
 "With the PositionerSetup plugin it is easy to install and configure a "
@@ -8875,6 +8941,9 @@ msgid ""
 "\n"
 "Do you want to set the pin now?"
 msgstr ""
+"Voer nu een pincode in en verberg het voor uw kinderen.\n"
+"\n"
+"Wilt u nu een pincode instellen?"
 
 #
 msgid ""
@@ -9784,9 +9853,8 @@ msgstr "niet ondersteund"
 msgid "not used"
 msgstr "niet gebruikt"
 
-#
 msgid "nothing connected"
-msgstr "niets aangesloten"
+msgstr "Niets aangesloten"
 
 #
 msgid "of a DUAL layer medium used."
index b7baaef..a089b9d 100755 (executable)
--- a/po/no.po
+++ b/po/no.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-06-12 14:34+0100\n"
 "Last-Translator: MMMMMM <theMMMMMM@gmail.com>\n"
 "Language-Team: none\n"
@@ -4743,6 +4743,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index bc2a30c..703e02d 100755 (executable)
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-07-23 12:21+0200\n"
 "Last-Translator: Mladen <acid-burn@opendreambox.org>\n"
 "Language-Team: none\n"
@@ -4871,6 +4871,9 @@ msgstr "Ludzie & Blogi"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "PermanentClock pokazuje na stałe zegar na ekranie."
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Zwierzęta"
index c69892f..0051f5e 100755 (executable)
--- a/po/pt.po
+++ b/po/pt.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma Portuguese\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-03-30 18:45-0000\n"
 "Last-Translator: Muaitai <muaitai@gmail.com>\n"
 "Language-Team: Muaitai <muaitai@gmail.com>\n"
@@ -4744,6 +4744,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index f109664..d748c01 100755 (executable)
--- a/po/ru.po
+++ b/po/ru.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-05-18 18:10+0200\n"
 "Last-Translator: peter <peter@dreambox.org.ua>\n"
 "Language-Team: Russian / enigma(c) Ukraine, Kiev>\n"
@@ -4759,6 +4759,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index e11193b..12fb3ae 100755 (executable)
--- a/po/sk.po
+++ b/po/sk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-05-12 13:09+0200\n"
 "Last-Translator: acid-burn <>\n"
 "Language-Team: none\n"
@@ -3946,6 +3946,9 @@ msgstr "Ľudia a blogy"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr "Stále hodiny zobrazujú čas na obrazovke trvalo."
 
+msgid "Persian"
+msgstr ""
+
 msgid "Pets & Animals"
 msgstr "Deti a zvieratá"
 
index 40b0d5b..f49fe2c 100755 (executable)
--- a/po/sl.po
+++ b/po/sl.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ENIGMA 1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2009-01-25 13:59+0100\n"
 "Last-Translator: Gregor <greg.domajnko@gmail.com>\n"
 "Language-Team: \n"
@@ -4771,6 +4771,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index 7c2864b..9b59a08 100755 (executable)
--- a/po/sr.po
+++ b/po/sr.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Enigma2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2009-10-10 11:18+0100\n"
 "Last-Translator: maja <jovanovic@gmx.ch>\n"
 "Language-Team: veselin & majevica CRNABERZA <jovanovic@gmx.ch>\n"
@@ -4842,6 +4842,9 @@ msgstr "Ljudi & Blogovi"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Kućni ljub.& životinje"
index d735dca..ebbf80d 100755 (executable)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,13 +7,13 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-12-08 08:01+0200\n"
 "Last-Translator: sig <sigstop@hotmail.com>\n"
-"Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Pootle 2.0.3\n"
 "X-Poedit-Language: Swedish\n"
@@ -4782,6 +4782,9 @@ msgstr "Folk & Bloggar"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Husdjur & Vilddjur"
index 0b47715..c889108 100755 (executable)
--- a/po/tr.po
+++ b/po/tr.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: enigma2 Turkish Locale\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2010-04-30 20:58+0200\n"
 "Last-Translator: Zulfikar <zveyis@gmail.com>\n"
 "Language-Team: http://hobiagaci.com <z.veyisoglu@hobiagaci.com>\n"
@@ -4802,6 +4802,9 @@ msgstr "İnsanlar"
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr "Hayvanlar"
index b45c28a..af214d4 100755 (executable)
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-11-01 13:01+0000\n"
+"POT-Creation-Date: 2011-01-27 12:42+0000\n"
 "PO-Revision-Date: 2008-09-28 14:03+0200\n"
 "Last-Translator: stepan_kv <stepan_kv@mail.ru>\n"
 "Language-Team: http://sat-ukraine.info/\n"
@@ -4814,6 +4814,9 @@ msgstr ""
 msgid "PermanentClock shows the clock permanently on the screen."
 msgstr ""
 
+msgid "Persian"
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
index a19e673..2f9292a 100755 (executable)
@@ -2,16 +2,29 @@
 
 prefix=@prefix@
 exec_prefix=@exec_prefix@
+datarootdir=@datarootdir@
 
-if [ -x @bindir@/showiframe -a -f /boot/backdrop.mvi ]; then
-       @bindir@/showiframe /boot/backdrop.mvi
+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
 
-LD_PRELOAD=@libdir@/libopen.so.0.0.0 @bindir@/enigma2
+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:
 #