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
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()))
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('&',"&").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('&',"&").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
-
class DVDTitle:
def __init__(self):
self.cuesheet = [ ]
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
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
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
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):
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 = ""
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):
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
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)
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"
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:
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])
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])
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>
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')
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):
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 = ""
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)
WaitForResidentTasks(self)
PreviewTask(self)
BurnTask(self)
- #RemoveDVDFolder(self)
+ RemoveDVDFolder(self)
def Burn(session, project):
print "burning cuesheet!"
-import DVDProject, TitleList, TitleCutter
-
+import DVDProject, TitleList, TitleCutter, ProjectSettings
from Screens.Screen import Screen
from Screens.ChoiceBox import ChoiceBox
from Screens.InputBox import InputBox
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" >
<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>
"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")),
})
"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:
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")
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
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
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
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
--- /dev/null
+AUTOMAKE_OPTIONS = gnu
+
+installdir = $(DATADIR)/enigma2
+
+install_DATA = \
+ dreamdvd_boat.jpg dreamvmgm.mpg silence.mp2
<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" />
--- /dev/null
+<?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>
--- /dev/null
+AUTOMAKE_OPTIONS = gnu
+
+installdir = /etc/enigma2/playlist
+
+install_DATA = \
+ DreamboxDVDtemplate.ddvdp.xml
+