def select_subtitles_file(self, fn): if not os.path.isfile(fn): def f(): dialog = Gtk.MessageDialog(self.win, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, "File Not Found") dialog.format_secondary_text("Could not find subtitles file: %s" % fn) dialog.run() dialog.destroy() GLib.idle_add(f) return fn = os.path.abspath(fn) ext = fn.split('.')[-1] display_name = os.path.basename(fn) if ext=='vtt': with open(fn) as f: self.subtitles = f.read() else: with open(fn,'rb') as f: caps = f.read() try: caps = caps.decode() except UnicodeDecodeError: caps = caps.decode('latin-1') if caps.startswith('\ufeff'): # BOM caps = caps[1:] converter = pycaption.CaptionConverter() converter.read(caps, pycaption.detect_format(caps)()) self.subtitles = converter.write(pycaption.WebVTTWriter()) pos = len(self.subtitle_store) self.subtitle_store.append([display_name, pos-2, self.subtitles]) self.subtitle_combo.set_active(pos)
def write_captions(content, options): writer_kwargs = { 'video_width': int(options.video_width) if options.video_width else None, # noqa 'video_height': int(options.video_height) if options.video_height else None # noqa } if options.sami: print( pycaption.SAMIWriter( **writer_kwargs).write(content).encode("utf-8")) # noqa if options.dfxp: print( pycaption.DFXPWriter( **writer_kwargs).write(content).encode("utf-8")) #noqa if options.srt: print( pycaption.SRTWriter( **writer_kwargs).write(content).encode("utf-8")) # noqa if options.transcript: print( pycaption.TranscriptWriter( **writer_kwargs).write(content).encode("utf-8")) # noqa if options.vtt: print( pycaption.WebVTTWriter( **writer_kwargs).write(content).encode("utf-8")) # noqa if options.unpositioned_dfxp: print( pycaption.dfxp.SinglePositioningDFXPWriter( **writer_kwargs).write(content).encode("utf-8"))
def gen_thumbnail(self): container = self.fn.lower().split(".")[-1] thumbnail_fn = None subtitle_ids = [] if container in ('aac', 'mp3', 'wav'): cmd = ['ffmpeg', '-i', self.fn, '-f', 'ffmetadata', '-'] else: thumbnail_fn = tempfile.mkstemp(suffix='.jpg', prefix='gnomecast_thumbnail_')[1] os.remove(thumbnail_fn) cmd = [ 'ffmpeg', '-y', '-i', self.fn, '-f', 'mjpeg', '-vframes', '1', '-ss', '27', '-vf', 'scale=600:-1', thumbnail_fn ] self.ffmpeg_desc = output = subprocess.check_output( cmd, stderr=subprocess.STDOUT) for line in output.decode().split('\n'): line = line.strip() if line.startswith('Duration:'): self.duration = parse_ffmpeg_time(line.split()[1].strip(',')) if line.startswith('Stream') and 'Subtitle' in line: id = line.split()[1].strip('#').replace(':', '.') id = id[:id.index('(')] subtitle_ids.append(id) print('subtitle_ids', subtitle_ids) def f(): if thumbnail_fn: self.thumbnail_image.set_from_file(thumbnail_fn) os.remove(thumbnail_fn) self.win.resize(1, 1) self.update_status() GLib.idle_add(f) new_subtitles = [] for subtitle_id in subtitle_ids: srt_fn = tempfile.mkstemp(suffix='.srt', prefix='gnomecast_subtitles_')[1] output = subprocess.check_output([ 'ffmpeg', '-y', '-i', self.fn, '-vn', '-an', '-codec:s:%s' % subtitle_id, 'srt', srt_fn ], stderr=subprocess.STDOUT) with open(srt_fn) as f: caps = f.read() print('caps', caps) converter = pycaption.CaptionConverter() converter.read(caps, pycaption.detect_format(caps)()) subtitles = converter.write(pycaption.WebVTTWriter()) new_subtitles.append((subtitle_id, subtitles)) os.remove(srt_fn) def f(): pos = len(self.subtitle_store) for id, subs in new_subtitles: self.subtitle_store.append([id, pos - 2, subs]) pos += 1 GLib.idle_add(f)
def write_captions(content, options): if options.sami: print pycaption.SAMIWriter().write(content).encode("utf-8") if options.dfxp: print pycaption.DFXPWriter().write(content).encode("utf-8") if options.srt: print pycaption.SRTWriter().write(content).encode("utf-8") if options.vtt: print pycaption.WebVTTWriter().write(content).encode("utf-8") if options.transcript: print pycaption.TranscriptWriter().write(content).encode("utf-8")
def main(argv): inputfile = '' inputType = '' outputType = '' try: opts, args = getopt.getopt(argv, "h:i:f:t:") except getopt.GetoptError: print('test.py -i <inputfile> -f <intputType> -t <outputType>') sys.exit(2) for opt, arg in opts: if opt == '-h': print('test.py -i <inputfile> -f <intputType> -t <outputType>') sys.exit() elif opt in ("-i", "--ifile"): inputfile = arg elif opt in ("-f", "--sfile"): inputType = arg elif opt in ("-t", "--tfile"): outputType = arg if inputType == outputType: print('Error: input type and output type are same format') sys.exit(1) with io.open(inputfile) as f: str1 = f.read() inputValue = inputType.lower() if inputValue == 'scc': c = pycaption.SCCReader().read(str1) elif inputValue == 'srt': c = pycaption.SRTReader().read(str1) elif inputValue == 'dfxp': c = pycaption.DFXPReader().read(str1) elif inputValue == 'webvtt': c = pycaption.WebVTTReader().read(str1) else: print('Error: invalid input type. <srt/scc/webvtt/dfxp> allowed') sys.exit(1) outputValue = outputType.lower() if outputValue == 'scc': print(pycaption.SCCWriter().write(c)) elif outputValue == 'srt': print(pycaption.SRTWriter().write(c)) elif outputValue == 'dfxp': print(pycaption.DFXPWriter().write(c)) elif outputValue == 'webvtt': print(pycaption.WebVTTWriter().write(c)) else: print('Error: invalid output type. <srt/scc/webvtt/dfxp> allowed') sys.exit(1)
def test_captions(): srt_caps = '''1 00:00:09,209 --> 00:00:12,312 This is an example SRT file,which, while extremely short,is still a valid SRT file. 2 00:00:19,209 --> 00:00:22,312 This is an example SRT file,which, while extremely short,is still a valid SRT file. ''' converter = pycaption.CaptionConverter() converter.read(srt_caps,pycaption.SRTReader()) print(converter.write(pycaption.WebVTTWriter()))
def write_captions(content, options): if options.scc: print(pycaption.SCCWriter().write(content)) if options.sami: print(pycaption.SAMIWriter().write(content)) if options.dfxp: print(pycaption.DFXPWriter().write(content)) if options.srt: print(pycaption.SRTWriter().write(content)) if options.vtt: print(pycaption.WebVTTWriter().write(content)) if options.transcript: # import TranscriptWriter only if necessary, since it requires additional dependencies from pycaption.transcript import TranscriptWriter print(TranscriptWriter().write(content))
def write_captions(content, options, lang='', filename=''): if options.sami: print pycaption.SAMIWriter().write(content).encode("utf-8") if options.dfxp: print pycaption.DFXPWriter().write(content).encode("utf-8") if options.webvtt: location = os.getcwd() f = open(location + '/captions/' + filename + '_' + lang + '.vtt', 'w') #Save vtt files into captions folder f.write(pycaption.WebVTTWriter().write(content, lang).encode("utf-8")) # print pycaption.WebVTTWriter().write(content, lang).encode("utf-8") if options.srt: print pycaption.SRTWriter().write(content).encode("utf-8") if options.transcript: print pycaption.TranscriptWriter().write(content).encode("utf-8")
def select_subtitles_file(self, fn): ext = fn.split('.')[-1] display_name = os.path.basename(fn) if ext == 'vtt': with open(fn) as f: self.subtitles = f.read() else: with open(fn) as f: caps = f.read() if caps.startswith('\ufeff'): # BOM caps = caps[1:] converter = pycaption.CaptionConverter() converter.read(caps, pycaption.detect_format(caps)()) self.subtitles = converter.write(pycaption.WebVTTWriter()) pos = len(self.subtitle_store) self.subtitle_store.append([display_name, pos - 2, self.subtitles]) self.subtitle_combo.set_active(pos)
def convert_to_vtt(caps): """Convert subtitles to WebVTT format Note that if the subtitles are already in VTT format, nothing is done. Args: caps (str or unicode) Returns: caps (unicode): None if the format could not be detected. """ if isinstance(caps, str): caps = caps.decode('utf-8') caps = caps.strip(u"\ufeff").strip(u"\n").strip(u"\r") sub_reader = pycaption.detect_format(caps) if sub_reader is None: return None if sub_reader != pycaption.WebVTTReader: caps = pycaption.WebVTTWriter().write(sub_reader().read(caps)) return caps
def convert_to_vtt(path): """ Convert a subtitles file from any format (e.g: srt) to vtt. This is necessary for use with videojs, which supports only vtt subtitles. """ caps = open(path, 'rb').read() try: caps = caps.decode('utf8') except UnicodeDecodeError: # Attempt to read with custom encoding detected = chardet.detect(caps) caps = caps.decode(detected['encoding']) caps = caps.strip("\ufeff").strip("\n").strip("\r") sub_reader = pycaption.detect_format(caps) if sub_reader is None: return None if sub_reader != pycaption.WebVTTReader: read_caps = sub_reader().read(caps) caps = pycaption.WebVTTWriter().write(read_caps) return caps
def update_subtitles(self): subtitle_ids = [] cmd = ['ffprobe', '-i', self.fn] output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) for line in output.decode().split('\n'): line = line.strip() if line.startswith('Stream') and 'Subtitle' in line: id = line.split()[1].strip('#').replace(':','.') id = id[:id.index('(')] subtitle_ids.append(id) print('subtitle_ids', subtitle_ids) new_subtitles = [] for subtitle_id in subtitle_ids: srt_fn = tempfile.mkstemp(suffix='.srt', prefix='gnomecast_subtitles_')[1] output = subprocess.check_output(['ffmpeg', '-y', '-i', self.fn, '-vn', '-an', '-codec:s:%s' % subtitle_id, 'srt', srt_fn], stderr=subprocess.STDOUT) with open(srt_fn) as f: caps = f.read() #print('caps', caps) converter = pycaption.CaptionConverter() converter.read(caps, pycaption.detect_format(caps)()) subtitles = converter.write(pycaption.WebVTTWriter()) new_subtitles.append((subtitle_id, subtitles)) os.remove(srt_fn) def f(): self.subtitle_store.clear() self.subtitle_store.append(["No subtitles.", -1, None]) self.subtitle_store.append(["Add subtitle file...", -2, None]) self.subtitle_combo.set_active(0) pos = len(self.subtitle_store) for id, subs in new_subtitles: self.subtitle_store.append([id, pos-2, subs]) pos += 1 GLib.idle_add(f) ext = self.fn.split('.')[-1] sexts = ['vtt', 'srt'] for sext in sexts: if os.path.isfile(self.fn[:-len(ext)] + sext): self.select_subtitles_file(self.fn[:-len(ext)] + sext) break
def upload_subtitle(public_video_id, subtitle_public_id, language_code, content): """ Convert subtitle to VTT and upload it. Args: public_video_id (str) subtitle_id (str) language_code (str) content (bytes) """ # Note: if this ever raises an exception, we should convert it to SubtitleInvalid content = content.decode('utf-8') # Convert to VTT, whatever the initial format content = content.strip("\ufeff\n\r") sub_reader = pycaption.detect_format(content) if sub_reader is None: raise exceptions.SubtitleInvalid("Could not detect subtitle format") if sub_reader != pycaption.WebVTTReader: content = pycaption.WebVTTWriter().write(sub_reader().read(content)) backend.get().upload_subtitle(public_video_id, subtitle_public_id, language_code, content)
def write_captions(content, output_filename): with open(output_filename, 'w') as output_file: output_file.write( pycaption.WebVTTWriter().write(content).encode("utf-8")) print("Generate " + output_filename)