Skip to content

Commit 3402cdb

Browse files
authored
Merge pull request #1147 from petlyh/youtube-albums
[YouTube] Add Albums channel tab
2 parents 9ab932e + 6dc25f7 commit 3402cdb

File tree

9 files changed

+1703
-1
lines changed

9 files changed

+1703
-1
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,9 @@ private List<ListLinkHandler> getTabsForNonAgeRestrictedChannels() throws Parsin
445445
case "streams":
446446
addNonVideosTab.accept(ChannelTabs.LIVESTREAMS);
447447
break;
448+
case "releases":
449+
addNonVideosTab.accept(ChannelTabs.ALBUMS);
450+
break;
448451
case "playlists":
449452
addNonVideosTab.accept(ChannelTabs.PLAYLISTS);
450453
break;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ private String getChannelTabsParameters() throws ParsingException {
7878
return "EgZzaG9ydHPyBgUKA5oBAA%3D%3D";
7979
case ChannelTabs.LIVESTREAMS:
8080
return "EgdzdHJlYW1z8gYECgJ6AA%3D%3D";
81+
case ChannelTabs.ALBUMS:
82+
return "EghyZWxlYXNlc_IGBQoDsgEA";
8183
case ChannelTabs.PLAYLISTS:
8284
return "EglwbGF5bGlzdHPyBgQKAkIA";
8385
default:
@@ -304,7 +306,7 @@ private Optional<JsonObject> collectItem(@Nonnull final MultiInfoItemsCollector
304306
richItem.getObject("reelItemRenderer"));
305307
} else if (richItem.has("playlistRenderer")) {
306308
getCommitPlaylistConsumer(collector, channelIds,
307-
item.getObject("playlistRenderer"));
309+
richItem.getObject("playlistRenderer"));
308310
}
309311
} else if (item.has("gridVideoRenderer")) {
310312
getCommitVideoConsumer(collector, timeAgoParser, channelIds,

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelTabLinkHandlerFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public static String getUrlSuffix(@Nonnull final String tab)
2929
return "/shorts";
3030
case ChannelTabs.LIVESTREAMS:
3131
return "/streams";
32+
case ChannelTabs.ALBUMS:
33+
return "/releases";
3234
case ChannelTabs.PLAYLISTS:
3335
return "/playlists";
3436
default:
@@ -65,6 +67,7 @@ public String[] getAvailableContentFilter() {
6567
ChannelTabs.VIDEOS,
6668
ChannelTabs.SHORTS,
6769
ChannelTabs.LIVESTREAMS,
70+
ChannelTabs.ALBUMS,
6871
ChannelTabs.PLAYLISTS
6972
};
7073
}

extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelTabExtractorTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,28 @@ static void setUp() throws IOException, ExtractionException {
112112
@Override public boolean expectedHasMoreItems() { return true; }
113113
}
114114

115+
static class Albums extends DefaultListExtractorTest<ChannelTabExtractor> {
116+
private static YoutubeChannelTabExtractor extractor;
117+
118+
@BeforeAll
119+
static void setUp() throws IOException, ExtractionException {
120+
YoutubeTestsUtils.ensureStateless();
121+
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "albums"));
122+
extractor = (YoutubeChannelTabExtractor) YouTube.getChannelTabExtractorFromId(
123+
"@Radiohead", ChannelTabs.ALBUMS);
124+
extractor.fetchPage();
125+
}
126+
127+
@Override public ChannelTabExtractor extractor() throws Exception { return extractor; }
128+
@Override public StreamingService expectedService() throws Exception { return YouTube; }
129+
@Override public String expectedName() throws Exception { return ChannelTabs.ALBUMS; }
130+
@Override public String expectedId() throws Exception { return "UCq19-LqvG35A-30oyAiPiqA"; }
131+
@Override public String expectedUrlContains() throws Exception { return "https://www.youtube.com/channel/UCq19-LqvG35A-30oyAiPiqA/releases"; }
132+
@Override public String expectedOriginalUrlContains() throws Exception { return "https://www.youtube.com/@Radiohead/releases"; }
133+
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.PLAYLIST; }
134+
@Override public boolean expectedHasMoreItems() { return true; }
135+
}
136+
115137

116138
// TESTS FOR TABS OF AGE RESTRICTED CHANNELS
117139
// Fetching the tabs individually would use the standard tabs without fallback to
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
{
2+
"request": {
3+
"httpMethod": "GET",
4+
"url": "https://www.youtube.com/sw.js",
5+
"headers": {
6+
"Referer": [
7+
"https://www.youtube.com"
8+
],
9+
"Origin": [
10+
"https://www.youtube.com"
11+
],
12+
"Accept-Language": [
13+
"en-GB, en;q\u003d0.9"
14+
]
15+
},
16+
"localization": {
17+
"languageCode": "en",
18+
"countryCode": "GB"
19+
}
20+
},
21+
"response": {
22+
"responseCode": 200,
23+
"responseMessage": "",
24+
"responseHeaders": {
25+
"access-control-allow-credentials": [
26+
"true"
27+
],
28+
"access-control-allow-origin": [
29+
"https://www.youtube.com"
30+
],
31+
"alt-svc": [
32+
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000"
33+
],
34+
"cache-control": [
35+
"private, max-age\u003d0"
36+
],
37+
"content-type": [
38+
"text/javascript; charset\u003dutf-8"
39+
],
40+
"cross-origin-opener-policy": [
41+
"same-origin; report-to\u003d\"youtube_main\""
42+
],
43+
"date": [
44+
"Sat, 30 Dec 2023 13:43:25 GMT"
45+
],
46+
"expires": [
47+
"Sat, 30 Dec 2023 13:43:25 GMT"
48+
],
49+
"origin-trial": [
50+
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
51+
],
52+
"p3p": [
53+
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
54+
],
55+
"permissions-policy": [
56+
"ch-ua-arch\u003d*, ch-ua-bitness\u003d*, ch-ua-full-version\u003d*, ch-ua-full-version-list\u003d*, ch-ua-model\u003d*, ch-ua-wow64\u003d*, ch-ua-form-factor\u003d*, ch-ua-platform\u003d*, ch-ua-platform-version\u003d*"
57+
],
58+
"report-to": [
59+
"{\"group\":\"youtube_main\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/youtube_main\"}]}"
60+
],
61+
"server": [
62+
"ESF"
63+
],
64+
"set-cookie": [
65+
"YSC\u003dpk4qlD0k7qs; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
66+
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSun, 04-Apr-2021 13:43:25 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
67+
"CONSENT\u003dPENDING+551; expires\u003dMon, 29-Dec-2025 13:43:25 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
68+
],
69+
"strict-transport-security": [
70+
"max-age\u003d31536000"
71+
],
72+
"x-content-type-options": [
73+
"nosniff"
74+
],
75+
"x-frame-options": [
76+
"SAMEORIGIN"
77+
],
78+
"x-xss-protection": [
79+
"0"
80+
]
81+
},
82+
"responseBody": "\n self.addEventListener(\u0027install\u0027, event \u003d\u003e {\n event.waitUntil(self.skipWaiting());\n });\n self.addEventListener(\u0027activate\u0027, event \u003d\u003e {\n event.waitUntil(\n self.clients.claim().then(() \u003d\u003e self.registration.unregister()));\n });\n ",
83+
"latestUrl": "https://www.youtube.com/sw.js"
84+
}
85+
}

extractor/src/test/resources/org/schabi/newpipe/extractor/services/youtube/extractor/channelTabs/albums/generated_mock_1.json

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

0 commit comments

Comments
 (0)