From: Andreas Frisch Date: Thu, 4 Sep 2008 14:24:03 +0000 (+0000) Subject: catch full medium error, implement loading of project files, allow creating dvds... X-Git-Tag: 2.6.0~904 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/3c066dfc061d51c59caf201e302cfb2301b5f0f7 catch full medium error, implement loading of project files, allow creating dvds without menus or without linked titles, path fixes --- diff --git a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py index 23f7a843..fe09642b 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py +++ b/lib/python/Plugins/Extensions/DVDBurn/DVDProject.py @@ -1,23 +1,9 @@ -from Tools.Directories import resolveFilename, fileExists, SCOPE_FONTS, SCOPE_PLUGINS, SCOPE_SKIN +from Tools.Directories import fileExists + class DVDProject: def __init__(self): self.titles = [ ] self.target = None - self.name = _("Dreambox DVD record") - self.vmgm = resolveFilename(SCOPE_PLUGINS,"Extensions/DVDBurn/dreamvmgm.mpg") - self.menuaudio = resolveFilename(SCOPE_PLUGINS,"Extensions/DVDBurn/silence.mp2") - self.menubg = resolveFilename(SCOPE_SKIN, "dreamdvd_02.jpg") - # tuples with R, G, B values - self.color_button = ( 0x08, 0x00, 0x00 ) - self.color_highlight = ( 0x00, 0xC0, 0xC0 ) - self.color_headline = ( 0x00, 0x00, 0x80 ) - self.font_face = resolveFilename(SCOPE_FONTS, "nmsbd.ttf") - # tuple with three pixel values ( headline, title, subtitle ) - self.font_size = ( 48, 28, 16 ) - # please supply even numbers for all dimensions - self.space_left = 30 - self.space_top = 120 - self.space_rows = 36 def addService(self, service): import DVDTitle @@ -25,18 +11,19 @@ class DVDProject: title.addService(service) self.titles.append(title) return title - + def saveProject(self, path): import xml.dom.minidom from Tools.XMLTools import elementsWithTag, mergeText, stringToXML list = [] list.append('\n') list.append('\n') - list.append('\t\n') list.append('\t\n') - list.append('\t\n') + list.append('\t\n') for title in self.titles: list.append('\t\t') list.append(stringToXML(title.source.getPath())) @@ -65,4 +54,56 @@ class DVDProject: file = open(filename, "w") for x in list: file.write(x) - file.close() \ No newline at end of file + file.close() + + def loadProject(self, filename): + import xml.dom.minidom + print "[loadProject]", filename + try: + if not fileExists(filename): + self.error = "file not found!" + raise AttributeError + else: + self.error = "" + file = open(filename, "r") + data = file.read().decode("utf-8").replace('&',"&").encode("ascii",'xmlcharrefreplace') + file.close() + projectfiledom = xml.dom.minidom.parseString(data) + for project in projectfiledom.childNodes[0].childNodes: + if project.nodeType == xml.dom.minidom.Element.nodeType: + if project.tagName == 'project': + self.name = project.getAttribute("name").encode("utf-8") + self.vmgm = project.getAttribute("vmgm").encode("utf-8") + if project.tagName == 'menu': + self.menu = eval(project.getAttribute("use")) + self.menubg = project.getAttribute("bg").encode("utf-8") + self.menuaudio = project.getAttribute("audio").encode("utf-8") + # tuples with R, G, B values + self.color_button = eval(project.getAttribute("color_button")) + self.color_highlight = eval(project.getAttribute("color_highlight")) + self.color_headline = eval(project.getAttribute("color_headline")) + self.font_face = project.getAttribute("font_face").encode("utf-8") + # tuple with three pixel sizes ( headline, title, subtitle ) + self.font_size = eval(project.getAttribute("font_size")) + # please supply even numbers for all dimensions + self.space_left = int(project.getAttribute("space_left")) + self.space_top = int(project.getAttribute("space_top")) + self.space_rows = int(project.getAttribute("space_rows")) + if project.tagName == 'titles': + self.linktitles = eval(project.getAttribute("link")) + if not fileExists(self.vmgm): + self.error += "\nvmgm '%s' not found" % self.vmgm + if not fileExists(self.menubg): + self.error += "\nmenu background '%s' not found" % self.menubg + if not fileExists(self.menuaudio): + self.error += "\nmenu audio '%s' not found" % self.menuaudio + if not fileExists(self.font_face): + self.error += "\nmenu font '%s' not found" % self.font_face + print "len(self.error):", len(self.error) + if len(self.error): + raise AttributeError + except: + print "len(self.error):, error", len(self.error), len(self.error) + self.error = ("error parsing project xml file '%s'" % filename) + self.error + return False + return True diff --git a/lib/python/Plugins/Extensions/DVDBurn/Process.py b/lib/python/Plugins/Extensions/DVDBurn/Process.py index b9710d5a..42af6ca6 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/Process.py +++ b/lib/python/Plugins/Extensions/DVDBurn/Process.py @@ -213,11 +213,12 @@ class BurnTaskPostcondition(Condition): task.ERROR_SIZE: ("Content does not fit on DVD!"), task.ERROR_WRITE_FAILED: ("Write failed!"), task.ERROR_DVDROM: ("No (supported) DVDROM found!"), + task.ERROR_ISOFS: ("Medium is not empty!"), task.ERROR_UNKNOWN: ("An unknown error occured!") }[task.error] class BurnTask(Task): - ERROR_MEDIA, ERROR_SIZE, ERROR_WRITE_FAILED, ERROR_DVDROM, ERROR_UNKNOWN = range(5) + ERROR_MEDIA, ERROR_SIZE, ERROR_WRITE_FAILED, ERROR_DVDROM, ERROR_ISOFS, ERROR_UNKNOWN = range(6) def __init__(self, job): Task.__init__(self, job, "burn") @@ -268,6 +269,12 @@ class BurnTask(Task): else: self.error = self.ERROR_UNKNOWN print "BurnTask: unknown error %s" % line + elif line.startswith("FATAL:"): + if line.find("already carries isofs!"): + self.error = self.ERROR_ISOFS + else: + self.error = self.ERROR_UNKNOWN + print "BurnTask: unknown error %s" % line class RemoveDVDFolder(Task): def __init__(self, job): @@ -449,79 +456,70 @@ def CreateMenus(job): def CreateAuthoringXML(job): nr_titles = len(job.project.titles) titles_per_menu = getTitlesPerMenu(nr_titles) - authorxml = """ - - - - - - jump titleset 1 menu; - - - - - - - """ + authorxml = [] + authorxml.append('\n') + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n', ) + if job.project.menu: + authorxml.append(' jump titleset 1 menu; \n') + else: + authorxml.append(' jump title 1; \n') + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') + if job.project.menu: + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') for i in range( nr_titles ): chapters = ','.join(["%d:%02d:%02d.%03d" % (p / (90000 * 3600), p % (90000 * 3600) / (90000 * 60), p % (90000 * 60) / 90000, (p % 90000) / 90) for p in job.project.titles[i].chaptermarks]) - title_no = i+1 title_filename = job.workspace + "/dvd_title_%d.mpg" % (title_no) - if job.menupreview: LinkTS(job, job.project.vmgm, title_filename) else: MakeFifoNode(job, title_no) - vob_tag = """file="%s" chapters="%s" />""" % (title_filename, chapters) - - if title_no < nr_titles: + if job.project.linktitles and title_no < nr_titles: post_tag = "jump title %d;" % ( title_no+1 ) - else: + elif job.project.menu: post_tag = "call vmgm menu 1;" - authorxml += """ - - %s - """ % (vob_tag, post_tag) - - authorxml += """ - - - -""" + else: post_tag = "" + + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' ' + post_tag + ' \n') + authorxml.append(' \n') + + authorxml.append(' \n') + authorxml.append(' \n') + authorxml.append(' \n') f = open(job.workspace+"/dvdauthor.xml", "w") - f.write(authorxml) + for x in authorxml: + f.write(x) f.close() class DVDJob(Job): @@ -531,14 +529,15 @@ class DVDJob(Job): 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") - createDir(new_workspace) + createDir(new_workspace, True) self.workspace = new_workspace self.project.workspace = self.workspace self.menupreview = menupreview self.conduct() def conduct(self): - CreateMenus(self) + if self.project.menu or self.menupreview: + CreateMenus(self) CreateAuthoringXML(self) totalsize = 50*1024*1024 # require an extra safety 50 MB diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py index 290b2d83..d8ba5a41 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleCutter.py @@ -1,6 +1,5 @@ from Plugins.Extensions.CutListEditor.plugin import CutListEditor - class TitleCutter(CutListEditor): def __init__(self, session, title): CutListEditor.__init__(self, session, title.source) diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py index c62fe03b..d67f1123 100644 --- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py +++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py @@ -4,20 +4,22 @@ from Screens.Screen import Screen from Screens.ChoiceBox import ChoiceBox from Screens.InputBox import InputBox 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.FileList import FileList from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT +from Tools.Directories import resolveFilename, SCOPE_PLAYLIST class WaitBox(MessageBox): def __init__(self, session, callback): - MessageBox.__init__(self, session, text=_("Preparing... Please wait"), type = MessageBox.TYPE_INFO) + MessageBox.__init__(self, session, text=_("please wait, loading picture..."), type = MessageBox.TYPE_INFO) self.skinName = "MessageBox" self.CB = callback self.onShown.append(self.runCB) - + def ok(self): pass @@ -27,13 +29,14 @@ class WaitBox(MessageBox): self.delayTimer.callback.append(self.CB) self.delayTimer.start(10,1) -class FileBrowser(Screen): +class FileBrowser(Screen, HelpableScreen): skin = """ """ def __init__(self, session, currDir = None, projectBrowser = False): Screen.__init__(self, session) + HelpableScreen.__init__(self) self.projectBrowser = projectBrowser if not currDir: currDir = "/" @@ -54,7 +57,7 @@ class FileBrowser(Screen): if self.filelist.canDescent(): self.filelist.descent() else: - ret = self["filelist"].getCurrentDirectory() + '/' + self["filelist"].getFilename() + ret = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename() self.close(ret,self.projectBrowser) def exit(self): @@ -88,7 +91,7 @@ class TitleList(Screen): "addTitle": (self.addTitle, _("Add a new title"), _("Add title")), "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")), "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")), - "saveProject": (self.saveProject, _("Save current project to disk"), _("Save")), + "saveProject": (self.saveProject, _("Save current collection to disk"), _("Save")), "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")), }) @@ -135,8 +138,8 @@ class TitleList(Screen): menu.append((_("Edit chapters of current title"), "edittitle")); menu.append((_("Set collection name"), "setname")); menu.append((_("Set menu background"), "setbackground")); - menu.append((_("Save current project to disk"), "save")); - menu.append((_("Load saved project from disk"), "load")); + menu.append((_("Save current collection to disk"), "save")); + menu.append((_("Load saved collection from disk"), "load")); menu.append((_("Preview menu"), "previewMenu")); menu.append((_("Burn DVD"), "burn")); self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) @@ -174,9 +177,9 @@ class TitleList(Screen): def newProject(self): self.project = DVDProject.DVDProject() - self.project.titles = [ ] - self.project.session = self.session - self.updateCollectionName() + if self.loadProject(): + self.project.session = self.session + self.updateCollectionName() def updateCollectionName(self): self["title_label"].text = _("Table of content for collection") + " \"" + self.project.name + "\":" @@ -206,9 +209,21 @@ class TitleList(Screen): self.updateTitleList() def saveProject(self): - from Tools.Directories import resolveFilename, SCOPE_PLAYLIST self.project.saveProject(resolveFilename(SCOPE_PLAYLIST)) + def loadProject(self, filename=None): + if not filename: + filename = resolveFilename(SCOPE_PLAYLIST)+"DreamboxDVDtemplate.ddvdp.xml" + if self.project.loadProject(filename): + return True + else: + try: + self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR) + except: + self["title_label"].text = self.project.error + print self.project.error + return False + def burnProject(self): self.project.waitboxref = self.project.session.open(WaitBox,self.burnProjectCB) @@ -277,7 +292,7 @@ class TitleList(Screen): def showFileBrowser(self, projectBrowser=False): if projectBrowser: - currDir = "/home/root" + currDir = resolveFilename(SCOPE_PLAYLIST) else: currDir = self.project.menubg if len(currDir) > 1: @@ -285,8 +300,7 @@ class TitleList(Screen): self.session.openWithCallback(self.FileBrowserClosed, FileBrowser, currDir, projectBrowser) def FileBrowserClosed(self, path, projectBrowser=False): - print "FileBrowserClosed", path, projectBrowser if projectBrowser: - print "would load project", path + self.loadProject(path) else: self.project.menubg = path