From dcb7483dcf144daf5df1416e70b03ac7f27c4ded Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 15 Apr 2022 13:00:45 +0200 Subject: [PATCH] Fix YouTube throttling decrypter function parsing --- .../youtube/YoutubeThrottlingDecrypter.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeThrottlingDecrypter.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeThrottlingDecrypter.java index 369cb6ab..2158bb32 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeThrottlingDecrypter.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeThrottlingDecrypter.java @@ -8,6 +8,7 @@ import org.schabi.newpipe.extractor.utils.StringUtils; import javax.annotation.Nonnull; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -36,7 +37,7 @@ public class YoutubeThrottlingDecrypter { private static final Pattern N_PARAM_PATTERN = Pattern.compile("[&?]n=([^&]+)"); private static final Pattern FUNCTION_NAME_PATTERN = Pattern.compile( - "b=a\\.get\\(\"n\"\\)\\)&&\\(b=(\\S+)\\(b\\),a\\.set\\(\"n\",b\\)"); + "\\.get\\(\"n\"\\)\\)&&\\(b=([a-zA-Z0-9$]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9]\\)"); private static final Map N_PARAMS_CACHE = new HashMap<>(); @SuppressWarnings("StaticVariableName") private static String FUNCTION; @@ -97,21 +98,24 @@ public class YoutubeThrottlingDecrypter { private static String parseDecodeFunctionName(final String playerJsCode) throws Parser.RegexException { - String functionName = Parser.matchGroup1(FUNCTION_NAME_PATTERN, playerJsCode); - final int arrayStartBrace = functionName.indexOf("["); - - if (arrayStartBrace > 0) { - final String arrayVarName = functionName.substring(0, arrayStartBrace); - final String order = functionName.substring( - arrayStartBrace + 1, functionName.indexOf("]")); - final int arrayNum = Integer.parseInt(order); - final Pattern arrayPattern = Pattern.compile( - String.format("var %s=\\[(.+?)\\];", arrayVarName)); - final String arrayStr = Parser.matchGroup1(arrayPattern, playerJsCode); - final String[] names = arrayStr.split(","); - functionName = names[arrayNum]; + final Matcher matcher = FUNCTION_NAME_PATTERN.matcher(playerJsCode); + final boolean foundMatch = matcher.find(); + if (!foundMatch) { + throw new Parser.RegexException("Failed to find pattern \"" + + FUNCTION_NAME_PATTERN + "\""); } - return functionName; + + final String functionName = matcher.group(1); + if (matcher.groupCount() == 1) { + return functionName; + } + + final int arrayNum = Integer.parseInt(matcher.group(2)); + final Pattern arrayPattern = Pattern.compile( + "var " + Pattern.quote(functionName) + "\\s*=\\s*\\[(.+?)];"); + final String arrayStr = Parser.matchGroup1(arrayPattern, playerJsCode); + final String[] names = arrayStr.split(","); + return names[arrayNum]; } @Nonnull