Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
[vuplus_dvbapp] / lib / python / Plugins / Extensions / DVDBurn / TitleList.py
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
16
17 class TitleList(Screen, HelpableScreen):
18         skin = """
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" />
32                     </widget>
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" />
35                 </screen>"""
36
37         def __init__(self, session, project = None):
38                 Screen.__init__(self, session)
39                 HelpableScreen.__init__(self)
40                 
41                 self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
42                         {
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")),
48                         })
49
50                 self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions",
51                         {
52                                 "contextMenu": (self.showMenu, _("menu")),
53                         })
54
55                 self["actions"] = ActionMap(["OkCancelActions"],
56                         {
57                                 "cancel": self.leave
58                         })
59
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"))
64
65                 self["title_label"] = StaticText()
66                 self["error_label"] = Label("")
67                 self["space_label"] = StaticText()
68                 self["space_bar"] = Progress()
69
70                 if project is not None:
71                         self.project = project
72                 else:
73                         self.newProject()
74
75                 self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
76                 self.updateTitleList()
77                 
78         def showMenu(self):
79                 menu = []
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)
95
96         def menuCallback(self, choice):
97                 if choice:
98                         choice[1]()
99
100         def titleProperties(self):
101                 if self.getCurrentTitle():
102                         self.session.openWithCallback(self.updateTitleList, TitleProperties.TitleProperties, self, self.project, self["titles"].getIndex())
103
104         def selectImage(self):
105                 self.session.openWithCallback(self.burnISO, ProjectSettings.FileBrowser, "image", self.project.settings)
106
107         def newProject(self):
108                 self.project = DVDProject.DVDProject()
109                 if self.loadTemplate():
110                         self.project.session = self.session
111                         self.settingsCB()
112
113         def addTitle(self):
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",
124                                 {
125                                         "red": (self.movieSelected, _("Add a new title")),
126                                         "green": (self.insertWithoutEdit, ("insert without cutlist editor"))
127                                 })
128                         def updateTags(self):
129                                 pass
130                         def doContext(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:
135                                         current.edit = False
136                                         self.close(current)
137                         def movieSelected(self):
138                                 current = self.getCurrent()
139                                 if current is not None:
140                                         current.edit = True
141                                         self.close(current)
142                 self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
143
144         def selectedSource(self, source):
145                 if source is None:
146                         return None
147                 t = self.project.addService(source)
148                 try:
149                         editor = source.edit
150                 except AttributeError:
151                         editor = True
152                 self.editTitle(t, editor)
153
154         def removeCurrentTitle(self):
155                 title = self.getCurrentTitle()
156                 self.removeTitle(title)
157         
158         def removeTitle(self, title):
159                 if title is not None:
160                         self.project.titles.remove(title)
161                         self.updateTitleList()
162
163         def toolbox(self):
164                 self.session.open(DVDToolbox.DVDToolbox)
165
166         def settings(self):
167                 self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
168
169         def settingsCB(self, update=True):
170                 if not update:
171                         return
172                 self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
173
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()
178                         return True
179                 else:
180                         self["error_label"].text = self.project.error
181                         self["error_label"].show()
182                         return False
183
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)
190                 else:
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)
195
196         def burnISO(self, path, scope):
197                 if path:
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)
202
203         def JobViewCB(self, in_background):
204                 job_manager.in_background = in_background
205
206         def previewMenu(self):
207                 job = Process.DVDJob(self.project, menupreview=True)
208                 job_manager.in_background = False
209                 job_manager.AddJob(job)
210                 
211         def updateTitleList(self):
212                 res = [ ]
213                 totalsize = 0
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())  ]
216                         res.append(a)
217                         totalsize += title.estimatedDiskspace
218                 self["titles"].list = res
219                 self.updateSize(totalsize)
220                 
221         def updateSize(self, totalsize):
222                 size = int((totalsize/1024)/1024)
223                 max_SL = 4370
224                 max_DL = 7950
225                 if size > max_DL:
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)
229                 elif size > max_SL:
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)
233                 elif size < max_SL:
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)
237
238         def getCurrentTitle(self):
239                 t = self["titles"].getCurrent()
240                 return t and t[0]
241
242         def editTitle(self, title = None, editor = True):
243                 t = title or self.getCurrentTitle()
244                 if t is not None:
245                         self.current_edit_title = t
246                         if editor:
247                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
248                         else:
249                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
250
251         def titleEditDone(self, cutlist):
252                 t = self.current_edit_title
253                 t.initDVDmenuText(self.project,len(self.project.titles))
254                 t.cuesheet = cutlist
255                 t.produceFinalCuesheet()
256                 if t.VideoType != 0:
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)
258                 else:
259                         self.updateTitleList()
260
261         def resetTitles(self):
262                 count = 0
263                 for title in self.project.titles:
264                         count += 1
265                         title.initDVDmenuText(self.project,count)
266                 self.updateTitleList()
267
268         def DVDformatCB(self, answer):
269                 t = self.current_edit_title
270                 if answer == True:
271                         self.project.settings.authormode.setValue("data_ts")
272                         self.updateTitleList()
273                 else:
274                         self.removeTitle(t)
275
276         def leave(self):
277                 self.close()