aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>2006-03-23 00:06:27 +0000
committerStefan Pluecken <stefan.pluecken@multimedia-labs.de>2006-03-23 00:06:27 +0000
commit08fca93e7f2a37a452399d08c5c84b969b7e52af (patch)
treee947a919972cdd6ad072c196640a643c6c9f7fff /lib
parent371447724a1e150c37a777e58a4725a3d2561c01 (diff)
downloadenigma2-08fca93e7f2a37a452399d08c5c84b969b7e52af.tar.gz
enigma2-08fca93e7f2a37a452399d08c5c84b969b7e52af.zip
- switchtimer added to RecordingTimer
- media player to play mp3, ogg (not yet fully working) and ts files (needs gstreamer) - language selection saves a language string instead of a changing index number
Diffstat (limited to 'lib')
-rw-r--r--lib/python/Components/FileList.py81
-rw-r--r--lib/python/Components/Language.py17
-rw-r--r--lib/python/Components/LanguageList.py4
-rw-r--r--lib/python/Components/Makefile.am2
-rw-r--r--lib/python/Components/MediaPlayer.py124
-rw-r--r--lib/python/Components/MenuList.py20
-rw-r--r--lib/python/Components/SetupDevices.py2
-rw-r--r--lib/python/Components/TimerList.py15
-rw-r--r--lib/python/Plugins/Extensions/FileManager/plugin.py10
-rw-r--r--lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py3
-rw-r--r--lib/python/Screens/InfoBarGenerics.py2
-rw-r--r--lib/python/Screens/LanguageSelection.py24
-rw-r--r--lib/python/Screens/Makefile.am3
-rw-r--r--lib/python/Screens/MediaPlayer.py316
-rw-r--r--lib/python/Screens/StartWizard.py5
-rw-r--r--lib/python/Screens/TimerEntry.py21
-rw-r--r--lib/python/Tools/Directories.py2
-rw-r--r--lib/service/servicefs.cpp2
18 files changed, 598 insertions, 55 deletions
diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py
index 7e6ced57..d726b833 100644
--- a/lib/python/Components/FileList.py
+++ b/lib/python/Components/FileList.py
@@ -20,6 +20,7 @@ RT_VALIGN_BOTTOM = 16
EXTENSIONS = {
"mp3": "music",
"wav": "music",
+ "ogg": "music",
"jpg": "picture",
"jpeg": "picture",
"png": "picture",
@@ -29,9 +30,9 @@ EXTENSIONS = {
"mpeg": "movie",
}
-def FileEntryComponent(name, absolute, isDir = False):
+def FileEntryComponent(name, absolute = None, isDir = False):
res = [ (absolute, isDir) ]
- res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, RT_HALIGN_LEFT ,name))
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, RT_HALIGN_LEFT, name))
if isDir:
png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
else:
@@ -39,18 +40,22 @@ def FileEntryComponent(name, absolute, isDir = False):
extension = extension[-1]
if EXTENSIONS.has_key(extension):
png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
+ else:
+ png = None
if png is not None:
res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))
return res
class FileList(HTMLComponent, GUIComponent, MenuList):
- def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None):
+ def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None, useServiceRef = False, isTop = False):
GUIComponent.__init__(self)
self.l = eListboxPythonMultiContent()
-
+
+ self.useServiceRef = useServiceRef
self.showDirectories = showDirectories
self.showFiles = showFiles
+ self.isTop = isTop
# example: matching .nfi and .ts files: "^.*\.(nfi|ts)"
self.matchingPattern = matchingPattern
self.changeDir(directory)
@@ -60,35 +65,75 @@ class FileList(HTMLComponent, GUIComponent, MenuList):
def getSelection(self):
return self.l.getCurrentSelection()[0]
+ def getFileList(self):
+ return self.list
+
def changeDir(self, directory):
self.list = []
- files = os.listdir(directory)
- files.sort()
+ directories = []
+ files = []
- if directory != "/" and self.showDirectories:
- self.list.append(FileEntryComponent(name = "..", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
+ if self.useServiceRef:
+ root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)
+ serviceHandler = eServiceCenter.getInstance()
+ list = serviceHandler.list(root)
- directories = []
- for x in files:
- if os.path.isdir(directory + x):
- directories.append(x)
- files.remove(x)
+ while 1:
+ s = list.getNext()
+ if not s.valid():
+ del list
+ break
+ if s.flags & s.mustDescent:
+ directories.append(s.getPath())
+ else:
+ files.append(s)
+ print s.getName(), s.flags
+ else:
+ files = os.listdir(directory)
+ files.sort()
+ tmpfiles = files[:]
+ for x in tmpfiles:
+ if os.path.isdir(directory + x):
+ directories.append(x)
+ files.remove(x)
+
+ if directory != "/" and self.showDirectories and not self.isTop:
+ self.list.append(FileEntryComponent(name = "..", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
if self.showDirectories:
for x in directories:
- self.list.append(FileEntryComponent(name = x, absolute = directory + x + "/" , isDir = True))
+ name = x.split('/')[-2]
+ self.list.append(FileEntryComponent(name = name, absolute = x, isDir = True))
-
if self.showFiles:
for x in files:
+ if self.useServiceRef:
+ path = x.getPath()
+ name = path.split('/')[-1]
+ else:
+ path = directory + x
+ name = x
+
if self.matchingPattern is not None:
- if re.compile(self.matchingPattern).search(x):
- self.list.append(FileEntryComponent(name = x, absolute = directory + x , isDir = False))
+ if re.compile(self.matchingPattern).search(path):
+ self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
else:
- self.list.append(FileEntryComponent(name = x, absolute = directory + x , isDir = False))
+ self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
self.l.setList(self.list)
+
+ def canDescent(self):
+ return self.getSelection()[1]
+
+ def descent(self):
+ self.changeDir(self.getSelection()[0])
+
+ def getFilename(self):
+ return self.getSelection()[0].getPath()
+
+ def getServiceRef(self):
+ return self.getSelection()[0]
def GUIcreate(self, parent):
self.instance = eListbox(parent)
diff --git a/lib/python/Components/Language.py b/lib/python/Components/Language.py
index 51ee9142..fd37e167 100644
--- a/lib/python/Components/Language.py
+++ b/lib/python/Components/Language.py
@@ -7,7 +7,7 @@ class Language:
def __init__(self):
gettext.install('enigma2', resolveFilename(SCOPE_LANGUAGE, ""), unicode=0, codeset="utf-8")
self.activeLanguage = 0
- self.lang = []
+ self.lang = {}
# FIXME make list dynamically
# name, iso-639 language, iso-3166 country. Please don't mix language&country!
self.addLanguage(_("English"), "en", "EN")
@@ -20,10 +20,10 @@ class Language:
self.callbacks = []
def addLanguage(self, name, lang, country):
- try:
- self.lang.append((_(name), gettext.translation('enigma2', resolveFilename(SCOPE_LANGUAGE, ""), languages=[lang]), lang, country))
- except:
- print "Language " + str(name) + " not found"
+ #try:
+ self.lang[str(lang + "_" + country)] = ((_(name), gettext.translation('enigma2', resolveFilename(SCOPE_LANGUAGE, ""), languages=[lang]), lang, country))
+ #except:
+ # print "Language " + str(name) + " not found"
def activateLanguage(self, index):
try:
@@ -37,10 +37,13 @@ class Language:
def getLanguageList(self):
list = []
- for x in self.lang:
- list.append(x[0])
+ for x in self.lang.keys():
+ list.append((x, self.lang[x]))
return list
+ def getActiveLanguage(self):
+ return self.activeLanguage
+
def getLanguage(self):
return str(self.lang[self.activeLanguage][2]) + "_" + str(self.lang[self.activeLanguage][3])
diff --git a/lib/python/Components/LanguageList.py b/lib/python/Components/LanguageList.py
index 08bb6307..adf87186 100644
--- a/lib/python/Components/LanguageList.py
+++ b/lib/python/Components/LanguageList.py
@@ -16,8 +16,8 @@ RT_VALIGN_TOP = 0
RT_VALIGN_CENTER = 8
RT_VALIGN_BOTTOM = 16
-def LanguageEntryComponent(file, name):
- res = [ 0 ]
+def LanguageEntryComponent(file, name, index):
+ res = [ index ]
res.append((eListboxPythonMultiContent.TYPE_TEXT, 80, 10, 200, 50, 0, RT_HALIGN_LEFT ,name))
png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "countries/" + file + ".png"))
if png == None:
diff --git a/lib/python/Components/Makefile.am b/lib/python/Components/Makefile.am
index a41c210f..94a8c06c 100644
--- a/lib/python/Components/Makefile.am
+++ b/lib/python/Components/Makefile.am
@@ -13,6 +13,6 @@ install_PYTHON = \
BlinkingPixmap.py Pixmap.py ConditionalWidget.py Slider.py LanguageList.py \
PluginList.py PluginComponent.py RecordingConfig.py About.py UsageConfig.py \
FIFOList.py ServiceEventTracker.py Input.py TimerSanityCheck.py FileList.py \
- MultiContent.py
+ MultiContent.py MediaPlayer.py
diff --git a/lib/python/Components/MediaPlayer.py b/lib/python/Components/MediaPlayer.py
new file mode 100644
index 00000000..b6b2e432
--- /dev/null
+++ b/lib/python/Components/MediaPlayer.py
@@ -0,0 +1,124 @@
+from HTMLComponent import *
+from GUIComponent import *
+
+from MenuList import MenuList
+
+from Tools.Directories import *
+import os
+
+from enigma import *
+
+RT_HALIGN_LEFT = 0
+RT_HALIGN_RIGHT = 1
+RT_HALIGN_CENTER = 2
+RT_HALIGN_BLOCK = 4
+
+RT_VALIGN_TOP = 0
+RT_VALIGN_CENTER = 8
+RT_VALIGN_BOTTOM = 16
+
+STATE_PLAY = 0
+STATE_PAUSE = 1
+STATE_STOP = 2
+STATE_REWIND = 3
+STATE_FORWARD = 4
+STATE_NONE = 5
+
+PlayIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "play-small-fs8.png"))
+PauseIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "pause-small-fs8.png"))
+StopIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "stop-small-fs8.png"))
+RewindIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rewind-small-fs8.png"))
+ForwardIcon = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "forward-small-fs8.png"))
+
+def PlaylistEntryComponent(serviceref, state):
+ res = [ serviceref ]
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 0, 250, 32, 0, RT_VALIGN_CENTER, os.path.split(serviceref.getPath().split('/')[-1])[1]))
+ png = None
+ if state == STATE_PLAY:
+ png = PlayIcon
+ elif state == STATE_PAUSE:
+ png = PauseIcon
+ elif state == STATE_STOP:
+ png = StopIcon
+ elif state == STATE_REWIND:
+ png = RewindIcon
+ elif state == STATE_FORWARD:
+ png = ForwardIcon
+
+ if png is not None:
+ res.append((eListboxPythonMultiContent.TYPE_PIXMAP, 0, 0, 33, 32, png))
+
+ return res
+
+class PlayList(HTMLComponent, GUIComponent, MenuList):
+ def __init__(self):
+ GUIComponent.__init__(self)
+ self.l = eListboxPythonMultiContent()
+ self.list = []
+ self.l.setList(self.list)
+ self.l.setFont(0, gFont("Regular", 18))
+ self.currPlaying = 0
+ self.oldCurrPlaying = -1
+
+ def clear(self):
+ self.list = []
+ self.l.setList(self.list)
+
+ def GUIcreate(self, parent):
+ self.instance = eListbox(parent)
+ self.instance.setContent(self.l)
+ self.instance.setItemHeight(32)
+
+ def getSelection(self):
+ return self.l.getCurrentSelection()[0]
+
+ def getSelectionIndex(self):
+ return self.l.getCurrentSelectionIndex()
+
+ def addFile(self, serviceref):
+ self.list.append(PlaylistEntryComponent(serviceref, STATE_NONE))
+
+ def deleteFile(self, index):
+ if self.currPlaying > index:
+ self.currPlaying -= 1
+ self.list = self.list[:index] + self.list[index + 1:]
+
+ def setCurrentPlaying(self, index):
+ self.oldCurrPlaying = self.currPlaying
+ self.currPlaying = index
+
+ def updateState(self, state):
+ if len(self.list) > self.oldCurrPlaying and self.oldCurrPlaying != -1:
+ self.list[self.oldCurrPlaying] = PlaylistEntryComponent(self.list[self.oldCurrPlaying][0], STATE_NONE)
+ self.list[self.currPlaying] = PlaylistEntryComponent(self.list[self.currPlaying][0], state)
+ self.updateList()
+
+ def playFile(self):
+ self.updateState(STATE_PLAY)
+
+ def pauseFile(self):
+ self.updateState(STATE_PAUSE)
+
+ def stopFile(self):
+ self.updateState(STATE_STOP)
+
+ def rewindFile(self):
+ self.updateState(STATE_REWIND)
+
+ def forwardFile(self):
+ self.updateState(STATE_FORWARD)
+
+ def updateList(self):
+ self.l.setList(self.list)
+
+ def getCurrentIndex(self):
+ return self.currPlaying
+
+ def getServiceRefList(self):
+ list = []
+ for x in self.list:
+ list.append(x[0])
+ return list
+
+ def __len__(self):
+ return len(self.list) \ No newline at end of file
diff --git a/lib/python/Components/MenuList.py b/lib/python/Components/MenuList.py
index b12cb236..0e337198 100644
--- a/lib/python/Components/MenuList.py
+++ b/lib/python/Components/MenuList.py
@@ -33,3 +33,23 @@ class MenuList(HTMLComponent, GUIComponent):
def moveToIndex(self, idx):
self.instance.moveSelectionTo(idx)
+
+ def pageUp(self):
+ if self.instance is not None:
+ self.instance.moveSelection(self.instance.pageUp)
+
+ def pageDown(self):
+ if self.instance is not None:
+ self.instance.moveSelection(self.instance.pageDown)
+
+ def up(self):
+ if self.instance is not None:
+ self.instance.moveSelection(self.instance.moveUp)
+
+ def down(self):
+ if self.instance is not None:
+ self.instance.moveSelection(self.instance.moveDown)
+
+ def selectionEnabled(self, enabled):
+ if self.instance is not None:
+ self.instance.setSelectionEnable(enabled) \ No newline at end of file
diff --git a/lib/python/Components/SetupDevices.py b/lib/python/Components/SetupDevices.py
index 3398af71..9036fa63 100644
--- a/lib/python/Components/SetupDevices.py
+++ b/lib/python/Components/SetupDevices.py
@@ -31,7 +31,7 @@ def InitSetupDevices():
def languageNotifier(configElement):
language.activateLanguage(configElement.value)
- config.osd.language = configElement("config.osd.language", configSelection, 0, language.getLanguageList() );
+ config.osd.language = configElement("config.osd.language", configText, "en_EN", 0);
config.osd.language.addNotifier(languageNotifier)
config.parental = ConfigSubsection();
diff --git a/lib/python/Components/TimerList.py b/lib/python/Components/TimerList.py
index 5e371a04..645c32ba 100644
--- a/lib/python/Components/TimerList.py
+++ b/lib/python/Components/TimerList.py
@@ -42,9 +42,15 @@ def TimerEntryComponent(timer, processed):
repeatedtext += days[x]
count += 1
flags = flags >> 1
- res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (" %s ... %s" % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1]))))
+ if timer.justplay:
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ((" %s "+ _("(ZAP)")) % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1]))))
+ else:
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (" %s ... %s" % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1]))))
else:
- res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ("%s, %s ... %s" % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:]))))
+ if timer.justplay:
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + (("%s, %s " + _("(ZAP)")) % (FuzzyTime(timer.begin)))))
+ else:
+ res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 50, 400, 20, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, repeatedtext + ("%s, %s ... %s" % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:]))))
if not processed:
if timer.state == TimerEntry.StateWaiting:
@@ -52,7 +58,10 @@ def TimerEntryComponent(timer, processed):
elif timer.state == TimerEntry.StatePrepared:
state = _("about to start")
elif timer.state == TimerEntry.StateRunning:
- state = _("recording...")
+ if timer.justplay:
+ state = _("zapped")
+ else:
+ state = _("recording...")
else:
state = _("<unknown>")
else:
diff --git a/lib/python/Plugins/Extensions/FileManager/plugin.py b/lib/python/Plugins/Extensions/FileManager/plugin.py
index a17e631c..e9dccbd6 100644
--- a/lib/python/Plugins/Extensions/FileManager/plugin.py
+++ b/lib/python/Plugins/Extensions/FileManager/plugin.py
@@ -22,7 +22,7 @@ class FileManager(Screen):
self.skin = FileManager.skin
Screen.__init__(self, session)
- self["list"] = FileList("/", matchingPattern = "^.*\.(png|avi|mp3|mpeg|ts)")
+ self["list"] = FileList("/", matchingPattern = "^.*\.(png|avi|mp3|mpeg|ts)", useServiceRef = True)
self["pixmap"] = Pixmap()
#self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
@@ -52,11 +52,11 @@ class FileManager(Screen):
self["text"].right()
def ok(self):
- selection = self["list"].getSelection()
- if selection[1] == True: # isDir
- self["list"].changeDir(selection[0])
+
+ if self["list"].canDescent(): # isDir
+ self["list"].descent()
else:
- self["pixmap"].instance.setPixmapFromFile(selection[0])
+ self["pixmap"].instance.setPixmapFromFile(self["list"].getSelection())
def keyNumberGlobal(self, number):
print "pressed", number
diff --git a/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py b/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py
index 7dc04d10..6dcdfee3 100644
--- a/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py
+++ b/lib/python/Plugins/Extensions/ZappingAlternatives/plugin.py
@@ -278,7 +278,8 @@ servicechanged = None
def playService(self, ref):
#print "--------------------Alternatives: trying to play service", str(ServiceReference(ref))
- servicechanged.lastPlayAction = str(ServiceReference(ref))
+ if ref is not None:
+ servicechanged.lastPlayAction = str(ServiceReference(ref))
servicechanged.nextPlayTry = 0
result = oldPlayService(ref)
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 8006520f..58321ac6 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -668,7 +668,7 @@ class InfoBarSeek:
self.checkSkipShowHideLock()
return True
-
+
def pauseService(self):
if self.seekstate == self.SEEK_STATE_PAUSE:
print "pause, but in fact unpause"
diff --git a/lib/python/Screens/LanguageSelection.py b/lib/python/Screens/LanguageSelection.py
index 6b18121f..1d2fd787 100644
--- a/lib/python/Screens/LanguageSelection.py
+++ b/lib/python/Screens/LanguageSelection.py
@@ -27,26 +27,34 @@ class LanguageSelection(Screen):
}, -1)
def selectActiveLanguage(self):
- self["list"].instance.moveSelectionTo(language.activeLanguage)
+ activeLanguage = language.getActiveLanguage()
+ pos = 0
+ for x in self.list:
+ if x[0] == activeLanguage:
+ self["list"].instance.moveSelectionTo(pos)
+ break
+ pos += 1
def save(self):
self.run()
self.close()
def run(self):
- language.activateLanguage(self["list"].l.getCurrentSelectionIndex())
- config.osd.language.value = self["list"].l.getCurrentSelectionIndex()
+ language.activateLanguage(self["list"].l.getCurrentSelection()[0])
+ config.osd.language.value = self["list"].l.getCurrentSelection()[0]
config.osd.language.save()
+ config.misc.languageselected.value = 0
+ config.misc.languageselected.save()
self.setTitle(_("Language selection"))
def updateList(self):
self.list = []
- if len(language.lang) == 0: # no language available => display only english
- self.list.append(LanguageEntryComponent("en", _("English")))
+ if len(language.getLanguageList()) == 0: # no language available => display only english
+ self.list.append(LanguageEntryComponent("en", _("English"), "en_EN"))
else:
- for x in language.lang:
- self.list.append(LanguageEntryComponent(x[3].lower(), _(x[0])))
-
+ for x in language.getLanguageList():
+ self.list.append(LanguageEntryComponent(file = x[1][3].lower(), name = _(x[1][0]), index = x[0]))
+ self.list.sort(key=lambda x: x[1][7])
self["list"].l.setList(self.list)
def up(self):
diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am
index 7a30e88a..ea314e24 100644
--- a/lib/python/Screens/Makefile.am
+++ b/lib/python/Screens/Makefile.am
@@ -9,4 +9,5 @@ install_PYTHON = \
AudioSelection.py InfoBarGenerics.py HelpMenu.py Wizard.py __init__.py \
Dish.py SubserviceSelection.py LanguageSelection.py StartWizard.py \
TutorialWizard.py PluginBrowser.py MinuteInput.py Scart.py PVRState.py \
- Console.py InputBox.py ChoiceBox.py SimpleSummary.py ImageWizard.py
+ Console.py InputBox.py ChoiceBox.py SimpleSummary.py ImageWizard.py \
+ MediaPlayer.py
diff --git a/lib/python/Screens/MediaPlayer.py b/lib/python/Screens/MediaPlayer.py
new file mode 100644
index 00000000..95ff16aa
--- /dev/null
+++ b/lib/python/Screens/MediaPlayer.py
@@ -0,0 +1,316 @@
+from enigma import eTimer, iPlayableService, eServiceCenter, iServiceInformation, eSize
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+from Components.ActionMap import NumberActionMap
+from Components.Label import Label
+from Components.Input import Input
+from Components.GUIComponent import *
+from Components.Pixmap import Pixmap
+from Components.Label import Label
+from Components.FileList import FileEntryComponent, FileList
+from Components.MediaPlayer import PlayList, PlaylistEntryComponent
+from Plugins.Plugin import PluginDescriptor
+from Tools.Directories import resolveFilename, SCOPE_MEDIA
+from Components.ServicePosition import ServicePositionGauge
+from Screens.ChoiceBox import ChoiceBox
+from Components.ServiceEventTracker import ServiceEventTracker
+from Screens.InfoBarGenerics import InfoBarSeek
+
+import os
+
+class MediaPlayer(Screen, InfoBarSeek):
+ def __init__(self, session, args = None):
+ Screen.__init__(self, session)
+ self.session.nav.stopService()
+
+ self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "^.*\.(mp3|ogg|ts|avi)", useServiceRef = True)
+ self["filelist"] = self.filelist
+
+ self.playlist = PlayList()
+ self["playlist"] = self.playlist
+
+ self["PositionGauge"] = ServicePositionGauge(self.session.nav)
+
+ self["currenttext"] = Label("")
+
+ self["artisttext"] = Label(_("Artist:"))
+ self["artist"] = Label("")
+ self["titletext"] = Label(_("Title:"))
+ self["title"] = Label("")
+ self["albumtext"] = Label(_("Album:"))
+ self["album"] = Label("")
+ self["yeartext"] = Label(_("Year:"))
+ self["year"] = Label("")
+ self["genretext"] = Label(_("Genre:"))
+ self["genre"] = Label("")
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+# iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
+# iPlayableService.evStart: self.__serviceStarted,
+
+ iPlayableService.evEOF: self.__evEOF,
+# iPlayableService.evSOF: self.__evSOF,
+ })
+
+
+ #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
+
+ self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"],
+ {
+ "ok": self.ok,
+ "cancel": self.close,
+
+ "right": self.rightDown,
+ "rightRepeated": self.doNothing,
+ "rightUp": self.rightUp,
+ "left": self.leftDown,
+ "leftRepeated": self.doNothing,
+ "leftUp": self.leftUp,
+
+ "up": self.up,
+ "upRepeated": self.up,
+ "down": self.down,
+ "downRepeated": self.down,
+
+ "play": self.playEntry,
+ "pause": self.pauseEntry,
+ "stop": self.stopEntry,
+
+ "previous": self.previousEntry,
+ "next": self.nextEntry,
+
+ "menu": self.showMenu,
+
+ "1": self.keyNumberGlobal,
+ "2": self.keyNumberGlobal,
+ "3": self.keyNumberGlobal,
+ "4": self.keyNumberGlobal,
+ "5": self.keyNumberGlobal,
+ "6": self.keyNumberGlobal,
+ "7": self.keyNumberGlobal,
+ "8": self.keyNumberGlobal,
+ "9": self.keyNumberGlobal,
+ "0": self.keyNumberGlobal
+ }, -2)
+
+ InfoBarSeek.__init__(self)
+
+ self.onClose.append(self.delMPTimer)
+ self.onClose.append(self.__onClose)
+
+ self.righttimer = False
+ self.rightKeyTimer = eTimer()
+ self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
+
+ self.lefttimer = False
+ self.leftKeyTimer = eTimer()
+ self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
+
+ self.currList = "filelist"
+
+ def doNothing(self):
+ pass
+
+ def checkSkipShowHideLock(self):
+ self.updatedSeekState()
+
+ def __evEOF(self):
+ self.nextEntry()
+
+ def __onClose(self):
+ self.session.nav.playService(None)
+
+ def delMPTimer(self):
+ del self.rightKeyTimer
+ del self.leftKeyTimer
+
+
+ def fwdTimerFire(self):
+ self.fwdKeyTimer.stop()
+ self.fwdtimer = False
+ self.nextEntry()
+
+ def rwdTimerFire(self):
+ self.rwdKeyTimer.stop()
+ self.rwdtimer = False
+ self.previousEntry()
+
+ def leftDown(self):
+ self.lefttimer = True
+ self.leftKeyTimer.start(1000)
+
+ def rightDown(self):
+ self.righttimer = True
+ self.rightKeyTimer.start(1000)
+
+ def leftUp(self):
+ if self.lefttimer:
+ self.leftKeyTimer.stop()
+ self.lefttimer = False
+ self[self.currList].pageUp()
+
+ def rightUp(self):
+ if self.righttimer:
+ self.rightKeyTimer.stop()
+ self.righttimer = False
+ self[self.currList].pageDown()
+
+ def leftTimerFire(self):
+ self.leftKeyTimer.stop()
+ self.lefttimer = False
+ self.switchToFileList()
+
+ def rightTimerFire(self):
+ self.rightKeyTimer.stop()
+ self.righttimer = False
+ self.switchToPlayList()
+
+ def switchToFileList(self):
+ self.currList = "filelist"
+ self.filelist.selectionEnabled(1)
+ self.playlist.selectionEnabled(0)
+ self.updateCurrentInfo()
+
+ def switchToPlayList(self):
+ if len(self.playlist) != 0:
+ self.currList = "playlist"
+ self.filelist.selectionEnabled(0)
+ self.playlist.selectionEnabled(1)
+ self.updateCurrentInfo()
+
+ def up(self):
+ self[self.currList].up()
+ self.updateCurrentInfo()
+
+ def down(self):
+ self[self.currList].down()
+ self.updateCurrentInfo()
+
+ def updateCurrentInfo(self):
+ text = ""
+ if self.currList == "filelist":
+ if not self.filelist.canDescent():
+ text = self.filelist.getServiceRef().getPath()
+ if self.currList == "playlist":
+ text = self.playlist.getSelection().getPath()
+
+ self["currenttext"].setText(os.path.basename(text))
+
+ def ok(self):
+ if self.currList == "filelist":
+ if self.filelist.canDescent():
+ self.filelist.descent()
+ self.updateCurrentInfo()
+ else:
+ self.copyFile()
+ if self.currList == "playlist":
+ selection = self["playlist"].getSelection()
+ self.changeEntry(self.playlist.getSelectionIndex())
+
+ def keyNumberGlobal(self, number):
+ pass
+
+ def showMenu(self):
+ menu = []
+ if self.currList == "filelist":
+ menu.append((_("switch to playlist"), "playlist"))
+ if self.filelist.canDescent():
+ menu.append((_("add directory to playlist"), "copydir"))
+ else:
+ menu.append((_("add file to playlist"), "copy"))
+ else:
+ menu.append((_("switch to filelist"), "filelist"))
+ menu.append((_("delete"), "delete"))
+ menu.append((_("clear playlist"), "clear"))
+ self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
+
+ def menuCallback(self, choice):
+ if choice is None:
+ return
+
+ if choice[1] == "copydir":
+ self.copyDirectory(self.filelist.getSelection()[0])
+ elif choice[1] == "copy":
+ self.copyFile()
+ elif choice[1] == "playlist":
+ self.switchToPlayList()
+ elif choice[1] == "filelist":
+ self.switchToFileList()
+ elif choice[1] == "delete":
+ self.deleteEntry()
+ elif choice[1] == "clear":
+ self.stopEntry()
+ self.playlist.clear()
+ self.switchToFileList()
+
+ def copyDirectory(self, directory):
+ filelist = FileList(directory, useServiceRef = True, isTop = True)
+
+ for x in filelist.getFileList():
+ if x[0][1] == True: #isDir
+ self.copyDirectory(x[0][0])
+ else:
+ self.playlist.addFile(x[0][0])
+ self.playlist.updateList()
+
+ def copyFile(self):
+ self.playlist.addFile(self.filelist.getServiceRef())
+ self.playlist.updateList()
+
+ def nextEntry(self):
+ next = self.playlist.getCurrentIndex() + 1
+ if next < len(self.playlist):
+ self.changeEntry(next)
+
+ def previousEntry(self):
+ next = self.playlist.getCurrentIndex() - 1
+ if next >= 0:
+ self.changeEntry(next)
+
+ def deleteEntry(self):
+ self.playlist.deleteFile(self.playlist.getSelectionIndex())
+ self.playlist.updateList()
+ if len(self.playlist) == 0:
+ self.switchToFileList()
+
+ def changeEntry(self, index):
+ self.playlist.setCurrentPlaying(index)
+ self.playEntry()
+
+ def playEntry(self):
+ currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]
+ if currref is None or self.session.nav.getCurrentlyPlayingServiceReference() is None or currref != self.session.nav.getCurrentlyPlayingServiceReference():
+ self.session.nav.playService(self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()])
+ info = eServiceCenter.getInstance().info(currref)
+ description = info.getInfoString(currref, iServiceInformation.sDescription)
+ self["title"].setText(description)
+ self.unPauseService()
+
+
+ def updatedSeekState(self):
+ if self.seekstate == self.SEEK_STATE_PAUSE:
+ self.playlist.pauseFile()
+ elif self.seekstate == self.SEEK_STATE_PLAY:
+ self.playlist.playFile()
+ elif self.seekstate in ( self.SEEK_STATE_FF_2X,
+ self.SEEK_STATE_FF_4X,
+ self.SEEK_STATE_FF_8X,
+ self.SEEK_STATE_FF_32X,
+ self.SEEK_STATE_FF_64X,
+ self.SEEK_STATE_FF_128X):
+ self.playlist.forwardFile()
+ elif self.seekstate in ( self.SEEK_STATE_BACK_16X,
+ self.SEEK_STATE_BACK_32X,
+ self.SEEK_STATE_BACK_64X,
+ self.SEEK_STATE_BACK_128X,):
+ self.playlist.rewindFile()
+
+ def pauseEntry(self):
+ self.pauseService()
+
+ def stopEntry(self):
+ self.playlist.stopFile()
+ self.session.nav.playService(None)
+
+
diff --git a/lib/python/Screens/StartWizard.py b/lib/python/Screens/StartWizard.py
index 8f356edc..8fc4ecdf 100644
--- a/lib/python/Screens/StartWizard.py
+++ b/lib/python/Screens/StartWizard.py
@@ -6,6 +6,7 @@ from Components.config import configElementBoolean, config, configfile
from LanguageSelection import LanguageSelection
config.misc.firstrun = configElementBoolean("config.misc.firstrun", 1);
+config.misc.languageselected = configElementBoolean("config.misc.languageselected", 1);
class StartWizard(Wizard):
skin = """
@@ -33,9 +34,9 @@ class StartWizard(Wizard):
self["arrowup2"] = MovingPixmap()
def markDone(self):
- config.misc.firstrun.value = 0;
+ config.misc.firstrun.value = 0
config.misc.firstrun.save()
configfile.save()
-wizardManager.registerWizard(LanguageSelection, config.misc.firstrun.value)
+wizardManager.registerWizard(LanguageSelection, config.misc.languageselected.value)
wizardManager.registerWizard(StartWizard, config.misc.firstrun.value)
diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py
index 3aa56800..7e2e55c8 100644
--- a/lib/python/Screens/TimerEntry.py
+++ b/lib/python/Screens/TimerEntry.py
@@ -54,6 +54,11 @@ class TimerEntry(Screen):
def createConfig(self):
config.timerentry = ConfigSubsection()
+ if (self.timer.justplay):
+ justplay = 0
+ else:
+ justplay = 1
+
# calculate default values
day = []
weekday = 0
@@ -87,6 +92,7 @@ class TimerEntry(Screen):
weekday = (int(strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
day[weekday] = 0
+ config.timerentry.justplay = configElement_nonSave("config.timerentry.justplay", configSelection, justplay, (("zap", _("zap")), ("record", _("record"))))
config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated")))
config.timerentry.name = configElement_nonSave("config.timerentry.name", configText, self.timer.name, (configText.extendableSize, self.keyRightCallback))
config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback))
@@ -139,7 +145,9 @@ class TimerEntry(Screen):
self.list = []
self.list.append(getConfigListEntry(_("Name"), config.timerentry.name))
self.list.append(getConfigListEntry(_("Description"), config.timerentry.description))
- self.timerTypeEntry = getConfigListEntry(_("Timer Type"), config.timerentry.type)
+ self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), config.timerentry.justplay)
+ self.list.append(self.timerJustplayEntry)
+ self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), config.timerentry.type)
self.list.append(self.timerTypeEntry)
if (config.timerentry.type.value == 0): # once
@@ -172,10 +180,12 @@ class TimerEntry(Screen):
else:
self.list.append(getConfigListEntry(_("StartTime"), config.timerentry.starttime))
if (config.timerentry.type.value == 0): # once
- self.list.append(getConfigListEntry(_("End"), config.timerentry.enddate))
- self.list.append(getConfigListEntry(" ", config.timerentry.endtime))
+ if currentConfigSelectionElement(config.timerentry.justplay) != "zap":
+ self.list.append(getConfigListEntry(_("End"), config.timerentry.enddate))
+ self.list.append(getConfigListEntry(" ", config.timerentry.endtime))
else:
- self.list.append(getConfigListEntry(_("EndTime"), config.timerentry.endtime))
+ if currentConfigSelectionElement(config.timerentry.justplay) != "zap":
+ self.list.append(getConfigListEntry(_("EndTime"), config.timerentry.endtime))
self.channelEntry = getConfigListEntry(_("Channel"), config.timerentry.service)
self.list.append(self.channelEntry)
@@ -187,6 +197,8 @@ class TimerEntry(Screen):
print "newConfig", self["config"].getCurrent()
if self["config"].getCurrent() == self.timerTypeEntry:
self.createSetup("config")
+ if self["config"].getCurrent() == self.timerJustplayEntry:
+ self.createSetup("config")
if self["config"].getCurrent() == self.frequencyEntry:
self.createSetup("config")
@@ -242,6 +254,7 @@ class TimerEntry(Screen):
def keyGo(self):
self.timer.name = config.timerentry.name.value
self.timer.description = config.timerentry.description.value
+ self.timer.justplay = (currentConfigSelectionElement(config.timerentry.justplay) == "zap")
self.timer.resetRepeated()
if (config.timerentry.type.value == 0): # once
diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py
index 123e1bf8..d6ffeeea 100644
--- a/lib/python/Tools/Directories.py
+++ b/lib/python/Tools/Directories.py
@@ -10,6 +10,7 @@ SCOPE_CONFIG = 6
SCOPE_LANGUAGE = 7
SCOPE_HDD = 8
SCOPE_PLUGINS = 9
+SCOPE_MEDIA = 10
PATH_CREATE = 0
PATH_DONTCREATE = 1
@@ -26,6 +27,7 @@ defaultPaths = {
SCOPE_SKIN: ("/usr/share/enigma2/", PATH_DONTCREATE),
SCOPE_SKIN_IMAGE: ("/usr/share/enigma2/", PATH_DONTCREATE),
SCOPE_HDD: ("/hdd/movie/", PATH_DONTCREATE),
+ SCOPE_MEDIA: ("/media/", PATH_DONTCREATE),
SCOPE_USERETC: ("", PATH_DONTCREATE) # user home directory
}
diff --git a/lib/service/servicefs.cpp b/lib/service/servicefs.cpp
index 2590993a..22d8cf65 100644
--- a/lib/service/servicefs.cpp
+++ b/lib/service/servicefs.cpp
@@ -134,7 +134,7 @@ RESULT eServiceFS::getContent(std::list<eServiceReference> &list, bool sorted)
if (extension == ".ts")
type = eServiceFactoryDVB::id;
- else if (extension == ".mp3")
+ else if (extension == ".mp3" || extension == ".ogg" || extension == ".avi")
type = 4097;
if (type != -1)