YoutubeIE: Detect new Vevo style videos
authorJaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com>
Fri, 21 Jun 2013 17:28:23 +0000 (19:28 +0200)
committerJaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com>
Fri, 21 Jun 2013 19:51:10 +0000 (21:51 +0200)
The url_encoded_fmt_stream_map can be found in the video page, but the signature must be decrypted, we get it from the webpage instead of the `get_video_info` pages because we have only discover the algorithm for keys with both sub keys of size 43.

youtube_dl/InfoExtractors.py

index 8d228d40dc9df44406e96b1eb568d918ccc04544..a12bffbe396cf73a9088f7bd3a7e36a7102b70c0 100755 (executable)
@@ -724,6 +724,16 @@ class YoutubeIE(InfoExtractor):
         # Decide which formats to download
         req_format = self._downloader.params.get('format', None)
 
+        try:
+            mobj = re.search(r';ytplayer.config = ({.*?});', video_webpage)
+            info = json.loads(mobj.group(1))
+            if 'dashmpd' in info['args']:
+                # Vevo videos with encrypted signatures
+                self.to_screen(u'Vevo video detected.')
+                video_info['url_encoded_fmt_stream_map'] = [info['args']['url_encoded_fmt_stream_map']]
+        except ValueError:
+            pass
+
         if 'conn' in video_info and video_info['conn'][0].startswith('rtmp'):
             self.report_rtmp_download()
             video_url_list = [(None, video_info['conn'][0])]
@@ -735,6 +745,16 @@ class YoutubeIE(InfoExtractor):
                     url = url_data['url'][0]
                     if 'sig' in url_data:
                         url += '&signature=' + url_data['sig'][0]
+                    if 's' in url_data:
+                        def k(s):
+                            """Decrypt the key the two subkeys must have a length of 43"""
+                            (a,b) = s.split('.')
+                            b = ''.join([b[:8],a[0],b[9:18],b[-4],b[19:39], b[18]])[0:40]
+                            a = a[-40:]
+                            s_dec = '.'.join((a,b))[::-1]
+                            return s_dec
+                        key = k(url_data['s'][0])
+                        url += '&signature=' + key
                     if 'ratebypass' not in url:
                         url += '&ratebypass=yes'
                     url_map[url_data['itag'][0]] = url