1 import DVDProject, TitleList, TitleCutter, ProjectSettings, DVDToolbox
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 Components.ActionMap import HelpableActionMap, ActionMap
8 from Components.Sources.List import List
9 from Components.Sources.StaticText import StaticText
10 from Components.Sources.Progress import Progress
11 from Components.FileList import FileList
12 from Components.Label import Label
13 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT
14 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
16 class TitleList(Screen, HelpableScreen):
18 <screen position="90,83" size="560,445" title="DVD Tool" >
19 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
20 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
21 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
22 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
23 <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" />
24 <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" />
25 <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" />
26 <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" />
27 <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" />
28 <widget name="error_label" position="10,48" size="540,395" zPosition="3" font="Regular;20" />
29 <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312">
30 <convert type="StaticMultiList" />
32 <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
33 <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
36 def __init__(self, session, project = None):
37 Screen.__init__(self, session)
38 HelpableScreen.__init__(self)
40 self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
42 "addTitle": (self.addTitle, _("Add a new title"), _("Add title")),
43 "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")),
44 "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")),
45 "settings": (self.settings, _("Collection settings"), _("Settings")),
46 "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")),
49 self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions",
51 "contextMenu": (self.showMenu, _("menu")),
54 self["actions"] = ActionMap(["OkCancelActions"],
59 self["key_red"] = StaticText(_("Remove title"))
60 self["key_green"] = StaticText(_("Add title"))
61 self["key_yellow"] = StaticText(_("Edit title"))
62 self["key_blue"] = StaticText(_("Settings"))
64 self["title_label"] = StaticText()
65 self["error_label"] = Label("")
66 self["space_label"] = StaticText()
67 self["space_bar"] = Progress()
69 if project is not None:
70 self.project = project
74 self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
75 self.updateTitleList()
79 menu.append((_("Burn DVD"), "burn"));
80 menu.append((_("Preview menu"), "previewMenu"));
81 menu.append((_("DVD media toolbox"), "toolbox"));
82 menu.append((_("Collection settings"), "settings"));
83 menu.append((_("Add a new title"), "addtitle"));
84 menu.append((_("Remove title"), "removetitle"));
85 menu.append((_("Edit chapters of current title"), "edittitle"));
86 menu.append((_("Exit"), "exit"));
87 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
89 def menuCallback(self, choice):
92 if choice[1] == "removetitle":
93 self.removeCurrentTitle()
94 elif choice[1] == "addtitle":
96 elif choice[1] == "edittitle":
98 elif choice[1] == "toolbox":
100 elif choice[1] == "settings":
102 elif choice[1] == "previewMenu":
104 elif choice[1] == "burn":
106 elif choice[1] == "exit":
109 def newProject(self):
110 self.project = DVDProject.DVDProject()
111 if self.loadTemplate():
112 self.project.session = self.session
116 from Screens.MovieSelection import MovieSelection
117 from Components.Button import Button
118 from Components.ActionMap import HelpableActionMap
119 class MovieSelectionNoMenu(MovieSelection):
120 def __init__(self, session):
121 MovieSelection.__init__(self, session)
122 self.skinName = "MovieSelection"
123 self["key_red"] = Button(_("Edit title"))
124 self["key_green"] = Button(_("Add"))
125 self["ColorActions"] = HelpableActionMap(self, "ColorActions",
127 "red": (self.movieSelected, _("Add a new title")),
128 "green": (self.insertWithoutEdit, ("insert without cutlist editor"))
130 def updateTags(self):
133 print "context menu forbidden inside DVDBurn to prevent calling multiple instances"
134 def insertWithoutEdit(self):
135 current = self.getCurrent()
136 if current is not None:
139 def movieSelected(self):
140 current = self.getCurrent()
141 if current is not None:
144 self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
146 def selectedSource(self, source):
149 t = self.project.addService(source)
152 except AttributeError:
154 self.editTitle(t, editor)
156 def removeCurrentTitle(self):
157 title = self.getCurrentTitle()
158 self.removeTitle(title)
160 def removeTitle(self, title):
161 if title is not None:
162 self.project.titles.remove(title)
163 self.updateTitleList()
166 self.session.open(DVDToolbox.DVDToolbox, self.project)
169 self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
171 def settingsCB(self, update=True):
174 self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
176 def loadTemplate(self):
177 filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml"
178 if self.project.loadProject(filename):
179 self["error_label"].hide()
182 self["error_label"].text = self.project.error
183 self["error_label"].show()
186 def burnProject(self):
187 if self.project.settings.authormode.getValue() == "data_ts":
189 job = Process.BurnDataTS(self.session, self.project)
190 from Screens.TaskView import JobView
191 self.session.open(JobView, job)
193 autochapter = self.project.settings.autochapter.getValue()
195 for title in self.project.titles:
196 title.produceAutoChapter(autochapter)
198 job = Process.Burn(self.session, self.project)
199 from Screens.TaskView import JobView
200 self.session.open(JobView, job)
202 def previewMenu(self):
204 job = Process.PreviewMenu(self.session, self.project)
206 def updateTitleList(self):
209 for title in self.project.titles:
210 a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.name) ]
212 totalsize += title.estimatedDiskspace
213 self["titles"].list = res
214 self.updateSize(totalsize)
216 def updateSize(self, totalsize):
217 size = int((totalsize/1024)/1024)
221 percent = 100 * size / float(max_DL)
222 self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
223 self["space_bar"].value = int(percent)
225 percent = 100 * size / float(max_DL)
226 self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
227 self["space_bar"].value = int(percent)
229 percent = 100 * size / float(max_SL)
230 self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
231 self["space_bar"].value = int(percent)
233 def getCurrentTitle(self):
234 t = self["titles"].getCurrent()
237 def editTitle(self, title = None, editor = True):
238 t = title or self.getCurrentTitle()
240 self.current_edit_title = t
242 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
244 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
246 def titleEditDone(self, cutlist):
247 t = self.current_edit_title
249 t.produceFinalCuesheet()
250 if t.sVideoType != 0:
251 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)
253 self.updateTitleList()
255 def DVDformatCB(self, answer):
256 t = self.current_edit_title
258 self.project.settings.authormode.setValue("data_ts")
259 self.updateTitleList()