introduce a collection settings screen, delivery of template and menu source files
authorAndreas Frisch <andreas.frisch@multimedia-labs.de>
Fri, 5 Sep 2008 16:46:08 +0000 (16:46 +0000)
committerAndreas Frisch <andreas.frisch@multimedia-labs.de>
Fri, 5 Sep 2008 16:46:08 +0000 (16:46 +0000)
13 files changed:
lib/python/Plugins/Extensions/DVDBurn/DVDProject.py
lib/python/Plugins/Extensions/DVDBurn/DVDTitle.py
lib/python/Plugins/Extensions/DVDBurn/Makefile.am
lib/python/Plugins/Extensions/DVDBurn/Process.py
lib/python/Plugins/Extensions/DVDBurn/TitleList.py
lib/python/Plugins/Extensions/DVDBurn/data/Makefile.am [new file with mode: 0644]
lib/python/Plugins/Extensions/DVDBurn/data/dreamdvd_boat.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/DVDBurn/data/dreamvmgm.mpg [new file with mode: 0644]
lib/python/Plugins/Extensions/DVDBurn/data/silence.mp2 [moved from lib/python/Plugins/Extensions/DVDBurn/silence.mp2 with 100% similarity]
lib/python/Plugins/Extensions/DVDBurn/dreamvmgm.mpg [deleted file]
lib/python/Plugins/Extensions/DVDBurn/keymap.xml
lib/python/Plugins/Extensions/DVDBurn/template/DreamboxDVDtemplate.ddvdp.xml [new file with mode: 0644]
lib/python/Plugins/Extensions/DVDBurn/template/Makefile.am [new file with mode: 0644]

index fe09642..9ee3bdb 100644 (file)
@@ -1,9 +1,32 @@
 from Tools.Directories import fileExists
+from Components.config import config, ConfigSubsection, ConfigInteger, ConfigYesNo, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence
+
+class ConfigColor(ConfigSequence):
+       def __init__(self):
+               ConfigSequence.__init__(self, seperator = "#", limits = [(0,255),(0,255),(0,255)])
+
+class ConfigPixelvals(ConfigSequence):
+       def __init__(self):
+               ConfigSequence.__init__(self, seperator = ",", limits = [(0,200),(0,200),(0,200)])
 
 class DVDProject:
        def __init__(self):
                self.titles = [ ]
                self.target = None
