def addDirtoPls(self, directory, recursive = True):
		print "copyDirectory", directory
		if directory == '/':
			print "refusing to operate on /"
			return
		filelist = FileList(directory, useServiceRef = True, showMountpoints = False, isTop = True)

		for x in filelist.getFileList():
			if x[0][1] == True: #isDir
				if recursive:
					if x[0][0] != directory:
						self.copyDirectory(x[0][0])
			elif filelist.getServiceRef() and filelist.getServiceRef().type == 4097:
				self.playlist.addFile(x[0][0])
		self.playlist.updateList()
class MC_AudioPlayer(Screen, HelpableScreen):
	def __init__(self, session):
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		
		self.isVisible = True

		self.coverArtFileName = ""
		
		self["key_red"] = Button(_(" "))
		self["key_green"] = Button(_(" "))
		self["key_yellow"] = Button(_("Add to Playlist"))
		self["key_blue"] = Button(_("Go to Playlist"))
		
		self["fileinfo"] = Label()
		self["coverArt"] = MediaPixmap()
		
		self["currentfolder"] = Label()

		self["play"] = Pixmap()
		self["stop"] = Pixmap()

		self["curplayingtitle"] = Label()
		
		self.PlaySingle = 0
		
		MC_AudioPlayer.STATE = "NONE"
		
		self.playlist = PlayList()
		self["playlist"] = self.playlist
		MC_AudioPlayer.playlistplay = 0
		MC_AudioPlayer.currPlaying = -1
		
		self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
			{
				iPlayableService.evStopped: self.doEOF,
				iPlayableService.evEOF: self.doEOF,
				iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
				iPlayableService.evUser+11: self.__evDecodeError,
				iPlayableService.evUser+12: self.__evPluginError,
				iPlayableService.evUser+13: self["coverArt"].embeddedCoverArt
			})
			
		self["actions"] = HelpableActionMap(self, "MC_AudioPlayerActions", 
			{
				"ok": (self.KeyOK, _("Play selected file")),
				"cancel": (self.Exit, _("Exit Audio Player")),
				"left": (self.leftUp, _("List Top")),
				"right": (self.rightDown, _("List Bottom")),
				"up": (self.up, _("List up")),
				"down": (self.down, _("List down")),
				"menu": (self.showMenu, _("File / Folder Options")),
				"video": (self.visibility, _("Show / Hide Player")),
				"info": (self.showFileInfo, _("Show File Info")),
				"stop": (self.StopPlayback, _("Stop Playback")),
				#"red": (self.Exit, _("Exit Music")),
				#"green": (self.KeyPlayAll, _("Play All")),
				"yellow": (self.addFiletoPls, _("Add file to playlist")),
				"blue": (self.Playlists, _("Playlists")),
				"next": (self.KeyNext, _("Next song")),
				"previous": (self.KeyPrevious, _("Previous song")),
				"playpause": (self.PlayPause, _("Play / Pause")),
				"stop": (self.StopPlayback, _("Stop")),
				"seekFwd": (self.seekFwd, _("skip forward")),
				"seekBwd": (self.seekBwd, _("skip backward")),
			}, -2)

		self.playlistparsers = {}
		self.addPlaylistParser(PlaylistIOM3U, "m3u")
		self.addPlaylistParser(PlaylistIOPLS, "pls")
		self.addPlaylistParser(PlaylistIOInternal, "e2pls")
		
		currDir = config.plugins.mc_ap.lastDir.value
		if not pathExists(currDir):
			currDir = None

		self["currentfolder"].setText(str(currDir))
		
		self.filelist = FileList(currDir, showMountpoints = True, useServiceRef = True, showDirectories = True, showFiles = True, matchingPattern = "(?i)^.*\.(mp3|ogg|wav|wave|flac|m4a|m3u|pls|e2pls)", additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
		self["filelist"] = self.filelist
		self["thumbnail"] = Pixmap()
		
	def up(self):
		self["filelist"].up()

	def down(self):
		self["filelist"].down()
		
	def leftUp(self):
		self["filelist"].pageUp()
		
	def rightDown(self):
		self["filelist"].pageDown()

	def KeyOK(self):
		if self["filelist"].canDescent():
			self.filelist.descent()
			self["currentfolder"].setText(str(self.filelist.getCurrentDirectory()))
		else:
			if self.filelist.getServiceRef().type == 4098: # playlist
				ServiceRef = self.filelist.getServiceRef()
				extension = ServiceRef.getPath()[ServiceRef.getPath().rfind('.') + 1:]
				if self.playlistparsers.has_key(extension):
					self.playlist.clear()
					playlist = self.playlistparsers[extension]()
					list = playlist.open(ServiceRef.getPath())
					for x in list:
						self.playlist.addFile(x.ref)
				self.playlist.updateList()
				MC_AudioPlayer.currPlaying = 0
				self.PlayServicepls()
			else:
				self.PlaySingle = 0
				self.PlayService()

	def PlayPause(self):
		if MC_AudioPlayer.STATE == "PLAY":
			service = self.session.nav.getCurrentService()
			pausable = service.pause()
			pausable.pause()
			MC_AudioPlayer.STATE = "PAUSED"
		elif MC_AudioPlayer.STATE == "PAUSED" or MC_AudioPlayer.STATE == "SEEKBWD" or MC_AudioPlayer.STATE == "SEEKFWD":
			service = self.session.nav.getCurrentService()
			pausable = service.pause()
			pausable.unpause()
			MC_AudioPlayer.STATE = "PLAY"
		else:
			self.KeyOK()
			
	def seekFwd(self):
		if MC_AudioPlayer.STATE == "PLAY" or MC_AudioPlayer.STATE == "SEEKBWD":
			service = self.session.nav.getCurrentService()
			pausable = service.pause()
			pausable.setFastForward(4)
			MC_AudioPlayer.STATE = "SEEKFWD"

	def seekBwd(self):
		if MC_AudioPlayer.STATE == "PLAY" or MC_AudioPlayer.STATE == "SEEKFWD":
			service = self.session.nav.getCurrentService()
			pausable = service.pause()
			pausable.setFastForward(-4)
			MC_AudioPlayer.STATE = "SEEKBWD"

	def KeyNext(self):
		if MC_AudioPlayer.STATE != "NONE":
			if MC_AudioPlayer.playlistplay == 1:
				next = self.playlist.getCurrentIndex() + 1
				if next < len(self.playlist):
					MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying + 1
				else:
					MC_AudioPlayer.currPlaying = 0
				self.PlayServicepls()
			
			else:
				print "Play Next File ..."
				self.down()
				self.PlayService()
		
	def KeyPrevious(self):
		if MC_AudioPlayer.STATE != "NONE":
			if MC_AudioPlayer.playlistplay == 1:
				next = self.playlist.getCurrentIndex() - 1
				if next != -1:
					MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying - 1
				else:
					MC_AudioPlayer.currPlaying = 0
				self.PlayServicepls()
			
			else:
				print "Play previous File ..."
				self.up()
				self.PlayService()

	def KeyPlayAll(self):
		if not self["filelist"].canDescent():
			self.PlaySingle = 0
			self.PlayService()

	def KeyExit(self):
		self.filelist.gotoParent()

	def KeyYellow(self):
		print "yellow"
			
	def visibility(self, force=1):
		if self.isVisible == True:
			self.isVisible = False
			self.hide()
		else:
			self.isVisible = True
			self.show()
	
	def Playlists(self):
		self.session.openWithCallback(self.updateFileInfo, MC_AudioPlaylist)
		
	def PlayService(self):
		playlistplay = 0
		self.session.nav.playService(self["filelist"].getServiceRef())
		MC_AudioPlayer.STATE = "PLAY"
		self.updateFileInfo()
		
		path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename()
		self["coverArt"].updateCoverArt(path)

	def PlayServicepls(self):
		MC_AudioPlayer.playlistplay = 1
		
		x = self.playlist.getCurrentIndex()
		print "x is %s" % (x)
		x = len(self.playlist)
		print "x is %s" % (x)
		ref = self.playlist.getServiceRefList()[self.playlist.getCurrentIndex()]
		self.session.nav.playService(ref)
		MC_AudioPlayer.STATE = "PLAY"
		self.updateFileInfo()
		
		#path = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename()
		#self["coverArt"].updateCoverArt(path)

	def StopPlayback(self):
		if self.isVisible == False:
			self.show()
			self.isVisible = True
		
		if self.session.nav.getCurrentService() is None:
			return
		else:
			self.session.nav.stopService()
			MC_AudioPlayer.STATE = "NONE"

	def showFileInfo(self):
		if self["filelist"].canDescent():
			return
		else:
			self.session.open(MC_AudioInfoView, self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() , self["filelist"].getFilename(), self["filelist"].getServiceRef())			

	def JumpToFolder(self, jumpto = None):
		if jumpto is None:
			return
		else:
			self["filelist"].changeDir(jumpto)
			self["currentfolder"].setText(("%s") % (jumpto))

	def updateFileInfo(self):
		currPlay = self.session.nav.getCurrentService()
		if currPlay is not None:
			sTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			sArtist = currPlay.info().getInfoString(iServiceInformation.sTagArtist)
			sAlbum = currPlay.info().getInfoString(iServiceInformation.sTagAlbum)
			sGenre = currPlay.info().getInfoString(iServiceInformation.sTagGenre)
			sComment = currPlay.info().getInfoString(iServiceInformation.sTagComment)
			sYear = currPlay.info().getInfoString(iServiceInformation.sTagDate)
			
			if sTitle == "":
				sTitle = currPlay.info().getName().split('/')[-1]
					
			self["fileinfo"].setText(_("Title:") + " " + sTitle + "\n" + _("Artist:") + " " +  sArtist + "\n" + _("Album:") + " " + sAlbum + "\n" + _("Genre:") + " " + sGenre + "\n" + _("Comment:") + " " + sComment)
			self["curplayingtitle"].setText(_("Now Playing:") + " " + sArtist + " - " + sTitle)

	def addFiletoPls(self):
		if self.filelist.getServiceRef().type == 4098: # playlist
			ServiceRef = self.filelist.getServiceRef()
			extension = ServiceRef.getPath()[ServiceRef.getPath().rfind('.') + 1:]
			if self.playlistparsers.has_key(extension):
				playlist = self.playlistparsers[extension]()
				list = playlist.open(ServiceRef.getPath())
				for x in list:
					self.playlist.addFile(x.ref)
				self.playlist.updateList()
		else:
			self.playlist.addFile(self.filelist.getServiceRef())
			self.playlist.updateList()

	def addDirtoPls(self, directory, recursive = True):
		print "copyDirectory", directory
		if directory == '/':
			print "refusing to operate on /"
			return
		filelist = FileList(directory, useServiceRef = True, showMountpoints = False, isTop = True)

		for x in filelist.getFileList():
			if x[0][1] == True: #isDir
				if recursive:
					if x[0][0] != directory:
						self.copyDirectory(x[0][0])
			elif filelist.getServiceRef() and filelist.getServiceRef().type == 4097:
				self.playlist.addFile(x[0][0])
		self.playlist.updateList()

	def deleteFile(self):
		self.service = self.filelist.getServiceRef()
		if self.service.type != 4098 and self.session.nav.getCurrentlyPlayingServiceReference() is not None:
			if self.service == self.session.nav.getCurrentlyPlayingServiceReference():
				self.StopPlayback()
		
		self.session.openWithCallback(self.deleteFileConfirmed, MessageBox, _("Do you really want to delete this file ?"))

	def deleteFileConfirmed(self, confirmed):
		if confirmed:
			delfile = self["filelist"].getFilename()
			os.remove(delfile)
	
	def deleteDir(self):
		self.session.openWithCallback(self.deleteDirConfirmed, MessageBox, _("Do you really want to delete this directory and it's content ?"))
		
	def deleteDirConfirmed(self, confirmed):
		if confirmed:
			import shutil
			deldir = self.filelist.getSelection()[0]
			shutil.rmtree(deldir)
	
	def addPlaylistParser(self, parser, extension):
		self.playlistparsers[extension] = parser

	def Exit(self):
		if self.isVisible == False:
			self.visibility()
			return
		
		try:
			config.plugins.mc_ap.lastDir.value = self.filelist.getCurrentDirectory()
		except:
			config.plugins.mc_ap.lastDir.value = 'mountpoint'
		config.plugins.mc_ap.save()
		configfile.save()
		
		del self["coverArt"].picload
		self.session.nav.stopService()
		MC_AudioPlayer.STATE = "NONE"
		self.close()

	def showMenu(self):
		menu = []
		if self.filelist.canDescent():
			x = self.filelist.getName()
			if x == "..":
				return
			menu.append((_("add directory to playlist"), "copydir"))
			menu.append((_("delete directory"), "deletedir"))
		else:
			menu.append((_("add file to playlist"), "copyfile"))
			menu.append((_("add file to playlist and play"), "copyandplay"))
			menu.append((_("add all files in directory to playlist"), "copyfiles"))
			menu.append((_("delete file"), "deletefile"))
		self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)

	def menuCallback(self, choice):
		if choice is None:
			return

		if choice[1] == "copydir":
			self.addDirtoPls(self.filelist.getSelection()[0])
		elif choice[1] == "deletedir":
			self.deleteDir()
		elif choice[1] == "copyfile":
			self.addFiletoPls()
		elif choice[1] == "copyandplay":
			self.addFiletoPls()
			MC_AudioPlayer.currPlaying = len(self.playlist) - 1
			print "curplay is %s" % (MC_AudioPlayer.currPlaying)
			self.PlayServicepls()
		elif choice[1] == "copyfiles":
			self.addDirtoPls(os_path.dirname(self.filelist.getSelection()[0].getPath()) + "/", recursive = False)
		elif choice[1] == "deletefile":
			self.deleteFile()
		
	def doEOF(self):
		print "MediaCenter: EOF Event AUDIO..."
		if MC_AudioPlayer.playlistplay == 1:
			next = self.playlist.getCurrentIndex() + 1
			if next < len(self.playlist):
				MC_AudioPlayer.currPlaying = MC_AudioPlayer.currPlaying + 1
				self.PlayServicepls()
		
		elif self.PlaySingle == 0:
			print "Play Next File ..."
			self.down()
			if not self["filelist"].canDescent():
				self.PlayService()
			else:
				self.StopPlayback()
		else:
			print "Stop Playback ..."
			self.StopPlayback()

	def __evUpdatedInfo(self):
		self.updateFileInfo()

	def __evDecodeError(self):
		currPlay = self.session.nav.getCurrentService()
		sVideoType = currPlay.info().getInfoString(iServiceInformation.sVideoType)
		print "[__evDecodeError] video-codec %s can't be decoded by hardware" % (sVideoType)
		self.session.open(MessageBox, _("This Dreambox can't decode %s video streams!") % sVideoType, type = MessageBox.TYPE_INFO,timeout = 20 )

	def __evPluginError(self):
		currPlay = self.session.nav.getCurrentService()
		message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
		print "[__evPluginError]" , message
		self.session.open(MessageBox, message, type = MessageBox.TYPE_INFO,timeout = 20 )