1 import DVDProject, TitleList, TitleCutter, TitleProperties, ProjectSettings, DVDToolbox, Process
2 from Screens.Screen import Screen
3 from Screens.ChoiceBox import ChoiceBox
4 from Screens.InputBox import InputBox
5 from Screens.MessageBox import MessageBox
6 from Screens.HelpMenu import HelpableScreen
7 from Screens.TaskView import JobView
8 from Components.Task import job_manager
9 from Components.ActionMap import HelpableActionMap, ActionMap
10 from Components.Sources.List import List
11 from Components.Sources.StaticText import StaticText
12 from Components.Sources.Progress import Progress
13 from Components.Label import Label
14 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT
15 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
17 class TitleList(Screen, HelpableScreen):
19 <screen position="90,83" size="560,445" title="DVD Tool" >
20 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
21 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
22 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
23 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
24 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
25 <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" />
26 <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" />
27 <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" />
28 <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" />
29 <widget name="error_label" position="10,48" size="540,395" zPosition="3" font="Regular;20" />
30 <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312">
31 <convert type="StaticMultiList" />
33 <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
34 <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
37 def __init__(self, session, project = None):
38 Screen.__init__(self, session)
39 HelpableScreen.__init__(self)
41 self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
43 "addTitle": (self.addTitle, _("Add a new title"), _("Add title")),
44 "titleProperties": (self.titleProperties, ("Properties of current title"), _("Title properties")),
45 "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")),
46 "settings": (self.settings, _("Collection settings"), _("Settings")),
47 "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")),
50 self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions",
52 "contextMenu": (self.showMenu, _("menu")),
55 self["actions"] = ActionMap(["OkCancelActions"],
60 self["key_red"] = StaticText(_("Remove title"))
61 self["key_green"] = StaticText(_("Add title"))
62 self["key_yellow"] = StaticText(_("Title properties"))
63 self["key_blue"] = StaticText(_("Settings"))
65 self["title_label"] = StaticText()
66 self["error_label"] = Label("")
67 self["space_label"] = StaticText()
68 self["space_bar"] = Progress()
70 if project is not None:
71 self.project = project
75 self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
76 self.updateTitleList()
80 if self.project.settings.output.getValue() == "dvd":
81 menu.append((_("Burn DVD"), self.burnProject))
82 elif self.project.settings.output.getValue() == "iso":
83 menu.append((_("Create DVD-ISO"), self.burnProject))
84 menu.append((_("Burn existing image to DVD"), self.selectImage))
85 menu.append((_("DVD media toolbox"), self.toolbox))
86 menu.append((_("Preview menu"), self.previewMenu))
87 menu.append((_("Collection settings"), self.settings))
88 menu.append(("Reset and renumerate title names", self.resetTitles))
89 menu.append((_("Edit chapters of current title"), self.editTitle))
90 menu.append(("Properties of current title", self.titleProperties))
91 menu.append((_("Add a new title"), self.addTitle))
92 menu.append((_("Remove title"), self.removeCurrentTitle))
93 menu.append((_("Exit"), self.leave))
94 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
96 def menuCallback(self, choice):
100 def titleProperties(self):
101 if self.getCurrentTitle():
102 self.session.openWithCallback(self.updateTitleList, TitleProperties.TitleProperties, self, self.project, self["titles"].getIndex())
104 def selectImage(self):
105 self.session.openWithCallback(self.burnISO, ProjectSettings.FileBrowser, "image", self.project.settings)
107 def newProject(self):
108 self.project = DVDProject.DVDProject()
109 if self.loadTemplate():
110 self.project.session = self.session
114 from Screens.MovieSelection import MovieSelection
115 from Components.Button import Button
116 from Components.ActionMap import HelpableActionMap
117 class MovieSelectionNoMenu(MovieSelection):
118 def __init__(self, session):
119 MovieSelection.__init__(self, session)
120 self.skinName = "MovieSelection"
121 self["key_red"] = Button(_("Edit title"))
122 self["key_green"] = Button(_("Add"))
123 self["ColorActions"] = HelpableActionMap(self, "ColorActions",
125 "red": (self.movieSelected, _("Add a new title")),
126 "green": (self.insertWithoutEdit, ("insert without cutlist editor"))
128 def updateTags(self):
131 print "context menu forbidden inside DVDBurn to prevent calling multiple instances"
132 def insertWithoutEdit(self):
133 current = self.getCurrent()
134 if current is not None:
137 def movieSelected(self):
138 current = self.getCurrent()
139 if current is not None:
142 self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
144 def selectedSource(self, source):
147 t = self.project.addService(source)
150 except AttributeError:
152 self.editTitle(t, editor)
154 def removeCurrentTitle(self):
155 title = self.getCurrentTitle()
156 self.removeTitle(title)
158 def removeTitle(self, title):
159 if title is not None:
160 self.project.titles.remove(title)
161 self.updateTitleList()
164 self.session.open(DVDToolbox.DVDToolbox)
167 self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
169 def settingsCB(self, update=True):
172 self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
174 def loadTemplate(self):
175 filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml"
176 if self.project.loadProject(filename):
177 self["error_label"].hide()
180 self["error_label"].text = self.project.error
181 self["error_label"].show()
184 def burnProject(self):
185 if self.project.settings.authormode.getValue() == "data_ts":
186 job = Process.DVDdataJob(self.project)
187 job_manager.AddJob(job)
188 job_manager.in_background = False
189 self.session.openWithCallback(self.JobViewCB, JobView, job)
191 autochapter = self.project.settings.autochapter.getValue()
193 for title in self.project.titles:
194 title.produceAutoChapter(autochapter)
195 job = Process.DVDJob(self.project)
196 job_manager.AddJob(job)
197 job_manager.in_background = False
198 self.session.openWithCallback(self.JobViewCB, JobView, job)
200 def burnISO(self, path, scope):
202 job = Process.DVDisoJob(self.project, path)
203 job_manager.AddJob(job)
204 job_manager.in_background = False
205 self.session.openWithCallback(self.JobViewCB, JobView, job)
207 def JobViewCB(self, in_background):
208 job_manager.in_background = in_background
210 def previewMenu(self):
211 job = Process.DVDJob(self.project, menupreview=True)
212 job_manager.in_background = False
213 job_manager.AddJob(job)
215 def updateTitleList(self):
218 for title in self.project.titles:
219 a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.properties.menutitle.getValue()) ]
221 totalsize += title.estimatedDiskspace
222 self["titles"].list = res
223 self.updateSize(totalsize)
225 def updateSize(self, totalsize):
226 size = int((totalsize/1024)/1024)
230 percent = 100 * size / float(max_DL)
231 self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
232 self["space_bar"].value = int(percent)
234 percent = 100 * size / float(max_DL)
235 self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
236 self["space_bar"].value = int(percent)
238 percent = 100 * size / float(max_SL)
239 self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
240 self["space_bar"].value = int(percent)
242 def getCurrentTitle(self):
243 t = self["titles"].getCurrent()
246 def editTitle(self, title = None, editor = True):
247 t = title or self.getCurrentTitle()
249 self.current_edit_title = t
251 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
253 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
255 def titleEditDone(self, cutlist):
256 t = self.current_edit_title
257 t.initDVDmenuText(self.project,len(self.project.titles))
259 t.produceFinalCuesheet()
261 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)
263 self.updateTitleList()
265 def resetTitles(self):
267 for title in self.project.titles:
269 title.initDVDmenuText(self.project,count)
270 self.updateTitleList()
272 def DVDformatCB(self, answer):
273 t = self.current_edit_title
275 self.project.settings.authormode.setValue("data_ts")
276 self.updateTitleList()