From: Andreas Frisch Date: Fri, 26 Sep 2008 14:59:02 +0000 (+0000) Subject: Add DVDToolbox for DVD medium info and RW formatting X-Git-Tag: 2.6.0~846 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/22f47520b40121bbb98e9098232771a178e7d523 Add DVDToolbox for DVD medium info and RW formatting --- diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py new file mode 100644 index 00000000..9d75621d --- /dev/null +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDToolbox.py @@ -0,0 +1,212 @@ +from Screens.Screen import Screen +from Screens.MessageBox import MessageBox +from Screens.HelpMenu import HelpableScreen +from Components.ActionMap import HelpableActionMap, ActionMap +from Components.Sources.List import List +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 + +class DVDToolbox(Screen): + skin = """ + + + + + + + + + + + + + + """ + + def __init__(self, session, project = None): + Screen.__init__(self, session) + self.project = project + + self["key_red"] = StaticText(_("Exit")) + self["key_green"] = StaticText(_("Update")) + self["key_yellow"] = StaticText() + self["key_blue"] = StaticText() + + self["space_label"] = StaticText() + self["space_bar"] = Progress() + + self.mediuminfo = [ ] + self.formattable = False + self["details"] = ScrollLabel() + self["info"] = StaticText() + + self["toolboxactions"] = ActionMap(["ColorActions", "DVDToolbox"], + { + "red": self.close, + "green": self.update, + "yellow": self.format, + #"blue": self.eject, + "cancel": self.close, + "pageUp": self.pageUp, + "pageDown": self.pageDown + }) + self.update() + + def pageUp(self): + self["details"].pageUp() + + def pageDown(self): + self["details"].pageDown() + + def update(self): + 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): + capacity = 1 + used = 0 + infotext = "" + mediatype = "" + for line in self.mediuminfo: + if line.find("Mounted Media:") > -1: + mediatype = line.rsplit(',',1)[1][1:-1] + if mediatype.find("RW") > 0: + self.formattable = True + else: + self.formattable = False + if line.find("Legacy lead-out at:") > -1: + used = int(line.rsplit('=',1)[1]) / 1048576.0 + print "[lead out] used =", used + elif line.find("formatted:") > -1: + capacity = int(line.rsplit('=',1)[1]) / 1048576.0 + print "[formatted] capacity =", capacity + elif capacity == 1 and line.find("READ CAPACITY:") > -1: + capacity = int(line.rsplit('=',1)[1]) / 1048576.0 + print "[READ CAP] capacity =", capacity + elif line.find("Disc status:") > -1: + if line.find("blank") > -1: + print "[Disc status] capacity=%d, used=0" % (capacity) + capacity = used + used = 0 + infotext += line + self["details"].setText(infotext) + if self.formattable: + self["key_yellow"].text = _("Format") + else: + self["key_yellow"].text = "" + percent = 100 * used / capacity + if capacity > 4600: + 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_bar"].value = int(percent) + elif capacity == 1 and used > 0: + 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!") + self["space_bar"].value = 0 + free = capacity-used + if free < 2: + 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) + +class DVDformatJob(Job): + def __init__(self, toolbox): + Job.__init__(self, _("DVD media toolbox")) + self.toolbox = toolbox + DVDformatTask(self) + + def retry(self): + self.tasks[0].args += [ "-force" ] + Job.retry(self) + +class DVDformatTaskPostcondition(Condition): + RECOVERABLE = True + def check(self, task): + return task.error is None + + def getErrorMessage(self, task): + return { + task.ERROR_ALREADYFORMATTED: _("This DVD RW medium is already formatted - reformatting will erase all content on the disc."), + task.ERROR_NOTWRITEABLE: _("Medium is not a writeable DVD!"), + task.ERROR_UNKNOWN: _("An unknown error occured!") + }[task.error] + +class DVDformatTask(Task): + ERROR_ALREADYFORMATTED, ERROR_NOTWRITEABLE, ERROR_UNKNOWN = range(3) + def __init__(self, job, extra_args=[]): + Task.__init__(self, job, ("RW medium format")) + self.toolbox = job.toolbox + self.postconditions.append(DVDformatTaskPostcondition()) + self.setTool("/bin/dvd+rw-format") + self.args += [ "/dev/cdroms/cdrom0" ] + self.end = 1100 + + def prepare(self): + self.error = None + + def processOutputLine(self, line): + if line.startswith("- media is already formatted"): + self.error = self.ERROR_ALREADYFORMATTED + self.force = True + if line.startswith(":-( mounted media doesn't appear to be"): + self.error = self.ERROR_NOTWRITEABLE + + def processOutput(self, data): + print "[DVDformatTask processOutput] ", data + if data.endswith('%'): + data= data.replace('\x08','') + 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() diff --git a/lib/python/Plugins/Extensions/DVDBurn/Makefile.am b/lib/python/Plugins/Extensions/DVDBurn/Makefile.am index 3b2f4484..d5c558d1 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Makefile.am +++ b/lib/python/Plugins/Extensions/DVDBurn/Makefile.am @@ -3,7 +3,7 @@ installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/DVDBurn install_PYTHON = \ __init__.py \ plugin.py \ - DVDProject.py DVDTitle.py TitleCutter.py TitleList.py Process.py ProjectSettings.py + DVDProject.py DVDTitle.py TitleCutter.py TitleList.py Process.py ProjectSettings.py DVDToolbox.py install_DATA = *.xml *.jpg *.mpg *.mp2 diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py index 197ab5bf..92fac1bb 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py @@ -1,4 +1,4 @@ -import DVDProject, TitleList, TitleCutter, ProjectSettings +import DVDProject, TitleList, TitleCutter, ProjectSettings, DVDToolbox from Screens.Screen import Screen from Screens.ChoiceBox import ChoiceBox from Screens.InputBox import InputBox @@ -77,6 +77,7 @@ class TitleList(Screen): menu = [] menu.append((_("Burn DVD"), "burn")); menu.append((_("Preview menu"), "previewMenu")); + menu.append((_("DVD media toolbox"), "toolbox")); menu.append((_("Collection settings"), "settings")); menu.append((_("Add a new title"), "addtitle")); menu.append((_("Remove title"), "removetitle")); @@ -93,6 +94,8 @@ class TitleList(Screen): self.addTitle() elif choice[1] == "edittitle": self.editTitle() + elif choice[1] == "toolbox": + self.toolbox() elif choice[1] == "settings": self.settings() elif choice[1] == "previewMenu": @@ -158,6 +161,9 @@ class TitleList(Screen): self.project.titles.remove(title) self.updateTitleList() + def toolbox(self): + self.session.open(DVDToolbox.DVDToolbox, self.project) + def settings(self): self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project) diff --git a/lib/python/Plugins/Extensions/DVDBurn/keymap.xml b/lib/python/Plugins/Extensions/DVDBurn/keymap.xml index 2727e2b8..13fa3ee0 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/keymap.xml +++ b/lib/python/Plugins/Extensions/DVDBurn/keymap.xml @@ -8,4 +8,12 @@ + + + + + + + +