Index: ipk/source/mediacenter_mediathek_2_9/CONTROL/control
===================================================================
--- ipk/source/mediacenter_mediathek_2_8/CONTROL/control	(revision 7149)
+++ ipk/source/mediacenter_mediathek_2_9/CONTROL/control	(revision 7246)
@@ -1,4 +1,4 @@
 Package: enigma2-plugin-mediacenter-multimediathek
-Version: 2.8
+Version: 2.9
 Architecture: sh4
 OE: MultiMediathek
Index: ipk/source/mediacenter_mediathek_2_9/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py
===================================================================
--- ipk/source/mediacenter_mediathek_2_8/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py	(revision 7149)
+++ ipk/source/mediacenter_mediathek_2_9/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py	(revision 7246)
@@ -3,5 +3,5 @@
 # Coded by Homey (c) 2011
 #
-# Version: 2.8.2
+# Version: 2.9
 # Support: www.i-have-a-dreambox.com
 #####################################################
@@ -61,5 +61,5 @@
 config.plugins.multimediathek.showadultcontent = ConfigYesNo(default=False)
 config.plugins.multimediathek.showsecretcontent = ConfigYesNo(default=False)
-config.plugins.multimediathek.version = NoSave(ConfigText(default="282"))
+config.plugins.multimediathek.version = NoSave(ConfigText(default="290"))
 
 default = config.plugins.multimediathek.storagepath.value + "/mediathek/movies"
@@ -75,9 +75,9 @@
 class downloadJob(Job):
 	def __init__(self, toolbox, cmdline, filename, filetitle):
-		Job.__init__(self, _("Download Movie"))
+		Job.__init__(self, "Download: %s" % filetitle)
 		self.filename = filename
 		self.toolbox = toolbox
 		self.retrycount = 0
-		downloadTask(self, cmdline, filename, filetitle)
+		downloadTask(self, cmdline, filename)
 
 	def retry(self):
@@ -89,9 +89,9 @@
 		self.abort()
 		os_system("rm -f %s" % self.filename)
-		
+
 class downloadTask(Task):
 	ERROR_CORRUPT_FILE, ERROR_RTMP_ReadPacket, ERROR_SEGFAULT, ERROR_SERVER, ERROR_UNKNOWN = range(5)
-	def __init__(self, job, cmdline, filename, filetitle):
-		Task.__init__(self, job, filetitle)
+	def __init__(self, job, cmdline, filename):
+		Task.__init__(self, job, _("Downloading ..."))
 		self.postconditions.append(downloadTaskPostcondition())
 		self.setCmdline(cmdline)
@@ -100,5 +100,5 @@
 		self.error = None
 		self.lasterrormsg = None
-		
+
 	def processOutput(self, data):
 		try:
@@ -120,5 +120,4 @@
 	def processOutputLine(self, line):
 		line = line[:-1]
-		#print "[MultiMediathek DownloadTask STATUS MSG] %s" % line
 		self.lasterrormsg = line
 		if line.startswith("ERROR:"):
@@ -135,5 +134,5 @@
 		elif line.find("Segmentation fault") != -1:
 			self.error = self.ERROR_SEGFAULT
-			
+
 	def afterRun(self):
 		pass
@@ -182,5 +181,12 @@
 
 	def doEofInternal(self, playing):
-		self.leavePlayerConfirmed(True)
+		currPlay = self.session.nav.getCurrentService()
+		message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
+		if message.find('Flash demuxer not available') != -1 or message.find('(AVI) demuxer not available') != -1:
+			self.session.openWithCallback(self.GSTplugincallback, MessageBox, _("Your Dreambox can't decode this video stream!\n%s\nDo you want to download and install it now?") % message, MessageBox.TYPE_YESNO)
+		elif message.find('GStreamer plugin') != -1 and message.find('not available') != -1:
+			self.__evPluginError()
+		else:
+			self.leavePlayerConfirmed(True)
 
 	def showMovies(self):
