Index: /ipk/source/players_mediathek_2_2/CONTROL/control
===================================================================
--- /ipk/source/players_mediathek_2_2/CONTROL/control	(revision 6604)
+++ /ipk/source/players_mediathek_2_2/CONTROL/control	(revision 6605)
@@ -1,4 +1,4 @@
 Package: enigma2-plugin-players-multimediathek
-Version: 2.2
+Version: 2.3
 Architecture: sh4
 OE: MultiMediathek
Index: /ipk/source/players_mediathek_2_2/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py
===================================================================
--- /ipk/source/players_mediathek_2_2/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py	(revision 6604)
+++ /ipk/source/players_mediathek_2_2/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py	(revision 6605)
@@ -3,5 +3,5 @@
 # Coded by Homey (c) 2011
 #
-# Version: 2.2
+# Version: 2.3
 # Support: www.i-have-a-dreambox.com
 #####################################################
@@ -17,5 +17,5 @@
 from Components.Sources.List import List
 from Components.Sources.StaticText import StaticText
-from Components.Task import Task, Job, job_manager as JobManager
+from Components.Task import Task, Job, job_manager as JobManager, Condition
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
@@ -60,5 +60,5 @@
 config.plugins.multimediathek.showsecretcontent = ConfigYesNo(default=False)
 config.plugins.multimediathek.checkforupdate = ConfigYesNo(default=True)
-config.plugins.multimediathek.version = NoSave(ConfigText(default="220"))
+config.plugins.multimediathek.version = NoSave(ConfigText(default="230"))
 
 #################################
@@ -70,13 +70,23 @@
 		Job.__init__(self, _("Saving Movie from Mediathek"))
 		self.toolbox = toolbox
+		self.retrycount = 0
 		downloadTask(self, cmdline, filename, filetitle)
 
+	def retry(self):
+		assert self.status == self.FAILED
+		self.retrycount += 1
+		self.restart()
+	
 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)
+		self.postconditions.append(downloadTaskPostcondition())
 		self.setCmdline(cmdline)
 		self.filename = filename
 		self.toolbox = job.toolbox
-
+		self.error = None
+		self.lasterrormsg = None
+		
 	def processOutput(self, data):
 		try:
@@ -87,5 +97,7 @@
 			elif data.find('%') != -1:
 				tmpvalue = data[:data.find("%")]
-				self.progress = int(tmpvalue[tmpvalue.rfind(" "):].strip())
+				tmpvalue = tmpvalue[tmpvalue.rfind(" "):].strip()
+				tmpvalue = tmpvalue[tmpvalue.rfind("(")+1:].strip()
+				self.progress = int(float(tmpvalue))
 			else:
 				Task.processOutput(self, data)
@@ -94,4 +106,23 @@
 			Task.processOutput(self, data)
 
+	def processOutputLine(self, line):
+		line = line[:-1]
+		#print "[MultiMediathek DownloadTask STATUS MSG] %s" % line
+		if line.startswith("ERROR:"):
+			self.lasterrormsg = line
+			if line.find("RTMP_ReadPacket") != -1:
+				self.error = self.ERROR_RTMP_ReadPacket
+			elif line.find("corrupt file!") != -1:
+				self.error = self.ERROR_CORRUPT_FILE
+				os_system("rm -f %s" % self.filename)
+			else:
+				self.error = self.ERROR_UNKNOWN
+		elif line.startswith("wget:"):
+			self.lasterrormsg = line
+			if line.find("server returned error") != -1:
+				self.error = self.ERROR_SERVER
+		elif line.find("Segmentation fault") != -1:
+			self.error = self.ERROR_SEGFAULT
+			
 	def afterRun(self):
 		pass
@@ -99,4 +130,21 @@
 		#if self.getProgress() == 0 or self.getProgress() == 100:
 		#	Notifications.AddNotification(MessageBox, _("Movie successfully transfered to your HDD!") +"\n"+self.filename, MessageBox.TYPE_INFO, timeout=10)
+
+class downloadTaskPostcondition(Condition):
+	RECOVERABLE = True
+	def check(self, task):
+		if task.returncode == 0 or task.error is None:
+			return True
+		else:
+			return False
+
+	def getErrorMessage(self, task):
+		return {
+			task.ERROR_CORRUPT_FILE: _("Video Download Failed!\n\nCorrupted Download File:\n%s" % task.lasterrormsg),
+			task.ERROR_RTMP_ReadPacket: _("Video Download Failed!\n\nCould not read RTMP-Packet:\n%s" % task.lasterrormsg),
+			task.ERROR_SEGFAULT: _("Video Download Failed!\n\nSegmentation fault:\n%s" % task.lasterrormsg),
+			task.ERROR_SERVER: _("Video Download Failed!\n\nServer returned error:\n%s" % task.lasterrormsg),
+			task.ERROR_UNKNOWN: _("Video Download Failed!\n\nUnknown Error:\n%s" % task.lasterrormsg)
+		}[task.error]
 
 ###################################################