+               self.settings = ConfigSubsection()
+               self.settings.name = ConfigText(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.menubg = ConfigText(visible_width = 40)
+               self.settings.menuaudio = ConfigText(visible_width = 40)
+               self.settings.titleformat = ConfigText(visible_width = 40)
+               self.settings.subtitleformat = ConfigText(visible_width = 40)
+               self.settings.color_headline = ConfigColor()
+               self.settings.color_highlight = ConfigColor()
+               self.settings.color_button = ConfigColor()
+               self.settings.font_face = ConfigText(visible_width = 40)
+               self.settings.font_size = ConfigPixelvals()
+               self.settings.space = ConfigPixelvals()
+               self.settings.vmgm = ConfigText(visible_width = 40)
 
        def addService(self, service):
                import DVDTitle
@@ -18,26 +41,11 @@ class DVDProject:
                list = []
                list.append('<?xml version="1.0" encoding="utf-8" ?>\n')
                list.append('<DreamDVDBurnerProject>\n')
-               list.append('\t<project')
-               list.append(' name="' + self.name + '"')
-               list.append(' vmgm="' + self.vmgm + '"')
-               list.append(' />\n')
-               list.append('\t<menu')
-               list.append('\tuse="' + str(self.menu) + '"\n')
-               list.append('\tbg="' + self.menubg + '"\n')
-               list.append('\t\taudio="' + self.menuaudio + '"\n')
-               list.append('\t\tcolor_button="' + str(self.color_button) + '"\n')
-               list.append('\t\tcolor_highlight="' + str(self.color_highlight) + '"\n')
-               list.append('\t\tcolor_headline="' + str(self.color_headline) + '"\n')
-               list.append('\t\tfont_face="' + self.font_face + '"\n')
-               list.append('\t\tfont_size="' + str(self.font_size) + '"\n')
-               list.append('\t\tspace_left="' + str(self.space_left) + '"\n')
-               list.append('\t\tspace_top="' + str(self.space_top) + '"\n')
-               list.append('\t\tspace_rows="' + str(self.space_rows) + '"')
-               list.append(' />\n')
-               list.append('\t<titles')
-               list.append(' link="' + str(self.linktitles) + '"')
-               list.append(' />\n')
+               list.append('\t<settings ')
+               for key, val in self.settings.dict().iteritems():
+                       list.append( key + '="' + str(val.getValue()) + '" ' )
+               list.append(' />\n')            
+               list.append('\t<titles>\n')
                for title in self.titles:
                        list.append('\t\t<path>')
                        list.append(stringToXML(title.source.getPath()))
@@ -45,65 +53,61 @@ class DVDProject:
                list.append('\t</titles>\n')
                list.append('</DreamDVDBurnerProject>\n')
 
+               name = self.settings.name.getValue()
                i = 0
-               filename = path + "/" + self.name + ".ddvdp.xml"
+               filename = path + name + ".ddvdp.xml"
                while fileExists(filename):
                        i = i+1
-                       filename = path + "/" + self.name + str(i).zfill(3) + ".ddvdp.xml"
-                               
-               file = open(filename, "w")
-               for x in list:
-                       file.write(x)
-               file.close()
+                       filename = path + name + str(i).zfill(3) + ".ddvdp.xml"
+               try:    
+                       file = open(filename, "w")
+                       for x in list:
+                               file.write(x)
+                       file.close()
+               except:
+                       return False
+               return filename
 
        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('&',"&amp;").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
+                       if not fileExists(filename):
+                               self.error = "xml file not found!"
+                               raise AttributeError
+                       else:
+                               self.error = ""
+                       file = open(filename, "r")
+                       data = file.read().decode("utf-8").replace('&',"&amp;").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 == 'settings':
+                               i = 0
+                               if project.attributes.length < 11:
+                                       self.error = "project attributes missing"
+                                       raise AttributeError                    
+                               while i < project.attributes.length:
+                                       item = project.attributes.item(i)
+                                       key = item.name.encode("utf-8")
+                                       try:
+                                               val = eval(item.nodeValue)
+                                       except (NameError, SyntaxError):
+                                               val = item.nodeValue.encode("utf-8")
+                                       try:
+                                               self.settings.dict()[key].setValue(val)
+                                       except (KeyError):
+                                               self.error = "unknown attribute '%s'" % (key)
+                                               raise AttributeError
+                                       i += 1
+                       checkfiles = ["vmgm", "menubg", "menuaudio", "font_face"]
+                       for key in checkfiles:
+                               val = self.settings.dict()[key].getValue()
+                               if not fileExists(val):
+                                       self.error += "\n%s '%s' not found" % (key, val)
+                       if len(self.error):
+                               raise AttributeError
+               except AttributeError:
+                       self.error += (" in project '%s'") % (filename)
                        return False
                return True
index 96bb1e7..dad16e7 100644 (file)
@@ -1,4 +1,3 @@
-
 class DVDTitle:
        def __init__(self):
                self.cuesheet = [ ]
@@ -22,6 +21,7 @@ class DVDTitle:
                self.inputfile = service.getPath()
                self.filesize = path.getsize(self.inputfile)
                self.estimatedDiskspace = self.filesize
+               self.length = info.getLength(service)
 
        def produceFinalCuesheet(self):
                print "[produceFinalCuesheet] >>> ", self.inputfile, self.cuesheet
@@ -67,12 +67,8 @@ class DVDTitle:
                print "cutlist =", self.cutlist, "chaptermarks =", self.chaptermarks, "accumulated_in =", accumulated_in
 
                if len(self.cutlist) > 1:
-                       from enigma import eServiceCenter, iServiceInformation
-                       serviceHandler = eServiceCenter.getInstance()
-                       service = self.source
-                       info = serviceHandler.info(service)
-                       lenpts = info.getLength(service) * 90000
-                       part = accumulated_in / float(lenpts)
+                       part = accumulated_in / (self.length*90000.0)
                        usedsize = int ( part * self.filesize )
-                       print "lenpts=", lenpts, "part=", part, "filesize=", self.filesize, "estimatedDiskspace=", usedsize
+                       print "part=", part, "filesize=", self.filesize, "estimatedDiskspace=", usedsize
                        self.estimatedDiskspace = usedsize
+                       self.length = accumulated_in / 90000
index 5906757..886876c 100644 (file)
@@ -3,6 +3,8 @@ installdir = $(LIBDIR)/enigma2/python/Plugins/Extensions/DVDBurn
 install_PYTHON =       \
        __init__.py \
        plugin.py \
-       DVDProject.py DVDTitle.py TitleCutter.py TitleList.py Process.py
+       DVDProject.py DVDTitle.py TitleCutter.py TitleList.py Process.py ProjectSettings.py
 
-install_DATA = keymap.xml silence.mp2 dreamvmgm.mpg
+install_DATA = keymap.xml
+
+SUBDIRS = data template
index 42af6ca..072085e 100644 (file)
@@ -209,12 +209,12 @@ class BurnTaskPostcondition(Condition):
 
        def getErrorMessage(self, task):
                return {
-                       task.ERROR_MEDIA: ("Medium is not a writeable DVD!"),
-                       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_MEDIA: _("Medium is not a writeable DVD!"),
+                       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):
@@ -226,8 +226,8 @@ class BurnTask(Task):
                self.end = 120 # 100 for writing, 10 for buffer flush, 10 for closing disc
                self.postconditions.append(BurnTaskPostcondition())
                self.setTool("/bin/growisofs")
-               
-               self.args += ["-dvd-video", "-dvd-compat", "-Z", "/dev/cdroms/cdrom0", "-V", self.getASCIIname(job.project.name), "-P", "Dreambox", "-use-the-force-luke=dummy", self.job.workspace + "/dvd"]
+               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"]
 
        def getASCIIname(self, name):
                ASCIIname = ""
@@ -285,6 +285,7 @@ class RemoveDVDFolder(Task):
 class PreviewTask(Task):
        def __init__(self, job):
                Task.__init__(self, job, "Preview")
+               self.postconditions.append(PreviewTaskPostcondition())
                self.job = job
 
        def run(self, callback, task_progress_changed):
@@ -325,6 +326,13 @@ class PreviewTask(Task):
                from Plugins.Extensions.DVDPlayer.plugin import DVDPlayer
                self.job.project.session.openWithCallback(self.playerClosed, DVDPlayer, dvd_filelist= [ self.job.project.workspace + "/dvd/VIDEO_TS/" ])
 
+class PreviewTaskPostcondition(Condition):
+       def check(self, task):
+               return task.returncode == 0
+
+       def getErrorMessage(self, task):
+               return "Cancel"
+
 def getTitlesPerMenu(nr_titles):
        if nr_titles < 6:
                titles_per_menu = 5
@@ -332,19 +340,47 @@ def getTitlesPerMenu(nr_titles):
                titles_per_menu = 4
        return titles_per_menu
 
+def formatTitle(template, title, track):
+       import re
+       template = template.replace("$i", str(track))
+       template = template.replace("$t", title.name)
+       template = template.replace("$d", title.descr)
+       template = template.replace("$c", str(len(title.chaptermarks)+1))
+       template = template.replace("$f", title.inputfile)
+       l = title.length
+       lengthstring = "%d:%02d:%02d" % (l/3600, l%3600/60, l%60)
+       template = template.replace("$l", lengthstring)
+       res = re.search("(?:/.*?).*/(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2}).(?P<hour>\d{2})(?P<minute>\d{2}).-.*.?.ts", title.inputfile)
+       if res:
+               template = template.replace("$Y", res.group("year"))
+               template = template.replace("$M", res.group("month"))
+               template = template.replace("$D", res.group("day"))
+               template = template.replace("$h", res.group("hour"))
+               template = template.replace("$m", res.group("minute"))
+       else:
+               template = template.replace("$Y", "").replace("$M", "").replace("$D", "").replace("$h", "").replace("$m", "")
+       return template.decode("utf-8")
+
 def CreateMenus(job):
-       import os, Image, ImageDraw, ImageFont, re
+       import os, Image, ImageDraw, ImageFont
        imgwidth = 720
        imgheight = 576
-       
-       im_bg_orig = Image.open(job.project.menubg)
+       s = job.project.settings
+       im_bg_orig = Image.open(s.menubg.getValue())
        if im_bg_orig.size != (imgwidth, imgheight):
                im_bg_orig = im_bg_orig.resize((720, 576))
+       
+       fontsizes = s.font_size.getValue()
+       fontface = s.font_face.getValue()
+       
+       font0 = ImageFont.truetype(fontface, fontsizes[0])
+       font1 = ImageFont.truetype(fontface, fontsizes[1])
+       font2 = ImageFont.truetype(fontface, fontsizes[2])
 
-       font0 = ImageFont.truetype(job.project.font_face, job.project.font_size[0])
-       font1 = ImageFont.truetype(job.project.font_face, job.project.font_size[1])
-       font2 = ImageFont.truetype(job.project.font_face, job.project.font_size[2])
-       spu_palette = [ 0x60, 0x60, 0x60 ] + list(job.project.color_highlight)
+       color_headline = tuple(s.color_headline.getValue())
+       color_button = tuple(s.color_button.getValue())
+       color_highlight = tuple(s.color_highlight.getValue())
+       spu_palette = [ 0x60, 0x60, 0x60 ] + s.color_highlight.getValue()
 
        nr_titles = len(job.project.titles)
        titles_per_menu = getTitlesPerMenu(nr_titles)
@@ -359,13 +395,13 @@ def CreateMenus(job):
                draw_high = ImageDraw.Draw(im_high)
 
                if menu_count == 1:
-                       headline = job.project.name.decode("utf-8")
+                       headline = s.name.getValue().decode("utf-8")
                        textsize = draw_bg.textsize(headline, font=font0)
                        if textsize[0] > imgwidth:
                                offset = (0 , 20)
                        else:
                                offset = (((imgwidth-textsize[0]) / 2) , 20)
-                       draw_bg.text(offset, headline, fill=job.project.color_headline, font=font0)
+                       draw_bg.text(offset, headline, fill=color_headline, font=font0)
                
                menubgpngfilename = job.workspace+"/dvd_menubg"+str(menu_count)+".png"
                highlightpngfilename = job.workspace+"/dvd_highlight"+str(menu_count)+".png"
@@ -377,8 +413,8 @@ def CreateMenus(job):
        transparent="%02x%02x%02x"
        start="00:00:00.00"
        force="yes" >""" % (highlightpngfilename, spu_palette[0], spu_palette[1], spu_palette[2])
-
-               rowheight = (job.project.font_size[1]+job.project.font_size[2]+job.project.space_rows)
+               s_top, s_rows, s_left = s.space.getValue()
+               rowheight = (fontsizes[1]+fontsizes[2]+s_rows)
                menu_start_title = (menu_count-1)*titles_per_menu + 1
                menu_end_title = (menu_count)*titles_per_menu + 1
                if menu_end_title > nr_titles:
@@ -386,33 +422,24 @@ def CreateMenus(job):
                menu_i = 0
                for title_no in range( menu_start_title , menu_end_title ):
                        i = title_no-1
-                       top = job.project.space_top + ( menu_i * rowheight )
+                       top = s_top + ( menu_i * rowheight )
                        menu_i += 1
                        title = job.project.titles[i]
-                       titlename = title.name.decode("utf-8")
-                       menuitem = "%d. %s" % (title_no, titlename)
-                       draw_bg.text((job.project.space_left,top), menuitem, fill=job.project.color_button, font=font1)
-                       draw_high.text((job.project.space_left,top), menuitem, fill=1, font=font1)
-                       res = re.search("(?:/.*?).*/(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2}).(?P<hour>\d{2})(?P<minute>\d{2}).-.*.?.ts", title.inputfile)
-                       subtitle = ""
-                       if res:
-                               subtitle = "%s-%s-%s, %s:%s. " % (res.group("year"),res.group("month"),res.group("day"),res.group("hour"),res.group("minute"))
-                       if len(title.descr) > 1:
-                               subtitle += title.descr.decode("utf-8") + ". "
-                       if len(title.chaptermarks) > 1:
-                               subtitle += (" (%d %s)" % (len(title.chaptermarks)+1, _("chapters")))
-                       draw_bg.text((job.project.space_left,top+36), subtitle, fill=job.project.color_button, font=font2)
-       
+                       titleText = formatTitle(s.titleformat.getValue(), title, title_no)
+                       draw_bg.text((s_left,top), titleText, fill=color_button, font=font1)
+                       draw_high.text((s_left,top), titleText, fill=1, font=font1)
+                       subtitleText = formatTitle(s.subtitleformat.getValue(), title, title_no)
+                       draw_bg.text((s_left,top+36), subtitleText, fill=color_button, font=font2)
                        bottom = top+rowheight
                        if bottom > imgheight:
                                bottom = imgheight
                        spuxml += """
-       <button name="button%s" x0="%d" x1="%d" y0="%d" y1="%d"/>""" % (str(title_no).zfill(2),job.project.space_left,imgwidth,top,bottom )
+       <button name="button%s" x0="%d" x1="%d" y0="%d" y1="%d"/>""" % (str(title_no).zfill(2),s_left,imgwidth,top,bottom )
                if menu_count > 1:
                        prev_page_text = "<<<"
                        textsize = draw_bg.textsize(prev_page_text, font=font1)
-                       offset = ( 2*job.project.space_left, job.project.space_top + ( titles_per_menu * rowheight ) )
-                       draw_bg.text(offset, prev_page_text, fill=job.project.color_button, font=font1)
+                       offset = ( 2*s_left, s_top + ( titles_per_menu * rowheight ) )
+                       draw_bg.text(offset, prev_page_text, fill=color_button, font=font1)
                        draw_high.text(offset, prev_page_text, fill=1, font=font1)
                        spuxml += """
        <button name="button_prev" x0="%d" x1="%d" y0="%d" y1="%d"/>""" % (offset[0],offset[0]+textsize[0],offset[1],offset[1]+textsize[1])
@@ -420,8 +447,8 @@ def CreateMenus(job):
                if menu_count < job.nr_menus:
                        next_page_text = ">>>"
                        textsize = draw_bg.textsize(next_page_text, font=font1)
-                       offset = ( imgwidth-textsize[0]-2*job.project.space_left, job.project.space_top + ( titles_per_menu * rowheight ) )
-                       draw_bg.text(offset, next_page_text, fill=job.project.color_button, font=font1)
+                       offset = ( imgwidth-textsize[0]-2*s_left, s_top + ( titles_per_menu * rowheight ) )
+                       draw_bg.text(offset, next_page_text, fill=color_button, font=font1)
                        draw_high.text(offset, next_page_text, fill=1, font=font1)
                        spuxml += """
        <button name="button_next" x0="%d" x1="%d" y0="%d" y1="%d"/>""" % (offset[0],offset[0]+textsize[0],offset[1],offset[1]+textsize[1])
@@ -439,7 +466,8 @@ def CreateMenus(job):
                menubgm2vfilename = job.workspace+"/dvdmenubg"+str(menu_count)+".mv2"
                mpeg2encTask(job, job.workspace+"/dvdmenubg"+str(menu_count)+".yuv", menubgm2vfilename)
                menubgmpgfilename = job.workspace+"/dvdmenubg"+str(menu_count)+".mpg"
-               MplexTask(job, outputfile=menubgmpgfilename, inputfiles = [menubgm2vfilename, job.project.menuaudio])
+               menuaudiofilename = s.menuaudio.getValue()
+               MplexTask(job, outputfile=menubgmpgfilename, inputfiles = [menubgm2vfilename, menuaudiofilename])
        
                spuxml += """
        </spu>
@@ -456,14 +484,15 @@ def CreateMenus(job):
 def CreateAuthoringXML(job):
        nr_titles = len(job.project.titles)
        titles_per_menu = getTitlesPerMenu(nr_titles)
+       mode = job.project.settings.authormode.getValue()
        authorxml = []
        authorxml.append('<?xml version="1.0" encoding="utf-8"?>\n')
        authorxml.append(' <dvdauthor dest="' + (job.workspace+"/dvd") + '">\n')
        authorxml.append('  <vmgm>\n')
        authorxml.append('   <menus>\n')
        authorxml.append('    <pgc>\n')
-       authorxml.append('     <vob file="' + job.project.vmgm + '" />\n', )
-       if job.project.menu:
+       authorxml.append('     <vob file="' + job.project.settings.vmgm.getValue() + '" />\n', )
+       if mode.startswith("menu"):
                authorxml.append('     <post> jump titleset 1 menu; </post>\n')
        else:
                authorxml.append('     <post> jump title 1; </post>\n')
@@ -471,7 +500,7 @@ def CreateAuthoringXML(job):
        authorxml.append('   </menus>\n')
        authorxml.append('  </vmgm>\n')
        authorxml.append('  <titleset>\n')
-       if job.project.menu:
+       if mode.startswith("menu"):
                authorxml.append('   <menus>\n')
                authorxml.append('    <video aspect="4:3"/>\n')
                for menu_count in range(1 , job.nr_menus+1):
@@ -499,13 +528,12 @@ def CreateAuthoringXML(job):
                title_no = i+1
                title_filename = job.workspace + "/dvd_title_%d.mpg" % (title_no)
                if job.menupreview:
-                       LinkTS(job, job.project.vmgm, title_filename)
+                       LinkTS(job, job.project.settings.vmgm.getValue(), title_filename)
                else:
                        MakeFifoNode(job, title_no)
-               
-               if job.project.linktitles and title_no < nr_titles:
+               if mode.endswith("linked") and title_no < nr_titles:
                        post_tag = "jump title %d;" % ( title_no+1 )
-               elif job.project.menu:
+               elif mode.startswith("menu"):
                        post_tag = "call vmgm menu 1;"
                else:   post_tag = ""
 
@@ -536,7 +564,7 @@ class DVDJob(Job):
                self.conduct()
 
        def conduct(self):
-               if self.project.menu or self.menupreview:
+               if self.project.settings.authormode.getValue().startswith("menu") or self.menupreview:
                        CreateMenus(self)
                CreateAuthoringXML(self)
 
@@ -567,7 +595,7 @@ class DVDJob(Job):
                        WaitForResidentTasks(self)
                        PreviewTask(self)
                        BurnTask(self)
-               #RemoveDVDFolder(self)
+               RemoveDVDFolder(self)
 
 def Burn(session, project):
        print "burning cuesheet!"
index d67f112..6edb090 100644 (file)
@@ -1,5 +1,4 @@
-import DVDProject, TitleList, TitleCutter
-
+import DVDProject, TitleList, TitleCutter, ProjectSettings
 from Screens.Screen import Screen
 from Screens.ChoiceBox import ChoiceBox
 from Screens.InputBox import InputBox
@@ -10,60 +9,10 @@ from Components.Sources.List import List
 from Components.Sources.StaticText import StaticText
 from Components.Sources.Progress import Progress
 from Components.FileList import FileList
+from Components.Label import Label
 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=_("please wait, loading picture..."), type = MessageBox.TYPE_INFO)
-               self.skinName = "MessageBox"
-               self.CB = callback
-               self.onShown.append(self.runCB)
-
-       def ok(self):
-               pass
-
-       def runCB(self):
-               from enigma import eTimer
-               self.delayTimer = eTimer()
-               self.delayTimer.callback.append(self.CB)
-               self.delayTimer.start(10,1)
-
-class FileBrowser(Screen, HelpableScreen):
-       skin = """
-       <screen name="FileBrowser" position="100,100" size="520,376" title="DVD File Browser" >
-               <widget name="filelist" position="0,0" size="520,376" scrollbarMode="showOnDemand" />
-       </screen>"""
-       def __init__(self, session, currDir = None, projectBrowser = False):
-               Screen.__init__(self, session)
-               HelpableScreen.__init__(self)
-               self.projectBrowser = projectBrowser
-               if not currDir:
-                       currDir = "/"
-
-               if projectBrowser:
-                       self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(ddvdp\.xml)")
-               else:
-                       self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|jpe|png|bmp)")
-               self["filelist"] = self.filelist
-
-               self["FilelistActions"] = ActionMap(["OkCancelActions"],
-                       {
-                               "ok": self.ok,
-                               "cancel": self.exit
-                       })
-
-       def ok(self):
-               if self.filelist.canDescent():
-                       self.filelist.descent()
-               else:
-                       ret = self["filelist"].getCurrentDirectory() + self["filelist"].getFilename()
-                       self.close(ret,self.projectBrowser)
-
-       def exit(self):
-               self.close(None)
-
-
 class TitleList(Screen):
        skin = """
                <screen position="90,83" size="560,445" title="DVD Tool" >
@@ -75,7 +24,8 @@ class TitleList(Screen):
                    <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
                    <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
                    <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
-                   <widget source="title_label" render="Label" position="6,48" size="540,38" font="Regular;18" />
+                   <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" />
+                   <widget name="error_label" position="10,48" size="540,395" zPosition="3" font="Regular;20" />
                    <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312">
                        <convert type="StaticMultiList" />
                    </widget>
@@ -91,7 +41,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 collection to disk"), _("Save")),
+                               "settings": (self.settings, _("Project settings"), _("Settings")),
                                "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")),
                        })
 
