<s> from __future__ import unicode_literals <EOL> import os <EOL> import subprocess <EOL> import sys <EOL> import time <EOL> from . common import AudioConversionError , PostProcessor <EOL> from . . compat import ( <EOL> compat_subprocess_get_DEVNULL , <EOL> ) <EOL> from . . utils import ( <EOL> encodeArgument , <EOL> encodeFilename , <EOL> get_exe_version , <EOL> is_outdated_version , <EOL> PostProcessingError , <EOL> prepend_extension , <EOL> shell_quote , <EOL> subtitles_filename , <EOL> ) <EOL> class FFmpegPostProcessorError ( PostProcessingError ) : <EOL> pass <EOL> class FFmpegPostProcessor ( PostProcessor ) : <EOL> def __init__ ( self , downloader = None , deletetempfiles = False ) : <EOL> PostProcessor . __init__ ( self , downloader ) <EOL> self . _versions = self . get_versions ( ) <EOL> self . _deletetempfiles = deletetempfiles <EOL> def check_version ( self ) : <EOL> if not self . _executable : <EOL> raise FFmpegPostProcessorError ( '<STR_LIT>' ) <EOL> required_version = '<STR_LIT>' if self . _uses_avconv ( ) else '<STR_LIT:1.0>' <EOL> if is_outdated_version ( <EOL> self . _versions [ self . _executable ] , required_version ) : <EOL> warning = '<STR_LIT>' % ( <EOL> self . _executable , self . _executable , required_version ) <EOL> if self . _downloader : <EOL> self . _downloader . report_warning ( warning ) <EOL> @ staticmethod <EOL> def get_versions ( ) : <EOL> programs = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> return dict ( ( p , get_exe_version ( p , args = [ '<STR_LIT>' ] ) ) for p in programs ) <EOL> @ property <EOL> def available ( self ) : <EOL> return self . _executable is not None <EOL> @ property <EOL> def _executable ( self ) : <EOL> if self . _downloader . params . get ( '<STR_LIT>' , False ) : <EOL> prefs = ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> else : <EOL> prefs = ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> for p in prefs : <EOL> if self . _versions [ p ] : <EOL> return p <EOL> return None <EOL> @ property <EOL> def _probe_executable ( self ) : <EOL> if self . _downloader . params . get ( '<STR_LIT>' , False ) : <EOL> prefs = ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> else : <EOL> prefs = ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> for p in prefs : <EOL> if self . _versions [ p ] : <EOL> return p <EOL> return None <EOL> def _uses_avconv ( self ) : <EOL> return self . _executable == '<STR_LIT>' <EOL> def run_ffmpeg_multiple_files ( self , input_paths , out_path , opts ) : <EOL> self . check_version ( ) <EOL> oldest_mtime = min ( <EOL> os . stat ( encodeFilename ( path ) ) . st_mtime for path in input_paths ) <EOL> files_cmd = [ ] <EOL> for path in input_paths : <EOL> files_cmd . extend ( [ encodeArgument ( '<STR_LIT>' ) , encodeFilename ( path , True ) ] ) <EOL> cmd = ( [ encodeFilename ( self . _executable , True ) , encodeArgument ( '<STR_LIT>' ) ] + <EOL> files_cmd + <EOL> [ encodeArgument ( o ) for o in opts ] + <EOL> [ encodeFilename ( self . _ffmpeg_filename_argument ( out_path ) , True ) ] ) <EOL> if self . _downloader . params . get ( '<STR_LIT>' , False ) : <EOL> self . _downloader . to_screen ( '<STR_LIT>' % shell_quote ( cmd ) ) <EOL> p = subprocess . Popen ( cmd , stdout = subprocess . PIPE , stderr = subprocess . PIPE ) <EOL> stdout , stderr = p . communicate ( ) <EOL> if p . returncode != <NUM_LIT:0> : <EOL> stderr = stderr . decode ( '<STR_LIT:utf-8>' , '<STR_LIT:replace>' ) <EOL> msg = stderr . strip ( ) . split ( '<STR_LIT:\n>' ) [ - <NUM_LIT:1> ] <EOL> raise FFmpegPostProcessorError ( msg ) <EOL> os . utime ( encodeFilename ( out_path ) , ( oldest_mtime , oldest_mtime ) ) <EOL> if self . _deletetempfiles : <EOL> for ipath in input_paths : <EOL> os . remove ( ipath ) <EOL> def run_ffmpeg ( self , path , out_path , opts ) : <EOL> self . run_ffmpeg_multiple_files ( [ path ] , out_path , opts ) <EOL> def _ffmpeg_filename_argument ( self , fn ) : <EOL> if fn . startswith ( '<STR_LIT:->' ) : <EOL> return '<STR_LIT>' + fn <EOL> return fn <EOL> class FFmpegExtractAudioPP ( FFmpegPostProcessor ) : <EOL> def __init__ ( self , downloader = None , preferredcodec = None , preferredquality = None , nopostoverwrites = False ) : <EOL> FFmpegPostProcessor . __init__ ( self , downloader ) <EOL> if preferredcodec is None : <EOL> preferredcodec = '<STR_LIT>' <EOL> self . _preferredcodec = preferredcodec <EOL> self . _preferredquality = preferredquality <EOL> self . _nopostoverwrites = nopostoverwrites <EOL> def get_audio_codec ( self , path ) : <EOL> if not self . _probe_executable : <EOL> raise PostProcessingError ( '<STR_LIT>' ) <EOL> try : <EOL> cmd = [ <EOL> encodeFilename ( self . _probe_executable , True ) , <EOL> encodeArgument ( '<STR_LIT>' ) , <EOL> encodeFilename ( self . _ffmpeg_filename_argument ( path ) , True ) ] <EOL> handle = subprocess . Popen ( cmd , stderr = compat_subprocess_get_DEVNULL ( ) , stdout = subprocess . PIPE ) <EOL> output = handle . communicate ( ) [ <NUM_LIT:0> ] <EOL> if handle . wait ( ) != <NUM_LIT:0> : <EOL> return None <EOL> except ( IOError , OSError ) : <EOL> return None <EOL> audio_codec = None <EOL> for line in output . decode ( '<STR_LIT:ascii>' , '<STR_LIT:ignore>' ) . split ( '<STR_LIT:\n>' ) : <EOL> if line . startswith ( '<STR_LIT>' ) : <EOL> audio_codec = line . split ( '<STR_LIT:=>' ) [ <NUM_LIT:1> ] . strip ( ) <EOL> elif line . strip ( ) == '<STR_LIT>' and audio_codec is not None : <EOL> return audio_codec <EOL> return None <EOL> def run_ffmpeg ( self , path , out_path , codec , more_opts ) : <EOL> if codec is None : <EOL> acodec_opts = [ ] <EOL> else : <EOL> acodec_opts = [ '<STR_LIT>' , codec ] <EOL> opts = [ '<STR_LIT>' ] + acodec_opts + more_opts <EOL> try : <EOL> FFmpegPostProcessor . run_ffmpeg ( self , path , out_path , opts ) <EOL> except FFmpegPostProcessorError as err : <EOL> raise AudioConversionError ( err . msg ) <EOL> def run ( self , information ) : <EOL> path = information [ '<STR_LIT>' ] <EOL> filecodec = self . get_audio_codec ( path ) <EOL> if filecodec is None : <EOL> raise PostProcessingError ( '<STR_LIT>' ) <EOL> uses_avconv = self . _uses_avconv ( ) <EOL> more_opts = [ ] <EOL> if self . _preferredcodec == '<STR_LIT>' or self . _preferredcodec == filecodec or ( self . _preferredcodec == '<STR_LIT>' and filecodec == '<STR_LIT>' ) : <EOL> if filecodec == '<STR_LIT>' and self . _preferredcodec in [ '<STR_LIT>' , '<STR_LIT>' ] : <EOL> acodec = '<STR_LIT>' <EOL> extension = '<STR_LIT>' <EOL> more_opts = [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , '<STR_LIT>' ] <EOL> elif filecodec in [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] : <EOL> acodec = '<STR_LIT>' <EOL> extension = filecodec <EOL> if filecodec == '<STR_LIT>' : <EOL> more_opts = [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> if filecodec == '<STR_LIT>' : <EOL> extension = '<STR_LIT>' <EOL> else : <EOL> acodec = '<STR_LIT>' <EOL> extension = '<STR_LIT>' <EOL> more_opts = [ ] <EOL> if self . _preferredquality is not None : <EOL> if int ( self . _preferredquality ) < <NUM_LIT:10> : <EOL> more_opts += [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , self . _preferredquality ] <EOL> else : <EOL> more_opts += [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , self . _preferredquality + '<STR_LIT:k>' ] <EOL> else : <EOL> acodec = { '<STR_LIT>' : '<STR_LIT>' , '<STR_LIT>' : '<STR_LIT>' , '<STR_LIT>' : '<STR_LIT>' , '<STR_LIT>' : '<STR_LIT>' , '<STR_LIT>' : '<STR_LIT>' , '<STR_LIT>' : None } [ self . _preferredcodec ] <EOL> extension = self . _preferredcodec <EOL> more_opts = [ ] <EOL> if self . _preferredquality is not None : <EOL> if int ( self . _preferredquality ) < <NUM_LIT:10> and extension != '<STR_LIT>' : <EOL> more_opts += [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , self . _preferredquality ] <EOL> else : <EOL> more_opts += [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , self . _preferredquality + '<STR_LIT:k>' ] <EOL> if self . _preferredcodec == '<STR_LIT>' : <EOL> more_opts += [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> if self . _preferredcodec == '<STR_LIT>' : <EOL> more_opts += [ '<STR_LIT>' if uses_avconv else '<STR_LIT>' , '<STR_LIT>' ] <EOL> if self . _preferredcodec == '<STR_LIT>' : <EOL> extension = '<STR_LIT>' <EOL> if self . _preferredcodec == '<STR_LIT>' : <EOL> extension = '<STR_LIT>' <EOL> more_opts += [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> prefix , sep , ext = path . rpartition ( '<STR_LIT:.>' ) <EOL> new_path = prefix + sep + extension <EOL> if new_path == path : <EOL> self . _nopostoverwrites = True <EOL> try : <EOL> if self . _nopostoverwrites and os . path . exists ( encodeFilename ( new_path ) ) : <EOL> self . _downloader . to_screen ( '<STR_LIT>' % new_path ) <EOL> else : <EOL> self . _downloader . to_screen ( '<STR_LIT:[>' + self . _executable + '<STR_LIT>' + new_path ) <EOL> self . run_ffmpeg ( path , new_path , acodec , more_opts ) <EOL> except : <EOL> etype , e , tb = sys . exc_info ( ) <EOL> if isinstance ( e , AudioConversionError ) : <EOL> msg = '<STR_LIT>' + e . msg <EOL> else : <EOL> msg = '<STR_LIT>' + self . _executable <EOL> raise PostProcessingError ( msg ) <EOL> if information . get ( '<STR_LIT>' ) is not None : <EOL> try : <EOL> os . utime ( encodeFilename ( new_path ) , ( time . time ( ) , information [ '<STR_LIT>' ] ) ) <EOL> except : <EOL> self . _downloader . report_warning ( '<STR_LIT>' ) <EOL> information [ '<STR_LIT>' ] = new_path <EOL> return self . _nopostoverwrites , information <EOL> class FFmpegVideoConvertorPP ( FFmpegPostProcessor ) : <EOL> def __init__ ( self , downloader = None , preferedformat = None ) : <EOL> super ( FFmpegVideoConvertorPP , self ) . __init__ ( downloader ) <EOL> self . _preferedformat = preferedformat <EOL> def run ( self , information ) : <EOL> path = information [ '<STR_LIT>' ] <EOL> prefix , sep , ext = path . rpartition ( '<STR_LIT:.>' ) <EOL> outpath = prefix + sep + self . _preferedformat <EOL> if information [ '<STR_LIT>' ] == self . _preferedformat : <EOL> self . _downloader . to_screen ( '<STR_LIT>' % ( path , self . _preferedformat ) ) <EOL> return True , information <EOL> self . _downloader . to_screen ( '<STR_LIT:[>' + '<STR_LIT>' + '<STR_LIT>' % ( information [ '<STR_LIT>' ] , self . _preferedformat ) + outpath ) <EOL> self . run_ffmpeg ( path , outpath , [ ] ) <EOL> information [ '<STR_LIT>' ] = outpath <EOL> information [ '<STR_LIT>' ] = self . _preferedformat <EOL> information [ '<STR_LIT>' ] = self . _preferedformat <EOL> return False , information <EOL> class FFmpegEmbedSubtitlePP ( FFmpegPostProcessor ) : <EOL> _lang_map = { <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT:id>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT:to>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> } <EOL> def __init__ ( self , downloader = None , subtitlesformat = '<STR_LIT>' ) : <EOL> super ( FFmpegEmbedSubtitlePP , self ) . __init__ ( downloader ) <EOL> self . _subformat = subtitlesformat <EOL> @ classmethod <EOL> def _conver_lang_code ( cls , code ) : <EOL> """<STR_LIT>""" <EOL> return cls . _lang_map . get ( code [ : <NUM_LIT:2> ] ) <EOL> def run ( self , information ) : <EOL> if information [ '<STR_LIT>' ] != '<STR_LIT>' : <EOL> self . _downloader . to_screen ( '<STR_LIT>' ) <EOL> return True , information <EOL> if not information . get ( '<STR_LIT>' ) : <EOL> self . _downloader . to_screen ( '<STR_LIT>' ) <EOL> return True , information <EOL> sub_langs = [ key for key in information [ '<STR_LIT>' ] ] <EOL> filename = information [ '<STR_LIT>' ] <EOL> input_files = [ filename ] + [ subtitles_filename ( filename , lang , self . _subformat ) for lang in sub_langs ] <EOL> opts = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> for ( i , lang ) in enumerate ( sub_langs ) : <EOL> opts . extend ( [ '<STR_LIT>' , '<STR_LIT>' % ( i + <NUM_LIT:1> ) , '<STR_LIT>' % i , '<STR_LIT>' ] ) <EOL> lang_code = self . _conver_lang_code ( lang ) <EOL> if lang_code is not None : <EOL> opts . extend ( [ '<STR_LIT>' % i , '<STR_LIT>' % lang_code ] ) <EOL> opts . extend ( [ '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> temp_filename = filename + '<STR_LIT>' <EOL> self . _downloader . to_screen ( '<STR_LIT>' % filename ) <EOL> self . run_ffmpeg_multiple_files ( input_files , temp_filename , opts ) <EOL> os . remove ( encodeFilename ( filename ) ) <EOL> os . rename ( encodeFilename ( temp_filename ) , encodeFilename ( filename ) ) <EOL> return True , information <EOL> class FFmpegMetadataPP ( FFmpegPostProcessor ) : <EOL> def run ( self , info ) : <EOL> metadata = { } <EOL> if info . get ( '<STR_LIT:title>' ) is not None : <EOL> metadata [ '<STR_LIT:title>' ] = info [ '<STR_LIT:title>' ] <EOL> if info . get ( '<STR_LIT>' ) is not None : <EOL> metadata [ '<STR_LIT:date>' ] = info [ '<STR_LIT>' ] <EOL> if info . get ( '<STR_LIT>' ) is not None : <EOL> metadata [ '<STR_LIT>' ] = info [ '<STR_LIT>' ] <EOL> elif info . get ( '<STR_LIT>' ) is not None : <EOL> metadata [ '<STR_LIT>' ] = info [ '<STR_LIT>' ] <EOL> if not metadata : <EOL> self . _downloader . to_screen ( '<STR_LIT>' ) <EOL> return True , info <EOL> filename = info [ '<STR_LIT>' ] <EOL> temp_filename = prepend_extension ( filename , '<STR_LIT>' ) <EOL> if info [ '<STR_LIT>' ] == '<STR_LIT>' : <EOL> options = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> else : <EOL> options = [ '<STR_LIT:-c>' , '<STR_LIT>' ] <EOL> for ( name , value ) in metadata . items ( ) : <EOL> options . extend ( [ '<STR_LIT>' , '<STR_LIT>' % ( name , value ) ] ) <EOL> self . _downloader . to_screen ( '<STR_LIT>' % filename ) <EOL> self . run_ffmpeg ( filename , temp_filename , options ) <EOL> os . remove ( encodeFilename ( filename ) ) <EOL> os . rename ( encodeFilename ( temp_filename ) , encodeFilename ( filename ) ) <EOL> return True , info <EOL> class FFmpegMergerPP ( FFmpegPostProcessor ) : <EOL> def run ( self , info ) : <EOL> filename = info [ '<STR_LIT>' ] <EOL> args = [ '<STR_LIT:-c>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> self . _downloader . to_screen ( '<STR_LIT>' % filename ) <EOL> self . run_ffmpeg_multiple_files ( info [ '<STR_LIT>' ] , filename , args ) <EOL> return True , info <EOL> class FFmpegAudioFixPP ( FFmpegPostProcessor ) : <EOL> def run ( self , info ) : <EOL> filename = info [ '<STR_LIT>' ] <EOL> temp_filename = prepend_extension ( filename , '<STR_LIT>' ) <EOL> options = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> self . _downloader . to_screen ( '<STR_LIT>' % filename ) <EOL> self . run_ffmpeg ( filename , temp_filename , options ) <EOL> os . remove ( encodeFilename ( filename ) ) <EOL> os . rename ( encodeFilename ( temp_filename ) , encodeFilename ( filename ) ) <EOL> return True , info <EOL> class FFmpegFixupStretchedPP ( FFmpegPostProcessor ) : <EOL> def run ( self , info ) : <EOL> stretched_ratio = info . get ( '<STR_LIT>' ) <EOL> if stretched_ratio is None or stretched_ratio == <NUM_LIT:1> : <EOL> return <EOL> filename = info [ '<STR_LIT>' ] <EOL> temp_filename = prepend_extension ( filename , '<STR_LIT>' ) <EOL> options = [ '<STR_LIT:-c>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' % stretched_ratio ] <EOL> self . _downloader . to_screen ( '<STR_LIT>' % filename ) <EOL> self . run_ffmpeg ( filename , temp_filename , options ) <EOL> os . remove ( encodeFilename ( filename ) ) <EOL> os . rename ( encodeFilename ( temp_filename ) , encodeFilename ( filename ) ) <EOL> return True , info </s>
