- switchtimer added to RecordingTimer
[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|avi)", 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.__event_tracker = ServiceEventTracker(screen=self, eventmap=
48                         {
49 #                               iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
50 #                               iPlayableService.evStart: self.__serviceStarted,
51                                 
52                                 iPlayableService.evEOF: self.__evEOF,
53 #                               iPlayableService.evSOF: self.__evSOF,
54                         })
55
56         
57                 #self["text"] = Input("1234", maxSize=True, type=Input.NUMBER)
58                 
59                 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "NumberActions", "MediaPlayerSeekActions"],
60                 {
61                         "ok": self.ok,
62                         "cancel": self.close,
63                         
64                         "right": self.rightDown,
65                         "rightRepeated": self.doNothing,
66                         "rightUp": self.rightUp,
67                         "left": self.leftDown,
68                         "leftRepeated": self.doNothing,
69                         "leftUp": self.leftUp,
70                         
71                         "up": self.up,
72                         "upRepeated": self.up,
73                         "down": self.down,
74                         "downRepeated": self.down,
75                         
76                         "play": self.playEntry,
77                         "pause": self.pauseEntry,
78                         "stop": self.stopEntry,
79                         
80                         "previous": self.previousEntry,
81                         "next": self.nextEntry,
82                         
83                         "menu": self.showMenu,
84                         
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
95         }, -2)
96
97                 InfoBarSeek.__init__(self)
98
99                 self.onClose.append(self.delMPTimer)
100                 self.onClose.append(self.__onClose)
101                 
102                 self.righttimer = False
103                 self.rightKeyTimer = eTimer()
104                 self.rightKeyTimer.timeout.get().append(self.rightTimerFire)
105
106                 self.lefttimer = False
107                 self.leftKeyTimer = eTimer()
108                 self.leftKeyTimer.timeout.get().append(self.leftTimerFire)
109                 
110                 self.currList = "filelist"
111                 
112         def doNothing(self):
113                 pass
114         
115         def checkSkipShowHideLock(self):
116                 self.updatedSeekState()
117         
118         def __evEOF(self):
119                 self.nextEntry()
120                 
121         def __onClose(self):
122                 self.session.nav.playService(None)
123         
124         def delMPTimer(self):
125                 del self.rightKeyTimer
126                 del self.leftKeyTimer
127                 
128
129         def fwdTimerFire(self):
130                 self.fwdKeyTimer.stop()
131                 self.fwdtimer = False
132                 self.nextEntry()
133         
134         def rwdTimerFire(self):
135                 self.rwdKeyTimer.stop()
136                 self.rwdtimer = False
137                 self.previousEntry()
138         
139         def leftDown(self):
140                 self.lefttimer = True
141                 self.leftKeyTimer.start(1000)
142
143         def rightDown(self):
144                 self.righttimer = True
145                 self.rightKeyTimer.start(1000)
146                 
147         def leftUp(self):
148                 if self.lefttimer:
149                         self.leftKeyTimer.stop()
150                         self.lefttimer = False
151                         self[self.currList].pageUp()
152     
153         def rightUp(self):
154                 if self.righttimer:
155                         self.rightKeyTimer.stop()
156                         self.righttimer = False
157                         self[self.currList].pageDown()
158                         
159         def leftTimerFire(self):
160                 self.leftKeyTimer.stop()
161                 self.lefttimer = False
162                 self.switchToFileList()
163         
164         def rightTimerFire(self):
165                 self.rightKeyTimer.stop()
166                 self.righttimer = False
167                 self.switchToPlayList()
168                                 
169         def switchToFileList(self):
170                 self.currList = "filelist"
171                 self.filelist.selectionEnabled(1)
172                 self.playlist.selectionEnabled(0)
173                 self.updateCurrentInfo()
174                 
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()
181                 
182         def up(self):
183                 self[self.currList].up()
184                 self.updateCurrentInfo()
185
186         def down(self):
187                 self[self.currList].down()
188                 self.updateCurrentInfo()
189
190         def updateCurrentInfo(self):
191                 text = ""
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()
197                 
198                 self["currenttext"].setText(os.path.basename(text))
199     
200         def ok(self):
201                 if self.currList == "filelist":
202                         if self.filelist.canDescent():
203                                 self.filelist.descent()
204                                 self.updateCurrentInfo()
205                         else:
206                                 self.copyFile()
207                 if self.currList == "playlist":
208                         selection = self["playlist"].getSelection()
209                         self.changeEntry(self.playlist.getSelectionIndex())
210
211         def keyNumberGlobal(self, number):
212                 pass
213         
214         def showMenu(self):
215                 menu = []
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"))
220                         else:
221                                 menu.append((_("add file to playlist"), "copy"))
222                 else:
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)
227                 
228         def menuCallback(self, choice):
229                 if choice is None:
230                         return
231                 
232                 if choice[1] == "copydir":
233                         self.copyDirectory(self.filelist.getSelection()[0])
234                 elif choice[1] == "copy":
235                         self.copyFile()
236                 elif choice[1] == "playlist":
237                         self.switchToPlayList()
238                 elif choice[1] == "filelist":
239                         self.switchToFileList()
240                 elif choice[1] == "delete":
241                         self.deleteEntry()
242                 elif choice[1] == "clear":
243                         self.stopEntry()
244                         self.playlist.clear()
245                         self.switchToFileList()
246                         
247         def copyDirectory(self, directory):
248                 filelist = FileList(directory, useServiceRef = True, isTop = True)
249                 
250                 for x in filelist.getFileList():
251                         if x[0][1] == True: #isDir
252                                 self.copyDirectory(x[0][0])
253                         else:
254                                 self.playlist.addFile(x[0][0])
255                 self.playlist.updateList()
256         
257         def copyFile(self):
258                 self.playlist.addFile(self.filelist.getServiceRef())
259                 self.playlist.updateList()
260
261         def nextEntry(self):
262                 next = self.playlist.getCurrentIndex() + 1
263                 if next < len(self.playlist):
264                         self.changeEntry(next)
265         
266         def previousEntry(self):
267                 next = self.playlist.getCurrentIndex() - 1
268                 if next >= 0:
269                         self.changeEntry(next)
270                         
271         def deleteEntry(self):
272                 self.playlist.deleteFile(self.playlist.getSelectionIndex())
273                 self.playlist.updateList()
274                 if len(self.playlist) == 0:
275                         self.switchToFileList()
276                 
277         def changeEntry(self, index):
278                 self.playlist.setCurrentPlaying(index)
279                 self.playEntry()
280         
281         def playEntry(self):
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()
289                 
290                 
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()
308         
309         def pauseEntry(self):
310                 self.pauseService()
311                 
312         def stopEntry(self):
313                 self.playlist.stopFile()
314                 self.session.nav.playService(None)
315
316