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)
Esempio n. 3
0
    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)
Esempio n. 5
0
 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)
Esempio n. 6
0
 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)
Esempio n. 8
0
    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
Esempio n. 9
0
    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)
Esempio n. 14
0
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)
Esempio n. 15
0
def _bulk_convert(i, o, config):
    print('Starting {}'.format(i))
    convert_with_config(i, o, config, print_output=False)