197ab5bf69ab7f59612d5792d95a2aca5b7d0d63
[enigma2.git] / lib / python / Plugins / Extensions / DVDBurn / TitleList.py
1 import DVDProject, TitleList, TitleCutter, ProjectSettings
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
15
16 class TitleList(Screen):
17         skin = """
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" />
31                     </widget>
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" />
34                 </screen>"""
35
36         def __init__(self, session, project = None):
37                 Screen.__init__(self, session)
38                 
39                 self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
40                         {
41                                 "addTitle": (self.addTitle, _("Add a new title"), _("Add title")),
42                                 "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")),
43                                 "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")),
44                                 "settings": (self.settings, _("Collection settings"), _("Settings")),
45                                 "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")),
46                         })
47
48                 self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions",
49                         {
50                                 "contextMenu": (self.showMenu, _("menu")),
51                         })
52
53                 self["actions"] = ActionMap(["OkCancelActions"],
54                         {
55                                 "cancel": self.leave
56                         })
57
58                 self["key_red"] = StaticText(_("Remove title"))
59                 self["key_green"] = StaticText(_("Add title"))
60                 self["key_yellow"] = StaticText(_("Edit title"))
61                 self["key_blue"] = StaticText(_("Settings"))
62
63                 self["title_label"] = StaticText()
64                 self["error_label"] = Label("")
65                 self["space_label"] = StaticText()
66                 self["space_bar"] = Progress()
67
68                 if project is not None:
69                         self.project = project
70                 else:
71                         self.newProject()
72
73                 self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
74                 self.updateTitleList()
75                 
76         def showMenu(self):
77                 menu = []
78                 menu.append((_("Burn DVD"), "burn"));
79                 menu.append((_("Preview menu"), "previewMenu"));
80                 menu.append((_("Collection settings"), "settings"));
81                 menu.append((_("Add a new title"), "addtitle"));
82                 menu.append((_("Remove title"), "removetitle"));
83                 menu.append((_("Edit chapters of current title"), "edittitle"));
84                 menu.append((_("Exit"), "exit"));
85                 self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
86
87         def menuCallback(self, choice):
88                 if choice is None:
89                         return
90                 if choice[1] == "removetitle":
91                         self.removeCurrentTitle()
92                 elif choice[1] == "addtitle":
93                         self.addTitle()
94                 elif choice[1] == "edittitle":
95                         self.editTitle()
96                 elif choice[1] == "settings":
97                         self.settings()
98                 elif choice[1] == "previewMenu":
99                         self.previewMenu()
100                 elif choice[1] == "burn":
101                         self.burnProject()
102                 elif choice[1] == "exit":
103                         self.leave()
104
105         def newProject(self):
106                 self.project = DVDProject.DVDProject()
107                 if self.loadTemplate():
108                         self.project.session = self.session
109                         self.settingsCB()
110
111         def addTitle(self):
112                 from Screens.MovieSelection import MovieSelection
113                 from Components.Button import Button
114                 from Components.ActionMap import HelpableActionMap
115                 class MovieSelectionNoMenu(MovieSelection):
116                         def __init__(self, session):
117                                 MovieSelection.__init__(self, session)
118                                 self.skinName = "MovieSelection"
119                                 self["key_red"] = Button(_("Edit title"))
120                                 self["key_green"] = Button(_("Add"))
121                                 self["ColorActions"] = HelpableActionMap(self, "ColorActions",
122                                 {
123                                         "red": (self.movieSelected, _("Add a new title")),
124                                         "green": (self.insertWithoutEdit, ("insert without cutlist editor"))
125                                 })
126                         def updateTags(self):
127                                 pass
128                         def doContext(self):
129                                 print "context menu forbidden inside DVDBurn to prevent calling multiple instances"
130                         def insertWithoutEdit(self):
131                                 current = self.getCurrent()
132                                 if current is not None:
133                                         current.edit = False
134                                         self.close(current)
135                         def movieSelected(self):
136                                 current = self.getCurrent()
137                                 if current is not None:
138                                         current.edit = True
139                                         self.close(current)
140                 self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
141
142         def selectedSource(self, source):
143                 if source is None:
144                         return None
145                 t = self.project.addService(source)
146                 try:
147                         editor = source.edit
148                 except AttributeError:
149                         editor = True
150                 self.editTitle(t, editor)
151
152         def removeCurrentTitle(self):
153                 title = self.getCurrentTitle()
154                 self.removeTitle(title)
155         
156         def removeTitle(self, title):
157                 if title is not None:
158                         self.project.titles.remove(title)
159                         self.updateTitleList()
160
161         def settings(self):
162                 self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
163
164         def settingsCB(self, update=True):
165                 if not update:
166                         return
167                 self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
168
169         def loadTemplate(self):
170                 filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVDtemplate.ddvdp.xml"
171                 if self.project.loadProject(filename):
172                         self["error_label"].hide()
173                         return True
174                 else:
175                         self["error_label"].text = self.project.error
176                         self["error_label"].show()
177                         return False
178
179         def burnProject(self):
180                 if self.project.settings.authormode.getValue() == "data_ts":
181                         import Process
182                         job = Process.BurnDataTS(self.session, self.project)
183                         from Screens.TaskView import JobView
184                         self.session.open(JobView, job)
185                 else:
186                         autochapter = self.project.settings.autochapter.getValue()
187                         if autochapter > 0:
188                                 for title in self.project.titles:
189                                         title.produceAutoChapter(autochapter)
190                         import Process
191                         job = Process.Burn(self.session, self.project)
192                         from Screens.TaskView import JobView
193                         self.session.open(JobView, job)
194
195         def previewMenu(self):
196                 import Process
197                 job = Process.PreviewMenu(self.session, self.project)
198
199         def updateTitleList(self):
200                 res = [ ]
201                 totalsize = 0
202                 for title in self.project.titles:
203                         a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.name)  ]
204                         res.append(a)
205                         totalsize += title.estimatedDiskspace
206                 self["titles"].list = res
207                 self.updateSize(totalsize)
208                 
209         def updateSize(self, totalsize):
210                 size = int((totalsize/1024)/1024)
211                 max_SL = 4370
212                 max_DL = 7950
213                 if size > max_DL:
214                         percent = 100 * size / float(max_DL)
215                         self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
216                         self["space_bar"].value = int(percent)
217                 elif size > max_SL:
218                         percent = 100 * size / float(max_DL)
219                         self["space_label"].text = "%d MB  " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
220                         self["space_bar"].value = int(percent)
221                 elif size < max_SL:
222                         percent = 100 * size / float(max_SL)
223                         self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
224                         self["space_bar"].value = int(percent)
225
226         def getCurrentTitle(self):
227                 t = self["titles"].getCurrent()
228                 return t and t[0]
229
230         def editTitle(self, title = None, editor = True):
231                 t = title or self.getCurrentTitle()
232                 if t is not None:
233                         self.current_edit_title = t
234                         if editor:
235                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
236                         else:
237                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
238
239         def titleEditDone(self, cutlist):
240                 t = self.current_edit_title
241                 t.cuesheet = cutlist
242                 t.produceFinalCuesheet()
243                 if t.sVideoType != 0:
244                         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)
245                 else:
246                         self.updateTitleList()
247
248         def DVDformatCB(self, answer):
249                 t = self.current_edit_title
250                 if answer == True:
251                         self.project.settings.authormode.setValue("data_ts")
252                         self.updateTitleList()
253                 else:
254                         self.removeTitle(t)
255
256         def leave(self):
257                 self.close()