[youtube] Fix extraction of age restricted videos

This commit is contained in:
bopol 2021-06-23 10:30:39 +02:00
parent 35c1bdd012
commit e9a992b0a9
6 changed files with 34 additions and 107 deletions

View File

@ -16,15 +16,8 @@ import org.schabi.newpipe.extractor.MetaInfo;
import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException; import org.schabi.newpipe.extractor.downloader.Response;
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.*;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException;
import org.schabi.newpipe.extractor.exceptions.PaidContentException;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.exceptions.PrivateContentException;
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler; import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.localization.Localization; import org.schabi.newpipe.extractor.localization.Localization;
@ -792,11 +785,9 @@ public class YoutubeStreamExtractor extends StreamExtractor {
} }
private void fetchVideoInfoPage() throws ParsingException, ReCaptchaException, IOException { private void fetchVideoInfoPage() throws ParsingException, ReCaptchaException, IOException {
final String sts = getEmbeddedInfoStsAndStorePlayerJsUrl(); final String videoInfoUrl = getVideoInfoUrl(getId());
final String videoInfoUrl = getVideoInfoUrl(getId(), sts); final Response videoInfoResponse = NewPipe.getDownloader().get(videoInfoUrl, getExtractorLocalization());
final String infoPageResponse = NewPipe.getDownloader() videoInfoPage.putAll(Parser.compatParseMap(videoInfoResponse.responseBody()));
.get(videoInfoUrl, getExtractorLocalization()).responseBody();
videoInfoPage.putAll(Parser.compatParseMap(infoPageResponse));
try { try {
playerResponse = JsonParser.object().from(videoInfoPage.get("player_response")); playerResponse = JsonParser.object().from(videoInfoPage.get("player_response"));
@ -975,11 +966,11 @@ public class YoutubeStreamExtractor extends StreamExtractor {
} }
@Nonnull @Nonnull
private static String getVideoInfoUrl(final String id, final String sts) { private static String getVideoInfoUrl(final String id) {
// TODO: Try parsing embedded_player_response first // TODO: Try parsing embedded_player_response first
return "https://www.youtube.com/get_video_info?" + "video_id=" + id + return "https://www.youtube.com/get_video_info?" + "video_id=" + id +
"&html5=1&eurl=https://youtube.googleapis.com/v/" + id + "&eurl=https://youtube.googleapis.com/v/" + id +
"&sts=" + sts + "&ps=default&gl=US&hl=en"; "&html5=1&c=TVHTML5&cver=6.20180913&gl=US&hl=en";
} }
private Map<String, ItagItem> getItags(final String streamingDataKey, private Map<String, ItagItem> getItags(final String streamingDataKey,
@ -1121,7 +1112,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
public String getCategory() { public String getCategory() {
return playerResponse.getObject("microformat") return playerResponse.getObject("microformat")
.getObject("playerMicroformatRenderer") .getObject("playerMicroformatRenderer")
.getString("category"); .getString("category", EMPTY_STRING);
} }
@Nonnull @Nonnull

View File

@ -57,7 +57,7 @@ public class YoutubeStreamExtractorAgeRestrictedTest extends DefaultStreamExtrac
@Nullable @Override public String expectedErrorMessage() { return "Sign in to confirm your age"; } @Nullable @Override public String expectedErrorMessage() { return "Sign in to confirm your age"; }
@Override public boolean expectedHasSubtitles() { return false; } @Override public boolean expectedHasSubtitles() { return false; }
@Override public String expectedCategory() {return "Entertainment"; } @Override public String expectedCategory() { return ""; } // Unavailable on age restricted videos
@Override public String expectedLicence() { return "YouTube licence"; } @Override public String expectedLicence() { return "YouTube licence"; }
@Override @Override
public List<String> expectedTags() { public List<String> expectedTags() {