@@ -207,4 +213,19 @@
 		else:
 			self.session.open(MessageBox, _("Your Dreambox can't decode this video stream!\n%s") % message, type=MessageBox.TYPE_INFO, timeout=20)
+
+	def GSTplugincallback(self, answer):
+		if answer is True:
+			self.container=eConsoleAppContainer()
+			self.container.appClosed.append(self.finishedPluginInstall)
+			self.container.execute("opkg update && opkg install gst-plugin-avi && opkg install gst-plugin-flv && opkg install gst-plugin-rtsp")
+		else:
+			self.close()
+
+	def finishedPluginInstall(self,retval):
+		self.session.openWithCallback(self.restartGUI, MessageBox, _("Missing GStreamer-Plugins were installed!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
+
+	def restartGUI(self, answer):
+		if answer is True:
+			self.session.open(TryQuitMainloop, 3)
 
 	def VLCcallback(self, answer):
@@ -322,5 +343,5 @@
 		# Get FrameBuffer Scale for ePicLoad()
 		sc = AVSwitch().getFramebufferScale()
-		
+
 		# Init Thumb PicLoad
 		self.picload = ePicLoad()
@@ -395,5 +416,5 @@
 
 	def finishedPluginUpdate(self,retval):
-		self.session.openWithCallback(self.restartGUI, MessageBox,_("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
+		self.session.openWithCallback(self.restartGUI, MessageBox, _("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
 
 	def restartGUI(self, answer):
@@ -409,5 +430,5 @@
 			if config.plugins.multimediathek.showsecretcontent.value:
 				feedurl = feedurl + "&showsecret=1"
-		
+
 		if '-->' in feedurl:
 			# Request to download external page
@@ -422,9 +443,9 @@
 		# We send the received page directly to my webserver and parse it there ...
 		getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.gotxmlfeed).addErrback(self.getxmlfeedError)
-		
+
 	def getxmlfeedError(self, error=""):
 		self["pageinfo"].setText("Error downloading XML Feed!\n\n" + str(error))
 		print error
-		
+
 	def gotxmlfeed(self, page=""):
 		print page
@@ -525,5 +546,5 @@
 			if self.thumbcount+1 < len(self.Thumbnaillist):
 				self.getThumbnail()
-		
+
 	def showThumbPixmap(self, picInfo=None):
 		ptr = self.picload.getData()
@@ -608,7 +629,5 @@
 
 	def key_menu(self):
-		if self.feedtitle == "Startseite":
-			self.session.openWithCallback(self.loadFrame, MultiMediathek_Settings)
-		elif self.itemlist:
+		if self.itemlist:
 			self.session.openWithCallback(self.loadFrame, MultiMediathek_MenuOptions, self.itemlist[self.index])
 
@@ -734,10 +753,10 @@
 		# Get FrameBuffer Scale for ePicLoad()
 		sc = AVSwitch().getFramebufferScale()
-		
+
 		# Init ePicLoad
 		self.picload = ePicLoad()
 		self.picload.PictureData.get().append(self.showPosterPixmap)
 		self.picload.setPara((270, 350, sc[0], sc[1], config.plugins.multimediathek.imagecache.value, int(config.plugins.multimediathek.imagescaling.value), "#00000000"))
-		
+
 		self.onFirstExecBegin.append(self.GetMovieInfo)
 
@@ -756,5 +775,5 @@
 	def keyBlue(self):
 		if self.movieinfo is not None:
-			os_system("echo 'movie:::%s:::%s:::%s\n' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
+			os_system("echo 'movie:::%s:::%s:::%s' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
 			self.session.open(MessageBox, _("Bookmark added!"), MessageBox.TYPE_INFO, timeout=5)
 
@@ -775,5 +794,5 @@
 		# We send the received page directly to my webserver and parse it there ...
 		getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.GotMovieInfo).addErrback(self.error)
-	
+
 	def GotMovieInfo(self, html):
 		self.movieinfo = html.splitlines()
@@ -792,5 +811,5 @@
 		except Exception, error:
 			print "[MultiMediathek] Getting UserAgent String failed. Using default ..."
-		
+
 		# Download Image
 		downloadPage(self.movieinfo[3], self.imagefolder+"/poster.jpg", agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2) Gecko/2008091620 Firefox/3.0.2").addCallback(self.downloadPosterCallback)
@@ -873,5 +892,5 @@
 		else:
 			self.session.open(MessageBox, _("Sorry, no supported videos found here."), MessageBox.TYPE_ERROR, timeout=10)
-			
+
 	def movieSelectCallback(self, movieinfo):
 		self.selmovieinfo = movieinfo
@@ -884,5 +903,5 @@
 				getPage(getpageurl, agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)").addCallback(self.ForwardExternalMovieList).addErrback(self.error)
 				return
-			
+
 			if self.action == "cachedplayback":
 				self.session.open(PlayMovie, movieinfo, self.movieinfo[0], self.useragent)
@@ -923,13 +942,4 @@
 
 	def saveMovie(self, title, url, filename, fileid):
-		if '(VLC)' in title and VLCSUPPORT:
-			try:
-				if vlcServerConfig.getDefaultServer() is None:
-					self.session.open(MessageBox, _("No Default Server configured in VLC Settings"), MessageBox.TYPE_ERROR)
-				else:
-					url = vlcServerConfig.getDefaultServer().playFile(url, 0x44, 0x45)
-			except Exception, error:
-				self.session.open(MessageBox,("VLC Plugin Error: %s") % error, MessageBox.TYPE_ERROR)
-
 		if self.movieinfo[0]:
 			if fileid > 1:
@@ -944,9 +954,11 @@
 			else:
 				useragentcmd = ""
-				
+
 			JobManager.AddJob(downloadJob(self, "wget %s -c '%s' -O '%s/%s'" % (useragentcmd, url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
+			self.createMetaFile(filename)
 			self.LastJobView()
 		elif url[0:4] == "rtmp":
 			JobManager.AddJob(downloadJob(self, "rtmpdump -r '%s' -o '%s/%s' -e" % (url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
+			self.createMetaFile(filename)
 			self.LastJobView()
 		else:
@@ -961,4 +973,10 @@
 			self.session.open(JobView, currentjob)
 
+	def createMetaFile(self, filename):
+		serviceref = eServiceReference(0x1001, 0, self.moviefolder + filename)
+		metafile = open("%s/%s.meta" % (self.moviefolder, filename), "w")
+		metafile.write("%s\n%s\n%s\n%i\n" % (serviceref.toString(), self.movieinfo[0].replace("\n", ""), self.movieinfo[2].replace("\n", ""), time()))
+		metafile.close()
+
 	def error(self, error):
 		self.session.open(MessageBox, _("Unexpected Error:\n%s") % (error), MessageBox.TYPE_ERROR)
@@ -973,15 +991,17 @@
 class PlayMovie(Screen):
 	skin = """
-		<screen position="center,center" size="400,240" title="Caching Video ..." >
-			<widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="380,20" font="Regular;19" />
-			<widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="380,20" font="Regular;19" />
-			<widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="380,20" font="Regular;19" />
-			<widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="380,20" font="Regular;19" />
-			<widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="380,20" font="Regular;19" />
-			<widget name="activityslider" position="10,150" size="380,30" zPosition="3" transparent="0" />
-			<widget name="key_green" position="50,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-			<widget name="key_red" position="200,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-			<ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="50,200" size="140,40" alphatest="on" />
-			<ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="200,200" size="140,40" alphatest="on" />
+		<screen position="center,center" size="450,240" title="Caching Video ..." >
+			<widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="430,21" font="Regular;19" />
+			<widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="430,21" font="Regular;19" />
+			<widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="430,21" font="Regular;19" />
+			<widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="430,21" font="Regular;19" />
+			<widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="430,21" font="Regular;19" />
+			<widget name="activityslider" position="10,150" size="430,30" zPosition="3" transparent="0" />
+			<widget name="key_red" position="10,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+			<widget name="key_green" position="155,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+			<widget name="key_blue" position="300,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+			<ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="10,200" size="140,40" alphatest="on" />
+			<ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="155,200" size="140,40" alphatest="on" />
+			<ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/blue.png" position="300,200" size="140,40" alphatest="on" />
 		</screen>"""
 
@@ -999,4 +1019,5 @@
 
 		self.streamactive = False
+		self.isVisible = True
 
 		self.container=eConsoleAppContainer()
@@ -1029,4 +1050,5 @@
 		self["key_green"] = Button(_("Play now"))
 		self["key_red"] = Button(_("Cancel"))
+		self["key_blue"] = Button(_("Show/Hide"))
 
 		self["label_filename"] = StaticText("File: %s" % (self.filename))
@@ -1041,5 +1063,6 @@
 			"ok": self.okbuttonClick,
 			"red": self.exit,
-			"green": self.playfile
+			"green": self.playfile,
+			"blue": self.visibility
 		}, -1)
 
@@ -1057,6 +1080,6 @@
 
 	def okbuttonClick(self):
-		self.StatusTimer.start(5000, True)
-		self.UpdateStatus()
+		if self.isVisible == False:
+			self.visibility()
 
 	def UpdateStatus(self):
@@ -1130,4 +1153,5 @@
 	def copyfinished(self,retval):
 		self.streamactive = False
+		self.UpdateStatus()
 		self["label_progress"].setText("Progress: 100%")
 		self["activityslider"].setValue(100)
@@ -1144,4 +1168,6 @@
 
 	def MoviePlayerCallback(self, response=None):
+		if self.isVisible == False:
+			self.visibility()
 		self.UpdateStatus()
 		if response is not None and VLCSUPPORT:
@@ -1164,5 +1190,17 @@
 		return retstr
 
+	def visibility(self):
+		if self.isVisible == True:
+			self.isVisible = False
+			self.hide()
+		else:
+			self.isVisible = True
+			self.show()
+
 	def exit(self, retval=None):
+		if self.isVisible == False:
+			self.visibility()
+			return
+
 		self.container.kill()
 		self.BgFileEraser.erase(self.destination + self.filename)
@@ -1219,7 +1257,6 @@
 					tmpfile = open(bookmarkfile, "r")
 					for line in tmpfile:
-						if self.movieinfo[5] not in line:
-							tmpdata = tmpdata + line + "\n"
-
+						if self.movieinfo[5] not in line and line != "\n":
+							tmpdata = tmpdata + line
 					tmpfile.close()
 					os_system("echo '%s' > %s" % (tmpdata,bookmarkfile))
@@ -1247,34 +1284,31 @@
 		Screen.__init__(self, session)
 		self.session = session
-		
+
 		self.skin = """
-			<screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Mediathek - Active Downloads">
-				<widget source="tasklist" render="Listbox" position="30,120" size="640,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
+			<screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Video Download List">
+				<widget source="movielist" render="Listbox" position="10,50" size="680,450" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
 					<convert type="TemplatedMultiContent">
 						{"template": [
-								MultiContentEntryText(pos = (0, 1), size = (200, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
-								MultiContentEntryText(pos = (210, 1), size = (150, 24), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
-								MultiContentEntryProgress(pos = (370, 1), size = (100, 24), percent = -3), # index 3 should be progress 
-								MultiContentEntryText(pos = (480, 1), size = (100, 24), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
+								MultiContentEntryText(pos = (0, 1), size = (310, 28), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
+								MultiContentEntryText(pos = (320, 1), size = (150, 28), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
+								MultiContentEntryProgress(pos = (480, 1), size = (100, 28), percent = -3), # index 3 should be progress
+								MultiContentEntryText(pos = (590, 1), size = (60, 28), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
 							],
-						"fonts": [gFont("Regular", 22),gFont("Regular", 18)],
-						"itemHeight": 25
+						"fonts": [gFont("Regular", 26),gFont("Regular", 22)],
+						"itemHeight": 29
 						}
 					</convert>
 				</widget>
-				<ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
-				<widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
 			</screen>"""
-		
-		self["shortcuts"] = ActionMap(["SetupActions", "ColorActions"],
+
+		self["shortcuts"] = ActionMap(["OkCancelActions"],
 		{
 			"ok": self.keyOK,
-			"cancel": self.keyClose,
-			"red": self.keyClose
+			"cancel": self.keyClose
 		}, -1)
 
-		self["tasklist"] = List([])
+		self["movielist"] = List([])
 		self["key_red"] = Button(_("Close"))
-		
+
 		self.Timer = eTimer()
 		self.Timer.callback.append(self.TimerFire)
@@ -1282,5 +1316,5 @@
 		self.onLayoutFinish.append(self.layoutFinished)
 		self.onClose.append(self.__onClose)
-		
+
 	def __onClose(self):
 		del self.Timer
@@ -1291,20 +1325,42 @@
 	def TimerFire(self):
 		self.Timer.stop()
-		self.rebuildTaskList()
-	
-	def rebuildTaskList(self):
-		self.tasklist = []
+		self.rebuildMovieList()
+
+	def rebuildMovieList(self):
+		self.movielist = []
+
+		self.getTaskList()
+		self.getMovieList()
+
+		self['movielist'].setList(self.movielist)
+		self['movielist'].updateList(self.movielist)
+
+
+	def getTaskList(self):
 		for job in JobManager.getPendingJobs():
-			self.tasklist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
-		self['tasklist'].setList(self.tasklist)
-		self['tasklist'].updateList(self.tasklist)
-		self.Timer.startLongTimer(2)
+			self.movielist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
+
+		if len(self.movielist) >= 1:
+			self.Timer.startLongTimer(10)
+
+	def getMovieList(self):
+		filelist = os_listdir(config.plugins.multimediathek.moviedir.value)
+		if filelist is not None:
+			filelist.sort()
+			for filename in filelist:
+				if os_path.isfile(config.plugins.multimediathek.moviedir.value + "/" + filename) and filename.endswith(".meta") is False:
+					self.movielist.append(("movie", filename, _("Finished"), 100, "100%"))
 
 	def keyOK(self):
-		current = self["tasklist"].getCurrent()
+		current = self["movielist"].getCurrent()
 		if current:
-			job = current[0]
-			self.session.openWithCallback(self.JobViewCB, JobView, job)
-	
+			if current[0] == "movie":
+				sref = eServiceReference(0x1001, 0, config.plugins.multimediathek.moviedir.value + "/" + current[1])
+				sref.setName(current[1])
+				self.session.open(MediathekMoviePlayer, sref)
+			else:
+				job = current[0]
+				self.session.openWithCallback(self.JobViewCB, JobView, job)
+
 	def JobViewCB(self, why):
 		pass
@@ -1355,5 +1411,5 @@
 		self.cfglist.append(getConfigListEntry(_("Thumbnail Scaler:"), config.plugins.multimediathek.imagescaler))
 		self.cfglist.append(getConfigListEntry(_("Show Adult Content:"), config.plugins.multimediathek.showadultcontent))
-		#self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
+		self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
 		self.cfglist.append(getConfigListEntry(_("Download Directory:"), config.plugins.multimediathek.moviedir))
 		self.cfglist.append(getConfigListEntry(_("Cache Folder:"), config.plugins.multimediathek.storagepath))
