diff options
| author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-07-09 14:38:24 +0200 | 
|---|---|---|
| committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-07-09 15:43:44 +0200 | 
| commit | c108eb73cc31c856e6c36face00827fadee3f411 (patch) | |
| tree | 29aef78b1b24d3a14175ec3a69eafba68975d7e7 | |
| parent | 3a1375dacf534e58e7e2e8ee3f84e9fb8d0f4ea4 (diff) | |
YoutubeIE: Fix vevo explicit videos (closes #956)
When an age restricted video is detected it simulates accessing the video from www.youtube.com/v/{video_id}
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 56 | 
1 files changed, 47 insertions, 9 deletions
| diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 61b7b561f..01b20cdc9 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -117,7 +117,19 @@ class YoutubeIE(InfoExtractor):                  u"uploader": u"IconaPop",                  u"uploader_id": u"IconaPop"              } -        } +        }, +        { +            u"url":  u"https://www.youtube.com/watch?v=07FYdnEawAQ", +            u"file":  u"07FYdnEawAQ.mp4", +            u"note": u"Test VEVO video with age protection (#956)", +            u"info_dict": { +                u"upload_date": u"20130703", +                u"title": u"Justin Timberlake - Tunnel Vision (Explicit)", +                u"description": u"md5:64249768eec3bc4276236606ea996373", +                u"uploader": u"justintimberlakeVEVO", +                u"uploader_id": u"justintimberlakeVEVO" +            } +        },      ] @@ -410,15 +422,35 @@ class YoutubeIE(InfoExtractor):          # Get video info          self.report_video_info_webpage_download(video_id) -        for el_type in ['&el=embedded', '&el=detailpage', '&el=vevo', '']: -            video_info_url = ('https://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' -                    % (video_id, el_type)) +        if re.search(r'player-age-gate-content">', video_webpage) is not None: +            self.report_age_confirmation() +            age_gate = True +            # We simulate the access to the video from www.youtube.com/v/{video_id} +            # this can be viewed without login into Youtube +            data = compat_urllib_parse.urlencode({'video_id': video_id, +                                                  'el': 'embedded', +                                                  'gl': 'US', +                                                  'hl': 'en', +                                                  'eurl': 'https://youtube.googleapis.com/v/' + video_id, +                                                  'asv': 3, +                                                  'sts':'1588', +                                                  }) +            video_info_url = 'https://www.youtube.com/get_video_info?' + data              video_info_webpage = self._download_webpage(video_info_url, video_id,                                      note=False,                                      errnote='unable to download video info webpage')              video_info = compat_parse_qs(video_info_webpage) -            if 'token' in video_info: -                break +        else: +            age_gate = False +            for el_type in ['&el=embedded', '&el=detailpage', '&el=vevo', '']: +                video_info_url = ('https://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' +                        % (video_id, el_type)) +                video_info_webpage = self._download_webpage(video_info_url, video_id, +                                        note=False, +                                        errnote='unable to download video info webpage') +                video_info = compat_parse_qs(video_info_webpage) +                if 'token' in video_info: +                    break          if 'token' not in video_info:              if 'reason' in video_info:                  raise ExtractorError(u'YouTube said: %s' % video_info['reason'][0], expected=True) @@ -545,9 +577,15 @@ class YoutubeIE(InfoExtractor):                      elif 's' in url_data:                          if self._downloader.params.get('verbose'):                              s = url_data['s'][0] -                            player = self._search_regex(r'html5player-(.+?)\.js', video_webpage, -                                'html5 player', fatal=False) -                            self.to_screen('encrypted signature length %d (%d.%d), itag %s, html5 player %s' % +                            if age_gate: +                                player_version = self._search_regex(r'ad3-(.+?)\.swf', +                                    video_info['ad3_module'][0], 'flash player', +                                    fatal=False) +                                player = 'flash player %s' % player_version +                            else: +                                player = u'html5 player %s' % self._search_regex(r'html5player-(.+?)\.js', video_webpage, +                                    'html5 player', fatal=False) +                            self.to_screen('encrypted signature length %d (%d.%d), itag %s, %s' %                                  (len(s), len(s.split('.')[0]), len(s.split('.')[1]), url_data['itag'][0], player))                          signature = self._decrypt_signature(url_data['s'][0])                          url += '&signature=' + signature | 
