da50ae55e5bec0589a5b3f76bcc84763c165dd14
[enigma2.git] / lib / python / Screens / MediaPlayer.py
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
18
19 import os
20
21 class MediaPlayer(Screen, InfoBarSeek):
22         def __init__(self, session, args = None):
23                 Screen.__init__(self, session)
24                 self.session.nav.stopService()
25                 
26                 self.filelist = FileList(resolveFilename(SCOPE_MEDIA), matchingPattern = "^.*\.(mp3|ogg|ts|wav|wave)", useServiceRef = True)
27                 self["filelist"] = self.filelist
28
29                 self.playlist = PlayList()
30                 self["playlist"] = self.playlist
31                 
32                 self["PositionGauge"] = ServicePositionGauge(self.session.nav)
33                 
34                 self["currenttext"] = Label("")
35                 
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("")
46                 
47                 #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
48                 
49                 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"],
50                 {
51                         "ok": self.ok,
52                         "cancel": self.close,
53                         
54                         "right": self.rightDown,
55                         "rightRepeated": self.doNothing,
56                         "rightUp": self.rightUp,
57                         "left": self.leftDown,
58                         "leftRepeated": self.doNothing,
59                         "leftUp": self.leftUp,
60                         
61                         "up": self.up,
62                         "upRepeated": self.up,
63                         "down": self.down,
64                         "downRepeated": self.down,
65                         
66                         "play": self.playEntry,
67                         "pause": self.pauseEntry,
68                         "stop": self.stopEntry,
69                         
70                         "previous": self.previousEntry,
71                         "next": self.nextEntry,
72                         
73                         "menu": self.showMenu,
74                         
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
85         }, -2)
86
87                 InfoBarSeek.__init__(self)
88
89                 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
90                         {
91 #                               iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
92 #                               iPlayableService.evStart: self.__serviceStarted,
93                                 
94                                 iPlayableService.evEOF: self.__evEOF,
95 #                               iPlayableService.evSOF: self.__evSOF,
96                         })
97
98                 self.onClose.append(self.delMPTimer)
99                 self.onClose.append(self.__onClose)
100                 
101                 self.righttimer = False
102                 self.rightKeyTimer = eTimer()
103                 self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
104
105                 self.lefttimer = False
106                 self.leftKeyTimer = eTimer()
107                 self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
108                 
109                 self.infoTimer = eTimer()
110                 self.infoTimer.timeout.get().append(self.infoTimerFire)
111                 self.infoTimer.start(500)
112                 
113                 self.currList = "filelist"
114                 
115         def doNothing(self):
116                 pass
117         
118         def checkSkipShowHideLock(self):
119                 self.updatedSeekState()
120         
121         def __evEOF(self):
122                 self.nextEntry()
123                 
124         def __onClose(self):
125                 self.session.nav.playService(None)
126         
127         def delMPTimer(self):
128                 del self.rightKeyTimer
129                 del self.leftKeyTimer
130                 del self.infoTimer
131                 
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),
139                                                                                  clear = True)
140                 else:
141                         self.updateMusicInformation()
142         
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)
149
150         def updateSingleMusicInformation(self, name, info, clear):
151                 if info != "" or clear:
152                         if self[name].getText() != info:
153                                 self[name].setText(info)
154
155         def fwdTimerFire(self):
156                 self.fwdKeyTimer.stop()
157                 self.fwdtimer = False
158                 self.nextEntry()
159         
160         def rwdTimerFire(self):
161                 self.rwdKeyTimer.stop()
162                 self.rwdtimer = False
163                 self.previousEntry()
164         
165         def leftDown(self):
166                 self.lefttimer = True
167                 self.leftKeyTimer.start(1000)
168
169         def rightDown(self):
170                 self.righttimer = True
171                 self.rightKeyTimer.start(1000)
172                 
173         def leftUp(self):
174                 if self.lefttimer:
175                         self.leftKeyTimer.stop()
176                         self.lefttimer = False
177                         self[self.currList].pageUp()
178     
179         def rightUp(self):
180                 if self.righttimer:
181                         self.rightKeyTimer.stop()
182                         self.righttimer = False
183                         self[self.currList].pageDown()
184                         
185         def leftTimerFire(self):
186                 self.leftKeyTimer.stop()
187                 self.lefttimer = False
188                 self.switchToFileList()
189         
190         def rightTimerFire(self):
191                 self.rightKeyTimer.stop()
192                 self.righttimer = False
193                 self.switchToPlayList()
194                                 
195         def switchToFileList(self):
196                 self.currList = "filelist"
197                 self.filelist.selectionEnabled(1)
198                 self.playlist.selectionEnabled(0)
199                 self.updateCurrentInfo()
200                 
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()
207                 
208         def up(self):
209                 self[self.currList].up()
210                 self.updateCurrentInfo()
211
212         def down(self):
213                 self[self.currList].down()
214                 self.updateCurrentInfo()
215
216         def updateCurrentInfo(self):
217                 text = ""
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()
223                 
224                 self["currenttext"].setText(os.path.basename(text))
225     
226         def ok(self):
227                 if self.currList == "filelist":
228                         if self.filelist.canDescent():
229                                 self.filelist.descent()
230                                 self.updateCurrentInfo()
231                         else:
232                                 self.copyFile()
233                 if self.currList == "playlist":
234                         selection = self["playlist"].getSelection()
235                         self.changeEntry(self.playlist.getSelectionIndex())
236
237         def keyNumberGlobal(self, number):
238                 pass
239         
240         def showMenu(self):
241                 menu = []
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"))
246                         else:
247                                 menu.append((_("add file to playlist"), "copy"))
248                 else:
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)
253                 
254         def menuCallback(self, choice):
255                 if choice is None:
256                         return
257                 
258                 if choice[1] == "copydir":
259                         self.copyDirectory(self.filelist.getSelection()[0])
260                 elif choice[1] == "copy":
261                         self.copyFile()
262                 elif choice[1] == "playlist":
263                         self.switchToPlayList()
264                 elif choice[1] == "filelist":
265                         self.switchToFileList()
266                 elif choice[1] == "delete":
267                         self.deleteEntry()
268                 elif choice[1] == "clear":
269                         self.stopEntry()
270                         self.playlist.clear()
271                         self.switchToFileList()
272                         
273         def copyDirectory(self, directory):
274                 filelist = FileList(directory, useServiceRef = True, isTop = True)
275                 
276                 for x in filelist.getFileList():
277                         if x[0][1] == True: #isDir
278                                 self.copyDirectory(x[0][0])
279                         else:
280                                 self.playlist.addFile(x[0][0])
281                 self.playlist.updateList()
282         
283         def copyFile(self):
284                 self.playlist.addFile(self.filelist.getServiceRef())
285                 self.playlist.updateList()
286                 if len(self.playlist) == 1:
287                         self.changeEntry(0)
288
289         def nextEntry(self):
290                 next = self.playlist.getCurrentIndex() + 1
291                 if next < len(self.playlist):
292                         self.changeEntry(next)
293         
294         def previousEntry(self):
295                 next = self.playlist.getCurrentIndex() - 1
296                 if next >= 0:
297                         self.changeEntry(next)
298                         
299         def deleteEntry(self):
300                 self.playlist.deleteFile(self.playlist.getSelectionIndex())
301                 self.playlist.updateList()
302                 if len(self.playlist) == 0:
303                         self.switchToFileList()
304                 
305         def changeEntry(self, index):
306                 self.playlist.setCurrentPlaying(index)
307                 self.playEntry()
308         
309         def playEntry(self):
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()
317                 
318                 
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()
336         
337         def pauseEntry(self):
338                 self.pauseService()
339                 
340         def stopEntry(self):
341                 self.playlist.stopFile()
342                 self.session.nav.playService(None)
343
344