diff options
Diffstat (limited to 'youtube_dl/downloader/hls.py')
| -rw-r--r-- | youtube_dl/downloader/hls.py | 74 | 
1 files changed, 3 insertions, 71 deletions
diff --git a/youtube_dl/downloader/hls.py b/youtube_dl/downloader/hls.py index 2a775bf00..a01dac031 100644 --- a/youtube_dl/downloader/hls.py +++ b/youtube_dl/downloader/hls.py @@ -1,87 +1,19 @@  from __future__ import unicode_literals -import os +import os.path  import re -import subprocess -import sys -from .common import FileDownloader  from .fragment import FragmentFD  from ..compat import compat_urlparse -from ..postprocessor.ffmpeg import FFmpegPostProcessor  from ..utils import ( -    encodeArgument,      encodeFilename,      sanitize_open, -    handle_youtubedl_headers,  ) -class HlsFD(FileDownloader): -    def real_download(self, filename, info_dict): -        url = info_dict['url'] -        self.report_destination(filename) -        tmpfilename = self.temp_name(filename) - -        ffpp = FFmpegPostProcessor(downloader=self) -        if not ffpp.available: -            self.report_error('m3u8 download detected but ffmpeg or avconv could not be found. Please install one.') -            return False -        ffpp.check_version() - -        args = [ffpp.executable, '-y'] - -        if info_dict['http_headers'] and re.match(r'^https?://', url): -            # Trailing \r\n after each HTTP header is important to prevent warning from ffmpeg/avconv: -            # [http @ 00000000003d2fa0] No trailing CRLF found in HTTP header. -            headers = handle_youtubedl_headers(info_dict['http_headers']) -            args += [ -                '-headers', -                ''.join('%s: %s\r\n' % (key, val) for key, val in headers.items())] - -        args += ['-i', url, '-c', 'copy'] -        if self.params.get('hls_use_mpegts', False): -            args += ['-f', 'mpegts'] -        else: -            args += ['-f', 'mp4', '-bsf:a', 'aac_adtstoasc'] - -        args = [encodeArgument(opt) for opt in args] -        args.append(encodeFilename(ffpp._ffmpeg_filename_argument(tmpfilename), True)) - -        self._debug_cmd(args) - -        proc = subprocess.Popen(args, stdin=subprocess.PIPE) -        try: -            retval = proc.wait() -        except KeyboardInterrupt: -            # subprocces.run would send the SIGKILL signal to ffmpeg and the -            # mp4 file couldn't be played, but if we ask ffmpeg to quit it -            # produces a file that is playable (this is mostly useful for live -            # streams). Note that Windows is not affected and produces playable -            # files (see https://github.com/rg3/youtube-dl/issues/8300). -            if sys.platform != 'win32': -                proc.communicate(b'q') -            raise -        if retval == 0: -            fsize = os.path.getsize(encodeFilename(tmpfilename)) -            self.to_screen('\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('\n') -            self.report_error('%s exited with code %d' % (ffpp.basename, retval)) -            return False - - -class NativeHlsFD(FragmentFD): -    """ A more limited implementation that does not require ffmpeg """ +class HlsFD(FragmentFD): +    """ A limited implementation that does not require ffmpeg """      FD_NAME = 'hlsnative'  | 
