added class SRTFormatter
This commit is contained in:
		
							parent
							
								
									8c38df9939
								
							
						
					
					
						commit
						69c5a46016
					
				|  | @ -134,6 +134,58 @@ class WebVTTFormatter(Formatter): | ||||||
|         """ |         """ | ||||||
|         return '\n\n\n'.join([self.format_transcript(transcript, **kwargs) for transcript in transcripts]) |         return '\n\n\n'.join([self.format_transcript(transcript, **kwargs) for transcript in transcripts]) | ||||||
| 
 | 
 | ||||||
|  | class SRTFormatter(Formatter): | ||||||
|  |     def _seconds_to_timestamp(self, time): | ||||||
|  |         """Helper that converts `time` into a transcript cue timestamp for SRT. | ||||||
|  | 
 | ||||||
|  |         :param time: a float representing time in seconds. | ||||||
|  |         :type time: float | ||||||
|  |         :return: a string formatted as a cue timestamp, 'HH:MM:SS,MS' | ||||||
|  |         :rtype str | ||||||
|  |         :example: | ||||||
|  |         >>> self._seconds_to_timestamp(6.93) | ||||||
|  |         '00:00:06,930' | ||||||
|  |         """ | ||||||
|  |         time = float(time) | ||||||
|  |         hours, remainder = divmod(time, 3600) | ||||||
|  |         mins, secs = divmod(remainder, 60) | ||||||
|  |         ms = int(round((time - int(time))*1000, 2)) | ||||||
|  |         return "{:02.0f}:{:02.0f}:{:02.0f},{:03d}".format(hours, mins, secs, ms) | ||||||
|  | 
 | ||||||
|  |     def format_transcript(self, transcript, **kwargs): | ||||||
|  |         """Converts a transcript into SRT formatting. | ||||||
|  | 
 | ||||||
|  |         :param transcript: | ||||||
|  |         :reference: https://www.3playmedia.com/blog/create-srt-file/ | ||||||
|  |         """ | ||||||
|  |         lines = [] | ||||||
|  |         for i, line in enumerate(transcript): | ||||||
|  |             if i < len(transcript) - 1: | ||||||
|  |                 # Looks ahead, use next start time since duration value | ||||||
|  |                 # would create an overlap between start times. | ||||||
|  |                 time_text = "{} --> {}".format( | ||||||
|  |                     self._seconds_to_timestamp(line['start']), | ||||||
|  |                     self._seconds_to_timestamp(transcript[i + 1]['start']) | ||||||
|  |                 ) | ||||||
|  |             else: | ||||||
|  |                 # Reached the end, cannot look ahead, use duration now. | ||||||
|  |                 duration = line['start'] + line['duration'] | ||||||
|  |                 time_text = "{} --> {}".format( | ||||||
|  |                     self._seconds_to_timestamp(line['start']), | ||||||
|  |                     self._seconds_to_timestamp(duration) | ||||||
|  |                 ) | ||||||
|  |             lines.append("{}\n{}\n{}".format(i + 1, time_text, line['text'])) | ||||||
|  | 
 | ||||||
|  |         return "\n\n".join(lines) + "\n" | ||||||
|  | 
 | ||||||
|  |     def format_transcripts(self, transcripts, **kwargs): | ||||||
|  |         """Converts a list of transcripts into SRT formatting. | ||||||
|  | 
 | ||||||
|  |         :param transcript: | ||||||
|  |         :reference: https://www.3playmedia.com/blog/create-srt-file/ | ||||||
|  |         """ | ||||||
|  |         return '\n\n\n'.join([self.format_transcript(transcript, **kwargs) for transcript in transcripts]) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class FormatterLoader(object): | class FormatterLoader(object): | ||||||
|     TYPES = { |     TYPES = { | ||||||
|  | @ -141,6 +193,7 @@ class FormatterLoader(object): | ||||||
|         'pretty': PrettyPrintFormatter, |         'pretty': PrettyPrintFormatter, | ||||||
|         'text': TextFormatter, |         'text': TextFormatter, | ||||||
|         'webvtt': WebVTTFormatter, |         'webvtt': WebVTTFormatter, | ||||||
|  |         'srt' : SRTFormatter, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     class UnknownFormatterType(Exception): |     class UnknownFormatterType(Exception): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue