X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/22f47520b40121bbb98e9098232771a178e7d523..519da68556638c7502a4f679f859e6032e258421:/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py index 9d75621d..ce16259e 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py @@ -7,6 +7,9 @@ from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress from Components.Task import Task, Job, job_manager, Condition from Components.ScrollLabel import ScrollLabel +from Components.Harddisk import harddiskmanager +from Components.Console import Console +from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier class DVDToolbox(Screen): skin = """ @@ -25,9 +28,8 @@ class DVDToolbox(Screen): """ - def __init__(self, session, project = None): + def __init__(self, session): Screen.__init__(self, session) - self.project = project self["key_red"] = StaticText(_("Exit")) self["key_green"] = StaticText(_("Update")) @@ -42,17 +44,18 @@ class DVDToolbox(Screen): self["details"] = ScrollLabel() self["info"] = StaticText() - self["toolboxactions"] = ActionMap(["ColorActions", "DVDToolbox"], + self["toolboxactions"] = ActionMap(["ColorActions", "DVDToolbox", "OkCancelActions"], { - "red": self.close, + "red": self.exit, "green": self.update, "yellow": self.format, #"blue": self.eject, - "cancel": self.close, + "cancel": self.exit, "pageUp": self.pageUp, "pageDown": self.pageDown }) self.update() + hotplugNotifier.append(self.update) def pageUp(self): self["details"].pageUp() @@ -60,23 +63,33 @@ class DVDToolbox(Screen): def pageDown(self): self["details"].pageDown() - def update(self): + def update(self, dev="", action=""): self["space_label"].text = _("Please wait... Loading list...") self["info"].text = "" self["details"].setText("") - self.mediuminfo = [ ] - job = DVDinfoJob(self) - job_manager.AddJob(job) - - def infoJobCB(self): + self.Console = Console() + cmd = "/bin/dvd+rw-mediainfo /dev/" + harddiskmanager.getCD() + self.Console.ePopen(cmd, self.mediainfoCB) + + def format(self): + if self.formattable: + job = DVDformatJob(self) + job_manager.AddJob(job) + from Screens.TaskView import JobView + self.session.openWithCallback(self.formatCB, JobView, job) + + def formatCB(self, in_background): + self.update() + + def mediainfoCB(self, mediuminfo, retval, extra_args): capacity = 1 used = 0 infotext = "" mediatype = "" - for line in self.mediuminfo: + for line in mediuminfo.splitlines(): if line.find("Mounted Media:") > -1: - mediatype = line.rsplit(',',1)[1][1:-1] - if mediatype.find("RW") > 0: + mediatype = line.rsplit(',',1)[1][1:] + if mediatype.find("RW") > 0 or mediatype.find("RAM") > 0: self.formattable = True else: self.formattable = False @@ -94,21 +107,31 @@ class DVDToolbox(Screen): print "[Disc status] capacity=%d, used=0" % (capacity) capacity = used used = 0 - infotext += line + elif line.find("Free Blocks:") > -1: + try: + size = eval(line[14:].replace("KB","*1024")) + except: + size = 0 + if size > 0: + capacity = size / 1048576 + if used: + used = capacity-used + print "[free blocks] capacity=%d, used=%d" % (capacity, used) + infotext += line+'\n' self["details"].setText(infotext) if self.formattable: self["key_yellow"].text = _("Format") else: self["key_yellow"].text = "" - percent = 100 * used / capacity + percent = 100 * used / (capacity or 1) if capacity > 4600: - self["space_label"].text = "%d / %d MB" % (used, capacity) + " (%.2f%% " % percent + _("of a DUAL layer medium used.)") + self["space_label"].text = "%d / %d MB" % (used, capacity) + " (%.2f%% " % percent + _("of a DUAL layer medium used.") + ")" self["space_bar"].value = int(percent) elif capacity > 1: - self["space_label"].text = "%d / %d MB" % (used, capacity) + " (%.2f%% " % percent + _("of a SINGLE layer medium used.)") + self["space_label"].text = "%d / %d MB" % (used, capacity) + " (%.2f%% " % percent + _("of a SINGLE layer medium used.") + ")" self["space_bar"].value = int(percent) elif capacity == 1 and used > 0: - self["space_label"].text = "%d MB" % (used) + _(" on READ ONLY medium.") + self["space_label"].text = "%d MB " % (used) + _("on READ ONLY medium.") self["space_bar"].value = int(percent) else: self["space_label"].text = _("Medium is not a writeable DVD!") @@ -118,12 +141,10 @@ class DVDToolbox(Screen): free = 0 self["info"].text = "Media-Type:\t\t%s\nFree capacity:\t\t%d MB" % (mediatype or "NO DVD", free) - def format(self): - if self.formattable: - job = DVDformatJob(self) - job_manager.AddJob(job) - from Screens.TaskView import JobView - self.session.openWithCallback(self.infoJobCB, JobView, job) + def exit(self): + del self.Console + hotplugNotifier.remove(self.update) + self.close() class DVDformatJob(Job): def __init__(self, toolbox): @@ -132,7 +153,7 @@ class DVDformatJob(Job): DVDformatTask(self) def retry(self): - self.tasks[0].args += [ "-force" ] + self.tasks[0].args += self.tasks[0].retryargs Job.retry(self) class DVDformatTaskPostcondition(Condition): @@ -154,8 +175,9 @@ class DVDformatTask(Task): self.toolbox = job.toolbox self.postconditions.append(DVDformatTaskPostcondition()) self.setTool("/bin/dvd+rw-format") - self.args += [ "/dev/cdroms/cdrom0" ] + self.args += [ "/dev/" + harddiskmanager.getCD() ] self.end = 1100 + self.retryargs = [ ] def prepare(self): self.error = None @@ -163,7 +185,10 @@ class DVDformatTask(Task): def processOutputLine(self, line): if line.startswith("- media is already formatted"): self.error = self.ERROR_ALREADYFORMATTED - self.force = True + self.retryargs = [ "-force" ] + if line.startswith("- media is not blank") or line.startswith(" -format=full to perform full (lengthy) reformat;"): + self.error = self.ERROR_ALREADYFORMATTED + self.retryargs = [ "-blank" ] if line.startswith(":-( mounted media doesn't appear to be"): self.error = self.ERROR_NOTWRITEABLE @@ -174,39 +199,3 @@ class DVDformatTask(Task): self.progress = int(float(data[:-1])*10) else: Task.processOutput(self, data) - -class DVDinfoJob(Job): - def __init__(self, toolbox): - Job.__init__(self, "DVD media toolbox") - self.toolbox = toolbox - DVDinfoTask(self) - -class DVDinfoTaskPostcondition(Condition): - RECOVERABLE = True - def check(self, task): - return task.error is None - - def getErrorMessage(self, task): - return { - task.ERROR_UNKNOWN: _("An unknown error occured!") - }[task.error] - -class DVDinfoTask(Task): - ERROR_UNKNOWN = range(1) - def __init__(self, job, extra_args=[]): - Task.__init__(self, job, ("mediainfo")) - self.toolbox = job.toolbox - self.postconditions.append(DVDinfoTaskPostcondition()) - self.setTool("/bin/dvd+rw-mediainfo") - self.args += [ "/dev/cdroms/cdrom0" ] - - def prepare(self): - self.error = None - - def processOutputLine(self, line): - print "[DVDinfoTask]", line[:-1] - self.toolbox.mediuminfo.append(line) - - def processFinished(self, returncode): - Task.processFinished(self, returncode) - self.toolbox.infoJobCB()