From a86a30103fc4afc2bc199b57dc59d2fc9b7fe21b Mon Sep 17 00:00:00 2001 From: XiangRongLin <41164160+XiangRongLin@users.noreply.github.com> Date: Fri, 9 Jul 2021 19:24:56 +0200 Subject: [PATCH] [Youtube] bare bones version to solve throttling Done by transforming the parameter "n" from videoplayback urls https://github.com/ytdl-org/youtube-dl/issues/29326#issuecomment-865985377 --- .../extractors/YoutubeStreamExtractor.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java index ad2b1f7d..03be11d3 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java @@ -39,6 +39,7 @@ import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.regex.Pattern; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.*; import static org.schabi.newpipe.extractor.utils.Utils.EMPTY_STRING; @@ -527,9 +528,31 @@ public class YoutubeStreamExtractor extends StreamExtractor { final List videoStreams = new ArrayList<>(); try { + getDeobfuscationCode(); + final String playerCode = NewPipe.getDownloader() + .get(playerJsUrl, getExtractorLocalization()).responseBody(); + Pattern pattern = Pattern.compile("b=a\\.get\\(\"n\"\\)\\)&&\\(b=(\\w+)\\(b\\),a\\.set\\(\"n\",b\\)"); + String functionName = Parser.matchGroup1(pattern, playerCode); + Pattern functionPattern = Pattern.compile(functionName + "=function(.*?;)\n", Pattern.DOTALL); + String function = "function " + functionName + Parser.matchGroup1(functionPattern, playerCode); + + Context context = Context.enter(); + context.setOptimizationLevel(-1); + ScriptableObject scope = context.initSafeStandardObjects(); + for (final Map.Entry entry : getItags(FORMATS, ItagItem.ItagType.VIDEO).entrySet()) { final ItagItem itag = entry.getValue(); - final VideoStream videoStream = new VideoStream(entry.getKey(), false, itag); + final String url = entry.getKey(); + Pattern nValuePattern = Pattern.compile("[&?]n=([^&]+)"); + String nValue = Parser.matchGroup1(nValuePattern, url); + + context.evaluateString(scope, function, functionName, 1, null); + final Function jsFunction = (Function) scope.get(functionName, scope); + Object result = jsFunction.call(context, scope, scope, new Object[]{nValue}); + String newNValue = Objects.toString(result, nValue); + String newUrl = nValuePattern.matcher(url).replaceFirst(newNValue); + System.out.println("aaaaaa " + nValue + " - " + newNValue); + final VideoStream videoStream = new VideoStream(newUrl, false, itag); if (!Stream.containSimilarStream(videoStream, videoStreams)) { videoStreams.add(videoStream); }