@@ -100,22 +50,21 @@ class TitleList(Screen):
                                "contextMenu": (self.showMenu, _("menu")),
                        })
 
+               self["actions"] = ActionMap(["OkCancelActions"],
+                       {
+                               "cancel": self.leave
+                       })
+
                self["key_red"] = StaticText(_("Add title"))
                self["key_green"] = StaticText(_("Edit title"))
                self["key_yellow"] = StaticText(_("Remove title"))
-               self["key_blue"] = StaticText(_("Save"))
+               self["key_blue"] = StaticText(_("Settings"))
 
                self["title_label"] = StaticText()
+               self["error_label"] = Label("")
                self["space_label"] = StaticText()
                self["space_bar"] = Progress()
 
-               self["actions"] = ActionMap(["OkCancelActions"],
-                       {
-                               "cancel": self.leave
-                       })
-
-               #Action("addTitle", self.addTitle)
-               
                if project is not None:
                        self.project = project
                else:
@@ -123,7 +72,6 @@ class TitleList(Screen):
 
                self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
                self.updateTitleList()
-               self.updateCollectionName()
                                
                #self["addTitle"] = ActionButton("titleactions", "addTitle")
                #self["editTitle"] = ActionButton("titleactions", "editTitle")
@@ -133,56 +81,38 @@ class TitleList(Screen):
                
        def showMenu(self):
                menu = []
