1 from enigma import eTimer, iPlayableService, eServiceCenter, iServiceInformation, eSize
2 from Screens.Screen import Screen
3 from Screens.MessageBox import MessageBox
4 from Components.ActionMap import NumberActionMap
5 from Components.Label import Label
6 from Components.Input import Input
7 from Components.GUIComponent import *
8 from Components.Pixmap import Pixmap
9 from Components.Label import Label
10 from Components.FileList import FileEntryComponent, FileList
11 from Components.MediaPlayer import PlayList, PlaylistEntryComponent
12 from Plugins.Plugin import PluginDescriptor
13 from Tools.Directories import resolveFilename, SCOPE_MEDIA
14 from Components.ServicePosition import ServicePositionGauge
15 from Screens.ChoiceBox import ChoiceBox
16 from Components.ServiceEventTracker import ServiceEventTracker
17 from Screens.InfoBarGenerics import InfoBarSeek
21 class MediaPlayer(Screen, InfoBarSeek):
22 def __init__(self, session, args = None):
23 Screen.__init__(self, session)
24 self.session.nav.stopService()
26 self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "^.*\.(mp3|ogg|ts|avi)", useServiceRef = True)
27 self["filelist"] = self.filelist
29 self.playlist = PlayList()
30 self["playlist"] = self.playlist
32 self["PositionGauge"] = ServicePositionGauge(self.session.nav)
34 self["currenttext"] = Label("")
36 self["artisttext"] = Label(_("Artist:"))
37 self["artist"] = Label("")
38 self["titletext"] = Label(_("Title:"))
39 self["title"] = Label("")
40 self["albumtext"] = Label(_("Album:"))
41 self["album"] = Label("")
42 self["yeartext"] = Label(_("Year:"))
43 self["year"] = Label("")
44 self["genretext"] = Label(_("Genre:"))
45 self["genre"] = Label("")
47 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
49 # iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
50 # iPlayableService.evStart: self.__serviceStarted,
52 iPlayableService.evEOF: self.__evEOF,
53 # iPlayableService.evSOF: self.__evSOF,
57 #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
59 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"],
64 "right": self.rightDown,
65 "rightRepeated": self.doNothing,
66 "rightUp": self.rightUp,
67 "left": self.leftDown,
68 "leftRepeated": self.doNothing,
69 "leftUp": self.leftUp,
72 "upRepeated": self.up,
74 "downRepeated": self.down,
76 "play": self.playEntry,
77 "pause": self.pauseEntry,
78 "stop": self.stopEntry,
80 "previous": self.previousEntry,
81 "next": self.nextEntry,
83 "menu": self.showMenu,
85 "1": self.keyNumberGlobal,
86 "2": self.keyNumberGlobal,
87 "3": self.keyNumberGlobal,
88 "4": self.keyNumberGlobal,
89 "5": self.keyNumberGlobal,
90 "6": self.keyNumberGlobal,
91 "7": self.keyNumberGlobal,
92 "8": self.keyNumberGlobal,
93 "9": self.keyNumberGlobal,
94 "0": self.keyNumberGlobal
97 InfoBarSeek.__init__(self)
99 self.onClose.append(self.delMPTimer)
100 self.onClose.append(self.__onClose)
102 self.righttimer = False
103 self.rightKeyTimer = eTimer()
104 self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
106 self.lefttimer = False
107 self.leftKeyTimer = eTimer()
108 self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
110 self.currList = "filelist"
115 def checkSkipShowHideLock(self):
116 self.updatedSeekState()
122 self.session.nav.playService(None)
124 def delMPTimer(self):
125 del self.rightKeyTimer
126 del self.leftKeyTimer
129 def fwdTimerFire(self):
130 self.fwdKeyTimer.stop()
131 self.fwdtimer = False
134 def rwdTimerFire(self):
135 self.rwdKeyTimer.stop()
136 self.rwdtimer = False
140 self.lefttimer = True
141 self.leftKeyTimer.start(1000)
144 self.righttimer = True
145 self.rightKeyTimer.start(1000)
149 self.leftKeyTimer.stop()
150 self.lefttimer = False
151 self[self.currList].pageUp()
155 self.rightKeyTimer.stop()
156 self.righttimer = False
157 self[self.currList].pageDown()
159 def leftTimerFire(self):
160 self.leftKeyTimer.stop()
161 self.lefttimer = False
162 self.switchToFileList()
164 def rightTimerFire(self):
165 self.rightKeyTimer.stop()
166 self.righttimer = False
167 self.switchToPlayList()
169 def switchToFileList(self):
170 self.currList = "filelist"
171 self.filelist.selectionEnabled(1)
172 self.playlist.selectionEnabled(0)
173 self.updateCurrentInfo()
175 def switchToPlayList(self):
176 if len(self.playlist) != 0:
177 self.currList = "playlist"
178 self.filelist.selectionEnabled(0)
179 self.playlist.selectionEnabled(1)
180 self.updateCurrentInfo()
183 self[self.currList].up()
184 self.updateCurrentInfo()
187 self[self.currList].down()
188 self.updateCurrentInfo()
190 def updateCurrentInfo(self):
192 if self.currList == "filelist":
193 if not self.filelist.canDescent():
194 text = self.filelist.getServiceRef().getPath()
195 if self.currList == "playlist":
196 text = self.playlist.getSelection().getPath()
198 self["currenttext"].setText(os.path.basename(text))
201 if self.currList == "filelist":
202 if self.filelist.canDescent():
203 self.filelist.descent()
204 self.updateCurrentInfo()
207 if self.currList == "playlist":
208 selection = self["playlist"].getSelection()
209 self.changeEntry(self.playlist.getSelectionIndex())
211 def keyNumberGlobal(self, number):
216 if self.currList == "filelist":
217 menu.append((_("switch to playlist"), "playlist"))
218 if self.filelist.canDescent():
219 menu.append((_("add directory to playlist"), "copydir"))
221 menu.append((_("add file to playlist"), "copy"))
223 menu.append((_("switch to filelist"), "filelist"))
224 menu.append((_("delete"), "delete"))
225 menu.append((_("clear playlist"), "clear"))
226 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
228 def menuCallback(self, choice):
232 if choice[1] == "copydir":
233 self.copyDirectory(self.filelist.getSelection()[0])
234 elif choice[1] == "copy":
236 elif choice[1] == "playlist":
237 self.switchToPlayList()
238 elif choice[1] == "filelist":
239 self.switchToFileList()
240 elif choice[1] == "delete":
242 elif choice[1] == "clear":
244 self.playlist.clear()
245 self.switchToFileList()
247 def copyDirectory(self, directory):
248 filelist = FileList(directory, useServiceRef = True, isTop = True)
250 for x in filelist.getFileList():
251 if x[0][1] == True: #isDir
252 self.copyDirectory(x[0][0])
254 self.playlist.addFile(x[0][0])
255 self.playlist.updateList()
258 self.playlist.addFile(self.filelist.getServiceRef())
259 self.playlist.updateList()
262 next = self.playlist.getCurrentIndex() + 1
263 if next < len(self.playlist):
264 self.changeEntry(next)
266 def previousEntry(self):
267 next = self.playlist.getCurrentIndex() - 1
269 self.changeEntry(next)
271 def deleteEntry(self):
272 self.playlist.deleteFile(self.playlist.getSelectionIndex())
273 self.playlist.updateList()
274 if len(self.playlist) == 0:
275 self.switchToFileList()
277 def changeEntry(self, index):
278 self.playlist.setCurrentPlaying(index)
282 currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]
283 if currref is None or self.session.nav.getCurrentlyPlayingServiceReference() is None or currref != self.session.nav.getCurrentlyPlayingServiceReference():
284 self.session.nav.playService(self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()])
285 info = eServiceCenter.getInstance().info(currref)
286 description = info.getInfoString(currref, iServiceInformation.sDescription)
287 self["title"].setText(description)
288 self.unPauseService()
291 def updatedSeekState(self):
292 if self.seekstate == self.SEEK_STATE_PAUSE:
293 self.playlist.pauseFile()
294 elif self.seekstate == self.SEEK_STATE_PLAY:
295 self.playlist.playFile()
296 elif self.seekstate in ( self.SEEK_STATE_FF_2X,
297 self.SEEK_STATE_FF_4X,
298 self.SEEK_STATE_FF_8X,
299 self.SEEK_STATE_FF_32X,
300 self.SEEK_STATE_FF_64X,
301 self.SEEK_STATE_FF_128X):
302 self.playlist.forwardFile()
303 elif self.seekstate in ( self.SEEK_STATE_BACK_16X,
304 self.SEEK_STATE_BACK_32X,
305 self.SEEK_STATE_BACK_64X,
306 self.SEEK_STATE_BACK_128X,):
307 self.playlist.rewindFile()
309 def pauseEntry(self):
313 self.playlist.stopFile()
314 self.session.nav.playService(None)