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 job = Process.DVDJob(self.project)
192 job_manager.AddJob(job)
193 job_manager.in_background = False
194 self.session.openWithCallback(self.JobViewCB, JobView, job)
196 def burnISO(self, path, scope):
198 job = Process.DVDisoJob(self.project, path)
199 job_manager.AddJob(job)
200 job_manager.in_background = False
201 self.session.openWithCallback(self.JobViewCB, JobView, job)
203 def JobViewCB(self, in_background):
204 job_manager.in_background = in_background
206 def previewMenu(self):
207 job = Process.DVDJob(self.project, menupreview=True)
208 job_manager.in_background = False
209 job_manager.AddJob(job)
211 def updateTitleList(self):
214 for title in self.project.titles:
215 a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.properties.menutitle.getValue()) ]
217 totalsize += title.estimatedDiskspace
218 self["titles"].list = res
219 self.updateSize(totalsize)
221 def updateSize(self, totalsize):
222 size = int((totalsize/1024)/1024)
226 percent = 100 * size / float(max_DL)
227 self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
228 self["space_bar"].value = int(percent)
230 percent = 100 * size / float(max_DL)
231 self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
232 self["space_bar"].value = int(percent)
234 percent = 100 * size / float(max_SL)
235 self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
236 self["space_bar"].value = int(percent)
238 def getCurrentTitle(self):
239 t = self["titles"].getCurrent()
242 def editTitle(self, title = None, editor = True):
243 t = title or self.getCurrentTitle()
245 self.current_edit_title = t
247 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
249 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
251 def titleEditDone(self, cutlist):
252 t = self.current_edit_title
253 t.initDVDmenuText(self.project,len(self.project.titles))
255 t.produceFinalCuesheet()
257 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)
259 self.updateTitleList()
261 def resetTitles(self):
263 for title in self.project.titles:
265 title.initDVDmenuText(self.project,count)
266 self.updateTitleList()
268 def DVDformatCB(self, answer):
269 t = self.current_edit_title
271 self.project.settings.authormode.setValue("data_ts")
272 self.updateTitleList()