+               menu.append((_("Collection settings"), "settings"));
                menu.append((_("Add a new title"), "addtitle"));
                menu.append((_("Remove title"), "removetitle"));
                menu.append((_("Edit chapters of current title"), "edittitle"));
-               menu.append((_("Set collection name"), "setname"));
-               menu.append((_("Set menu background"), "setbackground"));
-               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"));
+               menu.append((_("Exit"), "exit"));
                self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
 
        def menuCallback(self, choice):
                if choice is None:
                        return
-
                if choice[1] == "removetitle":
                        self.removeCurrentTitle()
                elif choice[1] == "addtitle":
                        self.addTitle()
                elif choice[1] == "edittitle":
                        self.editTitle()
-               elif choice[1] == "setname":
-                       self.setName()
-               elif choice[1] == "setbackground":
-                       self.showFileBrowser(False)
-               elif choice[1] == "save":
-                       self.saveProject()
-               elif choice[1] == "load":
-                       self.showFileBrowser(True)
+               elif choice[1] == "settings":
+                       self.settings()
                elif choice[1] == "previewMenu":
                        self.previewMenu()
                elif choice[1] == "burn":
                        self.burnProject()
-
-       def setName(self):
-               self.session.openWithCallback(self.setNameCallback, InputBox, title=_("Set collection name"), text=self.project.name, maxSize=False, visible_width = 56)
-               
-       def setNameCallback(self, name):
-               if name is not None:
-                       self.project.name = name
-                       self.updateCollectionName()
+               elif choice[1] == "exit":
+                       self.leave()
 
        def newProject(self):
                self.project = DVDProject.DVDProject()
