1 import DVDProject, TitleList, TitleCutter, 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 "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")),
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(_("Edit title"))
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"), "burn"));
82 elif self.project.settings.output.getValue() == "iso":
83 menu.append((_("Create DVD-ISO"), "burn"));
84 menu.append((_("Preview menu"), "previewMenu"));
85 menu.append((_("DVD media toolbox"), "toolbox"));
86 menu.append((_("Collection settings"), "settings"));
87 menu.append((_("Add a new title"), "addtitle"));
88 menu.append((_("Remove title"), "removetitle"));
89 menu.append((_("Edit chapters of current title"), "edittitle"));
90 menu.append((_("Burn existing image to DVD"), "burniso"));
91 menu.append((_("Exit"), "exit"));
92 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
94 def menuCallback(self, choice):
97 if choice[1] == "removetitle":
98 self.removeCurrentTitle()
99 elif choice[1] == "addtitle":
101 elif choice[1] == "edittitle":
103 elif choice[1] == "toolbox":
105 elif choice[1] == "settings":
107 elif choice[1] == "previewMenu":
109 elif choice[1] == "burn":
111 elif choice[1] == "burniso":
112 self.session.openWithCallback(self.burnISO, ProjectSettings.FileBrowser, "image", self.project.settings)
113 elif choice[1] == "exit":
116 def newProject(self):
117 self.project = DVDProject.DVDProject()
118 if self.loadTemplate():
119 self.project.session = self.session
123 from Screens.MovieSelection import MovieSelection
124 from Components.Button import Button
125 from Components.ActionMap import HelpableActionMap
126 class MovieSelectionNoMenu(MovieSelection):
127 def __init__(self, session):
128 MovieSelection.__init__(self, session)
129 self.skinName = "MovieSelection"
130 self["key_red"] = Button(_("Edit title"))
131 self["key_green"] = Button(_("Add"))
132 self["ColorActions"] = HelpableActionMap(self, "ColorActions",
134 "red": (self.movieSelected, _("Add a new title")),
135 "green": (self.insertWithoutEdit, ("insert without cutlist editor"))
137 def updateTags(self):
140 print "context menu forbidden inside DVDBurn to prevent calling multiple instances"
141 def insertWithoutEdit(self):
142 current = self.getCurrent()
143 if current is not None:
146 def movieSelected(self):
147 current = self.getCurrent()
148 if current is not None:
151 self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
153 def selectedSource(self, source):
156 t = self.project.addService(source)
159 except AttributeError:
161 self.editTitle(t, editor)
163 def removeCurrentTitle(self):
164 title = self.getCurrentTitle()
165 self.removeTitle(title)
167 def removeTitle(self, title):
168 if title is not None:
169 self.project.titles.remove(title)
170 self.updateTitleList()
173 self.session.open(DVDToolbox.DVDToolbox)
176 self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
178 def settingsCB(self, update=True):
181 self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
183 def loadTemplate(self):
184 filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml"
185 if self.project.loadProject(filename):
186 self["error_label"].hide()
189 self["error_label"].text = self.project.error
190 self["error_label"].show()
193 def burnProject(self):
194 if self.project.settings.authormode.getValue() == "data_ts":
195 job = Process.DVDdataJob(self.project)
196 job_manager.AddJob(job)
197 job_manager.in_background = False
198 self.session.openWithCallback(self.JobViewCB, JobView, job)
200 autochapter = self.project.settings.autochapter.getValue()
202 for title in self.project.titles:
203 title.produceAutoChapter(autochapter)
204 job = Process.DVDJob(self.project)
205 job_manager.AddJob(job)
206 job_manager.in_background = False
207 self.session.openWithCallback(self.JobViewCB, JobView, job)
209 def burnISO(self, path, scope):
210 job = Process.DVDisoJob(self.project, path)
211 job_manager.AddJob(job)
212 job_manager.in_background = False
213 self.session.openWithCallback(self.JobViewCB, JobView, job)
215 def JobViewCB(self, in_background):
216 job_manager.in_background = in_background
218 def previewMenu(self):
219 job = Process.DVDJob(self.project, menupreview=True)
220 job_manager.in_background = False
221 job_manager.AddJob(job)
223 def updateTitleList(self):
226 for title in self.project.titles:
227 a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.name) ]
229 totalsize += title.estimatedDiskspace
230 self["titles"].list = res
231 self.updateSize(totalsize)
233 def updateSize(self, totalsize):
234 size = int((totalsize/1024)/1024)
238 percent = 100 * size / float(max_DL)
239 self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
240 self["space_bar"].value = int(percent)
242 percent = 100 * size / float(max_DL)
243 self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
244 self["space_bar"].value = int(percent)
246 percent = 100 * size / float(max_SL)
247 self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
248 self["space_bar"].value = int(percent)
250 def getCurrentTitle(self):
251 t = self["titles"].getCurrent()
254 def editTitle(self, title = None, editor = True):
255 t = title or self.getCurrentTitle()
257 self.current_edit_title = t
259 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
261 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
263 def titleEditDone(self, cutlist):
264 t = self.current_edit_title
266 t.produceFinalCuesheet()
267 if t.sVideoType != 0:
268 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)
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()