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|wav|wave)", 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["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
49 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"],
54 "right": self.rightDown,
55 "rightRepeated": self.doNothing,
56 "rightUp": self.rightUp,
57 "left": self.leftDown,
58 "leftRepeated": self.doNothing,
59 "leftUp": self.leftUp,
62 "upRepeated": self.up,
64 "downRepeated": self.down,
66 "play": self.playEntry,
67 "pause": self.pauseEntry,
68 "stop": self.stopEntry,
70 "previous": self.previousEntry,
71 "next": self.nextEntry,
73 "menu": self.showMenu,
75 "1": self.keyNumberGlobal,
76 "2": self.keyNumberGlobal,
77 "3": self.keyNumberGlobal,
78 "4": self.keyNumberGlobal,
79 "5": self.keyNumberGlobal,
80 "6": self.keyNumberGlobal,
81 "7": self.keyNumberGlobal,
82 "8": self.keyNumberGlobal,
83 "9": self.keyNumberGlobal,
84 "0": self.keyNumberGlobal
87 InfoBarSeek.__init__(self)
89 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
91 # iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
92 # iPlayableService.evStart: self.__serviceStarted,
94 iPlayableService.evEOF: self.__evEOF,
95 # iPlayableService.evSOF: self.__evSOF,
98 self.onClose.append(self.delMPTimer)
99 self.onClose.append(self.__onClose)
101 self.righttimer = False
102 self.rightKeyTimer = eTimer()
103 self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
105 self.lefttimer = False
106 self.leftKeyTimer = eTimer()
107 self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
109 self.infoTimer = eTimer()
110 self.infoTimer.timeout.get().append(self.infoTimerFire)
111 self.infoTimer.start(500)
113 self.currList = "filelist"
118 def checkSkipShowHideLock(self):
119 self.updatedSeekState()
125 self.session.nav.playService(None)
127 def delMPTimer(self):
128 del self.rightKeyTimer
129 del self.leftKeyTimer
132 def infoTimerFire(self):
133 currPlay = self.session.nav.getCurrentService()
134 if currPlay is not None:
135 self.updateMusicInformation( artist = currPlay.info().getInfoString(iServiceInformation.sArtist),
136 title = currPlay.info().getInfoString(iServiceInformation.sTitle),
137 album = currPlay.info().getInfoString(iServiceInformation.sAlbum),
138 genre = currPlay.info().getInfoString(iServiceInformation.sGenre),
141 self.updateMusicInformation()
143 def updateMusicInformation(self, artist = "", title = "", album = "", year = "", genre = "", clear = False):
144 self.updateSingleMusicInformation("artist", artist, clear)
145 self.updateSingleMusicInformation("title", title, clear)
146 self.updateSingleMusicInformation("album", album, clear)
147 self.updateSingleMusicInformation("year", year, clear)
148 self.updateSingleMusicInformation("genre", genre, clear)
150 def updateSingleMusicInformation(self, name, info, clear):
151 if info != "" or clear:
152 if self[name].getText() != info:
153 self[name].setText(info)
155 def fwdTimerFire(self):
156 self.fwdKeyTimer.stop()
157 self.fwdtimer = False
160 def rwdTimerFire(self):
161 self.rwdKeyTimer.stop()
162 self.rwdtimer = False
166 self.lefttimer = True
167 self.leftKeyTimer.start(1000)
170 self.righttimer = True
171 self.rightKeyTimer.start(1000)
175 self.leftKeyTimer.stop()
176 self.lefttimer = False
177 self[self.currList].pageUp()
181 self.rightKeyTimer.stop()
182 self.righttimer = False
183 self[self.currList].pageDown()
185 def leftTimerFire(self):
186 self.leftKeyTimer.stop()
187 self.lefttimer = False
188 self.switchToFileList()
190 def rightTimerFire(self):
191 self.rightKeyTimer.stop()
192 self.righttimer = False
193 self.switchToPlayList()
195 def switchToFileList(self):
196 self.currList = "filelist"
197 self.filelist.selectionEnabled(1)
198 self.playlist.selectionEnabled(0)
199 self.updateCurrentInfo()
201 def switchToPlayList(self):
202 if len(self.playlist) != 0:
203 self.currList = "playlist"
204 self.filelist.selectionEnabled(0)
205 self.playlist.selectionEnabled(1)
206 self.updateCurrentInfo()
209 self[self.currList].up()
210 self.updateCurrentInfo()
213 self[self.currList].down()
214 self.updateCurrentInfo()
216 def updateCurrentInfo(self):
218 if self.currList == "filelist":
219 if not self.filelist.canDescent():
220 text = self.filelist.getServiceRef().getPath()
221 if self.currList == "playlist":
222 text = self.playlist.getSelection().getPath()
224 self["currenttext"].setText(os.path.basename(text))
227 if self.currList == "filelist":
228 if self.filelist.canDescent():
229 self.filelist.descent()
230 self.updateCurrentInfo()
233 if self.currList == "playlist":
234 selection = self["playlist"].getSelection()
235 self.changeEntry(self.playlist.getSelectionIndex())
237 def keyNumberGlobal(self, number):
242 if self.currList == "filelist":
243 menu.append((_("switch to playlist"), "playlist"))
244 if self.filelist.canDescent():
245 menu.append((_("add directory to playlist"), "copydir"))
247 menu.append((_("add file to playlist"), "copy"))
249 menu.append((_("switch to filelist"), "filelist"))
250 menu.append((_("delete"), "delete"))
251 menu.append((_("clear playlist"), "clear"))
252 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
254 def menuCallback(self, choice):
258 if choice[1] == "copydir":
259 self.copyDirectory(self.filelist.getSelection()[0])
260 elif choice[1] == "copy":
262 elif choice[1] == "playlist":
263 self.switchToPlayList()
264 elif choice[1] == "filelist":
265 self.switchToFileList()
266 elif choice[1] == "delete":
268 elif choice[1] == "clear":
270 self.playlist.clear()
271 self.switchToFileList()
273 def copyDirectory(self, directory):
274 filelist = FileList(directory, useServiceRef = True, isTop = True)
276 for x in filelist.getFileList():
277 if x[0][1] == True: #isDir
278 self.copyDirectory(x[0][0])
280 self.playlist.addFile(x[0][0])
281 self.playlist.updateList()
284 self.playlist.addFile(self.filelist.getServiceRef())
285 self.playlist.updateList()
286 if len(self.playlist) == 1:
290 next = self.playlist.getCurrentIndex() + 1
291 if next < len(self.playlist):
292 self.changeEntry(next)
294 def previousEntry(self):
295 next = self.playlist.getCurrentIndex() - 1
297 self.changeEntry(next)
299 def deleteEntry(self):
300 self.playlist.deleteFile(self.playlist.getSelectionIndex())
301 self.playlist.updateList()
302 if len(self.playlist) == 0:
303 self.switchToFileList()
305 def changeEntry(self, index):
306 self.playlist.setCurrentPlaying(index)
310 currref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]
311 if self.session.nav.getCurrentlyPlayingServiceReference() is None or currref != self.session.nav.getCurrentlyPlayingServiceReference():
312 self.session.nav.playService(self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()])
313 info = eServiceCenter.getInstance().info(currref)
314 description = info.getInfoString(currref, iServiceInformation.sDescription)
315 self["title"].setText(description)
316 self.unPauseService()
319 def updatedSeekState(self):
320 if self.seekstate == self.SEEK_STATE_PAUSE:
321 self.playlist.pauseFile()
322 elif self.seekstate == self.SEEK_STATE_PLAY:
323 self.playlist.playFile()
324 elif self.seekstate in ( self.SEEK_STATE_FF_2X,
325 self.SEEK_STATE_FF_4X,
326 self.SEEK_STATE_FF_8X,
327 self.SEEK_STATE_FF_32X,
328 self.SEEK_STATE_FF_64X,
329 self.SEEK_STATE_FF_128X):
330 self.playlist.forwardFile()
331 elif self.seekstate in ( self.SEEK_STATE_BACK_16X,
332 self.SEEK_STATE_BACK_32X,
333 self.SEEK_STATE_BACK_64X,
334 self.SEEK_STATE_BACK_128X,):
335 self.playlist.rewindFile()
337 def pauseEntry(self):
341 self.playlist.stopFile()
342 self.session.nav.playService(None)