diff --git a/youtube_dl/PostProcessor.py b/youtube_dl/PostProcessor.py index f2e2aa1fa..ba4deaaa9 100644 --- a/youtube_dl/PostProcessor.py +++ b/youtube_dl/PostProcessor.py @@ -90,15 +90,25 @@ class FFmpegExtractAudioPP(PostProcessor): return None except (IOError, OSError): return None - audio_codec = None + codec = None + duration = None for line in output.split('\n'): if line.startswith('codec_name='): - audio_codec = line.split('=')[1].strip() - elif line.strip() == 'codec_type=audio' and audio_codec is not None: - return audio_codec - return None + codec = line.split('=')[1].strip() + elif line.startswith('duration='): + duration = line.split('=')[1].strip() + try: + duration = float(duration) + except: + duration = None + elif line.strip() == '[/STREAM]' and codec is not None: + break + return { + 'codec': codec, + 'duration': duration + } - def run_ffmpeg(self, path, out_path, codec, more_opts): + def run_ffmpeg(self, path, out_path, codec, more_opts, duration): if not self._exes['ffmpeg'] and not self._exes['avconv']: raise AudioConversionError('ffmpeg or avconv not found. Please install one.') if codec is None: @@ -108,16 +118,55 @@ class FFmpegExtractAudioPP(PostProcessor): cmd = ([self._exes['avconv'] or self._exes['ffmpeg'], '-y', '-i', encodeFilename(path), '-vn'] + acodec_opts + more_opts + ['--', encodeFilename(out_path)]) - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout,stderr = p.communicate() + start = time.time() + # open process redirecting stderr to stdout + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) + import fcntl + import errno + import select + # entire captured output + p_output = '' + # size= 765kB time=243.67 bitrate= 25.7kbits/s + reo = re.compile("""size=\s*(?P\S+) # size + \stime=(?P