Skip to content

Commit 3966178

Browse files
authored
Merge pull request #665 from B0pol/agerestricted
[youtube] Fix extraction of age restricted videos
2 parents d1c56be + b475f09 commit 3966178

35 files changed

Lines changed: 283 additions & 740 deletions

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,8 @@
1616
import org.schabi.newpipe.extractor.NewPipe;
1717
import org.schabi.newpipe.extractor.StreamingService;
1818
import org.schabi.newpipe.extractor.downloader.Downloader;
19-
import org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException;
20-
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
21-
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
22-
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException;
23-
import org.schabi.newpipe.extractor.exceptions.PaidContentException;
24-
import org.schabi.newpipe.extractor.exceptions.ParsingException;
25-
import org.schabi.newpipe.extractor.exceptions.PrivateContentException;
26-
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
27-
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException;
19+
import org.schabi.newpipe.extractor.downloader.Response;
20+
import org.schabi.newpipe.extractor.exceptions.*;
2821
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
2922
import org.schabi.newpipe.extractor.localization.DateWrapper;
3023
import org.schabi.newpipe.extractor.localization.Localization;
@@ -792,11 +785,9 @@ public void onFetchPage(@Nonnull final Downloader downloader)
792785
}
793786

794787
private void fetchVideoInfoPage() throws ParsingException, ReCaptchaException, IOException {
795-
final String sts = getEmbeddedInfoStsAndStorePlayerJsUrl();
796-
final String videoInfoUrl = getVideoInfoUrl(getId(), sts);
797-
final String infoPageResponse = NewPipe.getDownloader()
798-
.get(videoInfoUrl, getExtractorLocalization()).responseBody();
799-
videoInfoPage.putAll(Parser.compatParseMap(infoPageResponse));
788+
final String videoInfoUrl = getVideoInfoUrl(getId());
789+
final Response videoInfoResponse = NewPipe.getDownloader().get(videoInfoUrl, getExtractorLocalization());
790+
videoInfoPage.putAll(Parser.compatParseMap(videoInfoResponse.responseBody()));
800791

801792
try {
802793
playerResponse = JsonParser.object().from(videoInfoPage.get("player_response"));
@@ -975,11 +966,11 @@ private JsonObject getVideoSecondaryInfoRenderer() throws ParsingException {
975966
}
976967

977968
@Nonnull
978-
private static String getVideoInfoUrl(final String id, final String sts) {
969+
private static String getVideoInfoUrl(final String id) {
979970
// TODO: Try parsing embedded_player_response first
980-
return "https://www.youtube.com/get_video_info?" + "video_id=" + id +
981-
"&html5=1&eurl=https://youtube.googleapis.com/v/" + id +
982-
"&sts=" + sts + "&ps=default&gl=US&hl=en";
971+
return "https://www.youtube.com/get_video_info?video_id=" + id +
972+
"&eurl=https://youtube.googleapis.com/v/" + id +
973+
"&html5=1&c=TVHTML5&cver=6.20180913&gl=US&hl=en";
983974
}
984975

985976
private Map<String, ItagItem> getItags(final String streamingDataKey,
@@ -1121,7 +1112,7 @@ public Privacy getPrivacy() {
11211112
public String getCategory() {
11221113
return playerResponse.getObject("microformat")
11231114
.getObject("playerMicroformatRenderer")
1124-
.getString("category");
1115+
.getString("category", EMPTY_STRING);
11251116
}
11261117

11271118
@Nonnull

extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/stream/YoutubeStreamExtractorAgeRestrictedTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static void setUp() throws Exception {
5757
@Nullable @Override public String expectedErrorMessage() { return "Sign in to confirm your age"; }
5858
@Override public boolean expectedHasSubtitles() { return false; }
5959

60-
@Override public String expectedCategory() {return "Entertainment"; }
60+
@Override public String expectedCategory() { return ""; } // Unavailable on age restricted videos
6161
@Override public String expectedLicence() { return "YouTube licence"; }
6262
@Override
6363
public List<String> expectedTags() {

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/ageRestricted/generated_mock_0.json

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/ageRestricted/generated_mock_1.json

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/ageRestricted/generated_mock_2.json

Lines changed: 14 additions & 19 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/ageRestricted/generated_mock_3.json

Lines changed: 0 additions & 59 deletions
This file was deleted.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/notAvailable/generated_mock_0.json

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/notAvailable/generated_mock_1.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"responseMessage": "",
2727
"responseHeaders": {
2828
"alt-svc": [
29-
"h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
29+
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
3030
],
3131
"cache-control": [
3232
"no-cache, no-store, max-age\u003d0, must-revalidate"
@@ -38,7 +38,7 @@
3838
"application/json; charset\u003dutf-8"
3939
],
4040
"date": [
41-
"Sat, 22 May 2021 18:30:38 GMT"
41+
"Wed, 23 Jun 2021 10:12:06 GMT"
4242
],
4343
"expires": [
4444
"Mon, 01 Jan 1990 00:00:00 GMT"
@@ -56,8 +56,8 @@
5656
"ESF"
5757
],
5858
"set-cookie": [
59-
"YSC\u003dbWHlSChZfJE; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
60-
"CONSENT\u003dPENDING+805; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
59+
"YSC\u003d-LT8a9maoCU; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
60+
"CONSENT\u003dPENDING+142; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
6161
],
6262
"strict-transport-security": [
6363
"max-age\u003d31536000"
@@ -75,7 +75,7 @@
7575
"0"
7676
]
7777
},
78-
"responseBody": "[\r\n{\"page\": \"watch\",\"rootVe\": \"3832\"},\r\n{\"page\": \"watch\",\"preconnect\": [\"https:\\/\\/r5---sn-4g5ednly.googlevideo.com\\/generate_204\",\"https:\\/\\/r5---sn-4g5ednly.googlevideo.com\\/generate_204?conn2\"]},\r\n{\"page\": \"watch\",\"playerResponse\": {\"responseContext\":{\"serviceTrackingParams\":[{\"service\":\"GFEEDBACK\",\"params\":[{\"key\":\"is_viewed_live\",\"value\":\"False\"},{\"key\":\"logged_in\",\"value\":\"0\"},{\"key\":\"e\",\"value\":\"24037794,24040786,24044575,23884386,23944779,23983296,23882685,24014268,24027649,23995927,23735347,24043867,24032296,24011649,23975059,23891344,23968099,23970529,23966208,24005207,24042868,24005646,24019954,23986021,23940237,23891346,24037806,24003105,23996830,1714251,24005802,23804281,24030040,23946420,23744176,24035514,23890959,23918597,24007246,23974595,24045350,23934970,24001373,24036086,23968386,23997375,24042653,24027133,23857949,24004644,24035275,24024949,24036899,24042802\"}]},{\"service\":\"CSI\",\"params\":[{\"key\":\"c\",\"value\":\"WEB\"},{\"key\":\"cver\",\"value\":\"2.20200214.04.00\"},{\"key\":\"yt_li\",\"value\":\"0\"},{\"key\":\"GetPlayer_rid\",\"value\":\"0xd8a06d19cc578a00\"}]},{\"service\":\"GUIDED_HELP\",\"params\":[{\"key\":\"logged_in\",\"value\":\"0\"}]},{\"service\":\"ECATCHER\",\"params\":[{\"key\":\"client.version\",\"value\":\"2.20210324\"},{\"key\":\"client.name\",\"value\":\"WEB\"}]}],\"mainAppWebResponseContext\":{\"loggedOut\":true},\"webResponseContextExtensionData\":{\"hasDecorated\":true}},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"Video unavailable\",\"errorScreen\":{\"playerErrorMessageRenderer\":{\"reason\":{\"simpleText\":\"Video unavailable\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\"width\":140,\"height\":100}]},\"icon\":{\"iconType\":\"ERROR_OUTLINE\"}}},\"contextParams\":\"Q0FBU0FnZ0E\u003d\"},\"trackingParams\":\"CAAQu2kiEwi_h9z79d3wAhXw1xEIHUqjCfI\u003d\"}},\r\n{\"page\": \"watch\",\"response\": {\"responseContext\":{\"webResponseContextExtensionData\":{\"ytConfigData\":{\"visitorData\":\"CgswTjM5MHFXN0hlayjOm6WFBg%3D%3D\",\"rootVisualElementType\":3832}}}},\"xsrf_token\": \"QUFFLUhqbmQyWVlOb0RMYzZ2YXVzdmhjWDZpRjdLQUJMQXxBQ3Jtc0trS2FPZGRQUzJZNFhoTU5EcnZjQjZFV0dMYnE0ZkNxYUNkeVlLd3N4MU9fRGpLYjRzdkliTVE4N3prNVByTVl2Mi04aFpZcHdvckhGSDI2U1Ewa24tbWFHNjNMa1pBb2lET0JSQW0xTUY4WklUOEtTcw\\u003d\\u003d\",\"url\": \"/watch?v\\u003dINVALID_ID_\",\"endpoint\": {\"clickTrackingParams\":\"IhMIobfb-_Xd8AIVzWjgCh0aDgYWMghleHRlcm5hbA\u003d\u003d\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v\u003dINVALID_ID_\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"INVALID_ID_\"}}},\r\n{\"page\": \"watch\",\"timing\": {\"info\": {\"st\": 0.0 }}}]\r\n",
78+
"responseBody": "[\r\n{\"page\": \"watch\",\"rootVe\": \"3832\"},\r\n{\"page\": \"watch\",\"preconnect\": [\"https:\\/\\/r5---sn-hgn7yn7z.googlevideo.com\\/generate_204\",\"https:\\/\\/r5---sn-hgn7yn7z.googlevideo.com\\/generate_204?conn2\"]},\r\n{\"page\": \"watch\",\"playerResponse\": {\"responseContext\":{\"serviceTrackingParams\":[{\"service\":\"GFEEDBACK\",\"params\":[{\"key\":\"is_viewed_live\",\"value\":\"False\"},{\"key\":\"logged_in\",\"value\":\"0\"},{\"key\":\"e\",\"value\":\"24001373,23946420,23970529,24049577,24042868,23966208,23804281,24027649,23998056,24049575,24036947,24004644,24017848,23891344,24007246,24037794,24052246,23963745,23934970,23996830,24030040,23983296,23891346,23884386,24037806,24042870,24012513,24058813,23857948,24053867,24049569,23968386,24049820,1714249,23973490,24049567,23918597,24003105,24049573,23744176,23974595,24058380,24003103,23882685,23944779,24038425,23890959,23999405\"}]},{\"service\":\"CSI\",\"params\":[{\"key\":\"c\",\"value\":\"WEB\"},{\"key\":\"cver\",\"value\":\"2.20200214.04.00\"},{\"key\":\"yt_li\",\"value\":\"0\"},{\"key\":\"GetPlayer_rid\",\"value\":\"0x58da0be5a82f9e65\"}]},{\"service\":\"GUIDED_HELP\",\"params\":[{\"key\":\"logged_in\",\"value\":\"0\"}]},{\"service\":\"ECATCHER\",\"params\":[{\"key\":\"client.version\",\"value\":\"2.20210526\"},{\"key\":\"client.name\",\"value\":\"WEB\"}]}],\"mainAppWebResponseContext\":{\"loggedOut\":true},\"webResponseContextExtensionData\":{\"hasDecorated\":true}},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"Video unavailable\",\"errorScreen\":{\"playerErrorMessageRenderer\":{\"reason\":{\"simpleText\":\"Video unavailable\"},\"thumbnail\":{\"thumbnails\":[{\"url\":\"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\"width\":140,\"height\":100}]},\"icon\":{\"iconType\":\"ERROR_OUTLINE\"}}},\"contextParams\":\"Q0FBU0FnZ0E\u003d\"},\"trackingParams\":\"CAAQu2kiEwiG75Ocwq3xAhU_NPEFHUM9A70\u003d\",\"frameworkUpdates\":{\"entityBatchUpdate\":{\"mutations\":[{\"entityKey\":\"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\"type\":\"ENTITY_MUTATION_TYPE_REPLACE\",\"payload\":{\"offlineabilityEntity\":{\"key\":\"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\"accessState\":\"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\"}}}],\"timestamp\":{\"seconds\":\"1624443126\",\"nanos\":616071922}}}}},\r\n{\"page\": \"watch\",\"response\": {\"responseContext\":{\"webResponseContextExtensionData\":{\"ytConfigData\":{\"visitorData\":\"Cgs1SUlhQUVDenVSUSj2kcyGBg%3D%3D\",\"rootVisualElementType\":3832}}}},\"xsrf_token\": \"QUFFLUhqbkdDQldjVWFhaHN4ZUQzTjMtY01fU1FpVElFd3xBQ3Jtc0tseTZPT0J2ZzA2eDNuYXRMREtXaGN0RWJsUWJ5eW1vWDQ4aGg5TDJHTjZvX3lSM2tRamh2M3lDdDNXc3haZE00TUJveWNZa2JBbWdYX21URUI2dTM2MTlfX0pIcWU1RVNXRHpreExHeHNfaW5LQjdvQQ\\u003d\\u003d\",\"url\": \"/watch?v\\u003dINVALID_ID_\",\"endpoint\": {\"clickTrackingParams\":\"IhMIpImTnMKt8QIV9TvxBR0TrgLLMghleHRlcm5hbA\u003d\u003d\",\"commandMetadata\":{\"webCommandMetadata\":{\"url\":\"/watch?v\u003dINVALID_ID_\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\",\"rootVe\":3832}},\"watchEndpoint\":{\"videoId\":\"INVALID_ID_\"}}},\r\n{\"page\": \"watch\",\"timing\": {\"info\": {\"st\": 0.0 }}}]\r\n",
7979
"latestUrl": "https://www.youtube.com/watch?v\u003dINVALID_ID_\u0026pbj\u003d1"
8080
}
8181
}

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/notAvailable/generated_mock_10.json

Lines changed: 11 additions & 33 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/stream/notAvailable/generated_mock_11.json

Lines changed: 26 additions & 9 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)