From e06c6d202696d83a3017861fc690ee3d75750f13 Mon Sep 17 00:00:00 2001 From: Andreas Frisch Date: Tue, 16 Sep 2008 08:53:43 +0000 Subject: [PATCH 1/1] allow burning videos (also H.264) to data DVDs --- .../Plugins/Extensions/DVDBurn/DVDProject.py | 2 +- .../Plugins/Extensions/DVDBurn/DVDTitle.py | 1 + .../Plugins/Extensions/DVDBurn/Process.py | 52 +++++++++++++++- .../Extensions/DVDBurn/ProjectSettings.py | 59 +++++++++++++------ .../Plugins/Extensions/DVDBurn/TitleCutter.py | 6 +- .../Plugins/Extensions/DVDBurn/TitleList.py | 35 +++++++---- 6 files changed, 117 insertions(+), 38 deletions(-) diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py index 6aae5ba4..73a2de57 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py @@ -32,7 +32,7 @@ class DVDProject: self.target = None self.settings = ConfigSubsection() self.settings.name = ConfigText(fixed_size = False, visible_width = 40) - self.settings.authormode = ConfigSelection(choices = [("menu_linked", _("Linked titles with a DVD menu")), ("just_linked", _("Direct playback of linked titles without menu")), ("menu_seperate", _("Seperate titles with a main menu")), ]) + self.settings.authormode = ConfigSelection(choices = [("menu_linked", _("Linked titles with a DVD menu")), ("just_linked", _("Direct playback of linked titles without menu")), ("menu_seperate", _("Seperate titles with a main menu")), ("data_ts", _("Dreambox format data DVD (HDTV compatible)"))]) self.settings.menubg = ConfigFilename() self.settings.menuaudio = ConfigFilename() self.settings.titleformat = ConfigText(fixed_size = False, visible_width = 40) diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py index 67b410ce..bfa2af54 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py @@ -11,6 +11,7 @@ class DVDTitle: self.chaptermarks = [ ] self.audiotracks = [ ] self.timeCreate = None + self.sVideoType = -1 def addService(self, service): from os import path diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index 913e7935..1851d870 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -65,6 +65,19 @@ class LinkTS(Task): self.args += ["-s", sourcefile, link_name] self.weighting = 10 +class CopyMeta(Task): + def __init__(self, job, sourcefile): + Task.__init__(self, job, "Copy title meta files") + self.setTool("/bin/cp") + from os import listdir + path, filename = sourcefile.rstrip("/").rsplit("/",1) + tsfiles = listdir(path) + for file in tsfiles: + if file.startswith(filename+"."): + self.args += [path+'/'+file] + self.args += [self.job.workspace] + self.weighting = 10 + class DemuxTask(Task): def __init__(self, job, inputfile): Task.__init__(self, job, "Demux video into ES") @@ -243,7 +256,7 @@ class BurnTaskPostcondition(Condition): class BurnTask(Task): ERROR_MEDIA, ERROR_SIZE, ERROR_WRITE_FAILED, ERROR_DVDROM, ERROR_ISOFS, ERROR_UNKNOWN = range(6) - def __init__(self, job): + def __init__(self, job, extra_args=[]): Task.__init__(self, job, "burn") self.weighting = 500 @@ -251,7 +264,8 @@ class BurnTask(Task): self.postconditions.append(BurnTaskPostcondition()) self.setTool("/bin/growisofs") volName = self.getASCIIname(job.project.settings.name.getValue()) - self.args += ["-dvd-video", "-dvd-compat", "-Z", "/dev/cdroms/cdrom0", "-V", volName, "-P", "Dreambox", "-use-the-force-luke=dummy", self.job.workspace + "/dvd"] + self.args += ["-dvd-compat", "-Z", "/dev/cdroms/cdrom0", "-V", volName, "-P", "Dreambox", "-use-the-force-luke=dummy", self.job.workspace + "/dvd"] + self.args += extra_args def getASCIIname(self, name): ASCIIname = "" @@ -619,7 +633,34 @@ class DVDJob(Job): RemoveESFiles(self, demux) WaitForResidentTasks(self) PreviewTask(self) - BurnTask(self) + BurnTask(self,["-dvd-video"]) + RemoveDVDFolder(self) + +class DVDdataJob(Job): + def __init__(self, project): + Job.__init__(self, "Data DVD Burn") + self.project = project + from time import strftime + from Tools.Directories import SCOPE_HDD, resolveFilename, createDir + new_workspace = resolveFilename(SCOPE_HDD) + "tmp/" + strftime("%Y%m%d%H%M%S") + "/dvd/" + createDir(new_workspace, True) + self.workspace = new_workspace + self.project.workspace = self.workspace + self.conduct() + + def conduct(self): + diskSpaceNeeded = 50*1024*1024 # require an extra safety 50 MB + for title in self.project.titles: + diskSpaceNeeded += title.filesize + 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): @@ -631,3 +672,8 @@ def PreviewMenu(session, project): j = DVDJob(project, menupreview=True) job_manager.AddJob(j) return j + +def BurnDataTS(session, project): + j = DVDdataJob(project) + job_manager.AddJob(j) + return j \ No newline at end of file diff --git a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py index fc8672c5..0dd77c2c 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py +++ b/lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py @@ -110,23 +110,9 @@ class ProjectSettings(Screen,ConfigListScreen): self["info"] = StaticText(infotext) self.settings = project.settings - self.list = [] - self.list.append(getConfigListEntry(_("Collection name"), self.settings.name)) - self.list.append(getConfigListEntry(_("Authoring mode"), self.settings.authormode)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("background image"), self.settings.menubg)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("Title"), self.settings.titleformat)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("Subtitles"), self.settings.subtitleformat)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("headline")+' '+_("color"), self.settings.color_headline)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("text")+' '+_("color"), self.settings.color_button)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("highlighted button")+' '+_("color"), self.settings.color_highlight)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("font face"), self.settings.font_face)) - self.list.append(getConfigListEntry(_("Font size")+' ('+_("headline")+', '+_("Title")+', '+_("Subtitles")+')', self.settings.font_size)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("spaces (top, between rows, left)"), self.settings.space)) - self.list.append(getConfigListEntry(_("Menu")+' '+_("Audio"), self.settings.menuaudio)) - self.list.append(getConfigListEntry(_("VMGM (intro trailer)"), self.settings.vmgm)) - self.list.append(getConfigListEntry(_("Auto chapter split every ? minutes (0=never)"), self.settings.autochapter)) - ConfigListScreen.__init__(self, self.list) - + ConfigListScreen.__init__(self, []) + self.initConfigList(self.settings.authormode.getValue()) + self.keydict = {} for key, val in self.settings.dict().iteritems(): self.keydict[val] = key @@ -140,7 +126,42 @@ class ProjectSettings(Screen,ConfigListScreen): "cancel": self.cancel, "ok": self.ok, }, -2) - + + def changedConfigList(self): + if self.keydict[self["config"].getCurrent()[1]] == "authormode": + self.initConfigList(self.settings.authormode.getValue()) + + def initConfigList(self, authormode=""): + print "initConfigList(%s)" % authormode + self.list = [] + self.list.append(getConfigListEntry(_("Collection name"), self.settings.name)) + self.list.append(getConfigListEntry(_("Authoring mode"), self.settings.authormode)) + if authormode.startswith("menu"): + self.list.append(getConfigListEntry(_("Menu")+' '+_("background image"), self.settings.menubg)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("Title"), self.settings.titleformat)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("Subtitles"), self.settings.subtitleformat)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("headline")+' '+_("color"), self.settings.color_headline)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("text")+' '+_("color"), self.settings.color_button)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("highlighted button")+' '+_("color"), self.settings.color_highlight)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("font face"), self.settings.font_face)) + self.list.append(getConfigListEntry(_("Font size")+' ('+_("headline")+', '+_("Title")+', '+_("Subtitles")+')', self.settings.font_size)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("spaces (top, between rows, left)"), self.settings.space)) + self.list.append(getConfigListEntry(_("Menu")+' '+_("Audio"), self.settings.menuaudio)) + if authormode != "data_ts": + self.list.append(getConfigListEntry(_("VMGM (intro trailer)"), self.settings.vmgm)) + self.list.append(getConfigListEntry(_("Auto chapter split every ? minutes (0=never)"), self.settings.autochapter)) + self["config"].setList(self.list) + + def keyLeft(self): + ConfigListScreen.keyLeft(self) + if self.keydict[self["config"].getCurrent()[1]] == "authormode": + self.initConfigList(self.settings.authormode.getValue()) + + def keyRight(self): + ConfigListScreen.keyRight(self) + if self.keydict[self["config"].getCurrent()[1]] == "authormode": + self.initConfigList(self.settings.authormode.getValue()) + def exit(self): self.applySettings() self.close(True) @@ -162,7 +183,7 @@ class ProjectSettings(Screen,ConfigListScreen): def saveProject(self): self.applySettings() - ret = self.project.saveProject(resolveFilename(SCOPE_PLAYLIST)) + ret = self.project.saveProject(resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/") if ret.startswith: text = _("Save")+' '+_('OK')+':\n'+ret self.session.open(MessageBox,text,type = MessageBox.TYPE_INFO) diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py index 016eb71f..ce6bce96 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py @@ -28,10 +28,8 @@ class TitleCutter(CutListEditor): description = "MP2" self.t.audiotracks.append((language, description)) print "[DVDBurn getAudioTracks]", self.t.audiotracks - sVideoType = service.info().getInfo(iServiceInformation.sVideoType) - print "[DVDBurn getVideoType]", sVideoType - if sVideoType != 0: - self.close(False) + self.t.sVideoType = service.info().getInfo(iServiceInformation.sVideoType) + print "[DVDBurn getVideoType]", self.t.sVideoType def exit(self): self.session.nav.stopService() diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py index f4467707..353efe67 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py @@ -161,11 +161,17 @@ class TitleList(Screen): return False def burnProject(self): - autochapter = self.project.settings.autochapter.getValue() - if autochapter > 0: - for title in self.project.titles: - title.produceAutoChapter(autochapter) - self.project.waitboxref = self.project.session.open(ProjectSettings.WaitBox,self.burnProjectCB) + if self.project.settings.authormode.getValue() == "data_ts": + import Process + job = Process.BurnDataTS(self.session, self.project) + from Screens.TaskView import JobView + self.session.open(JobView, job) + else: + autochapter = self.project.settings.autochapter.getValue() + if autochapter > 0: + for title in self.project.titles: + title.produceAutoChapter(autochapter) + self.project.waitboxref = self.project.session.open(ProjectSettings.WaitBox,self.burnProjectCB) def burnProjectCB(self): import Process @@ -221,14 +227,21 @@ class TitleList(Screen): self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t) def titleEditDone(self, cutlist): - if cutlist != False: - t = self.current_edit_title - t.cuesheet = cutlist - t.produceFinalCuesheet() + t = self.current_edit_title + t.cuesheet = cutlist + t.produceFinalCuesheet() + if t.sVideoType != 0: + self.session.openWithCallback(self.DVDformatCB,MessageBox,text = _("The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to create a Dreambox format data DVD (which will not play in stand-alone DVD players) instead?"), type = MessageBox.TYPE_YESNO) + else: + self.updateTitleList() + + def DVDformatCB(self, answer): + t = self.current_edit_title + if answer == True: + self.project.settings.authormode.setValue("data_ts") self.updateTitleList() else: - self.session.open(MessageBox,text = _("The DVD standard doesn't support H.264 (HDTV) video streams!"),type = MessageBox.TYPE_ERROR) - self.removeTitle(self.current_edit_title) + self.removeTitle(t) def leave(self): self.close() -- 2.30.2