YoutubeIE: Detect new Vevo style videos
diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py
index 8d228d40dc9..af11333d1a6 100755
--- a/youtube_dl/InfoExtractors.py
+++ b/youtube_dl/InfoExtractors.py
@@ -379,6 +379,17 @@ def report_rtmp_download(self):
         """Indicate the download will use the RTMP protocol."""
         self.to_screen(u'RTMP download detected')
 
+    @staticmethod
+    def _decrypt_signature(s):
+        """Decrypt the key the two subkeys must have a length of 43"""
+        (a,b) = s.split('.')
+        if len(a) != 43 or len(b) != 43:
+            raise ExtractorError(u'Unable to decrypt signature, subkeys lengths not valid')
+        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
+
     def _get_available_subtitles(self, video_id):
         self.report_video_subtitles_download(video_id)
         request = compat_urllib_request.Request('http://video.google.com/timedtext?hl=en&type=list&v=%s' % video_id)
@@ -724,6 +735,17 @@ def _real_extract(self, url):
         # 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))
+            args = info['args']
+            if args.get('ptk','') == 'vevo' or 'dashmpd':
+                # Vevo videos with encrypted signatures
+                self.to_screen(u'Vevo video detected.')
+                video_info['url_encoded_fmt_stream_map'] = [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 +757,9 @@ def _real_extract(self, url):
                     url = url_data['url'][0]
                     if 'sig' in url_data:
                         url += '&signature=' + url_data['sig'][0]
+                    if 's' in url_data:
+                        signature = self._decrypt_signature(url_data['s'][0])
+                        url += '&signature=' + signature
                     if 'ratebypass' not in url:
                         url += '&ratebypass=yes'
                     url_map[url_data['itag'][0]] = url

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.

This should fix #897, I've tested with a few videos and it has worked.
Thanks to all the people that has contributed test videos and specially to @speedyapocalypse for getting all the example keys and @FiloSottile for solving the algorithm.

Some things that should be improved:
- [x] The function for decripting the key should be in a better place, maybe as a staticmethod of the extractor.
- [ ] The algorithm should be documented, probably with a good example.
- [ ] Add tests?, we have ready at least three keys and it's easy to get them now, just by printing to screen when downlodaning a video.
