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)
pol ISO8859-2
rus ISO8859-5
bul ISO8859-5
+tha ISO8859-11
cze ISO6397
ces ISO6397
slo 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
<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">
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;
eRCConsoleDriver driver;
eRCConsole device;
public:
- eRCConsoleInit(): driver("/dev/vc/0"), device(&driver)
+ eRCConsoleInit(): driver("/dev/tty0"), device(&driver)
{
}
};
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;
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)
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;
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)
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)
}
}
}
- 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)
/* (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();
DECLARE_REF(eDVBResourceManager);
int avail, busy;
- enum { DM7025, DM800, DM500HD, DM800SE, DM8000 };
+ enum { DM7025, DM800, DM500HD, DM800SE, DM8000, DM7020HD };
int m_boxtype;
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];
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)
&& (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);
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());
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);
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())
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);
}
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
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
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()
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 = []
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:
import keymapparser
class PluginComponent:
+ firstRun = True
+ restartRequired = False
+
def __init__(self):
self.plugins = {}
self.pluginList = [ ]
+ self.installedPluginList = [ ]
self.setPluginPrefix("Plugins.")
self.resetWarnings()
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:
plugins = [ plugins ]
for p in plugins:
+ p.path = path
p.updateIcon(path)
new_plugins.append(p)
# 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"""
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 = [ ]
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,))
# 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
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)
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)
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
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:
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") ]
<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" />
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
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
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()
"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")),
keys.keyPressed(key)
return keys
+ def enterAudioSelection(self):
+ self.audioSelection()
+
def nextAudioTrack(self):
self.sendKey(iServiceKeys.keyUser)
)]
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)]
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;
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)
{
m_subtitle_widget->show();
return 0;
+
+error_out:
+ return -1;
}
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()
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;
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; }
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);
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
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)]
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)
]
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)
]
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)
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)]
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) ]
+
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
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:
else:
self.icon = icon
+ self.weight = weight
+
self.wakeupfnc = wakeupfnc
self.__call__ = fnc
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:
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
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 )]
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)]
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)
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)]
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
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)
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)]
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
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>"""
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
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>"""
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:
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
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)]
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 []
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 []
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 []
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)
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):
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)
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):
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):
callback = None
def cleanupSoftwareTools(self):
+ self.list_updating = False
if self.NotifierCallback is not None:
self.NotifierCallback = None
self.ipkg.stop()
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):
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))
if self.packagefiles:
for package in self.packagefiles[:]:
self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
- if len(self.cmdList):
- self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext)
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext)
else:
if iSoftwareTools.NetworkConnectionAvailable:
if self.packagefiles:
for package in self.packagefiles[:]:
self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
- if len(self.cmdList):
- self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext)
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext)
def runUpgrade(self, result):
if result:
self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
def runUpgradeFinished(self):
- self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your 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))
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."))
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
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)
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
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):
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:
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))
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))
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
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)
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
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))
]
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
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..."})
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)
language = _("<unknown>")
selected = ""
- if sel and x[:4] == sel[:4]:
+ if sel and x == sel:
selected = _("Running")
selectedidx = idx
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):
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
-from ChannelSelection import ChannelSelection, BouquetSelector
+from ChannelSelection import ChannelSelection, BouquetSelector, SilentBouquetSelector
from Components.ActionMap import ActionMap, HelpableActionMap
from Components.ActionMap import NumberActionMap
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:
answer[1][1]()
from Tools.BoundFunction import boundFunction
+import inspect
# depends on InfoBarExtensions
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):
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
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:
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()
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:
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
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():
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()
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),
}
#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
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;
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;
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);
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);
{
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 )
{
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;
}
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)
{
}
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);
tag = "channel-mode";
break;
case sUser+12:
- return m_error_message;
+ return m_errorInfo.error_message;
default:
return "";
}
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))
{
} 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);
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);
+ }
}
}
}
{
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);
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);
}
_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;
}
// 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)
{
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;
// 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)
{
{
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)
{
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");
gst_buffer_unref(buffer);
}
}
- gst_object_unref(appsink);
+ gst_object_unref(sink);
}
else
eDebug("no subtitle sink!");
SubtitlePage &frontpage = m_subtitle_pages.front();
pts_t running_pts;
gint64 diff_ms = 0;
- gint64 show_pts;
+ gint64 show_pts = 0;
getPlayPosition(running_pts);
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);
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();
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;
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;
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");
{
}
};
+ struct errorInfo
+ {
+ std::string error_message;
+ std::string missing_codec;
+ };
+
private:
static int pcm_delay;
static int ac3_delay;
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
{
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;
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");
{
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;
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
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"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr "Pets & Animals"
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"
msgid " "
msgstr " "
-#
msgid " Results"
-msgstr ""
+msgstr "Resultados"
#
msgid " extensions."
msgstr "extensiones."
msgid " ms"
-msgstr ""
+msgstr "ms"
#
msgid " packages selected."
msgid "%d.%B %Y"
msgstr "%d/%B/%Y"
-#
#, python-format
msgid "%i ms"
-msgstr ""
+msgstr "%i ms"
#
#, python-format
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
"¿Quiere conservar su versión?"
msgid "A demo plugin for TPM usage."
-msgstr ""
+msgstr "Un plugin de demo para el uso de TPM"
#
msgid ""
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
"¿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 ""
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:"
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:"
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"
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"
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"
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 ""
"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"
"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"
"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"
msgid "All Satellites"
msgstr "Todos satélites"
-#
msgid "All Time"
-msgstr ""
+msgstr "Todo el Tiempo"
#
msgid "All non-repeating timers"
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"
msgstr "Prioridad de sintonizadores alternativa"
msgid "Always ask"
-msgstr ""
+msgstr "Preguntar siempre"
#
msgid "Always ask before sending"
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!"
"¿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:"
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"
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: "
"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"
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"
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"
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"
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"
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: "
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"
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"
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"
msgid "Channel Selection"
msgstr "Selección de Canal"
-#
msgid "Channel audio:"
-msgstr ""
+msgstr "Canal de audio:"
#
msgid "Channel not in services list"
msgstr "Elegir lista"
msgid "Choose image to download"
-msgstr ""
+msgstr "Elegir imagen para descargar"
#
msgid "Choose target folder"
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"
msgid "Clear before scan"
msgstr "Limpiar antes de buscar"
-#
msgid "Clear history on Exit:"
-msgstr ""
+msgstr "Limpiar la historia al Salir:"
#
msgid "Clear log"
msgid "Color Format"
msgstr "Formato de Color"
-#
msgid "Comedy"
-msgstr ""
+msgstr "Comedia"
#
msgid "Command execution..."
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"
msgstr "Configurar DNSs"
msgid "Configure your WLAN network interface"
-msgstr ""
+msgstr "Configurar el interfaz de la red WLAN"
#
msgid "Configure your internal LAN"
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:"
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."
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
msgstr "Transponder actual"
msgid "Current device: "
-msgstr ""
+msgstr "Dispositivo actual:"
#
msgid "Current settings:"
msgstr "Versión actual:"
msgid "Currently installed image"
-msgstr ""
+msgstr "Imagen actualmente instalada"
#
#, python-format
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"
"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..."
msgid "Czech"
msgstr "Checo"
-#
msgid "Czech Republic"
-msgstr ""
+msgstr "República Checa"
#
msgid "D"
msgid "DHCP"
msgstr "DHCP"
-#
msgid "DUAL LAYER DVD"
-msgstr ""
+msgstr "DVD DOBLE CAPA"
#
msgid "DVB-S"
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"
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"
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"
msgid "Delete failed!"
msgstr "¡Falló el borrado!"
-#
msgid "Delete mount"
-msgstr ""
+msgstr "Borrar montaje"
#
#, python-format
"No borrar más satélite configurado\n"
"%s?"
-#
msgid "Descending"
-msgstr ""
+msgstr "Descendiendo"
#
msgid "Description"
msgstr "Deseleccionar"
msgid "Details for plugin: "
-msgstr ""
+msgstr "Detalles del plugin:"
#
msgid "Detected HDD:"
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"
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"
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
#, 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?"
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 ""
#, python-format
msgid "Download %s from Server"
-msgstr ""
+msgstr "Descargar %s desde el Servidor"
#
msgid "Download .NFI-Files for 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"
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)"
msgid "Dreambox software because updates are available."
msgstr "Actualizaciones del software Dreambox están disponibles."
-#
msgid "Duration: "
-msgstr ""
+msgstr "Duración:"
#
msgid "Dutch"
"(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
msgid "Edit Title"
msgstr "Editar Título"
-#
msgid "Edit bouquets list"
-msgstr ""
+msgstr "Editar lista de canales"
#
msgid "Edit chapters of current title"
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"
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"
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"
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"
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: "
"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 ""
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"
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"
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"
msgstr "Ejectuar el después del Evento durante el Tiempo"
msgid "Execute TuxboxPlugins"
-msgstr ""
+msgstr "Ejecuta TuxboxPlugins"
#
msgid "Execution Progress:"
msgstr "Salir del editor"
msgid "Exit input device selection."
-msgstr ""
+msgstr "Sale de la selección de dispositivo de entrada."
#
msgid "Exit network wizard"
"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"
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"
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"
msgid "Frame size in full view"
msgstr "Tamaño de trama en vista completa"
-#
msgid "France"
-msgstr ""
+msgstr "Francia"
#
msgid "French"
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
"¿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"
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"
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"
"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"
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"
msgid "Harddisk standby after"
msgstr "Disco duro en reposo después"
-#
msgid "Help"
-msgstr ""
+msgstr "Ayuda"
#
msgid "Hidden network SSID"
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?"
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"
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!"
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 ""
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"
msgid "Index"
msgstr "Índice"
-#
msgid "India"
-msgstr ""
+msgstr "India"
#
msgid "Info"
msgid "Initial location in new timers"
msgstr "Ruta inicial en nuevas programaciones"
-#
msgid "Initialization"
-msgstr ""
+msgstr "Inicialización"
#
msgid "Initialize"
msgstr "Entrada"
msgid "Input device setup"
-msgstr ""
+msgstr "Configuración del dispositivo de entrada"
msgid "Input devices"
-msgstr ""
+msgstr "Dispositivos de entrada"
#
msgid "Install"
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"
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"
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 ""
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"
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"
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"
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"
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"
msgid "Local Network"
msgstr "Red Local"
-#
msgid "Local share name"
-msgstr ""
+msgstr "Nombre compartido local"
#
msgid "Location"
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"
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"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
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"
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"
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"
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"
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"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
msgid "Pets & Animals"
msgstr "Dýralíf"
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"
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"
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"
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"
"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 ""
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"
msgstr "16:10 Letterbox"
msgid "16:10 PanScan"
-msgstr "16:10 PanScan"
+msgstr "16:10 Panoraminis Skanavimas"
#
msgid "16:9"
msgstr "4:3 Letterbox"
msgid "4:3 PanScan"
-msgstr "4:3 PanScan"
+msgstr "4:3 Panoraminis skanavimas"
#
msgid "5"
"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?"
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"
"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"
"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 ""
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"
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"
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"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
"Wilt u de tweede netwerk interface uitschakelen?"
msgid "A simple downloading application for other plugins"
-msgstr ""
+msgstr "Een eenvoudige downloadapplicatie voor andere plugins"
#
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"
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"
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"
"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"
"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"
"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"
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"
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 ""
"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..."
"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"
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"
msgstr "Deselecteer"
msgid "Details for plugin: "
-msgstr "Details voor plugin:"
+msgstr "Details voor plugin: "
#
msgid "Detected HDD:"
"(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
msgstr "Uitvoeren na gebeurtenis gedurende tijdspanne"
msgid "Execute TuxboxPlugins"
-msgstr ""
+msgstr "Voer TuxboxPlugins uit"
#
msgid "Execution Progress:"
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 ""
"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"
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"
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"
msgstr "Horizontaal"
msgid "Hotplugging for removeable devices"
-msgstr ""
+msgstr "Hotplugging voor verwijderbare opslagmedia"
#
msgid "How many minutes do you want to record?"
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"
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."
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"
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"
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"
"\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 ""
"\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 ""
"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 ""
"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 "
"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."
"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 "
"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 "
"\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 ""
msgid "not used"
msgstr "niet gebruikt"
-#
msgid "nothing connected"
-msgstr "niets aangesloten"
+msgstr "Niets aangesloten"
#
msgid "of a DUAL layer medium used."
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
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"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
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á"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr "Kućni ljub.& životinje"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr "Husdjur & Vilddjur"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr "Hayvanlar"
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"
msgid "PermanentClock shows the clock permanently on the screen."
msgstr ""
+msgid "Persian"
+msgstr ""
+
#
msgid "Pets & Animals"
msgstr ""
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:
#