Skip to content

Commit a4aeedf

Browse files
committed
[YouTube] Add WEB_MUSIC_ANALYTICS constants, make some methods public
This is the client for YouTube Charts (charts.youtube.com). Also change nullability of two fields and fix wrong client constant usage in ofWebEmbeddedPlayerClient method in InnertubeClientRequestInfo. Usages in YoutubeParsingHelper have been updated, getClientHeaders and prepareJsonBuilder methods in this class have been made public.
1 parent f4b0a7d commit a4aeedf

3 files changed

Lines changed: 48 additions & 23 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/ClientsConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ private ClientsConstants() {
4545
static final String WEB_EMBEDDED_CLIENT_NAME = "WEB_EMBEDDED_PLAYER";
4646
static final String WEB_EMBEDDED_CLIENT_VERSION = "1.20250121.00.00";
4747

48+
// WEB_MUSIC_ANALYTICS (YouTube charts)
49+
50+
static final String WEB_MUSIC_ANALYTICS_CLIENT_ID = "31";
51+
static final String WEB_MUSIC_ANALYTICS_CLIENT_NAME = "WEB_MUSIC_ANALYTICS";
52+
static final String WEB_MUSIC_ANALYTICS_CLIENT_VERSION = "2.0";
53+
4854
// IOS (iOS YouTube app) client fields
4955

5056
static final String IOS_CLIENT_ID = "5";

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/InnertubeClientRequestInfo.java

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.schabi.newpipe.extractor.services.youtube;
22

3+
import javax.annotation.Nonnull;
4+
import javax.annotation.Nullable;
5+
36
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_ID;
47
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_NAME;
58
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_VERSION;
@@ -16,11 +19,11 @@
1619
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_CLIENT_NAME;
1720
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_ID;
1821
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_NAME;
22+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_VERSION;
1923
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_HARDCODED_CLIENT_VERSION;
20-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_REMIX_HARDCODED_CLIENT_VERSION;
21-
22-
import javax.annotation.Nonnull;
23-
import javax.annotation.Nullable;
24+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_MUSIC_ANALYTICS_CLIENT_ID;
25+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_MUSIC_ANALYTICS_CLIENT_NAME;
26+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_MUSIC_ANALYTICS_CLIENT_VERSION;
2427

2528
// TODO: add docs
2629

@@ -38,28 +41,28 @@ public static final class ClientInfo {
3841
@Nonnull
3942
public String clientVersion;
4043
@Nonnull
41-
public String clientScreen;
42-
@Nullable
4344
public String clientId;
4445
@Nullable
46+
public String clientScreen;
47+
@Nullable
4548
public String visitorData;
4649

4750
private ClientInfo(@Nonnull final String clientName,
4851
@Nonnull final String clientVersion,
49-
@Nonnull final String clientScreen,
50-
@Nullable final String clientId,
52+
@Nonnull final String clientId,
53+
@Nullable final String clientScreen,
5154
@Nullable final String visitorData) {
5255
this.clientName = clientName;
5356
this.clientVersion = clientVersion;
54-
this.clientScreen = clientScreen;
5557
this.clientId = clientId;
58+
this.clientScreen = clientScreen;
5659
this.visitorData = visitorData;
5760
}
5861
}
5962

6063
public static final class DeviceInfo {
6164

62-
@Nonnull
65+
@Nullable
6366
public String platform;
6467
@Nullable
6568
public String deviceMake;
@@ -71,7 +74,7 @@ public static final class DeviceInfo {
7174
public String osVersion;
7275
public int androidSdkVersion;
7376

74-
private DeviceInfo(@Nonnull final String platform,
77+
private DeviceInfo(@Nullable final String platform,
7578
@Nullable final String deviceMake,
7679
@Nullable final String deviceModel,
7780
@Nullable final String osName,
@@ -96,8 +99,8 @@ private InnertubeClientRequestInfo(@Nonnull final ClientInfo clientInfo,
9699
public static InnertubeClientRequestInfo ofWebClient() {
97100
return new InnertubeClientRequestInfo(
98101
new InnertubeClientRequestInfo.ClientInfo(
99-
WEB_CLIENT_NAME, WEB_HARDCODED_CLIENT_VERSION, WATCH_CLIENT_SCREEN,
100-
WEB_CLIENT_ID, null),
102+
WEB_CLIENT_NAME, WEB_HARDCODED_CLIENT_VERSION, WEB_CLIENT_ID,
103+
WATCH_CLIENT_SCREEN, null),
101104
new InnertubeClientRequestInfo.DeviceInfo(DESKTOP_CLIENT_PLATFORM, null, null,
102105
null, null, -1));
103106
}
@@ -106,17 +109,27 @@ public static InnertubeClientRequestInfo ofWebClient() {
106109
public static InnertubeClientRequestInfo ofWebEmbeddedPlayerClient() {
107110
return new InnertubeClientRequestInfo(
108111
new InnertubeClientRequestInfo.ClientInfo(WEB_EMBEDDED_CLIENT_NAME,
109-
WEB_REMIX_HARDCODED_CLIENT_VERSION, EMBED_CLIENT_SCREEN,
110-
WEB_EMBEDDED_CLIENT_ID, null),
112+
WEB_EMBEDDED_CLIENT_VERSION, WEB_EMBEDDED_CLIENT_ID, EMBED_CLIENT_SCREEN,
113+
null),
111114
new InnertubeClientRequestInfo.DeviceInfo(DESKTOP_CLIENT_PLATFORM, null, null,
112115
null, null, -1));
113116
}
114117

118+
@Nonnull
119+
public static InnertubeClientRequestInfo ofWebMusicAnalyticsChartsClient() {
120+
return new InnertubeClientRequestInfo(
121+
new InnertubeClientRequestInfo.ClientInfo(WEB_MUSIC_ANALYTICS_CLIENT_NAME,
122+
WEB_MUSIC_ANALYTICS_CLIENT_VERSION, WEB_MUSIC_ANALYTICS_CLIENT_ID, null,
123+
null),
124+
new InnertubeClientRequestInfo.DeviceInfo(null, null, null,
125+
null, null, -1));
126+
}
127+
115128
@Nonnull
116129
public static InnertubeClientRequestInfo ofAndroidClient() {
117130
return new InnertubeClientRequestInfo(
118131
new InnertubeClientRequestInfo.ClientInfo(ANDROID_CLIENT_NAME,
119-
ANDROID_CLIENT_VERSION, WATCH_CLIENT_SCREEN, ANDROID_CLIENT_ID, null),
132+
ANDROID_CLIENT_VERSION, ANDROID_CLIENT_ID, WATCH_CLIENT_SCREEN, null),
120133
new InnertubeClientRequestInfo.DeviceInfo(MOBILE_CLIENT_PLATFORM, null, null,
121134
"Android", "15", 35));
122135
}
@@ -125,7 +138,7 @@ public static InnertubeClientRequestInfo ofAndroidClient() {
125138
public static InnertubeClientRequestInfo ofIosClient() {
126139
return new InnertubeClientRequestInfo(
127140
new InnertubeClientRequestInfo.ClientInfo(IOS_CLIENT_NAME, IOS_CLIENT_VERSION,
128-
WATCH_CLIENT_SCREEN, IOS_CLIENT_ID, null),
141+
IOS_CLIENT_ID, WATCH_CLIENT_SCREEN, null),
129142
new InnertubeClientRequestInfo.DeviceInfo(MOBILE_CLIENT_PLATFORM, "Apple",
130143
IOS_DEVICE_MODEL, "iOS", IOS_OS_VERSION, -1));
131144
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,8 +1181,8 @@ public static Map<String, List<String>> getOriginReferrerHeaders(@Nonnull final
11811181
* @param name The X-YouTube-Client-Name value.
11821182
* @param version X-YouTube-Client-Version value.
11831183
*/
1184-
static Map<String, List<String>> getClientHeaders(@Nonnull final String name,
1185-
@Nonnull final String version) {
1184+
public static Map<String, List<String>> getClientHeaders(@Nonnull final String name,
1185+
@Nonnull final String version) {
11861186
return Map.of("X-YouTube-Client-Name", List.of(name),
11871187
"X-YouTube-Client-Version", List.of(version));
11881188
}
@@ -1525,7 +1525,7 @@ public static String getVisitorDataFromInnertube(
15251525
}
15261526

15271527
@Nonnull
1528-
static JsonBuilder<JsonObject> prepareJsonBuilder(
1528+
public static JsonBuilder<JsonObject> prepareJsonBuilder(
15291529
@Nonnull final Localization localization,
15301530
@Nonnull final ContentCountry contentCountry,
15311531
@Nonnull final InnertubeClientRequestInfo innertubeClientRequestInfo,
@@ -1534,9 +1534,15 @@ static JsonBuilder<JsonObject> prepareJsonBuilder(
15341534
.object("context")
15351535
.object("client")
15361536
.value("clientName", innertubeClientRequestInfo.clientInfo.clientName)
1537-
.value("clientVersion", innertubeClientRequestInfo.clientInfo.clientVersion)
1538-
.value("clientScreen", innertubeClientRequestInfo.clientInfo.clientScreen)
1539-
.value("platform", innertubeClientRequestInfo.deviceInfo.platform);
1537+
.value("clientVersion", innertubeClientRequestInfo.clientInfo.clientVersion);
1538+
1539+
if (innertubeClientRequestInfo.clientInfo.clientScreen != null) {
1540+
builder.value("clientScreen", innertubeClientRequestInfo.clientInfo.clientScreen);
1541+
}
1542+
1543+
if (innertubeClientRequestInfo.deviceInfo.platform != null) {
1544+
builder.value("platform", innertubeClientRequestInfo.deviceInfo.platform);
1545+
}
15401546

15411547
if (innertubeClientRequestInfo.clientInfo.visitorData != null) {
15421548
builder.value("visitorData", innertubeClientRequestInfo.clientInfo.visitorData);

0 commit comments

Comments
 (0)