[DVDBurn] usability improvements: title list layout, bottom info area, consistency...
[enigma2.git] / lib / python / Plugins / Extensions / DVDBurn / DVDTitle.py
index 3d19bc48e71b998905a7bd98c3e4f915a01f9af0..6dff00d62772c3554b908d7061bae41cf24dcd7f 100644 (file)
@@ -1,15 +1,35 @@
+from Components.config import config, ConfigSubsection, ConfigSubList, ConfigInteger, ConfigText, ConfigSelection, getConfigListEntry, ConfigSequence, ConfigYesNo
+import TitleCutter
+
+class ConfigFixedText(ConfigText):
+       def __init__(self, text, visible_width=60):
+               ConfigText.__init__(self, default = text, fixed_size = True, visible_width = visible_width)
+       def handleKey(self, key):
+               pass
+
 class DVDTitle:
-       def __init__(self):
+       def __init__(self, project):
+               self.properties = ConfigSubsection()
+               self.properties.menutitle = ConfigText(fixed_size = False, visible_width = 80)
+               self.properties.menusubtitle = ConfigText(fixed_size = False, visible_width = 80)
+               self.properties.aspect = ConfigSelection(choices = [("4:3", _("4:3")), ("16:9", _("16:9"))])
+               self.properties.widescreen = ConfigSelection(choices = [("nopanscan", "nopanscan"), ("noletterbox", "noletterbox")])
+               self.properties.autochapter = ConfigInteger(default = 0, limits = (0, 60))
+               self.properties.audiotracks = ConfigSubList()
+               self.DVBname = _("Title")
+               self.DVBdescr = _("Description")
+               self.DVBchannel = _("Channel")
                self.cuesheet = [ ]
                self.source = None
-               self.name = ""
-               self.descr = ""
                self.filesize = 0
                self.estimatedDiskspace = 0
                self.inputfile = ""
                self.cutlist = [ ]
                self.chaptermarks = [ ]
                self.timeCreate = None
+               self.VideoType = -1
+               self.project = project
+               self.length = 0
 
        def addService(self, service):
                from os import path
@@ -19,17 +39,71 @@ class DVDTitle:
                self.source = service
                serviceHandler = eServiceCenter.getInstance()
                info = serviceHandler.info(service)
-               self.descr = info and " " + info.getInfoString(service, iServiceInformation.sDescription) or ""
+               sDescr = info and info.getInfoString(service, iServiceInformation.sDescription) or ""
+               self.DVBdescr = sDescr
                sTimeCreate = info.getInfo(service, iServiceInformation.sTimeCreate)
                if sTimeCreate > 1:
                        self.timeCreate = localtime(sTimeCreate)
                serviceref = ServiceReference(info.getInfoString(service, iServiceInformation.sServiceref))
-               self.name = info and info.getName(service) or "Title" + t.descr
-               self.channel = serviceref.getServiceName()
+               name = info and info.getName(service) or "Title" + sDescr
+               self.DVBname = name
+               self.DVBchannel = serviceref.getServiceName()
                self.inputfile = service.getPath()
                self.filesize = path.getsize(self.inputfile)
                self.estimatedDiskspace = self.filesize
                self.length = info.getLength(service)
+                                               
+       def addFile(self, filename):
+               from enigma import eServiceReference
+               ref = eServiceReference(1, 0, filename)
+               self.addService(ref)
+               self.project.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, self)
+       
+       def titleEditDone(self, cutlist):
+               self.initDVDmenuText(len(self.project.titles))
+               self.cuesheet = cutlist
+               self.produceFinalCuesheet()
+
+       def initDVDmenuText(self, track):
+               s = self.project.menutemplate.settings
+               self.properties.menutitle.setValue(self.formatDVDmenuText(s.titleformat.getValue(), track))
+               self.properties.menusubtitle.setValue(self.formatDVDmenuText(s.subtitleformat.getValue(), track))
+
+       def formatDVDmenuText(self, template, track):
+               template = template.replace("$i", str(track))
+               template = template.replace("$t", self.DVBname)
+               template = template.replace("$d", self.DVBdescr)
+               template = template.replace("$c", str(len(self.chaptermarks)+1))
+               template = template.replace("$f", self.inputfile)
+               template = template.replace("$C", self.DVBchannel)
+               
+               #if template.find("$A") >= 0:
+               from TitleProperties import languageChoices
+               audiolist = [ ]
+               for audiotrack in self.properties.audiotracks:
+                       active = audiotrack.active.getValue()
+                       if active:
+                               trackstring = audiotrack.format.getValue()
+                               language = audiotrack.language.getValue()
+                               if languageChoices.langdict.has_key(language):
+                                       trackstring += ' (' + languageChoices.langdict[language] + ')'
+                               audiolist.append(trackstring)
+               audiostring = ', '.join(audiolist)
+               template = template.replace("$A", audiostring)
+
+               if template.find("$l") >= 0:
+                       l = self.length
+                       lengthstring = "%d:%02d:%02d" % (l/3600, l%3600/60, l%60)
+                       template = template.replace("$l", lengthstring)
+               if self.timeCreate:
+                       template = template.replace("$Y", str(self.timeCreate[0]))
+                       template = template.replace("$M", str(self.timeCreate[1]))
+                       template = template.replace("$D", str(self.timeCreate[2]))
+                       timestring = "%d:%02d" % (self.timeCreate[3], self.timeCreate[4])
+                       template = template.replace("$T", timestring)
+               else:
+                       template = template.replace("$Y", "").replace("$M", "").replace("$D", "").replace("$T", "")
+               return template
 
        def produceFinalCuesheet(self):
                CUT_TYPE_IN = 0
@@ -76,9 +150,21 @@ class DVDTitle:
                        self.estimatedDiskspace = usedsize
                        self.length = accumulated_in / 90000
 
-       def produceAutoChapter(self, minutes):
-               if len(self.chaptermarks) < 1:
-                       chapterpts = self.cutlist[0]
-                       while chapterpts < self.length*90000:
+       def getChapterMarks(self, template="$h:$m:$s.$t"):
+               timestamps = [ ]
+               chapters = [ ]
+               minutes = self.properties.autochapter.getValue()
+               if len(self.chaptermarks) < 1 and minutes > 0:
+                       chapterpts = 0
+                       while chapterpts < (self.length-60*minutes)*90000:
                                chapterpts += 90000 * 60 * minutes
-                               self.chaptermarks.append(chapterpts)
\ No newline at end of file
+                               chapters.append(chapterpts)
+               else:
+                       chapters = self.chaptermarks
+               for p in chapters:
+                       timestring = template.replace("$h", str(p / (90000 * 3600)))
+                       timestring = timestring.replace("$m", ("%02d" % (p % (90000 * 3600) / (90000 * 60))))
+                       timestring = timestring.replace("$s", ("%02d" % (p % (90000 * 60) / 90000)))
+                       timestring = timestring.replace("$t", ("%03d" % ((p % 90000) / 90)))
+                       timestamps.append(timestring)
+               return timestamps
\ No newline at end of file