-               if self.loadProject():
+               if self.loadTemplate():
                        self.project.session = self.session
-                       self.updateCollectionName()
-
-       def updateCollectionName(self):
-               self["title_label"].text = _("Table of content for collection") + " \"" + self.project.name + "\":"
+                       self.settingsCB()
 
        def addTitle(self):
                from Screens.MovieSelection import MovieSelection
@@ -208,24 +138,27 @@ class TitleList(Screen):
                        self.project.titles.remove(title)
                        self.updateTitleList()
 
-       def saveProject(self):
-               self.project.saveProject(resolveFilename(SCOPE_PLAYLIST))
+       def settings(self):
+               self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
 
-       def loadProject(self, filename=None):
-               if not filename:
-                       filename = resolveFilename(SCOPE_PLAYLIST)+"DreamboxDVDtemplate.ddvdp.xml"
+       def settingsCB(self, update=True):
+               if not update:
+                       return
+               self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
+
+       def loadTemplate(self):
+               filename = resolveFilename(SCOPE_PLAYLIST)+"DreamboxDVDtemplate.ddvdp.xml"
                if self.project.loadProject(filename):
+                       self["error_label"].hide()
                        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
+                       self["error_label"].text = self.project.error
+                       self["error_label"].show()
+                       print self.project.error
                        return False
 
        def burnProject(self):
