update sv,tr language
[enigma2.git] / 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                         autochapter = self.project.settings.autochapter.getValue()
192                         if autochapter > 0:
193                                 for title in self.project.titles:
194                                         title.produceAutoChapter(autochapter)
195                         job = Process.DVDJob(self.project)
196                         job_manager.AddJob(job)
197                         job_manager.in_background = False
198                         self.session.openWithCallback(self.JobViewCB, JobView, job)
199
200         def burnISO(self, path, scope):
201                 if path:
202                         job = Process.DVDisoJob(self.project, path)
203                         job_manager.AddJob(job)
204                         job_manager.in_background = False
205                         self.session.openWithCallback(self.JobViewCB, JobView, job)
206
207         def JobViewCB(self, in_background):
208                 job_manager.in_background = in_background
209
210         def previewMenu(self):
211                 job = Process.DVDJob(self.project, menupreview=True)
212                 job_manager.in_background = False
213                 job_manager.AddJob(job)
214                 
215         def updateTitleList(self):
216                 res = [ ]
217                 totalsize = 0
218                 for title in self.project.titles:
219                         a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.properties.menutitle.getValue())  ]
220                         res.append(a)
221                         totalsize += title.estimatedDiskspace
222                 self["titles"].list = res
223                 self.updateSize(totalsize)
224                 
225         def updateSize(self, totalsize):
226                 size = int((totalsize/1024)/1024)
227                 max_SL = 4370
228                 max_DL = 7950
229                 if size > max_DL:
230                         percent = 100 * size / float(max_DL)
231                         self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")"
232                         self["space_bar"].value = int(percent)
233                 elif size > max_SL:
234                         percent = 100 * size / float(max_DL)
235                         self["space_label"].text = "%d MB  " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
236                         self["space_bar"].value = int(percent)
237                 elif size < max_SL:
238                         percent = 100 * size / float(max_SL)
239                         self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")"
240                         self["space_bar"].value = int(percent)
241
242         def getCurrentTitle(self):
243                 t = self["titles"].getCurrent()
244                 return t and t[0]
245
246         def editTitle(self, title = None, editor = True):
247                 t = title or self.getCurrentTitle()
248                 if t is not None:
249                         self.current_edit_title = t
250                         if editor:
251                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
252                         else:
253                                 self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
254
255         def titleEditDone(self, cutlist):
256                 t = self.current_edit_title
257                 t.initDVDmenuText(self.project,len(self.project.titles))
258                 t.cuesheet = cutlist
259                 t.produceFinalCuesheet()
260                 if t.VideoType != 0:
261                         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)
262                 else:
263                         self.updateTitleList()
264
265         def resetTitles(self):
266                 count = 0
267                 for title in self.project.titles:
268                         count += 1
269                         title.initDVDmenuText(self.project,count)
270                 self.updateTitleList()
271
272         def DVDformatCB(self, answer):
273                 t = self.current_edit_title
274                 if answer == True:
275                         self.project.settings.authormode.setValue("data_ts")
276                         self.updateTitleList()
277                 else:
278                         self.removeTitle(t)
279
280         def leave(self):
281                 self.close()