diff options
| author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2015-01-24 18:52:26 +0100 | 
|---|---|---|
| committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2015-01-24 18:56:04 +0100 | 
| commit | e5660ee6aebacee4b149648bee1a7ce1ec72c1e4 (patch) | |
| tree | 001f32088e9767f57858d17f346bb8347685e533 | |
| parent | 587a9c27496979d983296944fee8d1fa589e1b85 (diff) | |
[YoutubeDL] Fill the info dict 'http_headers' field with all the headers available
Useful for external tools using the json output.
The methods '_calc_headers' and '_calc_cookies' have been copied from the downloader/external, now they just use "info_dict['http_headers']".
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 36 | ||||
| -rw-r--r-- | youtube_dl/downloader/external.py | 43 | 
2 files changed, 39 insertions, 40 deletions
| diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 54e732943..4c3d45f48 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -56,6 +56,7 @@ from .utils import (      preferredencoding,      SameFileError,      sanitize_filename, +    std_headers,      subtitles_filename,      takewhile_inclusive,      UnavailableVideoError, @@ -865,6 +866,36 @@ class YoutubeDL(object):                  return matches[-1]          return None +    def _calc_headers(self, info_dict): +        res = std_headers.copy() + +        add_headers = info_dict.get('http_headers') +        if add_headers: +            res.update(add_headers) + +        cookies = self._calc_cookies(info_dict) +        if cookies: +            res['Cookie'] = cookies + +        return res + +    def _calc_cookies(self, info_dict): +        class _PseudoRequest(object): +            def __init__(self, url): +                self.url = url +                self.headers = {} +                self.unverifiable = False + +            def add_unredirected_header(self, k, v): +                self.headers[k] = v + +            def get_full_url(self): +                return self.url + +        pr = _PseudoRequest(info_dict['url']) +        self.cookiejar.add_cookie_header(pr) +        return pr.headers.get('Cookie') +      def process_video_result(self, info_dict, download=True):          assert info_dict.get('_type', 'video') == 'video' @@ -933,6 +964,11 @@ class YoutubeDL(object):              # Automatically determine file extension if missing              if 'ext' not in format:                  format['ext'] = determine_ext(format['url']).lower() +            # Add HTTP headers, so that external programs can use them from the +            # json output +            full_format_info = info_dict.copy() +            full_format_info.update(format) +            format['http_headers'] = self._calc_headers(full_format_info)          format_limit = self.params.get('format_limit', None)          if format_limit: diff --git a/youtube_dl/downloader/external.py b/youtube_dl/downloader/external.py index 5bf24ccbb..af9fdba75 100644 --- a/youtube_dl/downloader/external.py +++ b/youtube_dl/downloader/external.py @@ -7,7 +7,6 @@ import sys  from .common import FileDownloader  from ..utils import (      encodeFilename, -    std_headers,  ) @@ -46,42 +45,6 @@ class ExternalFD(FileDownloader):      def supports(cls, info_dict):          return info_dict['protocol'] in ('http', 'https', 'ftp', 'ftps') -    def _calc_headers(self, info_dict): -        res = std_headers.copy() - -        add_headers = info_dict.get('http_headers') -        if add_headers: -            res.update(add_headers) - -        cookies = self._calc_cookies(info_dict) -        if cookies: -            res['Cookie'] = cookies - -        return res - -    def _calc_cookies(self, info_dict): -        class _PseudoRequest(object): -            def __init__(self, url): -                self.url = url -                self.headers = {} -                self.unverifiable = False - -            def add_unredirected_header(self, k, v): -                self.headers[k] = v - -            def get_full_url(self): -                return self.url - -            def is_unverifiable(self): -                return self.unverifiable - -            def has_header(self, h): -                return h in self.headers - -        pr = _PseudoRequest(info_dict['url']) -        self.ydl.cookiejar.add_cookie_header(pr) -        return pr.headers.get('Cookie') -      def _call_downloader(self, tmpfilename, info_dict):          """ Either overwrite this or implement _make_cmd """          cmd = self._make_cmd(tmpfilename, info_dict) @@ -107,7 +70,7 @@ class ExternalFD(FileDownloader):  class CurlFD(ExternalFD):      def _make_cmd(self, tmpfilename, info_dict):          cmd = [self.exe, '-o', tmpfilename] -        for key, val in self._calc_headers(info_dict).items(): +        for key, val in info_dict['http_headers'].items():              cmd += ['--header', '%s: %s' % (key, val)]          cmd += ['--', info_dict['url']]          return cmd @@ -116,7 +79,7 @@ class CurlFD(ExternalFD):  class WgetFD(ExternalFD):      def _make_cmd(self, tmpfilename, info_dict):          cmd = [self.exe, '-O', tmpfilename, '-nv', '--no-cookies'] -        for key, val in self._calc_headers(info_dict).items(): +        for key, val in info_dict['http_headers'].items():              cmd += ['--header', '%s: %s' % (key, val)]          cmd += ['--', info_dict['url']]          return cmd @@ -131,7 +94,7 @@ class Aria2cFD(ExternalFD):          if dn:              cmd += ['--dir', dn]          cmd += ['--out', os.path.basename(tmpfilename)] -        for key, val in self._calc_headers(info_dict).items(): +        for key, val in info_dict['http_headers'].items():              cmd += ['--header', '%s: %s' % (key, val)]          cmd += ['--', info_dict['url']]          return cmd | 