-               self.project.waitboxref = self.project.session.open(WaitBox,self.burnProjectCB)
+               self.project.waitboxref = self.project.session.open(ProjectSettings.WaitBox,self.burnProjectCB)
 
        def burnProjectCB(self):
                import Process
@@ -234,7 +167,7 @@ class TitleList(Screen):
                self.session.open(JobView, job)
 
        def previewMenu(self):
-               self.project.waitboxref = self.project.session.open(WaitBox,self.previewMenuCB)
+               self.project.waitboxref = self.project.session.open(ProjectSettings.WaitBox,self.previewMenuCB)
                
        def previewMenuCB(self):
                import Process
@@ -289,18 +222,3 @@ class TitleList(Screen):
 
        def leave(self):
                self.close()
-
-       def showFileBrowser(self, projectBrowser=False):
-               if projectBrowser:
-                       currDir = resolveFilename(SCOPE_PLAYLIST)
-               else:
-                       currDir = self.project.menubg
-                       if len(currDir) > 1:
-                               currDir = (currDir.rstrip("/").rsplit("/",1))[0]
-               self.session.openWithCallback(self.FileBrowserClosed, FileBrowser, currDir, projectBrowser)
-       
-       def FileBrowserClosed(self, path, projectBrowser=False):
-               if projectBrowser:
-                       self.loadProject(path)
-               else:
-                       self.project.menubg = path
diff --git a/lib/python/Plugins/Extensions/DVDBurn/data/Makefile.am b/lib/python/Plugins/Extensions/DVDBurn/data/Makefile.am
new file mode 100644 (file)
index 0000000..e5992b9
--- /dev/null
@@ -0,0 +1,6 @@
+AUTOMAKE_OPTIONS = gnu
+
+installdir = $(DATADIR)/enigma2
+
+install_DATA = \
+       dreamdvd_boat.jpg dreamvmgm.mpg silence.mp2
diff --git a/lib/python/Plugins/Extensions/DVDBurn/data/dreamdvd_boat.jpg b/lib/python/Plugins/Extensions/DVDBurn/data/dreamdvd_boat.jpg
new file mode 100755 (executable)
index 0000000..a5256e2
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/data/dreamdvd_boat.jpg differ
diff --git a/lib/python/Plugins/Extensions/DVDBurn/data/dreamvmgm.mpg b/lib/python/Plugins/Extensions/DVDBurn/data/dreamvmgm.mpg
new file mode 100644 (file)
index 0000000..4797986
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/data/dreamvmgm.mpg differ
diff --git a/lib/python/Plugins/Extensions/DVDBurn/dreamvmgm.mpg b/lib/python/Plugins/Extensions/DVDBurn/dreamvmgm.mpg
deleted file mode 100644 (file)
index e69de29..0000000
index 56ff0c9..7b7ea31 100644 (file)
@@ -2,7 +2,7 @@
        <map context="DVDTitleList">
                <key id="KEY_RED" mapto="addTitle" flags="m" />
                <key id="KEY_GREEN" mapto="editTitle" flags="m" />
