Package translate :: Package storage :: Module subtitles
[hide private]
[frames] | no frames]

Source Code for Module translate.storage.subtitles

 1  #!/usr/bin/env python 
 2  # -*- coding: utf-8 -*- 
 3  #  
 4  # Copyright 2008-2009 Zuza Software Foundation 
 5  #  
 6  # This file is part of translate. 
 7  # 
 8  # translate is free software; you can redistribute it and/or modify 
 9  # it under the terms of the GNU General Public License as published by 
10  # the Free Software Foundation; either version 2 of the License, or 
11  # (at your option) any later version. 
12  #  
13  # translate is distributed in the hope that it will be useful, 
14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
16  # GNU General Public License for more details. 
17  # 
18  # You should have received a copy of the GNU General Public License 
19  # along with translate; if not, write to the Free Software 
20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
21   
22  """Class that manages subtitle files for translation 
23   
24     This class makes use of the subtitle functionality of L{gaupol} 
25     @see: gaupo/agents/open.py::open_main 
26   
27     a patch to gaupol is required to open utf-8 files successfully 
28  """ 
29  from translate.storage import base 
30  from StringIO import StringIO 
31  import gaupol 
32   
33 -class SubtitleUnit(base.TranslationUnit):
34 """A subtitle entry that is translatable""" 35
36 - def __init__(self, source=None, encoding="utf-8"):
37 self._start = None 38 self._end = None 39 if source: 40 self.source = source 41 super(SubtitleUnit, self).__init__(source)
42
43 - def getlocations(self):
44 return ["%s-->%s" % (self._start, self._end)]
45
46 -class SubtitleFile(base.TranslationStore):
47 """A subtitle file""" 48 UnitClass = SubtitleUnit
49 - def __init__(self, inputfile=None, unitclass=UnitClass):
50 """construct an Subtitle file, optionally reading in from inputfile.""" 51 self.UnitClass = unitclass 52 base.TranslationStore.__init__(self, unitclass=unitclass) 53 self.units = [] 54 self.filename = '' 55 self._subtitlefile = None 56 self._encoding = 'utf-8' 57 if inputfile is not None: 58 self.parse(inputfile)
59
60 - def __str__(self):
61 subtitles = [] 62 for unit in self.units: 63 subtitle = gaupol.subtitle.Subtitle() 64 subtitle.main_text = unit.target or unit.source 65 subtitle.start = unit._start 66 subtitle.end = unit._end 67 subtitles.append(subtitle) 68 output = StringIO() 69 self._subtitlefile.write_to_file(subtitles, gaupol.documents.MAIN, output) 70 return output.getvalue().encode(self._subtitlefile.encoding)
71 72
73 - def parse(self, input):
74 """parse the given file""" 75 if hasattr(input, 'name'): 76 self.filename = input.name 77 elif not getattr(self, 'filename', ''): 78 self.filename = '' 79 input.close() 80 self._encoding = gaupol.encodings.detect(self.filename) 81 if self._encoding == 'ascii': 82 self._encoding = 'utf-8' 83 self._format = gaupol.FormatDeterminer().determine(self.filename, self._encoding) 84 self._subtitlefile = gaupol.files.new(self._format, self.filename, self._encoding) 85 for subtitle in self._subtitlefile.read(): 86 newunit = self.addsourceunit(subtitle.main_text) 87 newunit._start = subtitle.start 88 newunit._end = subtitle.end 89 newunit.addnote("visible for %d seconds" % subtitle.duration_seconds, "developer")
90