]> code.delx.au - youtube-cgi/commitdiff
grab all dependent JS functions for signature generation
authorJames Bunton <jamesbunton@delx.net.au>
Thu, 8 Aug 2013 08:51:17 +0000 (18:51 +1000)
committerJames Bunton <jamesbunton@delx.net.au>
Thu, 8 Aug 2013 08:51:17 +0000 (18:51 +1000)
youtube.cgi

index 45c8574965dd00947d769c381400fdd14bc854b9..7e7645614e9dcaa159aa9c843185cb485e427adf 100755 (executable)
@@ -145,12 +145,23 @@ def get_player_config(doc):
                                        convert_from_old_itag(player_config)
                                        return player_config
 
-def decode_signature(js_url, s):
-       script = urlopen(js_url).read()
-       func_name = re.search(R"\b([a-z]+)\([a-z]+\.s\);", script).groups()[0]
+def extract_function(output, script, func_name):
        p1 = script.find("function " + func_name)
        p2 = script.find("}", p1)
-       func_block = script[p1:p2+1]
+       code = script[p1:p2+1]
+       output.append(code)
+       deps = re.findall(R"[^\.]\b([a-zA-Z]+)\(", code)
+       deps = set(deps)
+       deps.remove(func_name)
+       for dep in deps:
+               extract_function(output, script, dep)
+
+def decode_signature(js_url, s):
+       script = urlopen(js_url).read()
+       func_name = re.search(R"\b([a-zA-Z]+)\([a-zA-Z]+\.s\);", script).groups()[0]
+
+       codes = []
+       extract_function(codes, script, func_name)
 
        p = subprocess.Popen(
                "js",
@@ -159,7 +170,8 @@ def decode_signature(js_url, s):
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE
        )
-       p.stdin.write(func_block + "\n")
+       for code in codes:
+               p.stdin.write(code + "\n")
        p.stdin.write("console.log(%s('%s'));\n" % (func_name, s))
        p.stdin.close()