1 import DVDProject, DVDTitle, TitleList, TitleCutter
3 from Screens.Screen import Screen
4 from Components.ActionMap import HelpableActionMap, ActionMap
5 from Components.Sources.List import List
6 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT
8 class TitleList(Screen):
11 <screen position="100,100" size="550,400" title="DVD Tool" >
12 <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="0,0" size="400,400">
13 <convert type="StaticMultiList" />
17 def __init__(self, session, project = None):
18 Screen.__init__(self, session)
20 if project is not None:
21 self.project = project
25 self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
27 "addTitle": (self.addTitle, _("Add a new title"), _("Add title...")),
28 "editTitle": (self.editTitle, _("Edit current title"), _("Edit title...")),
29 "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")),
30 "saveProject": (self.saveProject, _("Save current project to disk"), _("Save...")),
31 "burnProject": (self.burnProject, _("Burn DVD"), _("Burn")),
34 self["actions"] = ActionMap(["OkCancelActions"],
39 #Action("addTitle", self.addTitle)
41 self["titles"] = List(list = [ ], enableWrapAround = True, item_height=50, fonts = [gFont("Regular", 20)])
42 self.updateTitleList()
44 #self["addTitle"] = ActionButton("titleactions", "addTitle")
45 #self["editTitle"] = ActionButton("titleactions", "editTitle")
46 #self["removeCurrentTitle"] = ActionButton("titleactions", "removeCurrentTitle")
47 #self["saveProject"] = ActionButton("titleactions", "saveProject")
48 #self["burnProject"] = ActionButton("titleactions", "burnProject")
51 self.project = DVDProject.DVDProject()
52 self.project.titles = [ ]
55 from Screens.MovieSelection import MovieSelection
56 self.session.openWithCallback(self.selectedSource, MovieSelection)
58 def selectedSource(self, source):
61 t = self.project.addService(source)
62 self.updateTitleList()
66 def removeCurrentTitle(self):
67 title = self.getCurrentTitle()
69 self.project.titles.remove(title)
70 self.updateTitleList()
72 def saveProject(self):
75 def burnProject(self):
76 print "producing final cue sheet:"
77 cue = self.produceFinalCuesheet()
79 job = Process.Burn(self.session, cue)
81 from Screens.TaskView import JobView
82 self.session.open(JobView, job)
84 def updateTitleList(self):
86 for title in self.project.titles:
87 a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 400, 50, 0, RT_HALIGN_LEFT, title.name) ]
90 self["titles"].list = res
92 def getCurrentTitle(self):
93 t = self["titles"].getCurrent()
96 def editTitle(self, title = None):
97 t = title or self.getCurrentTitle()
99 self.current_edit_title = t
100 self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
102 def titleEditDone(self, cutlist):
103 t = self.current_edit_title
105 print "title edit of %s done, resulting cutlist:" % (t.source.toString()), t.cutlist
110 def produceFinalCuesheet(self):
112 for title in self.project.titles:
113 path = title.source.getPath()
114 print ">>> path:", path
115 cutlist = title.cutlist
117 # our demuxer expects *stricly* IN,OUT lists.
131 res_chaptermarks = [0]
133 for (pts, type) in cutlist:
134 if first and type == CUT_TYPE_OUT: # first mark is "out"
135 res_cutlist.append(0) # emulate "in" at first
140 if type == CUT_TYPE_IN and not currently_in:
141 res_cutlist.append(pts)
145 if type == CUT_TYPE_OUT and currently_in:
146 res_cutlist.append(pts)
148 # accumulate the segment
149 accumulated_in += pts - last_in
153 if type == CUT_TYPE_MARK and currently_in:
154 # relocate chaptermark against "in" time. This is not 100% accurate,
155 # as the in/out points are not.
156 res_chaptermarks.append(pts - accumulated_at + accumulated_in)
158 res.append( (path, res_cutlist, res_chaptermarks) )