@@ -579,71 +627,4 @@
 						self.BgFileEraser.erase(filelocation)
 
-		self.close()
-
-#------------------------------------------------------------------------------------------
-
-class MultiMediathek_ItemOptions(Screen):
-	def __init__(self, session, movieinfo):
-		Screen.__init__(self, session)
-
-		self.skin = """
-			<screen position="center,center" size="400,200" title="Mediathek - Item Options">
-				<widget source="itemname" transparent="1" render="Label" zPosition="2" position="10,180" size="380,20" font="Regular;16" />
-				<widget source="menu" render="Listbox" zPosition="5" transparent="1" position="10,10" size="380,160" scrollbarMode="showOnDemand" >
-					<convert type="StringList" />
-				</widget>
-			</screen>"""
-
-		list = []
-		self.movieinfo = movieinfo
-		if self.movieinfo[7] == "bookmark":
-			list.append(("Delete this bookmark", "delbookmark", "menu_delbookmark", "50"))
-		elif self.movieinfo[6] == "movie":
-			list.append(("Bookmark this movie", "addbookmark", "menu_addbookmark", "50"))
-		elif self.movieinfo[6] == "cat":
-			list.append(("Bookmark this category", "addbookmark", "menu_addbookmark", "50"))
-		list.append(("View Bookmarks", "viewbookmarks", "menu_viewbookmarks", "50"))
-		list.append(("Mediathek Settings", "settingsmenu", "menu_settings", "50"))
-
-		self["menu"] = List(list)
-		self["itemname"] = StaticText(self.movieinfo[3])
-
-		self["actions"] = ActionMap(["OkCancelActions"],
-		{
-			"cancel": self.Exit,
-			"ok": self.okbuttonClick
-		}, -1)
-
-	def okbuttonClick(self):
-		selection = self["menu"].getCurrent()
-		if selection:
-			if selection[1] == "addbookmark":
-				os_system("echo '%s:::%s:::%s:::%s' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[6], self.movieinfo[3], self.movieinfo[5], self.movieinfo[4]))
-				#self.session.openWithCallback(self.Exit, MessageBox, _("Bookmark added!"), MessageBox.TYPE_INFO, timeout=5)
-				self.Exit()
-			if selection[1] == "delbookmark":
-				bookmarkfile = "/etc/enigma2/multimediathek.bookmarks"
-				if fileExists(bookmarkfile, 'r'):
-					tmpdata = ""
-					tmpfile = open(bookmarkfile, "r")
-					for line in tmpfile:
-						if self.movieinfo[5] not in line:
-							tmpdata = tmpdata + line + "\n"
-
-					tmpfile.close()
-					os_system("echo '%s' > %s" % (tmpdata,bookmarkfile))
-
-				#self.session.openWithCallback(self.Exit, MessageBox, _("Bookmark deleted!"), MessageBox.TYPE_INFO, timeout=5)
-				self.Exit()
-			elif selection[1] == "viewbookmarks":
-				self.session.open(MultiMediathek, self.movieinfo[5], "Bookmarks", "Bookmarks from your favorite Movies")
-			elif selection[1] == "settingsmenu":
-				self.session.openWithCallback(self.Exit, MultiMediathek_Settings)
-			else:
-				self.Exit()
-		else:
-			self.Exit()
-
-	def Exit(self, retval=None):
 		self.close()
 
@@ -801,5 +782,5 @@
 				if url and url != "":
 					filecount += 1
-					entrylist.append((title,url,filename))
+					entrylist.append((title,url,filename,filecount))
 
 		if filecount == 0:
@@ -810,4 +791,5 @@
 			tmpanswer.append((url))
 			tmpanswer.append((filename))
+			tmpanswer.append((filecount))
 			self.movieSelectCallback(tmpanswer)
 		else:
@@ -837,5 +819,5 @@
 
 			elif self.action == "savemovie":
-				self.saveMovie(movieinfo[0], movieinfo[1], movieinfo[2])
+				self.saveMovie(movieinfo[0], movieinfo[1], movieinfo[2], movieinfo[3])
 
 	def switchToCPBCallback(self, answer):
@@ -850,8 +832,9 @@
 			tmpinfo.append((response[1]))
 			tmpinfo.append((response[2]))
+			tmpinfo.append((response[3]))
 			self.action = "vlcplayback"
 			self.movieSelectCallback(tmpinfo)
 
-	def saveMovie(self, title, url, filename):
+	def saveMovie(self, title, url, filename, fileid):
 		if '(VLC)' in title and VLCSUPPORT:
 			try:
@@ -864,5 +847,9 @@
 
 		if self.movieinfo[0]:
-			filename = ASCIItranslit.legacyEncode(self.movieinfo[0]+"."+filename.split('.')[-1]).lower()
+			if fileid > 1:
+				addfilenumber = "_"+str(fileid)
+			else:
+				addfilenumber = ""
+			filename = ASCIItranslit.legacyEncode(self.movieinfo[0]+addfilenumber+"."+filename.split('.')[-1]).lower()
 
 		if url[0:4] == "http" or url[0:3] == "ftp":
@@ -870,5 +857,5 @@
 			self.LastJobView()
 		elif url[0:4] == "rtmp":
-			JobManager.AddJob(downloadJob(self, "rtmpdump -r '%s' -o '%s/%s'" % (url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
+			JobManager.AddJob(downloadJob(self, "rtmpdump -r '%s' -o '%s/%s' -e" % (url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
 			self.LastJobView()
 		else:
@@ -1082,4 +1069,71 @@
 #------------------------------------------------------------------------------------------
 
+class MultiMediathek_ItemOptions(Screen):
+	def __init__(self, session, movieinfo):
+		Screen.__init__(self, session)
+
+		self.skin = """
+			<screen position="center,center" size="400,200" title="Mediathek - Item Options">
+				<widget source="itemname" transparent="1" render="Label" zPosition="2" position="10,180" size="380,20" font="Regular;16" />
+				<widget source="menu" render="Listbox" zPosition="5" transparent="1" position="10,10" size="380,160" scrollbarMode="showOnDemand" >
+					<convert type="StringList" />
+				</widget>
+			</screen>"""
+
+		list = []
+		self.movieinfo = movieinfo
+		if self.movieinfo[7] == "bookmark":
+			list.append(("Delete this bookmark", "delbookmark", "menu_delbookmark", "50"))
+		elif self.movieinfo[6] == "movie":
+			list.append(("Bookmark this movie", "addbookmark", "menu_addbookmark", "50"))
+		elif self.movieinfo[6] == "cat":
+			list.append(("Bookmark this category", "addbookmark", "menu_addbookmark", "50"))
+		list.append(("View Bookmarks", "viewbookmarks", "menu_viewbookmarks", "50"))
+		list.append(("Mediathek Settings", "settingsmenu", "menu_settings", "50"))
+
+		self["menu"] = List(list)
+		self["itemname"] = StaticText(self.movieinfo[3])
+
+		self["actions"] = ActionMap(["OkCancelActions"],
+		{
+			"cancel": self.Exit,
+			"ok": self.okbuttonClick
+		}, -1)
+
+	def okbuttonClick(self):
+		selection = self["menu"].getCurrent()
+		if selection:
+			if selection[1] == "addbookmark":
+				os_system("echo '%s:::%s:::%s:::%s' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[6], self.movieinfo[3], self.movieinfo[5], self.movieinfo[4]))
+				#self.session.openWithCallback(self.Exit, MessageBox, _("Bookmark added!"), MessageBox.TYPE_INFO, timeout=5)
+				self.Exit()
+			if selection[1] == "delbookmark":
+				bookmarkfile = "/etc/enigma2/multimediathek.bookmarks"
+				if fileExists(bookmarkfile, 'r'):
+					tmpdata = ""
+					tmpfile = open(bookmarkfile, "r")
+					for line in tmpfile:
+						if self.movieinfo[5] not in line:
+							tmpdata = tmpdata + line + "\n"
+
+					tmpfile.close()
+					os_system("echo '%s' > %s" % (tmpdata,bookmarkfile))
+
+				#self.session.openWithCallback(self.Exit, MessageBox, _("Bookmark deleted!"), MessageBox.TYPE_INFO, timeout=5)
+				self.Exit()
+			elif selection[1] == "viewbookmarks":
+				self.session.open(MultiMediathek, self.movieinfo[5], "Bookmarks", "Bookmarks from your favorite Movies")
+			elif selection[1] == "settingsmenu":
+				self.session.openWithCallback(self.Exit, MultiMediathek_Settings)
+			else:
+				self.Exit()
+		else:
+			self.Exit()
+
+	def Exit(self, retval=None):
+		self.close()
+
+#------------------------------------------------------------------------------------------
+
 class MultiMediathek_Settings(Screen, ConfigListScreen):
 	skin = """
