def test_audio_remux(self): config = convert_config_from_ns({'audio_codec': 'copy'}) with create_test_video(length=3, audio_defs=[AudioDefition(codec=AudioCodec.AC3)]) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertEqual(metadata.audio_streams[0].codec, AudioCodec.AC3.ffmpeg_codec_name)
def test_video_remux(self): config = convert_config_from_ns({'video_codec': 'copy'}) with create_test_video(length=3, video_def=VideoDefinition(codec=VideoCodec.MPEG2)) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertEqual(metadata.video_streams[0].codec, VideoCodec.MPEG2.ffmpeg_codec_name)
def subexecute(self, ns): import os from media_management_scripts.convert import convert_config_from_ns input_to_cmd = ns['input'] output = ns['output'] overwrite = ns['overwrite'] bulk = ns['bulk'] config = convert_config_from_ns(ns) if os.path.isdir(input_to_cmd): if bulk: os.makedirs(output, exist_ok=True) files = list(get_input_output(input_to_cmd, output)) self._bulk(files, lambda i, o: _bulk_convert(i, o, config, overwrite), ['Input', 'Output']) else: print( 'Cowardly refusing to convert a direction without --bulk flag' ) elif not overwrite and os.path.exists(output): print('Cowardly refusing to overwrite existing file: {}'.format( output)) else: convert_with_config(input_to_cmd, output, config, print_output=True, overwrite=overwrite)
def test_scale_convert(self): config = ConvertConfig(scale=480) with create_test_video(length=4, video_def=VideoDefinition(resolution=Resolution.HIGH_DEF)) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertEqual(metadata.resolution, Resolution.STANDARD_DEF)
def test_cut_convert(self): config = convert_config_from_ns({'start': 3.0, 'end': 6.0}) with create_test_video(length=10) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertAlmostEqual(3.0, metadata.estimated_duration, delta=.03)
def test_mpeg2_convert(self): config = convert_config_from_ns( {'video_codec': VideoCodec.MPEG2.ffmpeg_encoder_name}) with create_test_video(length=3) as file, NamedTemporaryFile( suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertEqual(metadata.video_streams[0].codec.lower(), VideoCodec.MPEG2.ffmpeg_codec_name)
def test_defaults_convert(self): config = convert_config_from_ns({}) with create_test_video(length=3, video_def=VideoDefinition(resolution=Resolution.LOW_DEF, codec=VideoCodec.MPEG2), audio_defs=[AudioDefition(codec=AudioCodec.AC3)]) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True) metadata = extract_metadata(output.name) self.assertEqual(metadata.resolution, Resolution.LOW_DEF) self.assertEqual(metadata.video_streams[0].codec, VideoCodec.H264.ffmpeg_codec_name) self.assertEqual(metadata.audio_streams[0].codec, AudioCodec.AAC.ffmpeg_codec_name)
def process(self, root_dir, input_file, output_file, temp_file, status, convert_config): if not status.convert and os.path.exists(output_file): logger.info( 'Output exists, will not convert: input={}, output={}'.format( input_file, output_file)) create_dirs(temp_file) create_dirs(output_file) # Start backup backup_popen, cleanup_dir = None, None error = False if not status.backup: if self.backup_enabled: logger.debug('No backup for {}'.format(input_file)) backup_popen, cleanup_dir = self.backup(root_dir, input_file) else: logger.debug( 'No backup for {}, but backups are disabled'.format( input_file)) if not status.convert and not os.path.exists(output_file): # Start convert logger.debug('Not converted: {}'.format(input_file)) if os.path.exists(temp_file): os.remove(temp_file) result = convert_with_config(input_file, temp_file, convert_config, print_output=False) if result == 0: logger.debug('Conversion successful for {}'.format(input_file)) shutil.copyfile(temp_file, output_file) status.convert = True else: logger.error('Error converting: code={}, file={}'.format( result, input_file)) error = True if os.path.exists(temp_file): os.remove(temp_file) if backup_popen: logger.debug('Waiting for backup...') ret_code = backup_popen.wait() if ret_code == 0: logger.debug('Backup succeeded for {}'.format(input_file)) status.backup = True if cleanup_dir and os.path.exists(cleanup_dir): shutil.rmtree(cleanup_dir, ignore_errors=True) else: logger.error('Error backing up: code={}, file={}'.format( ret_code, input_file)) error = True return not error
def convert(self, in_file, out_file, commercials, metadata): invert = invert_commercial(commercials) temp_files = [] wo_ext = os.path.basename(in_file).replace('.wtv', '') try: args = [ffmpeg(), '-i', in_file] for i in invert: temp_file = os.path.join( self.temp_dir, wo_ext + '.' + str(len(temp_files)) + '.ts') temp_files.append(temp_file) if os.path.isfile(temp_file): os.remove(temp_file) args.extend(self.cut_args(i, temp_file)) ret, output = execute_with_output(args) if ret != 0: logger.error('Nonzero return code from ffmpeg: {}'.format(ret)) return False else: input = 'concat:{}'.format('|'.join(temp_files)) ret = convert_with_config(input, out_file, config=self.convert_config, print_output=False, overwrite=True, metadata=metadata) if ret != 0: logger.error( 'Nonzero return code from ffmpeg: {}'.format(ret)) # Cleanup temp files if not self.debug: for f in temp_files: os.remove(f) except Exception as e: logger.exception('Exception') return False return True
def test_deinterlace_convert(self): config = ConvertConfig(deinterlace=True) with create_test_video(length=10, video_def=VideoDefinition(codec=VideoCodec.MPEG2, interlaced=True)) as file, \ NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True)
def test_deinterlace_detect_convert(self): config = ConvertConfig(deinterlace=True) with create_test_video(length=10) as file, NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True)
def test_auto_bitrate_custom_convert(self): config = ConvertConfig(bitrate='auto', auto_bitrate_240=300) with create_test_video(length=10) as file, NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True)
def test_basic_convert(self): config = convert_config_from_ns({}) with create_test_video(length=10) as file, NamedTemporaryFile(suffix='.mkv') as output: convert_with_config(file.name, output.name, config, overwrite=True)
def _bulk_convert(i, o, config, overwrite): print('Starting {}'.format(i)) os.makedirs(os.path.dirname(o), exist_ok=True) convert_with_config(i, o, config, print_output=False, overwrite=overwrite)
def _bulk_convert(i, o, config): print('Starting {}'.format(i)) convert_with_config(i, o, config, print_output=False)