diff options
Diffstat (limited to 'youtube_dl/extractor/common.py')
| -rw-r--r-- | youtube_dl/extractor/common.py | 72 | 
1 files changed, 40 insertions, 32 deletions
| diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 69a083b68..ba46a7bc7 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -18,6 +18,7 @@ from ..utils import (      sanitize_filename,      unescapeHTML,  ) +_NO_DEFAULT = object()  class InfoExtractor(object): @@ -34,15 +35,39 @@ class InfoExtractor(object):      The dictionaries must include the following fields:      id:             Video identifier. -    url:            Final video URL.      title:          Video title, unescaped. -    ext:            Video filename extension. -    Instead of url and ext, formats can also specified. +    Additionally, it must contain either a formats entry or url and ext: + +    formats:        A list of dictionaries for each format available, it must +                    be ordered from worst to best quality. Potential fields: +                    * url        Mandatory. The URL of the video file +                    * ext        Will be calculated from url if missing +                    * format     A human-readable description of the format +                                 ("mp4 container with h264/opus"). +                                 Calculated from the format_id, width, height. +                                 and format_note fields if missing. +                    * format_id  A short description of the format +                                 ("mp4_h264_opus" or "19") +                    * format_note Additional info about the format +                                 ("3D" or "DASH video") +                    * width      Width of the video, if known +                    * height     Height of the video, if known +                    * abr        Average audio bitrate in KBit/s +                    * acodec     Name of the audio codec in use +                    * vbr        Average video bitrate in KBit/s +                    * vcodec     Name of the video codec in use +                    * filesize   The number of bytes, if known in advance +                    * player_url SWF Player URL (used for rtmpdump). +    url:            Final video URL. +    ext:            Video filename extension. +    format:         The video format, defaults to ext (used for --get-format) +    player_url:     SWF Player URL (used for rtmpdump). +    urlhandle:      [internal] The urlHandle to be used to download the file, +                    like returned by urllib.request.urlopen      The following fields are optional: -    format:         The video format, defaults to ext (used for --get-format)      thumbnails:     A list of dictionaries (with the entries "resolution" and                      "url") for the varying thumbnails      thumbnail:      Full URL to a video thumbnail image. @@ -51,35 +76,14 @@ class InfoExtractor(object):      upload_date:    Video upload date (YYYYMMDD).      uploader_id:    Nickname or id of the video uploader.      location:       Physical location of the video. -    player_url:     SWF Player URL (used for rtmpdump).      subtitles:      The subtitle file contents as a dictionary in the format                      {language: subtitles}. +    duration:       Length of the video in seconds, as an integer.      view_count:     How many users have watched the video on the platform.      like_count:     Number of positive ratings of the video      dislike_count:  Number of negative ratings of the video      comment_count:  Number of comments on the video -    urlhandle:      [internal] The urlHandle to be used to download the file, -                    like returned by urllib.request.urlopen      age_limit:      Age restriction for the video, as an integer (years) -    formats:        A list of dictionaries for each format available, it must -                    be ordered from worst to best quality. Potential fields: -                    * url       Mandatory. The URL of the video file -                    * ext       Will be calculated from url if missing -                    * format    A human-readable description of the format -                                ("mp4 container with h264/opus"). -                                Calculated from the format_id, width, height. -                                and format_note fields if missing. -                    * format_id A short description of the format -                                ("mp4_h264_opus" or "19") -                    * format_note Additional info about the format -                                ("3D" or "DASH video") -                    * width     Width of the video, if known -                    * height    Height of the video, if known -                    * abr       Average audio bitrate in KBit/s -                    * acodec    Name of the audio codec in use -                    * vbr       Average video bitrate in KBit/s -                    * vcodec    Name of the video codec in use -                    * filesize  The number of bytes, if known in advance      webpage_url:    The url to the video webpage, if given to youtube-dl it                      should allow to get the same result again. (It will be set                      by YoutubeDL if it's missing) @@ -166,6 +170,8 @@ class InfoExtractor(object):          try:              return self._downloader.urlopen(url_or_request)          except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: +            if errnote is False: +                return False              if errnote is None:                  errnote = u'Unable to download webpage'              errmsg = u'%s: %s' % (errnote, compat_str(err)) @@ -259,7 +265,8 @@ class InfoExtractor(object):          self.to_screen(u'Logging in')      #Methods for following #608 -    def url_result(self, url, ie=None, video_id=None): +    @staticmethod +    def url_result(url, ie=None, video_id=None):          """Returns a url that points to a page that should be processed"""          #TODO: ie should be the class used for getting the info          video_info = {'_type': 'url', @@ -268,7 +275,8 @@ class InfoExtractor(object):          if video_id is not None:              video_info['id'] = video_id          return video_info -    def playlist_result(self, entries, playlist_id=None, playlist_title=None): +    @staticmethod +    def playlist_result(entries, playlist_id=None, playlist_title=None):          """Returns a playlist"""          video_info = {'_type': 'playlist',                        'entries': entries} @@ -278,7 +286,7 @@ class InfoExtractor(object):              video_info['title'] = playlist_title          return video_info -    def _search_regex(self, pattern, string, name, default=None, fatal=True, flags=0): +    def _search_regex(self, pattern, string, name, default=_NO_DEFAULT, fatal=True, flags=0):          """          Perform a regex search on the given string, using a single or a list of          patterns returning the first matching group. @@ -292,7 +300,7 @@ class InfoExtractor(object):                  mobj = re.search(p, string, flags)                  if mobj: break -        if sys.stderr.isatty() and os.name != 'nt': +        if os.name != 'nt' and sys.stderr.isatty():              _name = u'\033[0;34m%s\033[0m' % name          else:              _name = name @@ -300,7 +308,7 @@ class InfoExtractor(object):          if mobj:              # return the first matching group              return next(g for g in mobj.groups() if g is not None) -        elif default is not None: +        elif default is not _NO_DEFAULT:              return default          elif fatal:              raise RegexNotFoundError(u'Unable to extract %s' % _name) @@ -309,7 +317,7 @@ class InfoExtractor(object):                  u'please report this issue on http://yt-dl.org/bug' % _name)              return None -    def _html_search_regex(self, pattern, string, name, default=None, fatal=True, flags=0): +    def _html_search_regex(self, pattern, string, name, default=_NO_DEFAULT, fatal=True, flags=0):          """          Like _search_regex, but strips HTML tags and unescapes entities.          """ | 
