diff options
| author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-07-31 22:32:46 +0200 | 
|---|---|---|
| committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-07-31 22:33:37 +0200 | 
| commit | b15d4f624f3d9774bfe932b5f0b89f62e2614af2 (patch) | |
| tree | b80f2a489f2b3bf19552b4efdca83f2178548e5a | |
| parent | 4aa16a50f57a566f4ead63db261c194af2034a96 (diff) | |
Allow to download from m3u8 manifests with ffmpeg
They are detected by the extension of the url.
| -rw-r--r-- | youtube_dl/FileDownloader.py | 33 | 
1 files changed, 33 insertions, 0 deletions
| diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index 155895fe2..ea6b9d626 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -329,6 +329,35 @@ class FileDownloader(object):              self.report_error(u'mplayer exited with code %d' % retval)              return False +    def _download_m3u8_with_ffmpeg(self, filename, url): +        self.report_destination(filename) +        tmpfilename = self.temp_name(filename) + +        args = ['ffmpeg', '-y', '-i', url, '-f', 'mp4', tmpfilename] +        # Check for ffmpeg first +        try: +            subprocess.call(['ffmpeg', '-h'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT) +        except (OSError, IOError): +            self.report_error(u'm3u8 download detected but "%s" could not be run' % args[0] ) +            return False + +        retval = subprocess.call(args) +        if retval == 0: +            fsize = os.path.getsize(encodeFilename(tmpfilename)) +            self.to_screen(u'\r[%s] %s bytes' % (args[0], fsize)) +            self.try_rename(tmpfilename, filename) +            self._hook_progress({ +                'downloaded_bytes': fsize, +                'total_bytes': fsize, +                'filename': filename, +                'status': 'finished', +            }) +            return True +        else: +            self.to_stderr(u"\n") +            self.report_error(u'ffmpeg exited with code %d' % retval) +            return False +      def _do_download(self, filename, info_dict):          url = info_dict['url'] @@ -354,6 +383,10 @@ class FileDownloader(object):          if url.startswith('mms') or url.startswith('rtsp'):              return self._download_with_mplayer(filename, url) +        # m3u8 manifest are downloaded with ffmpeg +        if determine_ext(url) == u'm3u8': +            return self._download_m3u8_with_ffmpeg(filename, url) +          tmpfilename = self.temp_name(filename)          stream = None | 