-               <key id="KEY_BLUE" mapto="saveProject" flags="m" />
+               <key id="KEY_BLUE" mapto="settings" flags="m" />
                <key id="KEY_YELLOW" mapto="removeCurrentTitle" flags="m" />
                <key id="KEY_RECORD" mapto="burnProject" flags="m" />
                <key id="KEY_0" mapto="burnProject" flags="m" />
diff --git a/lib/python/Plugins/Extensions/DVDBurn/template/DreamboxDVDtemplate.ddvdp.xml b/lib/python/Plugins/Extensions/DVDBurn/template/DreamboxDVDtemplate.ddvdp.xml
new file mode 100644 (file)
index 0000000..5738f3a
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<DreamDVDBurnerProject>
+       <settings
+               name="Dreambox DVD record"
+               authormode="linked_nomenu"
+               titleformat="$i. $t"
+               subtitleformat="$Y-$M-$D, $h:$m, $d ($c chapters)"
+               vmgm="/usr/share/enigma2/dreamvmgm.mpg"
+               menubg="/usr/share/enigma2/dreamdvd_boat.jpg"
+               menuaudio="/usr/share/enigma2/silence.mp2"
+               color_button="[8, 0, 0]"
+               color_highlight="[0, 192, 192]"
+               color_headline="[0, 0, 128]"
+               font_face="/usr/share/fonts/nmsbd.ttf"
+               font_size="[48, 28, 16]"
+               space="[120, 36, 30]" />
+       <titles> </titles>
+</DreamDVDBurnerProject>
diff --git a/lib/python/Plugins/Extensions/DVDBurn/template/Makefile.am b/lib/python/Plugins/Extensions/DVDBurn/template/Makefile.am
new file mode 100644 (file)
index 0000000..f0d9e8a
--- /dev/null
@@ -0,0 +1,7 @@
+AUTOMAKE_OPTIONS = gnu
+
+installdir = /etc/enigma2/playlist
+
+install_DATA = \
+       DreamboxDVDtemplate.ddvdp.xml
+