X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a6dfff23d0d29b636120a3e6fdd845fb2f4117b4..25a66e5ff609eeb03907030f16c408197b646ecc:/lib/python/Plugins/Extensions/DVDBurn/Process.py diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 0fcbab04..b8a3788e 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -1,4 +1,5 @@ -from Components.Task import Task, Job, job_manager, DiskspacePrecondition, Condition, ToolExistsPrecondition +from Components.Task import Task, Job, DiskspacePrecondition, Condition, ToolExistsPrecondition +from Components.Harddisk import harddiskmanager from Screens.MessageBox import MessageBox class png2yuvTask(Task): @@ -7,11 +8,11 @@ class png2yuvTask(Task): self.setTool("/usr/bin/png2yuv") self.args += ["-n1", "-Ip", "-f25", "-j", inputfile] self.dumpFile = outputfile - self.weighting = 10 + self.weighting = 15 def run(self, callback, task_progress_changed): Task.run(self, callback, task_progress_changed) - self.container.stdoutAvail.get().remove(self.processStdout) + self.container.stdoutAvail.remove(self.processStdout) self.container.dumpToFile(self.dumpFile) def processStderr(self, data): @@ -23,7 +24,7 @@ class mpeg2encTask(Task): self.setTool("/usr/bin/mpeg2enc") self.args += ["-f8", "-np", "-a2", "-o", outputfile] self.inputFile = inputfile - self.weighting = 10 + self.weighting = 25 def run(self, callback, task_progress_changed): Task.run(self, callback, task_progress_changed) @@ -39,11 +40,11 @@ class spumuxTask(Task): self.args += [xmlfile] self.inputFile = inputfile self.dumpFile = outputfile - self.weighting = 10 + self.weighting = 15 def run(self, callback, task_progress_changed): Task.run(self, callback, task_progress_changed) - self.container.stdoutAvail.get().remove(self.processStdout) + self.container.stdoutAvail.remove(self.processStdout) self.container.dumpToFile(self.dumpFile) self.container.readFromFile(self.inputFile) @@ -76,7 +77,7 @@ class CopyMeta(Task): if file.startswith(filename+"."): self.args += [path+'/'+file] self.args += [self.job.workspace] - self.weighting = 10 + self.weighting = 15 class DemuxTask(Task): def __init__(self, job, inputfile): @@ -167,9 +168,9 @@ class MplexTaskPostcondition(Condition): class MplexTask(Task): ERROR_UNDERRUN, ERROR_UNKNOWN = range(2) - def __init__(self, job, outputfile, inputfiles=None, demux_task=None): + def __init__(self, job, outputfile, inputfiles=None, demux_task=None, weighting = 500): Task.__init__(self, job, "Mux ES into PS") - self.weighting = 500 + self.weighting = weighting self.demux_task = demux_task self.postconditions.append(MplexTaskPostcondition()) self.setTool("/usr/bin/mplex") @@ -201,6 +202,7 @@ class RemoveESFiles(Task): Task.__init__(self, job, "Remove temp. files") self.demux_task = demux_task self.setTool("/bin/rm") + self.weighting = 10 def prepare(self): self.args += ["-f"] @@ -208,10 +210,8 @@ class RemoveESFiles(Task): self.args += [self.demux_task.cutfile] class DVDAuthorTask(Task): - def __init__(self, job, diskspaceNeeded): + def __init__(self, job): Task.__init__(self, job, "Authoring DVD") - - self.global_preconditions.append(DiskspacePrecondition(diskspaceNeeded)) self.weighting = 300 self.setTool("/usr/bin/dvdauthor") self.CWD = self.job.workspace @@ -256,27 +256,14 @@ class BurnTaskPostcondition(Condition): class BurnTask(Task): ERROR_NOTWRITEABLE, ERROR_LOAD, ERROR_SIZE, ERROR_WRITE_FAILED, ERROR_DVDROM, ERROR_ISOFS, ERROR_UNKNOWN = range(7) - def __init__(self, job, extra_args=[]): - Task.__init__(self, job, _("Burn to DVD...")) - + def __init__(self, job, extra_args=[], tool="/bin/growisofs"): + Task.__init__(self, job, job.name) self.weighting = 500 self.end = 120 # 100 for writing, 10 for buffer flush, 10 for closing disc self.postconditions.append(BurnTaskPostcondition()) - self.setTool("/bin/growisofs") - volName = self.getASCIIname(job.project.settings.name.getValue()) - self.args += [ "-dvd-compat", "-Z", "/dev/cdroms/cdrom0", "-V", volName, "-publisher", "Dreambox", "-use-the-force-luke=dummy" ] + self.setTool(tool) self.args += extra_args - self.args += [ self.job.workspace + "/dvd" ] - - def getASCIIname(self, name): - ASCIIname = "" - for char in name.decode("utf-8").encode("ascii","replace"): - if ord(char) <= 0x20 or ( ord(char) >= 0x3a and ord(char) <= 0x40 ): - ASCIIname += '_' - else: - ASCIIname += char - return ASCIIname - + def prepare(self): self.error = None @@ -303,7 +290,7 @@ class BurnTask(Task): self.error = self.ERROR_SIZE elif line.find("write failed") != -1: self.error = self.ERROR_WRITE_FAILED - elif line.find("unable to open64(\"/dev/cdroms/cdrom0\",O_RDONLY): No such file or directory") != -1: # fixme + elif line.find("unable to open64(") != -1 and line.find(",O_RDONLY): No such file or directory") != -1: self.error = self.ERROR_DVDROM elif line.find("media is not recognized as recordable DVD") != -1: self.error = self.ERROR_NOTWRITEABLE @@ -322,12 +309,37 @@ class RemoveDVDFolder(Task): Task.__init__(self, job, "Remove temp. files") self.setTool("/bin/rm") self.args += ["-rf", self.job.workspace] + self.weighting = 10 -class PreviewTask(Task): +class CheckDiskspaceTask(Task): def __init__(self, job): + Task.__init__(self, job, "Checking free space") + totalsize = 50*1024*1024 # require an extra safety 50 MB + maxsize = 0 + for title in job.project.titles: + titlesize = title.estimatedDiskspace + if titlesize > maxsize: maxsize = titlesize + totalsize += titlesize + diskSpaceNeeded = totalsize + maxsize + self.global_preconditions.append(DiskspacePrecondition(diskSpaceNeeded)) + self.weighting = 5 + + def run(self, callback, task_progress_changed): + failed_preconditions = self.checkPreconditions(True) + self.checkPreconditions(False) + if len(failed_preconditions): + callback(self, failed_preconditions) + return + self.callback = callback + self.task_progress_changed = task_progress_changed + Task.processFinished(self, 0) + +class PreviewTask(Task): + def __init__(self, job, path): Task.__init__(self, job, "Preview") self.postconditions.append(PreviewTaskPostcondition()) self.job = job + self.path = path + self.weighting = 10 def run(self, callback, task_progress_changed): self.callback = callback @@ -335,7 +347,11 @@ class PreviewTask(Task): if self.job.menupreview: self.previewProject() else: - self.job.project.session.openWithCallback(self.previewCB, MessageBox, _("Do you want to preview this DVD before burning?"), timeout = 60, default = False) + from Tools import Notifications + Notifications.AddNotificationWithCallback(self.previewCB, MessageBox, _("Do you want to preview this DVD before burning?"), timeout = 60, default = False) + + def abort(self): + self.finish(aborted = True) def previewCB(self, answer): if answer == True: @@ -347,17 +363,18 @@ class PreviewTask(Task): if self.job.menupreview: self.closedCB(True) else: - self.job.project.session.openWithCallback(self.closedCB, MessageBox, _("Do you want to burn this collection to DVD medium?") ) + from Tools import Notifications + Notifications.AddNotificationWithCallback(self.closedCB, MessageBox, _("Do you want to burn this collection to DVD medium?") ) def closedCB(self, answer): if answer == True: Task.processFinished(self, 0) else: Task.processFinished(self, 1) - + def previewProject(self): from Plugins.Extensions.DVDPlayer.plugin import DVDPlayer - self.job.project.session.openWithCallback(self.playerClosed, DVDPlayer, dvd_filelist= [ self.job.project.workspace + "/dvd/VIDEO_TS/" ]) + self.job.project.session.openWithCallback(self.playerClosed, DVDPlayer, dvd_filelist= [ self.path ]) class PreviewTaskPostcondition(Condition): def check(self, task): @@ -392,7 +409,7 @@ class ImagingPostcondition(Condition): return task.returncode == 0 def getErrorMessage(self, task): - return "python-imaging " + _("failed") + return _("Failed") + ": python-imaging" class ImagePrepareTask(Task): def __init__(self, job): @@ -430,7 +447,7 @@ class MenuImageTask(Task): def __init__(self, job, menu_count, spuxmlfilename, menubgpngfilename, highlightpngfilename): Task.__init__(self, job, "Create Menu %d Image" % menu_count) self.postconditions.append(ImagingPostcondition()) - self.weighting = 20 + self.weighting = 10 self.job = job self.Menus = job.Menus self.menu_count = menu_count @@ -560,7 +577,7 @@ class Menus: mpeg2encTask(job, job.workspace+"/dvdmenubg"+num+".yuv", menubgm2vfilename) menubgmpgfilename = job.workspace+"/dvdmenubg"+num+".mpg" menuaudiofilename = s.menuaudio.getValue() - MplexTask(job, outputfile=menubgmpgfilename, inputfiles = [menubgm2vfilename, menuaudiofilename]) + MplexTask(job, outputfile=menubgmpgfilename, inputfiles = [menubgm2vfilename, menuaudiofilename], weighting = 20) menuoutputfilename = job.workspace+"/dvdmenu"+num+".mpg" spumuxTask(job, spuxmlfilename, menubgmpgfilename, menuoutputfilename) @@ -634,9 +651,18 @@ def CreateAuthoringXML(job): f.write(x) f.close() +def getISOfilename(isopath, volName): + from Tools.Directories import fileExists + i = 0 + filename = isopath+'/'+volName+".iso" + while fileExists(filename): + i = i+1 + filename = isopath+'/'+volName + str(i).zfill(3) + ".iso" + return filename + class DVDJob(Job): def __init__(self, project, menupreview=False): - Job.__init__(self, _("Burn DVD")) + Job.__init__(self, "DVDBurn Job") self.project = project from time import strftime from Tools.Directories import SCOPE_HDD, resolveFilename, createDir @@ -648,24 +674,17 @@ class DVDJob(Job): self.conduct() def conduct(self): + CheckDiskspaceTask(self) if self.project.settings.authormode.getValue().startswith("menu") or self.menupreview: Menus(self) CreateAuthoringXML(self) - totalsize = 50*1024*1024 # require an extra safety 50 MB - maxsize = 0 - for title in self.project.titles: - titlesize = title.estimatedDiskspace - if titlesize > maxsize: maxsize = titlesize - totalsize += titlesize - diskSpaceNeeded = totalsize + maxsize - - DVDAuthorTask(self, diskSpaceNeeded) + DVDAuthorTask(self) nr_titles = len(self.project.titles) - + if self.menupreview: - PreviewTask(self) + PreviewTask(self, self.workspace + "/dvd/VIDEO_TS/") else: for self.i in range(nr_titles): title = self.project.titles[self.i] @@ -676,8 +695,20 @@ class DVDJob(Job): MplexTask(self, outputfile=title_filename, demux_task=demux) RemoveESFiles(self, demux) WaitForResidentTasks(self) - PreviewTask(self) - BurnTask(self,["-dvd-video"]) + PreviewTask(self, self.workspace + "/dvd/VIDEO_TS/") + output = self.project.settings.output.getValue() + volName = self.project.settings.name.getValue() + if output == "dvd": + self.name = _("Burn DVD") + tool = "/bin/growisofs" + burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat", "-use-the-force-luke=dummy" ] + elif output == "iso": + self.name = _("Create DVD-ISO") + tool = "/usr/bin/mkisofs" + isopathfile = getISOfilename(self.project.settings.isopath.getValue(), volName) + burnargs = [ "-o", isopathfile ] + burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, self.workspace + "/dvd" ] + BurnTask(self, burnargs, tool) RemoveDVDFolder(self) class DVDdataJob(Job): @@ -693,31 +724,49 @@ class DVDdataJob(Job): self.conduct() def conduct(self): - diskSpaceNeeded = 50*1024*1024 # require an extra safety 50 MB - for title in self.project.titles: - diskSpaceNeeded += title.filesize + if self.project.settings.output.getValue() == "iso": + CheckDiskspaceTask(self) nr_titles = len(self.project.titles) - for self.i in range(nr_titles): title = self.project.titles[self.i] filename = title.inputfile.rstrip("/").rsplit("/",1)[1] link_name = self.workspace + filename LinkTS(self, title.inputfile, link_name) CopyMeta(self, title.inputfile) - BurnTask(self) - RemoveDVDFolder(self) - -def Burn(session, project): - j = DVDJob(project) - job_manager.AddJob(j) - return j -def PreviewMenu(session, project): - j = DVDJob(project, menupreview=True) - job_manager.AddJob(j) - return j + output = self.project.settings.output.getValue() + volName = self.project.settings.name.getValue() + tool = "/bin/growisofs" + if output == "dvd": + self.name = _("Burn DVD") + burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat", "-use-the-force-luke=dummy" ] + elif output == "iso": + tool = "/usr/bin/mkisofs" + self.name = _("Create DVD-ISO") + isopathfile = getISOfilename(self.project.settings.isopath.getValue(), volName) + burnargs = [ "-o", isopathfile ] + if self.project.settings.dataformat.getValue() == "iso9660_1": + burnargs += ["-iso-level", "1" ] + elif self.project.settings.dataformat.getValue() == "iso9660_4": + burnargs += ["-iso-level", "4", "-allow-limited-size" ] + elif self.project.settings.dataformat.getValue() == "udf": + burnargs += ["-udf", "-allow-limited-size" ] + burnargs += [ "-publisher", "Dreambox", "-V", volName, "-follow-links", self.workspace ] + BurnTask(self, burnargs, tool) + RemoveDVDFolder(self) -def BurnDataTS(session, project): - j = DVDdataJob(project) - job_manager.AddJob(j) - return j +class DVDisoJob(Job): + def __init__(self, project, imagepath): + Job.__init__(self, _("Burn DVD")) + self.project = project + self.menupreview = False + if imagepath.endswith(".iso"): + PreviewTask(self, imagepath) + burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD() + '='+imagepath, "-dvd-compat", "-use-the-force-luke=dummy" ] + else: + PreviewTask(self, imagepath + "/VIDEO_TS/") + volName = self.project.settings.name.getValue() + burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat", "-use-the-force-luke=dummy" ] + burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, imagepath ] + tool = "/bin/growisofs" + BurnTask(self, burnargs, tool)