[pornhub] Decode obfuscated video URL (closes #12470)
authorThroaway <Throaway@null.com>
Mon, 20 Mar 2017 23:29:39 +0000 (16:29 -0700)
committerSergey M․ <dstftw@gmail.com>
Tue, 21 Mar 2017 18:51:45 +0000 (01:51 +0700)
youtube_dl/extractor/pornhub.py

index 9b413590a4078b9e962edc63912a85fbc8312523..eb316ad1413985f2bd3e6fd6ac94323f71c554f5 100644 (file)
@@ -1,7 +1,9 @@
 # coding: utf-8
 from __future__ import unicode_literals
 
+import functools
 import itertools
+import operator
 # import os
 import re
 
@@ -129,9 +131,38 @@ class PornHubIE(InfoExtractor):
 
         tv_webpage = dl_webpage('tv')
 
-        video_url = self._search_regex(
-            r'<video[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//.+?)\1', tv_webpage,
-            'video url', group='url')
+        encoded_url = self._search_regex(r'(var.*mediastring.*)</script>',
+            tv_webpage, 'encoded url')
+        assignments = encoded_url.split(";")
+        js_vars = {}
+
+        def parse_js_value(inp):
+            inp = re.sub(r'/\*[^*]*\*/', "", inp)
+
+            if "+" in inp:
+                inps = inp.split("+")
+                return functools.reduce(operator.concat, map(parse_js_value, inps))
+
+            inp = inp.strip()
+            if inp in js_vars:
+                return js_vars[inp]
+
+            # Hope it's a string!
+            assert inp.startswith('"') and inp.endswith('"')
+            return inp[1:-1]
+
+        for assn in assignments:
+            assn = assn.strip()
+            if len(assn) == 0:
+                continue
+
+            assert assn.startswith("var ")
+            assn = assn[4:]
+            vname, value = assn.split("=", 1)
+
+            js_vars[vname] = parse_js_value(value)
+
+        video_url = js_vars["mediastring"]
 
         title = self._search_regex(
             r'<h1>([^>]+)</h1>', tv_webpage, 'title', default=None)