[YouTube] Fix throttling parameter decryption function regex

- Quote the function name, as it may contain special regex symbols, such as
  dollar;
- Support multiple lines;
- Use what looks like the end of the function for the end of the regex (this
  part is inspired from yt-dlp throttling parameter decryption regex);
- Move the throttling function body regex into a private and static constant.
This commit is contained in:
AudricV 2022-09-24 21:28:09 +02:00
parent 7244be7627
commit abcee87167
No known key found for this signature in database
GPG Key ID: DA92EC7905614198
1 changed files with 9 additions and 5 deletions

View File

@ -40,6 +40,12 @@ public final class YoutubeThrottlingDecrypter {
private static final Pattern DECRYPT_FUNCTION_NAME_PATTERN = Pattern.compile(
"\\.get\\(\"n\"\\)\\)&&\\(b=([a-zA-Z0-9$]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9]\\)");
// Escape the curly end brace to allow compatibility with Android's regex engine
// See https://stackoverflow.com/q/45074813
@SuppressWarnings("RegExpRedundantEscape")
private static final String DECRYPT_FUNCTION_BODY_REGEX =
"=\\s*function([\\S\\s]*?\\}\\s*return [\\w$]+?\\.join\\(\"\"\\)\\s*\\};)";
private static final Map<String, String> N_PARAMS_CACHE = new HashMap<>();
private static String decryptFunction;
private static String decryptFunctionName;
@ -128,11 +134,9 @@ public final class YoutubeThrottlingDecrypter {
@Nonnull
private static String parseWithRegex(final String playerJsCode, final String functionName)
throws Parser.RegexException {
// Escape the curly end brace to allow compatibility with Android's regex engine
// See https://stackoverflow.com/q/45074813
//noinspection RegExpRedundantEscape
final Pattern functionPattern = Pattern.compile(functionName + "=function(.*?\\};)\n",
Pattern.DOTALL);
// Quote the function name, as it may contain special regex characters such as dollar
final Pattern functionPattern = Pattern.compile(
Pattern.quote(functionName) + DECRYPT_FUNCTION_BODY_REGEX, Pattern.DOTALL);
return validateFunction("function "
+ functionName
+ Parser.matchGroup1(functionPattern, playerJsCode));