aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFraxinas <andreas.frisch@multimedia-labs.de>2010-04-09 08:25:08 +0200
committerFraxinas <andreas.frisch@multimedia-labs.de>2010-04-09 08:25:08 +0200
commit98c7a787df63a93f868548c2b1e357c0d873ebbe (patch)
treee8258f3e175e540e6106e0b7202abcf550b825d1 /lib
parentae60e9e3642949a91b7ea4f77374495fec9a51ed (diff)
parent76250cdc36d0f0e84505d5654066229b846f035f (diff)
downloadenigma2-98c7a787df63a93f868548c2b1e357c0d873ebbe.tar.gz
enigma2-98c7a787df63a93f868548c2b1e357c0d873ebbe.zip
Merge branch 'experimental' of git.opendreambox.org:/git/enigma2 into experimental
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/dvb.cpp20
-rw-r--r--lib/dvb/frontend.cpp7
-rw-r--r--lib/dvb/frontend.h1
-rw-r--r--lib/dvb/idvb.h2
-rw-r--r--lib/dvb/scan.cpp98
-rw-r--r--lib/dvb/scan.h2
-rw-r--r--lib/gui/elistboxcontent.cpp29
-rw-r--r--lib/python/Components/Converter/ServiceInfo.py4
-rwxr-xr-x[-rw-r--r--]lib/python/Components/Converter/TemplatedMultiContent.py24
-rw-r--r--lib/python/Components/FanControl.py43
-rwxr-xr-xlib/python/Components/Ipkg.py8
-rwxr-xr-xlib/python/Components/Network.py4
-rw-r--r--lib/python/Components/NimManager.py91
-rwxr-xr-x[-rw-r--r--]lib/python/Components/Renderer/Listbox.py19
-rw-r--r--[-rwxr-xr-x]lib/python/Components/ServiceList.py33
-rw-r--r--lib/python/Components/Sources/List.py5
-rw-r--r--lib/python/Components/Task.py1
-rw-r--r--lib/python/Components/UsageConfig.py11
-rw-r--r--lib/python/Plugins/Extensions/DVDBurn/DVDProject.py102
-rw-r--r--lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py28
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py23
-rw-r--r--lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py22
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/TitleList.py115
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/TitleProperties.py13
-rw-r--r--lib/python/Plugins/Extensions/DVDBurn/plugin.py2
-rw-r--r--lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp47
-rw-r--r--lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h2
-rwxr-xr-xlib/python/Plugins/Extensions/MediaPlayer/plugin.py2
-rw-r--r--lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py84
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py1
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py23
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py27
-rw-r--r--lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py22
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/plugin.py27
-rw-r--r--lib/python/Screens/ChannelSelection.py2
-rw-r--r--lib/python/Screens/InfoBarGenerics.py13
-rw-r--r--lib/python/Screens/RecordPaths.py8
-rw-r--r--lib/python/Screens/Satconfig.py21
-rw-r--r--lib/python/Screens/ScanSetup.py27
-rw-r--r--lib/python/Screens/ServiceScan.py4
-rw-r--r--lib/python/Screens/TaskView.py9
-rw-r--r--lib/service/iservice.h3
-rw-r--r--lib/service/listboxservice.cpp78
-rw-r--r--lib/service/listboxservice.h8
-rw-r--r--lib/service/servicedvb.cpp137
-rw-r--r--lib/service/servicedvb.h8
-rw-r--r--lib/service/servicemp3.cpp10
47 files changed, 985 insertions, 285 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 6eaadb04..17712dde 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -1324,16 +1324,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
return;
}
- m_cue->m_lock.RdLock();
- if (!m_cue->m_decoding_demux)
- {
- start = current_offset;
- size = max;
- eDebug("getNextSourceSpan, no decoding demux. forcing normal play");
- m_cue->m_lock.Unlock();
- return;
- }
-
if (m_skipmode_n)
{
eDebug("skipmode %d:%d (x%d)", m_skipmode_m, m_skipmode_n, m_skipmode_frames);
@@ -1341,7 +1331,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
}
eDebug("getNextSourceSpan, current offset is %08llx, m_skipmode_m = %d!", current_offset, m_skipmode_m);
-
int frame_skip_success = 0;
if (m_skipmode_m)
@@ -1386,6 +1375,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
}
}
+ m_cue->m_lock.RdLock();
+
while (!m_cue->m_seek_requests.empty())
{
std::pair<int, pts_t> seek = m_cue->m_seek_requests.front();
@@ -1410,6 +1401,13 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
eDebug("decoder getPTS failed, can't seek relative");
continue;
}
+ if (!m_cue->m_decoding_demux)
+ {
+ eDebug("getNextSourceSpan, no decoding demux. couldn't seek to %llx... ignore request!", pts);
+ start = current_offset;
+ size = max;
+ continue;
+ }
if (getCurrentPosition(m_cue->m_decoding_demux, now, 1))
{
eDebug("seekTo: getCurrentPosition failed!");
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index f85a37fe..bc3a88da 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -483,6 +483,13 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate)
closeFrontend();
}
+void eDVBFrontend::reopenFrontend()
+{
+ sleep(1);
+ m_type = -1;
+ openFrontend();
+}
+
int eDVBFrontend::openFrontend()
{
if (m_state != stateClosed)
diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h
index 4cf05081..bc31755c 100644
--- a/lib/dvb/frontend.h
+++ b/lib/dvb/frontend.h
@@ -146,6 +146,7 @@ public:
static void setTypePriorityOrder(int val) { PriorityOrder = val; }
static int getTypePriorityOrder() { return PriorityOrder; }
+ void reopenFrontend();
int openFrontend();
int closeFrontend(bool force=false);
const char *getDescription() const { return m_description; }
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index 4ef7efad..d20829bf 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -459,6 +459,8 @@ class iDVBFrontend: public iDVBFrontend_ENUMS, public iObject
public:
virtual RESULT getFrontendType(int &SWIG_OUTPUT)=0;
virtual RESULT tune(const iDVBFrontendParameters &where)=0;
+ virtual int closeFrontend(bool force = false)=0;
+ virtual void reopenFrontend()=0;
#ifndef SWIG
virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
#endif
diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp
index fd29617a..b37aa714 100644
--- a/lib/dvb/scan.cpp
+++ b/lib/dvb/scan.cpp
@@ -12,6 +12,7 @@
#include <lib/dvb/frontend.h>
#include <lib/base/eerror.h>
#include <lib/base/estring.h>
+#include <lib/python/python.h>
#include <errno.h>
#define SCAN_eDebug(x...) do { if (m_scan_debug) eDebug(x); } while(0)
@@ -23,37 +24,118 @@ eDVBScan::eDVBScan(iDVBChannel *channel, bool usePAT, bool debug)
:m_channel(channel), m_channel_state(iDVBChannel::state_idle)
,m_ready(0), m_ready_all(usePAT ? (readySDT|readyPAT) : readySDT)
,m_pmt_running(false), m_abort_current_pmt(false), m_flags(0)
- ,m_usePAT(usePAT), m_scan_debug(debug)
+ ,m_usePAT(usePAT), m_scan_debug(debug), m_show_add_tsid_onid_check_failed_msg(true)
{
if (m_channel->getDemux(m_demux))
SCAN_eDebug("scan: failed to allocate demux!");
m_channel->connectStateChange(slot(*this, &eDVBScan::stateChange), m_stateChanged_connection);
+ FILE *f = fopen("/etc/enigma2/scan_tp_valid_check.py", "r");
+ if (f)
+ {
+ char code[16384];
+ size_t rd = fread(code, 1, 16383, f);
+ if (rd)
+ {
+ code[rd]=0;
+ m_additional_tsid_onid_check_func = Py_CompileString(code, "/etc/enigma2/scan_tp_valid_check.py", Py_file_input);
+ }
+ fclose(f);
+ }
}
eDVBScan::~eDVBScan()
{
+ if (m_additional_tsid_onid_check_func)
+ Py_DECREF(m_additional_tsid_onid_check_func);
}
int eDVBScan::isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTransportStreamID tsid)
{
+ int ret;
switch (onid.get())
{
case 0:
case 0x1111:
- return 0;
+ ret=0;
+ break;
case 0x13E: // workaround for 11258H and 11470V on hotbird with same ONID/TSID (0x13E/0x578)
- return orbital_position != 130 || tsid != 0x578;
+ ret = orbital_position != 130 || tsid != 0x578;
+ break;
case 1:
- return orbital_position == 192;
+ ret = orbital_position == 192;
+ break;
case 0x00B1:
- return tsid != 0x00B0;
+ ret = tsid != 0x00B0;
+ break;
case 0x00eb:
- return tsid != 0x4321;
+ ret = tsid != 0x4321;
+ break;
case 0x0002:
- return abs(orbital_position-282) < 6;
+ ret = abs(orbital_position-282) < 6 && tsid != 2019;
+ // 12070H and 10936V have same tsid/onid.. but even the same services are provided
+ break;
+ case 0x2000:
+ ret = tsid != 0x1000;
+ break;
+ case 0x5E: // Sirius 4.8E 12322V and 12226H
+ ret = abs(orbital_position-48) < 3 && tsid != 1;
+ break;
+ case 10100: // Eutelsat W7 36.0E 11644V and 11652V
+ ret = orbital_position != 360 || tsid != 10187;
+ break;
+ case 42: // Tuerksat 42.0E
+ ret = orbital_position != 420 || (
+ tsid != 8 && // 11830V 12729V
+ tsid != 5 && // 12679V 12685H
+ tsid != 2 && // 11096V 12015H
+ tsid != 55); // 11996V 11716V
+ break;
+ case 100: // Intelsat 10 68.5E 3808V 3796V 4012V, Amos 4.0W 10723V 11571H
+ ret = (orbital_position != 685 && orbital_position != 3560) || tsid != 1;
+ break;
+ case 70: // Thor 0.8W 11862H 12341V
+ ret = abs(orbital_position-3592) < 3 && tsid != 46;
+ break;
+ case 32: // NSS 806 (40.5W) 4059R, 3774L
+ ret = orbital_position != 3195 || tsid != 21;
+ break;
default:
- return onid.get() < 0xFF00;
+ ret = onid.get() < 0xFF00;
+ break;
+ }
+ if (ret && m_additional_tsid_onid_check_func)
+ {
+ bool failed = true;
+ ePyObject dict = PyDict_New();
+ extern void PutToDict(ePyObject &, const char *, long);
+ PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins());
+ PutToDict(dict, "orbpos", orbital_position);
+ PutToDict(dict, "tsid", tsid.get());
+ PutToDict(dict, "onid", onid.get());
+ ePyObject r = PyEval_EvalCode((PyCodeObject*)(PyObject*)m_additional_tsid_onid_check_func, dict, dict);
+ if (r)
+ {
+ ePyObject o = PyDict_GetItemString(dict, "ret");
+ if (o)
+ {
+ if (PyInt_Check(o))
+ {
+ ret = PyInt_AsLong(o);
+ failed = false;
+ }
+ }
+ Py_DECREF(r);
+ }
+ if (failed && m_show_add_tsid_onid_check_failed_msg)
+ {
+ eDebug("execing /etc/enigma2/scan_tp_valid_check failed!\n"
+ "usable global variables in scan_tp_valid_check.py are 'orbpos', 'tsid', 'onid'\n"
+ "the return value must be stored in a global var named 'ret'");
+ m_show_add_tsid_onid_check_failed_msg=false;
+ }
+ Py_DECREF(dict);
}
+ return ret;
}
eDVBNamespace eDVBScan::buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash)
diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h
index 2f3ac34a..8f64abe5 100644
--- a/lib/dvb/scan.h
+++ b/lib/dvb/scan.h
@@ -92,6 +92,8 @@ class eDVBScan: public Object, public iObject
int m_flags;
bool m_usePAT;
bool m_scan_debug;
+ ePyObject m_additional_tsid_onid_check_func;
+ bool m_show_add_tsid_onid_check_failed_msg;
public:
eDVBScan(iDVBChannel *channel, bool usePAT=true, bool debug=true );
~eDVBScan();
diff --git a/lib/gui/elistboxcontent.cpp b/lib/gui/elistboxcontent.cpp
index 4b4b58c1..4465d84c 100644
--- a/lib/gui/elistboxcontent.cpp
+++ b/lib/gui/elistboxcontent.cpp
@@ -514,7 +514,7 @@ void eListboxPythonMultiContent::setSelectionClip(eRect &rect, bool update)
m_listbox->entryChanged(m_cursor);
}
-static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid)
+static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColor, bool cursorValid, bool clear=true)
{
if (pbackColor)
{
@@ -536,10 +536,11 @@ static void clearRegionHelper(gPainter &painter, eListboxStyle *local_style, con
else if (local_style->m_transparent_background)
return;
}
- painter.clear();
+ if (clear)
+ painter.clear();
}
-static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid)
+static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_style, const ePoint &offset, ePyObject &pbackColorSelected, bool cursorValid, bool clear=true)
{
if (pbackColorSelected)
{
@@ -559,10 +560,11 @@ static void clearRegionSelectedHelper(gPainter &painter, eListboxStyle *local_st
return;
}
}
- painter.clear();
+ if (clear)
+ painter.clear();
}
-static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid)
+static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *local_style, ePyObject pforeColor, ePyObject pforeColorSelected, ePyObject pbackColor, ePyObject pbackColorSelected, int selected, gRegion &rc, eRect &sel_clip, const ePoint &offset, bool cursorValid, bool clear=true)
{
if (selected && sel_clip.valid())
{
@@ -571,7 +573,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l
{
painter.clip(part);
style.setStyle(painter, eWindowStyle::styleListboxNormal);
- clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
+ clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
painter.clippop();
selected = 0;
}
@@ -580,7 +582,7 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l
{
painter.clip(part);
style.setStyle(painter, eWindowStyle::styleListboxSelected);
- clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
+ clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
painter.clippop();
selected = 1;
}
@@ -588,14 +590,14 @@ static void clearRegion(gPainter &painter, eWindowStyle &style, eListboxStyle *l
else if (selected)
{
style.setStyle(painter, eWindowStyle::styleListboxSelected);
- clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid);
+ clearRegionSelectedHelper(painter, local_style, offset, pbackColorSelected, cursorValid, clear);
if (local_style && local_style->m_selection)
painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST);
}
else
{
style.setStyle(painter, eWindowStyle::styleListboxNormal);
- clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid);
+ clearRegionHelper(painter, local_style, offset, pbackColor, cursorValid, clear);
}
if (selected)
@@ -818,7 +820,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
painter.setFont(m_font[fnt]);
@@ -921,7 +924,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, pforeColor, pforeColorSelected, pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
// border
@@ -995,7 +999,8 @@ void eListboxPythonMultiContent::paint(gPainter &painter, eWindowStyle &style, c
{
gRegion rc(rect);
- clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid);
+ bool mustClear = (selected && pbackColorSelected) || (!selected && pbackColor);
+ clearRegion(painter, style, local_style, ePyObject(), ePyObject(), pbackColor, pbackColorSelected, selected, rc, sel_clip, offset, cursorValid, mustClear);
}
painter.blit(pixmap, rect.topLeft(), rect, (type == TYPE_PIXMAP_ALPHATEST) ? gPainter::BT_ALPHATEST : (type == TYPE_PIXMAP_ALPHABLEND) ? gPainter::BT_ALPHABLEND : 0);
diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py
index 5014fde6..fa3518ce 100644
--- a/lib/python/Components/Converter/ServiceInfo.py
+++ b/lib/python/Components/Converter/ServiceInfo.py
@@ -19,6 +19,7 @@ class ServiceInfo(Converter, object):
ONID = 13
SID = 14
FRAMERATE = 15
+ TRANSFERBPS = 16
def __init__(self, type):
@@ -40,6 +41,7 @@ class ServiceInfo(Converter, object):
"OnId": (self.ONID, (iPlayableService.evUpdatedInfo,)),
"Sid": (self.SID, (iPlayableService.evUpdatedInfo,)),
"Framerate": (self.FRAMERATE, (iPlayableService.evVideoSizeChanged,iPlayableService.evUpdatedInfo,)),
+ "TransferBPS": (self.TRANSFERBPS, (iPlayableService.evUpdatedInfo,)),
}[type]
def getServiceInfoString(self, info, what, convert = lambda x: "%d" % x):
@@ -112,6 +114,8 @@ class ServiceInfo(Converter, object):
return self.getServiceInfoString(info, iServiceInformation.sSID)
elif self.type == self.FRAMERATE:
return self.getServiceInfoString(info, iServiceInformation.sFrameRate, lambda x: "%d fps" % ((x+500)/1000))
+ elif self.type == self.TRANSFERBPS:
+ return self.getServiceInfoString(info, iServiceInformation.sTransferBPS, lambda x: "%d kB/s" % (x/1024))
return ""
text = property(getText)
diff --git a/lib/python/Components/Converter/TemplatedMultiContent.py b/lib/python/Components/Converter/TemplatedMultiContent.py
index b86d94bf..b1d89f55 100644..100755
--- a/lib/python/Components/Converter/TemplatedMultiContent.py
+++ b/lib/python/Components/Converter/TemplatedMultiContent.py
@@ -10,8 +10,8 @@ class TemplatedMultiContent(StringList):
del l["self"] # cleanup locals a bit
del l["args"]
- self.template = eval(args, {}, l)
self.active_style = None
+ self.template = eval(args, {}, l)
assert "fonts" in self.template
assert "itemHeight" in self.template
assert "template" in self.template or "templates" in self.template
@@ -25,7 +25,6 @@ class TemplatedMultiContent(StringList):
if not self.content:
from enigma import eListboxPythonMultiContent
self.content = eListboxPythonMultiContent()
- self.setTemplate()
# also setup fonts (also given by source)
index = 0
@@ -35,30 +34,37 @@ class TemplatedMultiContent(StringList):
# if only template changed, don't reload list
if what[0] == self.CHANGED_SPECIFIC and what[1] == "style":
- self.setTemplate()
- return
-
- if self.source:
+ pass
+ elif self.source:
self.content.setList(self.source.list)
- self.setTemplate()
+ self.setTemplate()
self.downstream_elements.changed(what)
def setTemplate(self):
if self.source:
style = self.source.style
+
if style == self.active_style:
- return # style did not change
+ return
# if skin defined "templates", that means that it defines multiple styles in a dict. template should still be a default
templates = self.template.get("templates")
template = self.template.get("template")
itemheight = self.template["itemHeight"]
+ selectionEnabled = self.template.get("selectionEnabled", True)
+ scrollbarMode = self.template.get("scrollbarMode", "showOnDemand")
if templates and style and style in templates: # if we have a custom style defined in the source, and different templates in the skin, look it up
template = templates[style][1]
itemheight = templates[style][0]
+ if len(templates[style]) > 2:
+ selectionEnabled = templates[style][2]
+ if len(templates[style]) > 3:
+ scrollbarMode = templates[style][3]
self.content.setTemplate(template)
-
self.content.setItemHeight(itemheight)
+ self.selectionEnabled = selectionEnabled
+ self.scrollbarMode = scrollbarMode
+ self.active_style = style
diff --git a/lib/python/Components/FanControl.py b/lib/python/Components/FanControl.py
index cee0523e..a993c396 100644
--- a/lib/python/Components/FanControl.py
+++ b/lib/python/Components/FanControl.py
@@ -3,6 +3,9 @@ import os
from Components.config import config, ConfigSubList, ConfigSubsection, ConfigSlider
from Tools.BoundFunction import boundFunction
+import NavigationInstance
+from enigma import iRecordableService
+
class FanControl:
# ATM there's only support for one fan
def __init__(self):
@@ -13,18 +16,42 @@ class FanControl:
self.createConfig()
config.misc.standbyCounter.addNotifier(self.standbyCounterChanged, initial_call = False)
- def leaveStandby(self):
+ def setVoltage_PWM(self):
for fanid in range(self.getFanCount()):
cfg = self.getConfig(fanid)
self.setVoltage(fanid, cfg.vlt.value)
self.setPWM(fanid, cfg.pwm.value)
+ print "[FanControl]: setting fan values: fanid = %d, voltage = %d, pwm = %d" % (fanid, cfg.vlt.value, cfg.pwm.value)
+
+ def setVoltage_PWM_Standby(self):
+ for fanid in range(self.getFanCount()):
+ cfg = self.getConfig(fanid)
+ self.setVoltage(fanid, cfg.vlt_standby.value)
+ self.setPWM(fanid, cfg.pwm_standby.value)
+ print "[FanControl]: setting fan values (standby mode): fanid = %d, voltage = %d, pwm = %d" % (fanid, cfg.vlt_standby.value, cfg.pwm_standby.value)
+
+ def getRecordEvent(self, recservice, event):
+ recordings = len(NavigationInstance.instance.getRecordings())
+ if event == iRecordableService.evEnd:
+ if recordings == 0:
+ self.setVoltage_PWM_Standby()
+ elif event == iRecordableService.evStart:
+ if recordings == 1:
+ self.setVoltage_PWM()
+
+ def leaveStandby(self):
+ NavigationInstance.instance.record_event.remove(self.getRecordEvent)
+ recordings = NavigationInstance.instance.getRecordings()
+ if not recordings:
+ self.setVoltage_PWM()
def standbyCounterChanged(self, configElement):
from Screens.Standby import inStandby
inStandby.onClose.append(self.leaveStandby)
- for fanid in range(self.getFanCount()):
- self.setVoltage(fanid, 0)
- self.setPWM(fanid, 0)
+ recordings = NavigationInstance.instance.getRecordings()
+ NavigationInstance.instance.record_event.append(self.getRecordEvent)
+ if not recordings:
+ self.setVoltage_PWM_Standby()
def createConfig(self):
def setVlt(fancontrol, fanid, configElement):
@@ -35,12 +62,14 @@ class FanControl:
config.fans = ConfigSubList()
for fanid in range(self.getFanCount()):
fan = ConfigSubsection()
- fan.vlt = ConfigSlider(default = 16, increment = 5, limits = (0, 255))
+ fan.vlt = ConfigSlider(default = 15, increment = 5, limits = (0, 255))
fan.pwm = ConfigSlider(default = 0, increment = 5, limits = (0, 255))
+ fan.vlt_standby = ConfigSlider(default = 5, increment = 5, limits = (0, 255))
+ fan.pwm_standby = ConfigSlider(default = 0, increment = 5, limits = (0, 255))
fan.vlt.addNotifier(boundFunction(setVlt, self, fanid))
fan.pwm.addNotifier(boundFunction(setPWM, self, fanid))
config.fans.append(fan)
-
+
def getConfig(self, fanid):
return config.fans[fanid]
@@ -85,4 +114,4 @@ class FanControl:
f.write("%x" % value)
f.close()
-fancontrol = FanControl() \ No newline at end of file
+fancontrol = FanControl()
diff --git a/lib/python/Components/Ipkg.py b/lib/python/Components/Ipkg.py
index 0ba1165c..71447775 100755
--- a/lib/python/Components/Ipkg.py
+++ b/lib/python/Components/Ipkg.py
@@ -1,4 +1,5 @@
from enigma import eConsoleAppContainer
+from Tools.Directories import fileExists
class IpkgComponent:
EVENT_INSTALL = 0
@@ -20,7 +21,7 @@ class IpkgComponent:
def __init__(self, ipkg = '/usr/bin/ipkg'):
self.ipkg = ipkg
-
+ self.opkgAvail = fileExists('/usr/bin/opkg')
self.cmd = eConsoleAppContainer()
self.cache = None
self.callbackList = []
@@ -89,7 +90,10 @@ class IpkgComponent:
if data.find('Downloading') == 0:
self.callCallbacks(self.EVENT_DOWNLOAD, data.split(' ', 5)[1].strip())
elif data.find('Upgrading') == 0:
- self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0])
+ if self.opkgAvail:
+ self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0])
+ else:
+ self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0])
elif data.find('Installing') == 0:
self.callCallbacks(self.EVENT_INSTALL, data.split(' ', 1)[1].split(' ')[0])
elif data.find('Removing') == 0:
diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py
index 45b8bfa0..b9da48d8 100755
--- a/lib/python/Components/Network.py
+++ b/lib/python/Components/Network.py
@@ -580,11 +580,11 @@ class Network:
self.wlanmodule = 'madwifi'
if os_path.exists(rt73_dir):
rtfiles = listdir(rt73_dir)
- if len(rtfiles) == 2:
+ if len(rtfiles) == 2 or len(rtfiles) == 5:
self.wlanmodule = 'ralink'
if os_path.exists(zd1211b_dir):
zdfiles = listdir(zd1211b_dir)
- if len(zdfiles) == 1:
+ if len(zdfiles) == 1 or len(zdfiles) == 5:
self.wlanmodule = 'zydas'
return self.wlanmodule
diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py
index 00d06095..c68e9404 100644
--- a/lib/python/Components/NimManager.py
+++ b/lib/python/Components/NimManager.py
@@ -1,4 +1,5 @@
from Tools.HardwareInfo import HardwareInfo
+from Tools.BoundFunction import boundFunction
from config import config, ConfigSubsection, ConfigSelection, ConfigFloat, \
ConfigSatlist, ConfigYesNo, ConfigInteger, ConfigSubList, ConfigNothing, \
@@ -13,6 +14,7 @@ from enigma import eDVBSatelliteEquipmentControl as secClass, \
from time import localtime, mktime
from datetime import datetime
+from Tools.BoundFunction import boundFunction
def getConfigSatlist(orbpos, satlist):
default_orbpos = None
@@ -444,7 +446,7 @@ class SecConfigure:
self.update()
class NIM(object):
- def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None):
+ def __init__(self, slot, type, description, has_outputs = True, internally_connectable = None, multi_type = {}):
self.slot = slot
if type not in ("DVB-S", "DVB-C", "DVB-T", "DVB-S2", None):
@@ -455,6 +457,7 @@ class NIM(object):
self.description = description
self.has_outputs = has_outputs
self.internally_connectable = internally_connectable
+ self.multi_type = multi_type
def isCompatible(self, what):
compatible = {
@@ -466,6 +469,9 @@ class NIM(object):
}
return what in compatible[self.type]
+ def getType(self):
+ return self.type
+
def connectableTo(self):
connectable = {
"DVB-S": ("DVB-S", "DVB-S2"),
@@ -491,6 +497,13 @@ class NIM(object):
def internallyConnectableTo(self):
return self.internally_connectable
+
+ def isMultiType(self):
+ return (len(self.multi_type) > 0)
+
+ # returns dict {<slotid>: <type>}
+ def getMultiTypeList(self):
+ return self.multi_type
slot_id = property(getSlotID)
@@ -636,7 +649,15 @@ class NimManager:
entries[current_slot]["has_outputs"] = (input == "yes")
elif line.strip().startswith("Internally_Connectable:"):
input = int(line.strip()[len("Internally_Connectable:") + 1:])
- entries[current_slot]["internally_connectable"] = input
+ entries[current_slot]["internally_connectable"] = input
+ elif line.strip().startswith("Mode"):
+ # "Mode 0: DVB-T" -> ["Mode 0", " DVB-T"]
+ split = line.strip().split(":")
+ # "Mode 0" -> ["Mode, "0"]
+ split2 = split[0].split(" ")
+ modes = entries[current_slot].get("multi_type", {})
+ modes[split2[1]] = split[1].strip()
+ entries[current_slot]["multi_type"] = modes
elif line.strip().startswith("empty"):
entries[current_slot]["type"] = None
entries[current_slot]["name"] = _("N/A")
@@ -650,12 +671,17 @@ class NimManager:
entry["has_outputs"] = True
if not (entry.has_key("internally_connectable")):
entry["internally_connectable"] = None
- self.nim_slots.append(NIM(slot = id, description = entry["name"], type = entry["type"], has_outputs = entry["has_outputs"], internally_connectable = entry["internally_connectable"]))
+ if not (entry.has_key("multi_type")):
+ entry["multi_type"] = {}
+ self.nim_slots.append(NIM(slot = id, description = entry["name"], type = entry["type"], has_outputs = entry["has_outputs"], internally_connectable = entry["internally_connectable"], multi_type = entry["multi_type"]))
def hasNimType(self, chktype):
for slot in self.nim_slots:
if slot.isCompatible(chktype):
return True
+ for type in slot.getMultiTypeList().values():
+ if chktype == type:
+ return True
return False
def getNimType(self, slotid):
@@ -663,6 +689,9 @@ class NimManager:
def getNimDescription(self, slotid):
return self.nim_slots[slotid].friendly_full_description
+
+ def getNimName(self, slotid):
+ return self.nim_slots[slotid].description
def getNimListOfType(self, type, exception = -1):
# returns a list of indexes for NIMs compatible to the given type, except for 'exception'
@@ -938,16 +967,22 @@ def InitSecParams():
# the configElement should be only visible when diseqc 1.2 is disabled
def InitNimManager(nimmgr):
- InitSecParams()
hw = HardwareInfo()
+ addNimConfig = False
+ try:
+ config.Nims
+ except:
+ addNimConfig = True
- config.Nims = ConfigSubList()
- for x in range(len(nimmgr.nim_slots)):
- config.Nims.append(ConfigSubsection())
+ if addNimConfig:
+ InitSecParams()
+ config.Nims = ConfigSubList()
+ for x in range(len(nimmgr.nim_slots)):
+ config.Nims.append(ConfigSubsection())
lnb_choices = {
"universal_lnb": _("Universal LNB"),
-# "unicable": _("Unicable"),
+ "unicable": _("Unicable"),
"c_band": _("C-Band"),
"user_defined": _("User defined")}
@@ -1218,11 +1253,49 @@ def InitNimManager(nimmgr):
slot_id = configElement.slot_id
if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2':
open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value)
-
+
+ def tunerTypeChanged(nimmgr, configElement):
+ fe_id = configElement.fe_id
+ print "tunerTypeChanged feid %d to mode %s" % (fe_id, configElement.value)
+ try:
+ oldvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
+ open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
+ except:
+ print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+ frontend = eDVBResourceManager.getInstance().allocateRawChannel(fe_id).getFrontend()
+ frontend.closeFrontend()
+ open("/proc/stb/frontend/%d/mode" % (fe_id), "w").write(configElement.value)
+ frontend.reopenFrontend()
+ try:
+ open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(oldvalue)
+ except:
+ print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+ nimmgr.enumerateNIMs()
+
+ empty_slots = 0
+ for slot in nimmgr.nim_slots:
+ x = slot.slot
+ nim = config.Nims[x]
+ addMultiType = False
+ try:
+ nim.multiType
+ except:
+ addMultiType = True
+ if slot.isMultiType() and addMultiType:
+ typeList = []
+ for id in slot.getMultiTypeList().keys():
+ type = slot.getMultiTypeList()[id]
+ typeList.append((id, type))
+ nim.multiType = ConfigSelection(typeList, "0")
+
+ nim.multiType.fe_id = x - empty_slots
+ nim.multiType.addNotifier(boundFunction(tunerTypeChanged, nimmgr))
+
empty_slots = 0
for slot in nimmgr.nim_slots:
x = slot.slot
nim = config.Nims[x]
+
if slot.isCompatible("DVB-S"):
nim.toneAmplitude = ConfigSelection([("9", "600mV"), ("8", "700mV"), ("7", "800mV"), ("6", "900mV"), ("5", "1100mV")], "7")
nim.toneAmplitude.fe_id = x - empty_slots
diff --git a/lib/python/Components/Renderer/Listbox.py b/lib/python/Components/Renderer/Listbox.py
index 7a895330..716fe445 100644..100755
--- a/lib/python/Components/Renderer/Listbox.py
+++ b/lib/python/Components/Renderer/Listbox.py
@@ -19,6 +19,7 @@ class Listbox(Renderer, object):
self.__content = None
self.__wrap_around = False
self.__selection_enabled = True
+ self.__scrollbarMode = "showOnDemand"
GUI_WIDGET = eListbox
@@ -38,6 +39,7 @@ class Listbox(Renderer, object):
instance.selectionChanged.get().append(self.selectionChanged)
self.wrap_around = self.wrap_around # trigger
self.selection_enabled = self.selection_enabled # trigger
+ self.scrollbarMode = self.scrollbarMode # trigger
def preWidgetRemove(self, instance):
instance.setContent(None)
@@ -76,7 +78,24 @@ class Listbox(Renderer, object):
selection_enabled = property(lambda self: self.__selection_enabled, setSelectionEnabled)
+ def setScrollbarMode(self, mode):
+ self.__scrollbarMode = mode
+ if self.instance is not None:
+ self.instance.setScrollbarMode(int(
+ { "showOnDemand": 0,
+ "showAlways": 1,
+ "showNever": 2,
+ }[mode]))
+
+ scrollbarMode = property(lambda self: self.__scrollbarMode, setScrollbarMode)
+
def changed(self, what):
+ if hasattr(self.source, "selectionEnabled"):
+ self.selection_enabled = self.source.selectionEnabled
+ if hasattr(self.source, "scrollbarMode"):
+ self.scrollbarMode = self.source.scrollbarMode
+ if len(what) > 1 and isinstance(what[1], str) and what[1] == "style":
+ return
self.content = self.source.content
def entry_changed(self, index):
diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py
index 6095812a..cd055a82 100755..100644
--- a/lib/python/Components/ServiceList.py
+++ b/lib/python/Components/ServiceList.py
@@ -7,6 +7,8 @@ from Tools.LoadPixmap import LoadPixmap
from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
+from Components.config import config
+
class ServiceList(HTMLComponent, GUIComponent):
MODE_NORMAL = 0
MODE_FAVOURITES = 1
@@ -62,6 +64,22 @@ class ServiceList(HTMLComponent, GUIComponent):
self.l.setColor(eListboxServiceContent.markedBackgroundSelected, parseColor(value))
elif attrib == "foregroundColorServiceNotAvail":
self.l.setColor(eListboxServiceContent.serviceNotAvail, parseColor(value))
+ elif attrib == "colorEventProgressbar":
+ self.l.setColor(eListboxServiceContent.serviceEventProgressbarColor, parseColor(value))
+ elif attrib == "colorEventProgressbarSelected":
+ self.l.setColor(eListboxServiceContent.serviceEventProgressbarColorSelected, parseColor(value))
+ elif attrib == "colorEventProgressbarBorder":
+ self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColor, parseColor(value))
+ elif attrib == "colorEventProgressbarBorderSelected":
+ self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColorSelected, parseColor(value))
+ elif attrib == "colorServiceDescription":
+ self.l.setColor(eListboxServiceContent.serviceDescriptionColor, parseColor(value))
+ elif attrib == "colorServiceDescriptionSelected":
+ self.l.setColor(eListboxServiceContent.serviceDescriptionColorSelected, parseColor(value))
+ elif attrib == "picServiceEventProgressbar":
+ pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value))
+ if pic:
+ self.l.setPixmap(self.l.picServiceEventProgressbar, pic)
elif attrib == "serviceItemHeight":
self.ItemHeight = int(value)
elif attrib == "serviceNameFont":
@@ -213,17 +231,24 @@ class ServiceList(HTMLComponent, GUIComponent):
def setMode(self, mode):
self.mode = mode
+ self.l.setItemHeight(self.ItemHeight)
+ self.l.setVisualMode(eListboxServiceContent.visModeComplex)
if mode == self.MODE_NORMAL:
- self.l.setItemHeight(self.ItemHeight)
- self.l.setVisualMode(eListboxServiceContent.visModeComplex)
+ if config.usage.show_event_progress_in_servicelist.value:
+ self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 52, self.ItemHeight))
+ else:
+ self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 0, 0))
self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont)
self.l.setElementPosition(self.l.celServiceName, eRect(0, 0, self.instance.size().width(), self.ItemHeight))
self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont)
else:
- self.l.setItemHeight(self.ItemHeight)
- self.l.setVisualMode(eListboxServiceContent.visModeComplex)
+ if config.usage.show_event_progress_in_servicelist.value:
+ self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 52, self.ItemHeight))
+ else:
+ self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 0, 0))
self.l.setElementFont(self.l.celServiceNumber, self.ServiceNumberFont)
self.l.setElementPosition(self.l.celServiceNumber, eRect(0, 0, 50, self.ItemHeight))
self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont)
self.l.setElementPosition(self.l.celServiceName, eRect(60, 0, self.instance.size().width()-60, self.ItemHeight))
self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont)
+
diff --git a/lib/python/Components/Sources/List.py b/lib/python/Components/Sources/List.py
index 1eab32b2..6f0670a1 100644
--- a/lib/python/Components/Sources/List.py
+++ b/lib/python/Components/Sources/List.py
@@ -91,8 +91,9 @@ to generate HTML."""
return self.__style
def setStyle(self, style):
- self.__style = style
- self.changed((self.CHANGED_SPECIFIC, "style"))
+ if self.__style != style:
+ self.__style = style
+ self.changed((self.CHANGED_SPECIFIC, "style"))
style = property(getStyle, setStyle)
diff --git a/lib/python/Components/Task.py b/lib/python/Components/Task.py
index a1e04bce..2e4e757d 100644
--- a/lib/python/Components/Task.py
+++ b/lib/python/Components/Task.py
@@ -16,6 +16,7 @@ class Job(object):
self.end = 100
self.__progress = 0
self.weightScale = 1
+ self.afterEvent = None
self.state_changed = CList()
diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py
index 60827107..b86c1a13 100644
--- a/lib/python/Components/UsageConfig.py
+++ b/lib/python/Components/UsageConfig.py
@@ -51,7 +51,14 @@ def InitUsageConfig():
config.usage.on_long_powerpress = ConfigSelection(default = "show_menu", choices = [
("show_menu", _("show shutdown menu")),
- ("shutdown", _("immediate shutdown")) ] )
+ ("shutdown", _("immediate shutdown")),
+ ("standby", _("Standby")) ] )
+
+ config.usage.on_short_powerpress = ConfigSelection(default = "standby", choices = [
+ ("show_menu", _("show shutdown menu")),
+ ("shutdown", _("immediate shutdown")),
+ ("standby", _("Standby")) ] )
+
config.usage.alternatives_priority = ConfigSelection(default = "0", choices = [
("0", "DVB-S/-C/-T"),
@@ -61,6 +68,8 @@ def InitUsageConfig():
("4", "DVB-T/-C/-S"),
("5", "DVB-T/-S/-C") ])
+ config.usage.show_event_progress_in_servicelist = ConfigYesNo(default = False)
+
config.usage.blinking_display_clock_during_recording = ConfigYesNo(default = False)
config.usage.show_message_when_recording_starts = ConfigYesNo(default = True)
diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py
index 83672460..7f755db4 100644
--- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py
@@ -1,5 +1,7 @@
from Tools.Directories import fileExists
from Components.config import config, ConfigSubsection, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigSubList
+import DVDTitle
+import xml.dom.minidom
class ConfigColor(ConfigSequence):
def __init__(self, default = [128,128,128]):
@@ -10,7 +12,10 @@ class ConfigFilename(ConfigText):
ConfigText.__init__(self, default = "", fixed_size = True, visible_width = False)
def getMulti(self, selected):
- filename = (self.text.rstrip("/").rsplit("/",1))[1].encode("utf-8")[:40] + " "
+ if self.text == "":
+ return ("mtext"[1-selected:], "", 0)
+ cut_len = min(len(self.text),40)
+ filename = (self.text.rstrip("/").rsplit("/",1))[1].encode("utf-8")[:cut_len] + " "
if self.allmarked:
mark = range(0, len(filename))
else:
@@ -34,10 +39,11 @@ class DVDProject:
self.settings.vmgm = ConfigFilename()
self.filekeys = ["vmgm", "isopath", "menutemplate"]
self.menutemplate = MenuTemplate()
+ self.error = ""
+ self.session = None
def addService(self, service):
- import DVDTitle
- title = DVDTitle.DVDTitle()
+ title = DVDTitle.DVDTitle(self)
title.addService(service)
self.titles.append(title)
return title
@@ -100,47 +106,78 @@ class DVDProject:
return ret
def loadProject(self, filename):
- import xml.dom.minidom
- try:
+ #try:
if not fileExists(filename):
self.error = "xml file not found!"
- raise AttributeError
- else:
- self.error = ""
+ #raise AttributeError
file = open(filename, "r")
data = file.read().decode("utf-8").replace('&',"&amp;").encode("ascii",'xmlcharrefreplace')
file.close()
projectfiledom = xml.dom.minidom.parseString(data)
- for project in projectfiledom.childNodes[0].childNodes:
- if project.nodeType == xml.dom.minidom.Element.nodeType:
- if project.tagName == 'settings':
- i = 0
- if project.attributes.length < len(self.settings.dict())-1:
- self.error = "project attributes missing"
- raise AttributeError
- while i < project.attributes.length:
- item = project.attributes.item(i)
- key = item.name.encode("utf-8")
- try:
- val = eval(item.nodeValue)
- except (NameError, SyntaxError):
- val = item.nodeValue.encode("utf-8")
- try:
- self.settings.dict()[key].setValue(val)
- except (KeyError):
- self.error = "unknown attribute '%s'" % (key)
- raise AttributeError
- i += 1
+ for node in projectfiledom.childNodes[0].childNodes:
+ print "node:", node
+ if node.nodeType == xml.dom.minidom.Element.nodeType:
+ if node.tagName == 'settings':
+ self.xmlAttributesToConfig(node, self.settings)
+ elif node.tagName == 'titles':
+ self.xmlGetTitleNodeRecursive(node)
+
for key in self.filekeys:
val = self.settings.dict()[key].getValue()
if not fileExists(val):
self.error += "\n%s '%s' not found" % (key, val)
- if len(self.error):
- raise AttributeError
+ #except AttributeError:
+ #print "loadProject AttributeError", self.error
+ #self.error += (" in project '%s'") % (filename)
+ #return False
+ return True
+
+ def xmlAttributesToConfig(self, node, config):
+ try:
+ i = 0
+ #if node.attributes.length < len(config.dict())-1:
+ #self.error = "project attributes missing"
+ #raise AttributeError
+ while i < node.attributes.length:
+ item = node.attributes.item(i)
+ key = item.name.encode("utf-8")
+ try:
+ val = eval(item.nodeValue)
+ except (NameError, SyntaxError):
+ val = item.nodeValue.encode("utf-8")
+ try:
+ print "config[%s].setValue(%s)" % (key, val)
+ config.dict()[key].setValue(val)
+ except (KeyError):
+ self.error = "unknown attribute '%s'" % (key)
+ print "KeyError", self.error
+ raise AttributeError
+ i += 1
except AttributeError:
- self.error += (" in project '%s'") % (filename)
+ self.error += (" XML attribute error '%s'") % node.toxml()
return False
- return True
+
+ def xmlGetTitleNodeRecursive(self, node, title_idx = -1):
+ print "[xmlGetTitleNodeRecursive]", title_idx, node
+ print node.childNodes
+ for subnode in node.childNodes:
+ print "xmlGetTitleNodeRecursive subnode:", subnode
+ if subnode.nodeType == xml.dom.minidom.Element.nodeType:
+ if subnode.tagName == 'title':
+ title_idx += 1
+ title = DVDTitle.DVDTitle(self)
+ self.titles.append(title)
+ self.xmlGetTitleNodeRecursive(subnode, title_idx)
+ if subnode.tagName == 'path':
+ print "path:", subnode.firstChild.data
+ filename = subnode.firstChild.data
+ self.titles[title_idx].addFile(filename.encode("utf-8"))
+ if subnode.tagName == 'properties':
+ self.xmlAttributesToConfig(node, self.titles[title_idx].properties)
+ if subnode.tagName == 'audiotracks':
+ self.xmlGetTitleNodeRecursive(subnode, title_idx)
+ if subnode.tagName == 'audiotrack':
+ print "audiotrack...", subnode.toxml()
def getSize(self):
totalsize = 0
@@ -187,6 +224,7 @@ class MenuTemplate(DVDProject):
self.filekeys = ["menubg", "menuaudio", "fontface_headline", "fontface_title", "fontface_subtitle"]
from TitleProperties import languageChoices
self.settings.menulang = ConfigSelection(choices = languageChoices.choices, default=languageChoices.choices[1][0])
+ self.error = ""
def loadTemplate(self, filename):
ret = DVDProject.loadProject(self, filename)
diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py
index 660005e6..6dff00d6 100644
--- a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py
@@ -1,4 +1,5 @@
from Components.config import config, ConfigSubsection, ConfigSubList, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigYesNo
+import TitleCutter
class ConfigFixedText(ConfigText):
def __init__(self, text, visible_width=60):
@@ -7,17 +8,17 @@ class ConfigFixedText(ConfigText):
pass
class DVDTitle:
- def __init__(self):
+ def __init__(self, project):
self.properties = ConfigSubsection()
self.properties.menutitle = ConfigText(fixed_size = False, visible_width = 80)
self.properties.menusubtitle = ConfigText(fixed_size = False, visible_width = 80)
- self.DVBname = _("Title")
- self.DVBdescr = _("Description")
- self.DVBchannel = _("Channel")
self.properties.aspect = ConfigSelection(choices = [("4:3", _("4:3")), ("16:9", _("16:9"))])
self.properties.widescreen = ConfigSelection(choices = [("nopanscan", "nopanscan"), ("noletterbox", "noletterbox")])
self.properties.autochapter = ConfigInteger(default = 0, limits = (0, 60))
self.properties.audiotracks = ConfigSubList()
+ self.DVBname = _("Title")
+ self.DVBdescr = _("Description")
+ self.DVBchannel = _("Channel")
self.cuesheet = [ ]
self.source = None
self.filesize = 0
@@ -27,6 +28,8 @@ class DVDTitle:
self.chaptermarks = [ ]
self.timeCreate = None
self.VideoType = -1
+ self.project = project
+ self.length = 0
def addService(self, service):
from os import path
@@ -36,7 +39,7 @@ class DVDTitle:
self.source = service
serviceHandler = eServiceCenter.getInstance()
info = serviceHandler.info(service)
- sDescr = info and " " + info.getInfoString(service, iServiceInformation.sDescription) or ""
+ sDescr = info and info.getInfoString(service, iServiceInformation.sDescription) or ""
self.DVBdescr = sDescr
sTimeCreate = info.getInfo(service, iServiceInformation.sTimeCreate)
if sTimeCreate > 1:
@@ -49,9 +52,20 @@ class DVDTitle:
self.filesize = path.getsize(self.inputfile)
self.estimatedDiskspace = self.filesize
self.length = info.getLength(service)
+
+ def addFile(self, filename):
+ from enigma import eServiceReference
+ ref = eServiceReference(1, 0, filename)
+ self.addService(ref)
+ self.project.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, self)
+
+ def titleEditDone(self, cutlist):
+ self.initDVDmenuText(len(self.project.titles))
+ self.cuesheet = cutlist
+ self.produceFinalCuesheet()
- def initDVDmenuText(self, project, track):
- s = project.menutemplate.settings
+ def initDVDmenuText(self, track):
+ s = self.project.menutemplate.settings
self.properties.menutitle.setValue(self.formatDVDmenuText(s.titleformat.getValue(), track))
self.properties.menusubtitle.setValue(self.formatDVDmenuText(s.subtitleformat.getValue(), track))
diff --git a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py
index a1c38842..39d7277e 100755
--- a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py
@@ -92,10 +92,10 @@ class ProjectSettings(Screen,ConfigListScreen):
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
- <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
<widget name="config" position="5,50" size="550,276" scrollbarMode="showOnDemand" />
<ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />
<widget source="info" render="Label" position="10,360" size="550,80" font="Regular;18" halign="center" valign="center" />
@@ -233,10 +233,19 @@ class ProjectSettings(Screen,ConfigListScreen):
else:
self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR)
elif scope == "project":
- if self.project.loadProject(path):
- self.initConfigList()
+ self.path = path
+ print "len(self.titles)", len(self.project.titles)
+ if len(self.project.titles):
+ self.session.openWithCallback(self.askLoadCB, MessageBox,text = _("Your current collection will get lost!") + "\n" + _("Do you want to restore your settings?"), type = MessageBox.TYPE_YESNO)
else:
- self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR)
+ self.askLoadCB(True)
elif scope:
configRef.setValue(path)
self.initConfigList()
+
+ def askLoadCB(self, answer):
+ if answer is not None and answer:
+ if self.project.loadProject(self.path):
+ self.initConfigList()
+ else:
+ self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR) \ No newline at end of file
diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py
index 61152e8a..a52fad9f 100644
--- a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py
@@ -52,13 +52,35 @@ class TitleCutter(CutListEditor):
CutListEditor.grabFrame(self)
def exit(self):
+ if self.t.VideoType == -1:
+ self.getPMTInfo()
self.checkAndGrabThumb()
self.session.nav.stopService()
self.close(self.cut_list[:])
class CutlistReader(TitleCutter):
+ skin = """
+ <screen position="0,0" size="720,576">
+ <eLabel position="0,0" size="720,576" zPosition="1" backgroundColor="#000000" />
+ <widget name="Video" position="0,0" size="100,75" />
+ <widget name="SeekState" position="0,0" />
+ <widget source="cutlist" position="0,0" render="Listbox" >
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(text = 1),
+ MultiContentEntryText(text = 2)
+ ],
+ "fonts": [gFont("Regular", 18)],
+ "itemHeight": 20
+ }
+ </convert>
+ </widget>
+ <widget name="Timeline" position="0,0" />
+ </screen>"""
+
def __init__(self, session, t):
TitleCutter.__init__(self, session, t)
+ self.skin = CutlistReader.skin
def getPMTInfo(self):
TitleCutter.getPMTInfo(self)
diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
index dbc988b1..2cbeb633 100755
--- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
@@ -11,38 +11,46 @@ from Components.Sources.List import List
from Components.Sources.StaticText import StaticText
from Components.Sources.Progress import Progress
from Components.MultiContent import MultiContentEntryText
+from Components.Label import MultiColorLabel
from enigma import gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT
from Tools.Directories import resolveFilename, SCOPE_PLUGINS
class TitleList(Screen, HelpableScreen):
skin = """
- <screen name="TitleList" position="center,center" size="560,445" title="DVD Tool" >
+ <screen name="TitleList" position="center,center" size="560,470" title="DVD Tool" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
- <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
<widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" transparent="1" />
- <widget source="error_label" render="Label" position="10,48" size="540,395" zPosition="3" font="Regular;20" transparent="1" />
- <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312" zPosition="3" transparent="1" >
+ <widget source="error_label" render="Label" position="10,48" size="540,296" zPosition="3" font="Regular;20" transparent="1" />
+ <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="546,296" zPosition="3" transparent="1" >
<convert type="TemplatedMultiContent">
{"template": [
- MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
- MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
- MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time,
- MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel,
- MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel,
+ MultiContentEntryText(pos = (0, 0), size = (360, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
+ MultiContentEntryText(pos = (0, 20), size = (360, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
+ MultiContentEntryText(pos = (366, 6), size = (152, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 channel,
+ MultiContentEntryText(pos = (366, 20), size = (102, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 begin time,
+ MultiContentEntryText(pos = (470, 20), size = (48, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 5 duration,
],
"fonts": [gFont("Regular", 20), gFont("Regular", 14)],
"itemHeight": 37
}
</convert>
</widget>
- <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
- <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
+ <ePixmap pixmap="skin_default/div-h.png" position="0,390" zPosition="10" size="560,2" />
+ <ePixmap pixmap="skin_default/buttons/key_menu.png" position="10,394" size="35,25" alphatest="on" />
+ <widget source="hint" render="Label" position="50,396" size="540,22" font="Regular;18" halign="left" />
+ <widget name="medium_label" position="10,420" size="540,22" font="Regular;18" halign="left" foregroundColors="#FFFFFF,#FFFF00,#FF0000" />
+ <widget source="space_bar_single" render="Progress" position="10,446" size="270,24" borderWidth="1" zPosition="2" backgroundColor="#254f7497" />
+ <widget source="space_label_single" render="Label" position="10,449" size="270,22" zPosition="3" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
+ <widget source="space_bar_dual" render="Progress" position="10,446" size="540,24" borderWidth="1" backgroundColor="#254f7497" />
+ <widget source="space_label_dual" render="Label" position="10,449" size="540,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
+
</screen>"""
def __init__(self, session, project = None):
@@ -75,17 +83,19 @@ class TitleList(Screen, HelpableScreen):
self["title_label"] = StaticText()
self["error_label"] = StaticText()
- self["space_label"] = StaticText()
- self["space_bar"] = Progress()
+ self["space_label_single"] = StaticText()
+ self["space_label_dual"] = StaticText()
+ self["hint"] = StaticText(_("Advanced Options"))
+ self["medium_label"] = MultiColorLabel()
+ self["space_bar_single"] = Progress()
+ self["space_bar_dual"] = Progress()
+ self["titles"] = List([])
+ self.previous_size = 0
if project is not None:
self.project = project
else:
self.newProject()
-
- self["titles"] = List([])
- self.updateTitleList()
- self.previous_size = 0
self.onLayoutFinish.append(self.layoutFinished)
def layoutFinished(self):
@@ -107,15 +117,16 @@ class TitleList(Screen, HelpableScreen):
j = self.backgroundJob
menu.append(("%s: %s (%d%%)" % (j.getStatustext(), j.name, int(100*j.progress/float(j.end))), self.showBackgroundJob))
menu.append((_("DVD media toolbox"), self.toolbox))
- menu.append((_("Preview menu"), self.previewMenu))
if self.project.settings.output.getValue() == "dvd":
if len(self["titles"].list):
menu.append((_("Burn DVD"), self.burnProject))
elif self.project.settings.output.getValue() == "iso":
menu.append((_("Create DVD-ISO"), self.burnProject))
menu.append((_("Burn existing image to DVD"), self.selectImage))
- menu.append((_("Edit chapters of current title"), self.editTitle))
- menu.append((_("Reset and renumerate title names"), self.resetTitles))
+ if len(self["titles"].list):
+ menu.append((_("Preview menu"), self.previewMenu))
+ menu.append((_("Edit chapters of current title"), self.editTitle))
+ menu.append((_("Reset and renumerate title names"), self.resetTitles))
menu.append((_("Exit"), self.leave))
self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
@@ -149,9 +160,9 @@ class TitleList(Screen, HelpableScreen):
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
<widget name="waitingtext" position="0,45" size="560,395" zPosition="4" font="Regular;22" halign="center" valign="center" />
<widget name="list" position="5,40" size="550,375" zPosition="2" scrollbarMode="showOnDemand" />
<widget name="DescriptionBorder" pixmap="skin_default/border_eventinfo.png" position="0,316" zPosition="1" size="560,103" transparent="1" alphatest="on" />
@@ -197,7 +208,7 @@ class TitleList(Screen, HelpableScreen):
self.close(current)
self.session.openWithCallback(self.selectedSource, DVDMovieSelection)
- def selectedSource(self, source):
+ def selectedSource(self, source = None):
if source is None:
return None
if not source.getPath().endswith(".ts"):
@@ -228,7 +239,7 @@ class TitleList(Screen, HelpableScreen):
def settingsCB(self, update=True):
if not update:
return
- self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
+ self.updateTitleList()
def loadTemplate(self):
filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVD.ddvdp.xml"
@@ -281,9 +292,11 @@ class TitleList(Screen, HelpableScreen):
if len(list):
self["key_red"].text = _("Remove title")
self["key_yellow"].text = _("Title properties")
+ self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
else:
self["key_red"].text = ""
self["key_yellow"].text = ""
+ self["title_label"].text = _("Please add titles to the compilation.")
def updateSize(self):
size = self.project.size/(1024*1024)
@@ -292,20 +305,32 @@ class TitleList(Screen, HelpableScreen):
print "updateSize:", size, "MAX_DL:", MAX_DL, "MAX_SL:", MAX_SL
if size > MAX_DL:
percent = 100 * size / float(MAX_DL)
- self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
- self["space_bar"].value = int(percent)
+ self["space_label_dual"].text = "%d MB (%.2f%%)" % (size, percent)
+ self["space_bar_dual"].value = int(percent)
+ self["space_bar_single"].value = 100
+ self["space_label_single"].text = ""
+ self["medium_label"].setText(_("Exceeds dual layer medium!"))
+ self["medium_label"].setForegroundColorNum(2)
if self.previous_size < MAX_DL:
- self.session.open(MessageBox,text = _("exceeds dual layer medium!"), type = MessageBox.TYPE_ERROR)
+ self.session.open(MessageBox,text = _("Exceeds dual layer medium!"), type = MessageBox.TYPE_ERROR)
elif size > MAX_SL:
percent = 100 * size / float(MAX_DL)
- self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
- self["space_bar"].value = int(percent)
+ self["space_label_dual"].text = "%d MB (%.2f%%)" % (size, percent)
+ self["space_bar_dual"].value = int(percent)
+ self["space_bar_single"].value = 100
+ self["space_label_single"].text = ""
+ self["medium_label"].setText(_("Required medium type:") + " " + _("DUAL LAYER DVD") + ", %d MB " % (MAX_DL - size) + _("free"))
+ self["medium_label"].setForegroundColorNum(1)
if self.previous_size < MAX_SL:
- self.session.open(MessageBox,text = _("Your collection exceeds the size of a single layer medium, you will need a blank dual layer DVD!"), type = MessageBox.TYPE_INFO)
+ self.session.open(MessageBox, text = _("Your collection exceeds the size of a single layer medium, you will need a blank dual layer DVD!"), timeout = 10, type = MessageBox.TYPE_INFO)
elif size < MAX_SL:
percent = 100 * size / float(MAX_SL)
- self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
- self["space_bar"].value = int(percent)
+ self["space_label_single"].text = "%d MB (%.2f%%)" % (size, percent)
+ self["space_bar_single"].value = int(percent)
+ self["space_bar_dual"].value = 0
+ self["space_label_dual"].text = ""
+ self["medium_label"].setText(_("Required medium type:") + " " + _("SINGLE LAYER DVD") + ", %d MB " % (MAX_SL - size) + _("free"))
+ self["medium_label"].setForegroundColorNum(0)
self.previous_size = size
def getCurrentTitle(self):
@@ -323,9 +348,7 @@ class TitleList(Screen, HelpableScreen):
def titleEditDone(self, cutlist):
t = self.current_edit_title
- t.initDVDmenuText(self.project,len(self.project.titles))
- t.cuesheet = cutlist
- t.produceFinalCuesheet()
+ t.titleEditDone(cutlist)
if t.VideoType != 0:
self.session.openWithCallback(self.DVDformatCB,MessageBox,text = _("The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to create a Dreambox format data DVD (which will not play in stand-alone DVD players) instead?"), type = MessageBox.TYPE_YESNO)
else:
@@ -335,7 +358,7 @@ class TitleList(Screen, HelpableScreen):
count = 0
for title in self.project.titles:
count += 1
- title.initDVDmenuText(self.project,count)
+ title.initDVDmenuText(count)
self.updateTitleList()
def DVDformatCB(self, answer):
@@ -346,5 +369,13 @@ class TitleList(Screen, HelpableScreen):
else:
self.removeTitle(t)
- def leave(self):
- self.close()
+ def leave(self, close = False):
+ if not len(self["titles"].list) or close:
+ self.close()
+ else:
+ self.session.openWithCallback(self.exitCB, MessageBox,text = _("Your current collection will get lost!") + "\n" + _("Do you really want to exit?"), type = MessageBox.TYPE_YESNO)
+
+ def exitCB(self, answer):
+ print "exitCB", answer
+ if answer is not None and answer:
+ self.close() \ No newline at end of file
diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py b/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py
index 0a664eba..956f054d 100755
--- a/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py
@@ -21,10 +21,12 @@ class TitleProperties(Screen,ConfigListScreen):
<screen name="TitleProperties" position="center,center" size="560,445" title="Properties of current title" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
<widget source="serviceinfo" render="Label" position="10,46" size="350,144" font="Regular;18" />
<widget name="thumbnail" position="370,46" size="180,144" alphatest="on" />
<widget name="config" position="10,206" size="540,228" scrollbarMode="showOnDemand" />
@@ -38,7 +40,8 @@ class TitleProperties(Screen,ConfigListScreen):
self["key_red"] = StaticText(_("Cancel"))
self["key_green"] = StaticText(_("OK"))
- self["key_blue"] = StaticText(_("Edit Title"))
+ self["key_yellow"] = StaticText(_("Edit Title"))
+ self["key_blue"] = StaticText()
self["serviceinfo"] = StaticText()
self["thumbnail"] = Pixmap()
@@ -57,7 +60,7 @@ class TitleProperties(Screen,ConfigListScreen):
{
"green": self.exit,
"red": self.cancel,
- "blue": self.editTitle,
+ "yellow": self.editTitle,
"cancel": self.cancel,
"ok": self.ok,
}, -2)
diff --git a/lib/python/Plugins/Extensions/DVDBurn/plugin.py b/lib/python/Plugins/Extensions/DVDBurn/plugin.py
index 45f438da..bd856b47 100644
--- a/lib/python/Plugins/Extensions/DVDBurn/plugin.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/plugin.py
@@ -12,6 +12,6 @@ def main_add(session, service, **kwargs):
dvdburn.selectedSource(service)
def Plugins(**kwargs):
- descr = _("Burn to DVD...")
+ descr = _("Burn to DVD")
return [PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_MOVIELIST, fnc=main_add, icon="dvdburn.png"),
PluginDescriptor(name="DVD Burn", description=descr, where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main, icon="dvdburn.png") ]
diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
index 0372c497..2ba53927 100644
--- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
+++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
@@ -85,12 +85,9 @@ RESULT eServiceFactoryDVD::offlineOperations(const eServiceReference &, ePtr<iSe
DEFINE_REF(eServiceDVD);
eServiceDVD::eServiceDVD(eServiceReference ref):
- m_ref(ref),
- m_ddvdconfig(ddvd_create()),
- m_subtitle_widget(0),
- m_state(stIdle),
- m_current_trick(0),
- m_pump(eApp, 1)
+ m_ref(ref), m_ddvdconfig(ddvd_create()), m_subtitle_widget(0), m_state(stIdle),
+ m_current_trick(0), m_pump(eApp, 1), m_width(-1), m_height(-1),
+ m_aspect(-1), m_framerate(-1), m_progressive(-1)
{
int aspect = DDVD_16_9;
int policy = DDVD_PAN_SCAN;
@@ -309,6 +306,32 @@ void eServiceDVD::gotMessage(int /*what*/)
m_event(this, evSeekableStatusChanged);
m_event(this, evUser+12);
break;
+#ifdef DDVD_SUPPORTS_PICTURE_INFO
+ case DDVD_SIZE_CHANGED:
+ {
+ int changed = m_width != -1 && m_height != -1 && m_aspect != -1;
+ ddvd_get_last_size(m_ddvdconfig, &m_width, &m_height, &m_aspect);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoSizeChanged);
+ break;
+ }
+ case DDVD_PROGRESSIVE_CHANGED:
+ {
+ int changed = m_progressive != -1;
+ ddvd_get_last_progressive(m_ddvdconfig, &m_progressive);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoProgressiveChanged);
+ break;
+ }
+ case DDVD_FRAMERATE_CHANGED:
+ {
+ int changed = m_framerate != -1;
+ ddvd_get_last_framerate(m_ddvdconfig, &m_framerate);
+ if (changed)
+ m_event((iPlayableService*)this, evVideoFramerateChanged);
+ break;
+ }
+#endif
default:
break;
}
@@ -500,6 +523,18 @@ int eServiceDVD::getInfo(int w)
case sUser+7:
case sUser+8:
return resIsPyObject;
+#ifdef DDVD_SUPPORTS_PICTURE_INFO
+ case sVideoWidth:
+ return m_width;
+ case sVideoHeight:
+ return m_height;
+ case sAspect:
+ return m_aspect;
+ case sProgressive:
+ return m_progressive;
+ case sFrameRate:
+ return m_framerate;
+#endif
default:
return resNA;
}
diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h
index c730d501..c751a394 100644
--- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h
+++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h
@@ -127,6 +127,8 @@ private:
void loadCuesheet();
void saveCuesheet();
+
+ int m_width, m_height, m_aspect, m_framerate, m_progressive;
};
#endif
diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
index 036bbbb9..0fc78fb1 100755
--- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
+++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
@@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
# 'None' is magic to start at the list of mountpoints
defaultDir = config.mediaplayer.defaultDir.getValue()
- self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+ self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
self["filelist"] = self.filelist
self.playlist = MyPlayList()
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
index 860efc02..8986560b 100644
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py
@@ -63,10 +63,10 @@ class NFIFlash(Screen):
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
- <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
- <widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
+ <widget source="listlabel" render="Label" position="10,44" size="250,20" font="Regular;16" />
<widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" />
<widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
<widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
@@ -95,6 +95,7 @@ class NFIFlash(Screen):
{
"green": self.ok,
"yellow": self.reboot,
+ "blue": self.runWizard,
"ok": self.ok,
"left": self.left,
"right": self.right,
@@ -109,6 +110,43 @@ class NFIFlash(Screen):
self.md5sum = ""
self.job = None
self.box = HardwareInfo().get_device_name()
+ self.configuration_restorable = None
+ self.wizard_mode = False
+ from enigma import eTimer
+ self.delayTimer = eTimer()
+ self.delayTimer.callback.append(self.runWizard)
+ self.delayTimer.start(50,1)
+
+ def check_for_wizard(self):
+ if self["filelist"].getCurrentDirectory() is not None and fileExists(self["filelist"].getCurrentDirectory()+"wizard.nfo"):
+ self["key_blue"].text = _("USB stick wizard")
+ return True
+ else:
+ self["key_blue"].text = ""
+ return False
+
+ def runWizard(self):
+ if not self.check_for_wizard():
+ self.wizard_mode = False
+ return
+ wizardcontent = open(self["filelist"].getCurrentDirectory()+"/wizard.nfo", "r").readlines()
+ nfifile = None
+ for line in wizardcontent:
+ line = line.strip()
+ if line.startswith("image: "):
+ nfifile = self["filelist"].getCurrentDirectory()+line[7:]
+ if line.startswith("configuration: "):
+ backupfile = self["filelist"].getCurrentDirectory()+line[15:]
+ if fileExists(backupfile):
+ print "wizard configuration:", backupfile
+ self.configuration_restorable = backupfile
+ else:
+ self.configuration_restorable = None
+ if nfifile and fileExists(nfifile):
+ self.wizard_mode = True
+ print "wizard image:", nfifile
+ self.check_for_NFO(nfifile)
+ self.queryFlash()
def closeCB(self):
if ( self.job is None or self.job.status is not self.job.IN_PROGRESS ) and not self.no_autostart:
@@ -133,12 +171,16 @@ class NFIFlash(Screen):
self["filelist"].pageUp()
self.check_for_NFO()
- def check_for_NFO(self):
+ def check_for_NFO(self, nfifile=None):
self.session.summary.setText(self["filelist"].getFilename())
- if self["filelist"].getFilename() is None:
- return
- if self["filelist"].getCurrentDirectory() is not None:
- self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()
+ if nfifile is None:
+ self.session.summary.setText(self["filelist"].getFilename())
+ if self["filelist"].getFilename() is None:
+ return
+ if self["filelist"].getCurrentDirectory() is not None:
+ self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()
+ else:
+ self.nfifile = nfifile
if self.nfifile.upper().endswith(".NFI"):
self["key_green"].text = _("Flash")
@@ -152,7 +194,7 @@ class NFIFlash(Screen):
else:
self.md5sum = ""
else:
- self["infolabel"].text = _("No details for this image file") + ":\n" + self["filelist"].getFilename()
+ self["infolabel"].text = _("No details for this image file") + (self["filelist"].getFilename() or "")
self.md5sum = ""
else:
self["infolabel"].text = ""
@@ -164,6 +206,7 @@ class NFIFlash(Screen):
self["filelist"].descent()
self.session.summary.setText(self["filelist"].getFilename())
self.check_for_NFO()
+ self.check_for_wizard()
else:
self.queryFlash()
@@ -192,7 +235,10 @@ class NFIFlash(Screen):
def md5finished(self, retval):
if retval==0:
- self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file has a valid md5 signature. Continue programming this image to flash memory?"), MessageBox.TYPE_YESNO)
+ if self.wizard_mode:
+ self.session.openWithCallback(self.queryCB, MessageBox, _("Shall the USB stick wizard proceed and program the image file %s into flash memory?" % self.nfifile.rsplit('/',1)[-1]), MessageBox.TYPE_YESNO)
+ else:
+ self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file has a valid md5 signature. Continue programming this image to flash memory?"), MessageBox.TYPE_YESNO)
else:
self.session.openWithCallback(self.queryCB, MessageBox, _("The md5sum validation failed, the file may be corrupted! Are you sure that you want to burn this image to flash memory? You are doing this at your own risk!"), MessageBox.TYPE_YESNO)
@@ -201,6 +247,7 @@ class NFIFlash(Screen):
self.createJob()
else:
self["statusbar"].text = _("Please select .NFI flash image file from medium")
+ self.wizard_mode = False
def createJob(self):
self.job = Job("Image flashing job")
@@ -240,6 +287,8 @@ class NFIFlash(Screen):
elif j.status == j.FINISHED:
self["statusbar"].text = _("Writing NFI image file to flash completed")
self.session.summary.setText(_("NFI image flashing completed. Press Yellow to Reboot!"))
+ if self.wizard_mode:
+ self.restoreConfiguration()
self["key_yellow"].text = _("Reboot")
elif j.status == j.FAILED:
@@ -250,10 +299,19 @@ class NFIFlash(Screen):
print "[jobcb] %s %s %s" % (jobref, fasel, blubber)
self["key_green"].text = _("Flash")
- def reboot(self):
+ def reboot(self, ret=None):
if self.job.status == self.job.FINISHED:
self["statusbar"].text = ("rebooting...")
TryQuitMainloop(self.session,2)
-
+
+ def restoreConfiguration(self):
+ if self.configuration_restorable:
+ from Screens.Console import Console
+ cmdlist = [ "mount /dev/mtdblock/3 /mnt/realroot -t jffs2", "tar -xzvf " + self.configuration_restorable + " -C /mnt/realroot/" ]
+ self.session.open(Console, title = "Restore running", cmdlist = cmdlist, finishedCallback = self.restore_finished, closeOnSuccess = True)
+
+ def restore_finished(self):
+ self.session.openWithCallback(self.reboot, MessageBox, _("USB stick wizard finished. Your dreambox will now restart with your new image!"), MessageBox.TYPE_INFO)
+
def createSummary(self):
return NFISummary
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
index 6096ca8b..a8b34acd 100755
--- a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
@@ -421,3 +421,4 @@ class NetworkWizard(WizardLanguage, Rc):
def ChoicesSelectionMoved(self):
pass
+
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
index e8cf6dc2..d4653cca 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
@@ -7,6 +7,7 @@ from Components.Sources.List import List
from Components.Ipkg import IpkgComponent
from Components.Network import iNetwork
from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR
+from Tools.HardwareInfo import HardwareInfo
from time import time
@@ -29,6 +30,7 @@ class SoftwareTools(DreamInfoHandler):
self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
self.directory = resolveFilename(SCOPE_METADIR)
+ self.hardware_info = HardwareInfo()
self.list = List([])
self.NotifierCallback = None
self.Console = Console()
@@ -78,9 +80,12 @@ class SoftwareTools(DreamInfoHandler):
def ipkgCallback(self, event, param):
if event == IpkgComponent.EVENT_ERROR:
SoftwareTools.list_updating = False
+ if self.NotifierCallback is not None:
+ self.NotifierCallback(False)
elif event == IpkgComponent.EVENT_DONE:
if SoftwareTools.list_updating:
self.startIpkgListAvailable()
+ #print event, "-", param
pass
def startIpkgListAvailable(self, callback = None):
@@ -164,6 +169,14 @@ class SoftwareTools(DreamInfoHandler):
l = len(tokens)
version = l > 1 and tokens[1].strip() or ""
SoftwareTools.installed_packetlist[name] = version
+ for package in self.packagesIndexlist[:]:
+ if not self.verifyPrerequisites(package[0]["prerequisites"]):
+ self.packagesIndexlist.remove(package)
+ for package in self.packagesIndexlist[:]:
+ attributes = package[0]["attributes"]
+ if attributes.has_key("packagetype"):
+ if attributes["packagetype"] == "internal":
+ self.packagesIndexlist.remove(package)
if callback is None:
self.countUpdates()
else:
@@ -228,4 +241,14 @@ class SoftwareTools(DreamInfoHandler):
for name in self.UpdateConsole.appContainers.keys():
self.UpdateConsole.kill(name)
+ def verifyPrerequisites(self, prerequisites):
+ if prerequisites.has_key("hardware"):
+ hardware_found = False
+ for hardware in prerequisites["hardware"]:
+ if hardware == self.hardware_info.device_name:
+ hardware_found = True
+ if not hardware_found:
+ return False
+ return True
+
iSoftwareTools = SoftwareTools() \ No newline at end of file
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
index 4dbe7f70..1e0ed4d5 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
@@ -307,8 +307,8 @@ class PluginManager(Screen, DreamInfoHandler):
<convert type="TemplatedMultiContent">
{"templates":
{"default": (51,[
- MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
+ MultiContentEntryText(pos = (0, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (0, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
]),
@@ -405,22 +405,19 @@ class PluginManager(Screen, DreamInfoHandler):
if status == 'update':
statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
self.statuslist.append(( _("Updating software catalog"), '', _("Searching for available updates. Please wait..." ),'', '', statuspng, divpng, None, '' ))
- self["list"].style = "default"
- self['list'].setList(self.statuslist)
elif status == 'sync':
statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
- self["list"].style = "default"
- self['list'].setList(self.statuslist)
elif status == 'error':
statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
- self["list"].style = "default"
- self['list'].setList(self.statuslist)
+ self["list"].style = "default"
+ self['list'].setList(self.statuslist)
+
def getUpdateInfos(self):
self.setState('update')
- iSoftwareTools.getUpdates(self.getUpdateInfosCB)
+ iSoftwareTools.startSoftwareTools(self.getUpdateInfosCB)
def getUpdateInfosCB(self, retval = None):
if retval is not None:
@@ -429,9 +426,13 @@ class PluginManager(Screen, DreamInfoHandler):
self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
else:
self["status"].setText(_("There are no updates available."))
+ self.rebuildList()
elif retval is False:
- self["status"].setText(_("No network connection available."))
- self.rebuildList()
+ self.setState('error')
+ if iSoftwareTools.NetworkConnectionAvailable:
+ self["status"].setText(_("Updatefeed not available."))
+ else:
+ self["status"].setText(_("No network connection available."))
def rebuildList(self, retval = None):
if self.currentSelectedTag is None:
@@ -1701,15 +1702,11 @@ def startSetup(menuid):
return [ ]
return [(_("Software management"), UpgradeMain, "software_manager", 50)]
-def autostart(reason, **kwargs):
- if reason is True:
- iSoftwareTools.startSoftwareTools()
def Plugins(path, **kwargs):
global plugin_path
plugin_path = path
list = [
- PluginDescriptor(where = [PluginDescriptor.WHERE_NETWORKCONFIG_READ], fnc = autostart),
PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup),
PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)
]
diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py
index 38e343f9..c8af9cdd 100644
--- a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py
@@ -12,7 +12,7 @@ from Components.FanControl import fancontrol
class TempFanControl(Screen, ConfigListScreen):
skin = """
- <screen position="90,100" size="570,420" title="Fan Control" >
+ <screen position="center,center" size="570,420" title="Fan Control" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
@@ -22,7 +22,7 @@ class TempFanControl(Screen, ConfigListScreen):
<widget source="yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
<widget source="blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
- <widget name="config" position="10,50" size="550,90" scrollbarMode="showOnDemand" />
+ <widget name="config" position="10,50" size="550,120" scrollbarMode="showOnDemand" />
<widget source="SensorTempText0" render="Label" position="10,150" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
<widget source="SensorTemp0" render="Label" position="100,150" zPosition="1" size="100,20" font="Regular;19" halign="right">
@@ -90,7 +90,7 @@ class TempFanControl(Screen, ConfigListScreen):
<convert type="SensorToText"></convert>
</widget>
</screen>"""
-
+
def __init__(self, session, args = None):
Screen.__init__(self, session)
@@ -125,6 +125,9 @@ class TempFanControl(Screen, ConfigListScreen):
for count in range(fancontrol.getFanCount()):
self.list.append(getConfigListEntry(_("Fan %d Voltage") % (count + 1), fancontrol.getConfig(count).vlt))
self.list.append(getConfigListEntry(_("Fan %d PWM") % (count + 1), fancontrol.getConfig(count).pwm))
+ self.list.append(getConfigListEntry(_("Standby Fan %d Voltage") % (count + 1), fancontrol.getConfig(count).vlt_standby))
+ self.list.append(getConfigListEntry(_("Standby Fan %d PWM") % (count + 1), fancontrol.getConfig(count).pwm_standby))
+
ConfigListScreen.__init__(self, self.list, session = self.session)
#self["config"].list = self.list
#self["config"].setList(self.list)
@@ -136,28 +139,31 @@ class TempFanControl(Screen, ConfigListScreen):
"red": self.revert,
"green": self.save
}, -1)
-
+
def save(self):
for count in range(fancontrol.getFanCount()):
fancontrol.getConfig(count).vlt.save()
fancontrol.getConfig(count).pwm.save()
+ fancontrol.getConfig(count).vlt_standby.save()
+ fancontrol.getConfig(count).pwm_standby.save()
self.close()
-
+
def revert(self):
for count in range(fancontrol.getFanCount()):
fancontrol.getConfig(count).vlt.load()
fancontrol.getConfig(count).pwm.load()
+ fancontrol.getConfig(count).vlt_standby.load()
+ fancontrol.getConfig(count).pwm_standby.load()
self.close()
-
+
def main(session, **kwargs):
session.open(TempFanControl)
def startMenu(menuid):
if menuid != "system":
return []
-
return [(_("Temperature and Fan control"), main, "tempfancontrol", 80)]
def Plugins(**kwargs):
return PluginDescriptor(name = "Temperature and Fan control", description = _("Temperature and Fan control"), where = PluginDescriptor.WHERE_MENU, fnc = startMenu)
- \ No newline at end of file
+
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
index a9f7bf43..2df5814c 100755
--- a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
@@ -190,7 +190,7 @@ class WlanScan(Screen):
self.newAPList = None
self.WlanList = None
self.cleanList = None
- self.oldlist = None
+ self.oldlist = {}
self.listLength = None
self.rescanTimer = eTimer()
self.rescanTimer.callback.append(self.rescanTimerFired)
@@ -274,24 +274,18 @@ class WlanScan(Screen):
return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng))
def updateAPList(self):
- self.oldlist = []
- self.oldlist = self.cleanList
- self.newAPList = []
newList = []
+ newList = self.getAccessPoints(refresh = True)
+ self.newAPList = []
tmpList = []
newListIndex = None
currentListEntry = None
currentListIndex = None
- newList = self.getAccessPoints(refresh = True)
-
- for oldentry in self.oldlist:
- if oldentry not in newList:
- newList.append(oldentry)
- for newentry in newList:
- if newentry[1] == "hidden...":
- continue
- tmpList.append(newentry)
+ for ap in self.oldlist.keys():
+ data = self.oldlist[ap]['data']
+ if data is not None:
+ tmpList.append(data)
if len(tmpList):
if "hidden..." not in tmpList:
@@ -303,7 +297,7 @@ class WlanScan(Screen):
currentListEntry = self["list"].getCurrent()
idx = 0
for entry in self.newAPList:
- if entry == currentListEntry:
+ if entry[0] == currentListEntry[0]:
newListIndex = idx
idx +=1
self['list'].setList(self.newAPList)
@@ -335,6 +329,10 @@ class WlanScan(Screen):
compList.remove(compentry)
for entry in compList:
self.cleanList.append( ( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ) )
+ if not self.oldlist.has_key(entry[0]):
+ self.oldlist[entry[0]] = { 'data': entry }
+ else:
+ self.oldlist[entry[0]]['data'] = entry
if "hidden..." not in self.cleanList:
self.cleanList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
@@ -401,4 +399,3 @@ def configStrings(iface):
def Plugins(**kwargs):
return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."})
- \ No newline at end of file
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 4ca6fa39..0895c9c2 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -449,7 +449,7 @@ class ChannelSelectionEdit:
if mutableAlternatives:
mutableAlternatives.setListName(name)
if mutableAlternatives.addService(cur_service.ref):
- print "add", cur_service.toString(), "to new alternatives failed"
+ print "add", cur_service.ref.toString(), "to new alternatives failed"
mutableAlternatives.flushChanges()
self.servicelist.addService(new_ref.ref, True)
self.servicelist.removeCurrent()
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index ca9ba550..1c577eec 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -487,7 +487,7 @@ class InfoBarEPG:
self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
{
"showEventInfo": (self.openEventView, _("show EPG...")),
- "showEventInfoPlugin": (self.showEventInfoPlugins, _("show single service EPG...")),
+ "showEventInfoPlugin": (self.showEventInfoPlugins, _("list of EPG views...")),
"showInfobarOrEpgWhenInfobarAlreadyVisible": self.showEventInfoWhenNotVisible,
})
@@ -598,6 +598,7 @@ class InfoBarEPG:
if list:
list.append((_("show single service EPG..."), self.openSingleServiceEPG))
+ list.append((_("Multi EPG"), self.openMultiServiceEPG))
self.session.openWithCallback(self.EventInfoPluginChosen, ChoiceBox, title=_("Please choose an extension..."), list = list, skin_name = "EPGExtensionsList")
else:
self.openSingleServiceEPG()
@@ -1110,15 +1111,21 @@ class InfoBarPVRState:
self.pvrStateDialog.hide()
else:
self._mayShow()
-
class InfoBarTimeshiftState(InfoBarPVRState):
def __init__(self):
InfoBarPVRState.__init__(self, screen=TimeshiftState, force_show = True)
+ self.__hideTimer = eTimer()
+ self.__hideTimer.callback.append(self.__hideTimeshiftState)
def _mayShow(self):
- if self.execing and self.timeshift_enabled and self.seekstate != self.SEEK_STATE_PLAY:
+ if self.execing and self.timeshift_enabled:
self.pvrStateDialog.show()
+ if self.seekstate == self.SEEK_STATE_PLAY and not self.shown:
+ self.__hideTimer.start(5*1000, True)
+
+ def __hideTimeshiftState(self):
+ self.pvrStateDialog.hide()
class InfoBarShowMovies:
diff --git a/lib/python/Screens/RecordPaths.py b/lib/python/Screens/RecordPaths.py
index c833266f..22ca9fcf 100644
--- a/lib/python/Screens/RecordPaths.py
+++ b/lib/python/Screens/RecordPaths.py
@@ -6,7 +6,7 @@ from Components.config import config, ConfigSelection, getConfigListEntry, confi
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Tools.Directories import fileExists
-
+from Components.UsageConfig import preferredPath
class RecordPathsSettings(Screen,ConfigListScreen):
skin = """
@@ -115,7 +115,7 @@ class RecordPathsSettings(Screen,ConfigListScreen):
self.dirnameSelected,
MovieLocationBox,
txt,
- self.default_dirname.value
+ preferredPath(self.default_dirname.value)
)
elif currentry == self.timer_entry:
self.entrydirname = self.timer_dirname
@@ -123,7 +123,7 @@ class RecordPathsSettings(Screen,ConfigListScreen):
self.dirnameSelected,
MovieLocationBox,
_("Initial location in new timers"),
- self.timer_dirname.value
+ preferredPath(self.timer_dirname.value)
)
elif currentry == self.instantrec_entry:
self.entrydirname = self.instantrec_dirname
@@ -131,7 +131,7 @@ class RecordPathsSettings(Screen,ConfigListScreen):
self.dirnameSelected,
MovieLocationBox,
_("Location for instant recordings"),
- self.instantrec_dirname.value
+ preferredPath(self.instantrec_dirname.value)
)
elif currentry == self.timeshift_entry:
self.entrydirname = self.timeshift_dirname
diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py
index 7fdfc2fd..87d65e54 100644
--- a/lib/python/Screens/Satconfig.py
+++ b/lib/python/Screens/Satconfig.py
@@ -58,7 +58,7 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
def createConfigMode(self):
if self.nim.isCompatible("DVB-S"):
- choices = { "nothing": _("nothing connected"),
+ choices = { "nothing": _("not configured"),
"simple": _("simple"),
"advanced": _("advanced")}
#if len(nimmanager.getNimListOfType(nimmanager.getNimType(self.slotid), exception = x)) > 0:
@@ -76,6 +76,7 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
print "Creating setup"
self.list = [ ]
+ self.multiType = None
self.configMode = None
self.diseqcModeEntry = None
self.advancedSatsEntry = None
@@ -94,6 +95,11 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
self.advancedType = None
self.advancedManufacturer = None
self.advancedSCR = None
+
+ if self.nim.isMultiType():
+ multiType = self.nimConfig.multiType
+ self.multiType = getConfigListEntry(_("Tuner type"), multiType)
+ self.list.append(self.multiType)
if self.nim.isCompatible("DVB-S"):
self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode)
@@ -200,10 +206,17 @@ class NimSetup(Screen, ConfigListScreen, ServiceStopScreen):
self.advancedLnbsEntry, self.advancedDiseqcMode, self.advancedUsalsEntry, \
self.advancedLof, self.advancedPowerMeasurement, self.turningSpeed, \
self.advancedType, self.advancedSCR, self.advancedManufacturer, self.advancedUnicable, \
- self.uncommittedDiseqcCommand, self.cableScanType)
+ self.uncommittedDiseqcCommand, self.cableScanType, self.multiType)
+ if self["config"].getCurrent() == self.multiType:
+ from Components.NimManager import InitNimManager
+ InitNimManager(nimmanager)
+ self.nim = nimmanager.nim_slots[self.slotid]
+ self.nimConfig = self.nim.config
+
for x in checkList:
if self["config"].getCurrent() == x:
self.createSetup()
+ break
def run(self):
if self.have_advanced and self.nim.config_mode == "advanced":
@@ -482,7 +495,7 @@ class NimSelection(Screen):
"satposdepends": _("second cable of motorized LNB") } [nimConfig.configMode.value]
text += " " + _("Tuner") + " " + ["A", "B", "C", "D"][int(nimConfig.connectedTo.value)]
elif nimConfig.configMode.value == "nothing":
- text = _("nothing connected")
+ text = _("not configured")
elif nimConfig.configMode.value == "simple":
if nimConfig.diseqcMode.value in ("single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"):
text = {"single": _("Single"), "toneburst_a_b": _("Toneburst A/B"), "diseqc_a_b": _("DiSEqC A/B"), "diseqc_a_b_c_d": _("DiSEqC A/B/C/D")}[nimConfig.diseqcMode.value] + "\n"
@@ -519,6 +532,8 @@ class NimSelection(Screen):
text = _("nothing connected")
elif nimConfig.configMode.value == "enabled":
text = _("enabled")
+ if x.isMultiType():
+ text = _("Switchable tuner types:") + "(" + ','.join(x.getMultiTypeList().values()) + ")" + "\n" + text
self.list.append((slotid, x.friendly_full_description, text, x))
self["nimlist"].setList(self.list)
diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py
index 1dbc1505..f4828088 100644
--- a/lib/python/Screens/ScanSetup.py
+++ b/lib/python/Screens/ScanSetup.py
@@ -8,6 +8,7 @@ from Components.ConfigList import ConfigListScreen
from Components.NimManager import nimmanager, getConfigSatlist
from Components.Label import Label
from Tools.Directories import resolveFilename, SCOPE_DEFAULTPARTITIONMOUNTDIR, SCOPE_DEFAULTDIR, SCOPE_DEFAULTPARTITION
+from Tools.HardwareInfo import HardwareInfo
from Screens.MessageBox import MessageBox
from enigma import eTimer, eDVBFrontendParametersSatellite, eComponentScan, \
eDVBSatelliteEquipmentControl, eDVBFrontendParametersTerrestrial, \
@@ -113,6 +114,7 @@ class CableTransponderSearchSupport:
def cableTransponderSearchSessionClosed(self, *val):
print "cableTransponderSearchSessionClosed, val", val
+ self.resetTimeout()
self.cable_search_container.appClosed.remove(self.cableTransponderSearchClosed)
self.cable_search_container.dataAvail.remove(self.getCableTransponderData)
self.cable_search_container = None
@@ -160,6 +162,19 @@ class CableTransponderSearchSupport:
tmpstr += " kHz "
tmpstr += data[0]
self.cable_search_session["text"].setText(tmpstr)
+
+ def setTimeout(self):
+ try:
+ self.oldtimeoutvalue = open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "r").readline()
+ open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write("0")
+ except:
+ print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
+
+ def resetTimeout(self):
+ try:
+ open("/sys/module/dvb_core/parameters/dvb_shutdown_timeout", "w").write(self.oldtimeoutvalue)
+ except:
+ print "[info] no /sys/module/dvb_core/parameters/dvb_shutdown_timeout available"
def startCableTransponderSearch(self, nim_idx):
if not self.tryGetRawFrontend(nim_idx):
@@ -176,10 +191,17 @@ class CableTransponderSearchSupport:
self.cable_search_container.appClosed.append(self.cableTransponderSearchClosed)
self.cable_search_container.dataAvail.append(self.getCableTransponderData)
cableConfig = config.Nims[nim_idx].cable
- cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus "
+ tunername = nimmanager.getNimName(nim_idx)
+ if tunername == "CXD1981":
+ cmd = "cxd1978 --init --scan --verbose --wakeup --inv 2 --bus "
+ else:
+ cmd = "tda1002x --init --scan --verbose --wakeup --inv 2 --bus "
#FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000
if nim_idx < 2:
- cmd += str(nim_idx)
+ if HardwareInfo().get_device_name() == "dm500hd":
+ cmd += "2"
+ else:
+ cmd += str(nim_idx)
else:
if nim_idx == 2:
cmd += "2" # first nim socket on DM8000 use /dev/i2c/2
@@ -243,6 +265,7 @@ class CableTransponderSearchSupport:
self.cable_search_container.execute(cmd)
tmpstr = _("Try to find used transponders in cable network.. please wait...")
tmpstr += "\n\n..."
+ self.setTimeout()
self.cable_search_session = self.session.openWithCallback(self.cableTransponderSearchSessionClosed, MessageBox, tmpstr, MessageBox.TYPE_INFO)
class DefaultSatLists(DefaultWizard):
diff --git a/lib/python/Screens/ServiceScan.py b/lib/python/Screens/ServiceScan.py
index 6ee35b84..df427f99 100644
--- a/lib/python/Screens/ServiceScan.py
+++ b/lib/python/Screens/ServiceScan.py
@@ -36,7 +36,7 @@ class ServiceScan(Screen):
def cancel(self):
self.close()
-
+
def __init__(self, session, scanList):
Screen.__init__(self, session)
@@ -58,7 +58,7 @@ class ServiceScan(Screen):
"ok": self.ok,
"cancel": self.cancel
})
-
+
self.onFirstExecBegin.append(self.doServiceScan)
def doServiceScan(self):
diff --git a/lib/python/Screens/TaskView.py b/lib/python/Screens/TaskView.py
index eb926ca3..9907e2fb 100644
--- a/lib/python/Screens/TaskView.py
+++ b/lib/python/Screens/TaskView.py
@@ -7,7 +7,7 @@ import Screens.Standby
from Tools import Notifications
class JobView(InfoBarNotifications, Screen, ConfigListScreen):
- def __init__(self, session, job, parent=None, cancelable = True, backgroundable = True, afterEvent = 0):
+ def __init__(self, session, job, parent=None, cancelable = True, backgroundable = True):
from Components.Sources.StaticText import StaticText
from Components.Sources.Progress import Progress
from Components.Sources.Boolean import Boolean
@@ -43,19 +43,20 @@ class JobView(InfoBarNotifications, Screen, ConfigListScreen):
"ok": self.ok,
}, -2)
- self.afterevents = [ "nothing", "standby", "deepstandby", "close" ]
self.settings = ConfigSubsection()
if SystemInfo["DeepstandbySupport"]:
shutdownString = _("go to deep standby")
else:
shutdownString = _("shut down")
- self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", shutdownString)], default = self.afterevents[afterEvent])
+ self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", shutdownString)], default = self.job.afterEvent or "nothing")
+ self.job.afterEvent = self.settings.afterEvent.getValue()
self.setupList()
self.state_changed()
def setupList(self):
self["config"].setList( [ getConfigListEntry(_("After event"), self.settings.afterEvent) ])
-
+ self.job.afterEvent = self.settings.afterEvent.getValue()
+
def keyLeft(self):
ConfigListScreen.keyLeft(self)
self.setupList()
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index c35313f0..2ba7cb46 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -356,6 +356,8 @@ public:
sTagCRC,
sTagChannelMode,
+ sTransferBPS,
+
sUser = 0x100
};
enum {
@@ -594,6 +596,7 @@ class iTimeshiftService: public iObject
public:
virtual RESULT startTimeshift()=0;
virtual RESULT stopTimeshift(bool swToLive=true)=0;
+ virtual RESULT setNextPlaybackFile(const char *fn)=0; // not needed by our internal timeshift.. but external plugin...
virtual int isTimeshiftActive()=0;
/* this essentially seeks to the relative end of the timeshift buffer */
diff --git a/lib/service/listboxservice.cpp b/lib/service/listboxservice.cpp
index 05aaf731..cc8c32b5 100644
--- a/lib/service/listboxservice.cpp
+++ b/lib/service/listboxservice.cpp
@@ -526,7 +526,12 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
ePtr<iStaticServiceInformation> service_info;
m_service_center->info(*m_cursor, service_info);
eServiceReference ref = *m_cursor;
- bool isPlayable = !(ref.flags & eServiceReference::isDirectory || ref.flags & eServiceReference::isMarker);
+ bool isMarker = ref.flags & eServiceReference::isMarker;
+ bool isPlayable = !(ref.flags & eServiceReference::isDirectory || isMarker);
+ bool paintProgress = false;
+ ePtr<eServiceEvent> evt;
+
+ bool serviceAvail = true;
if (!marked && isPlayable && service_info && m_is_playable_ignore.valid() && !service_info->isPlayable(*m_cursor, m_is_playable_ignore))
{
@@ -534,12 +539,13 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
painter.setForegroundColor(m_color[serviceNotAvail]);
else
painter.setForegroundColor(gRGB(0xbbbbbb));
+ serviceAvail = false;
}
if (selected && local_style && local_style->m_selection)
painter.blit(local_style->m_selection, offset, eRect(), gPainter::BT_ALPHATEST);
- int xoffset=0; // used as offset when painting the folder/marker symbol
+ int xoffset=0; // used as offset when painting the folder/marker symbol or the serviceevent progress
for (int e = 0; e < celElements; ++e)
{
@@ -583,13 +589,19 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
}
case celServiceInfo:
{
- ePtr<eServiceEvent> evt;
- if ( isPlayable && service_info && !service_info->getEvent(*m_cursor, evt) )
+ if ( isPlayable && !service_info->getEvent(*m_cursor, evt) )
{
std::string name = evt->getEventName();
if (!name.length())
continue;
text = '(' + evt->getEventName() + ')';
+ if (serviceAvail)
+ {
+ if (!selected && m_color_set[serviceDescriptionColor])
+ painter.setForegroundColor(m_color[serviceDescriptionColor]);
+ else if (selected && m_color_set[serviceDescriptionColorSelected])
+ painter.setForegroundColor(m_color[serviceDescriptionColorSelected]);
+ }
}
else
continue;
@@ -608,9 +620,9 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
{
eRect bbox = para->getBoundBox();
int name_width = bbox.width()+8;
- m_element_position[celServiceInfo].setLeft(area.left()+name_width);
+ m_element_position[celServiceInfo].setLeft(area.left()+name_width+xoffs);
m_element_position[celServiceInfo].setTop(area.top());
- m_element_position[celServiceInfo].setWidth(area.width()-name_width);
+ m_element_position[celServiceInfo].setWidth(area.width()-(name_width+xoffs));
m_element_position[celServiceInfo].setHeight(area.height());
}
@@ -678,12 +690,62 @@ void eListboxServiceContent::paint(gPainter &painter, eWindowStyle &style, const
painter.clippop();
}
}
+ else if (e == celServiceEventProgressbar)
+ {
+ eRect area = m_element_position[celServiceEventProgressbar];
+ if (area.width() > 0 && (isPlayable || isMarker))
+ {
+ // we schedule it to paint it as last element.. so we dont need to reset fore/background color
+ paintProgress = isPlayable;
+ xoffset = area.width() + 10;
+ }
+ }
}
-
if (selected && (!local_style || !local_style->m_selection))
style.drawFrame(painter, eRect(offset, m_itemsize), eWindowStyle::frameListboxEntry);
+ if (paintProgress && evt)
+ {
+ eRect area = m_element_position[celServiceEventProgressbar];
+ if (!selected && m_color_set[serviceEventProgressbarBorderColor])
+ painter.setForegroundColor(m_color[serviceEventProgressbarBorderColor]);
+ else if (selected && m_color_set[serviceEventProgressbarBorderColorSelected])
+ painter.setForegroundColor(m_color[serviceEventProgressbarBorderColorSelected]);
+
+ int border = 1;
+ int progressH = 6;
+ int progressX = area.left() + offset.x();
+ int progressW = area.width() - 2 * border;
+ int progressT = offset.y() + (m_itemsize.height() - progressH - 2*border) / 2;
+
+ // paint progressbar frame
+ painter.fill(eRect(progressX, progressT, area.width(), border));
+ painter.fill(eRect(progressX, progressT + border, border, progressH));
+ painter.fill(eRect(progressX, progressT + progressH + border, area.width(), border));
+ painter.fill(eRect(progressX + area.width() - border, progressT + border, border, progressH));
+
+ // calculate value
+ time_t now = time(0);
+ int value = progressW * (now - evt->getBeginTime()) / evt->getDuration();
+
+ eRect tmp = eRect(progressX + border, progressT + border, value, progressH);
+ ePtr<gPixmap> &pixmap = m_pixmaps[picServiceEventProgressbar];
+ if (pixmap)
+ {
+ area.moveBy(offset);
+ painter.clip(area);
+ painter.blit(pixmap, ePoint(progressX + border, progressT + border), tmp, gPainter::BT_ALPHATEST);
+ painter.clippop();
+ }
+ else
+ {
+ if (!selected && m_color_set[serviceEventProgressbarColor])
+ painter.setForegroundColor(m_color[serviceEventProgressbarColor]);
+ else if (selected && m_color_set[serviceEventProgressbarColorSelected])
+ painter.setForegroundColor(m_color[serviceEventProgressbarColorSelected]);
+ painter.fill(tmp);
+ }
+ }
}
-
painter.clippop();
}
diff --git a/lib/service/listboxservice.h b/lib/service/listboxservice.h
index 5228a2f2..589afba6 100644
--- a/lib/service/listboxservice.h
+++ b/lib/service/listboxservice.h
@@ -49,6 +49,7 @@ public:
celServiceNumber,
celMarkerPixmap,
celFolderPixmap,
+ celServiceEventProgressbar,
celServiceName,
celServiceTypePixmap,
celServiceInfo, // "now" event
@@ -62,6 +63,7 @@ public:
picServiceGroup,
picFolder,
picMarker,
+ picServiceEventProgressbar,
picElements
};
@@ -84,6 +86,12 @@ public:
markedBackground,
markedBackgroundSelected,
serviceNotAvail,
+ serviceEventProgressbarColor,
+ serviceEventProgressbarColorSelected,
+ serviceEventProgressbarBorderColor,
+ serviceEventProgressbarBorderColorSelected,
+ serviceDescriptionColor,
+ serviceDescriptionColorSelected,
colorElements
};
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 558bf0c2..e498dd42 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -910,7 +910,7 @@ RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServ
return 0;
}
-eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service):
+eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service):
m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0)
{
m_is_primary = 1;
@@ -1021,12 +1021,13 @@ void eDVBServicePlay::serviceEvent(int event)
updateTimeshiftPids();
if (!m_timeshift_active)
updateDecoder();
- if (m_first_program_info && m_is_pvr)
+ if (m_first_program_info & 1 && m_is_pvr)
{
- m_first_program_info = 0;
+ m_first_program_info &= ~1;
seekTo(0);
}
- m_event((iPlayableService*)this, evUpdatedInfo);
+ if (!m_timeshift_active)
+ m_event((iPlayableService*)this, evUpdatedInfo);
break;
}
case eDVBServicePMTHandler::eventPreStart:
@@ -1046,17 +1047,85 @@ void eDVBServicePlay::serviceEventTimeshift(int event)
switch (event)
{
case eDVBServicePMTHandler::eventNewProgramInfo:
+ eDebug("eventNewProgramInfo TS");
if (m_timeshift_active)
+ {
updateDecoder();
+ if (m_first_program_info & 2)
+ {
+ if (m_slowmotion)
+ {
+ eDebug("re-apply slowmotion after timeshift file change");
+ m_decoder->setSlowMotion(m_slowmotion);
+ }
+ if (m_fastforward)
+ {
+ eDebug("re-apply skip %d, ratio %d after timeshift file change", m_skipmode, m_fastforward);
+ if (m_skipmode)
+ m_cue->setSkipmode(m_skipmode * 90000); /* convert to 90000 per second */
+ if (m_fastforward != 1)
+ m_decoder->setFastForward(m_fastforward);
+ else
+ m_decoder->setTrickmode();
+ }
+ else
+ seekTo(0);
+ m_first_program_info &= ~2;
+ }
+ m_event((iPlayableService*)this, evUpdatedInfo);
+ }
break;
case eDVBServicePMTHandler::eventSOF:
- m_event((iPlayableService*)this, evSOF);
+#if 0
+ if (!m_timeshift_file_next.empty())
+ {
+ eDebug("timeshift SOF, switch to next file");
+ m_decoder->pause();
+
+ m_first_program_info |= 2;
+
+ eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference;
+ r.path = m_timeshift_file_next;
+
+ /* free the timeshift service handler, we need the resources */
+ m_service_handler_timeshift.free();
+ resetTimeshift(1);
+
+ if (m_skipmode < 0)
+ m_cue->seekTo(0, -1000);
+ m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
+
+ m_event((iPlayableService*)this, evUser+1);
+ }
+ else
+#endif
+ m_event((iPlayableService*)this, evSOF);
break;
case eDVBServicePMTHandler::eventEOF:
if ((!m_is_paused) && (m_skipmode >= 0))
{
- eDebug("timeshift EOF, so let's go live");
- switchToLive();
+ if (m_timeshift_file_next.empty())
+ {
+ eDebug("timeshift EOF, so let's go live");
+ switchToLive();
+ }
+ else
+ {
+ eDebug("timeshift EOF, switch to next file");
+
+ m_first_program_info |= 2;
+
+ eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference;
+ r.path = m_timeshift_file_next;
+
+ /* free the timeshift service handler, we need the resources */
+ m_service_handler_timeshift.free();
+ resetTimeshift(1);
+
+ m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
+
+ m_event((iPlayableService*)this, evUser+1);
+ }
}
break;
}
@@ -2240,38 +2309,32 @@ void eDVBServicePlay::updateTimeshiftPids()
}
}
+RESULT eDVBServicePlay::setNextPlaybackFile(const char *f)
+{
+ m_timeshift_file_next = f;
+ return 0;
+}
+
void eDVBServicePlay::switchToLive()
{
if (!m_timeshift_active)
return;
-
+
eDebug("SwitchToLive");
-
- m_cue = 0;
- m_decoder = 0;
- m_decode_demux = 0;
- m_teletext_parser = 0;
- m_rds_decoder = 0;
- m_subtitle_parser = 0;
- m_new_dvb_subtitle_page_connection = 0;
- m_new_subtitle_page_connection = 0;
- m_rds_decoder_event_connection = 0;
- m_video_event_connection = 0;
+
+ resetTimeshift(0);
+
m_is_paused = m_skipmode = m_fastforward = m_slowmotion = 0; /* not supported in live mode */
- /* free the timeshift service handler, we need the resources */
+ /* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
- m_timeshift_active = 0;
- m_timeshift_changed = 1;
updateDecoder(true);
}
-void eDVBServicePlay::switchToTimeshift()
+void eDVBServicePlay::resetTimeshift(int start)
{
- if (m_timeshift_active)
- return;
-
+ m_cue = 0;
m_decode_demux = 0;
m_decoder = 0;
m_teletext_parser = 0;
@@ -2281,14 +2344,28 @@ void eDVBServicePlay::switchToTimeshift()
m_new_dvb_subtitle_page_connection = 0;
m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
-
- m_timeshift_active = 1;
m_timeshift_changed = 1;
+ m_timeshift_file_next.clear();
+
+ if (start)
+ {
+ m_cue = new eCueSheet();
+ m_timeshift_active = 1;
+ }
+ else
+ m_timeshift_active = 0;
+}
+
+void eDVBServicePlay::switchToTimeshift()
+{
+ if (m_timeshift_active)
+ return;
+
+ resetTimeshift(1);
eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference;
r.path = m_timeshift_file;
- m_cue = new eCueSheet();
m_cue->seekTo(0, -1000);
m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
@@ -2351,8 +2428,6 @@ void eDVBServicePlay::updateDecoder(bool sendSeekableStateChanged)
if (!m_decoder)
{
h.getDecodeDemux(m_decode_demux);
- if (m_timeshift_changed)
- m_decoder = 0;
if (m_decode_demux)
{
m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary);
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index 1262836e..dafaf35d 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -162,6 +162,7 @@ public:
RESULT stopTimeshift(bool swToLive=true);
int isTimeshiftActive();
RESULT activateTimeshift();
+ RESULT setNextPlaybackFile(const char *fn);
// iCueSheet
PyObject *getCutList();
@@ -213,9 +214,8 @@ private:
int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active, m_timeshift_changed;
int m_first_program_info;
- std::string m_timeshift_file;
+ std::string m_timeshift_file, m_timeshift_file_next;
int m_timeshift_fd;
-
ePtr<iDVBDemux> m_decode_demux;
int m_current_audio_stream;
@@ -228,8 +228,10 @@ private:
void updateTimeshiftPids();
void switchToLive();
+
+ void resetTimeshift(int start);
void switchToTimeshift();
-
+
void updateDecoder(bool sendSeekableStateChanged=false);
int m_skipmode;
diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
index 2c84f7be..0b2ac9d4 100644
--- a/lib/service/servicemp3.cpp
+++ b/lib/service/servicemp3.cpp
@@ -46,6 +46,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
extensions.push_back("mp4");
extensions.push_back("mov");
extensions.push_back("m4a");
+ extensions.push_back("m2ts");
sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
}
@@ -302,11 +303,11 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
if ( ret == -1 ) // this is a "REAL" VCD
uri = g_strdup_printf ("vcd://");
else
- uri = g_strdup_printf ("file://%s", filename);
+ uri = g_filename_to_uri(filename, NULL, NULL);
}
else
- uri = g_strdup_printf ("file://%s", filename);
+ uri = g_filename_to_uri(filename, NULL, NULL);
eDebug("eServiceMP3::playbin2 uri=%s", uri);
@@ -340,9 +341,8 @@ eServiceMP3::eServiceMP3(eServiceReference ref)
struct stat buffer;
if (stat(srt_filename, &buffer) == 0)
{
- std::string suburi = "file://" + (std::string)srt_filename;
- eDebug("eServiceMP3::subtitle uri: %s",suburi.c_str());
- g_object_set (G_OBJECT (m_gst_playbin), "suburi", suburi.c_str(), NULL);
+ eDebug("eServiceMP3::subtitle uri: %s", g_filename_to_uri(srt_filename, NULL, NULL));
+ g_object_set (G_OBJECT (m_gst_playbin), "suburi", g_filename_to_uri(srt_filename, NULL, NULL), NULL);
subtitleStream subs;
subs.type = stSRT;
subs.language_code = std::string("und");