Skip to content

Commit 0952431

Browse files
AudricVStypox
authored andcommitted
[YouTube] Move InnertubeClientRequestInfo creations in class' methods
This commits provides methods to get InnertubeClientRequestInfo instances, which can be used by extractor clients to get visitor data to pass to PoTokenProvider implementations using YoutubeParsingHelper. Ability to create custom instances has been removed, but returned objects can be modified. This is what YoutubeStreamHelper now uses to set the visitorData property.
1 parent 4644e17 commit 0952431

2 files changed

Lines changed: 100 additions & 132 deletions

File tree

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

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

3+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_ID;
4+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_NAME;
5+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_VERSION;
6+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.DESKTOP_CLIENT_PLATFORM;
7+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.EMBED_CLIENT_SCREEN;
8+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_ID;
9+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_NAME;
10+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_VERSION;
11+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_DEVICE_MODEL;
12+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_OS_VERSION;
13+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.MOBILE_CLIENT_PLATFORM;
14+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_ID;
15+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_NAME;
16+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_PLATFORM;
17+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_VERSION;
18+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_DEVICE_MAKE;
19+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_DEVICE_MODEL_AND_OS_NAME;
20+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WATCH_CLIENT_SCREEN;
21+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_CLIENT_ID;
22+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_CLIENT_NAME;
23+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_ID;
24+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_NAME;
25+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_HARDCODED_CLIENT_VERSION;
26+
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_REMIX_HARDCODED_CLIENT_VERSION;
27+
328
import javax.annotation.Nonnull;
429
import javax.annotation.Nullable;
530

31+
// TODO: add docs
32+
633
public final class InnertubeClientRequestInfo {
734

835
@Nonnull
@@ -23,11 +50,11 @@ public static final class ClientInfo {
2350
@Nullable
2451
public String visitorData;
2552

26-
public ClientInfo(@Nonnull final String clientName,
27-
@Nonnull final String clientVersion,
28-
@Nonnull final String clientScreen,
29-
@Nullable final String clientId,
30-
@Nullable final String visitorData) {
53+
private ClientInfo(@Nonnull final String clientName,
54+
@Nonnull final String clientVersion,
55+
@Nonnull final String clientScreen,
56+
@Nullable final String clientId,
57+
@Nullable final String visitorData) {
3158
this.clientName = clientName;
3259
this.clientVersion = clientVersion;
3360
this.clientScreen = clientScreen;
@@ -50,12 +77,12 @@ public static final class DeviceInfo {
5077
public String osVersion;
5178
public int androidSdkVersion;
5279

53-
public DeviceInfo(@Nonnull final String platform,
54-
@Nullable final String deviceMake,
55-
@Nullable final String deviceModel,
56-
@Nullable final String osName,
57-
@Nullable final String osVersion,
58-
final int androidSdkVersion) {
80+
private DeviceInfo(@Nonnull final String platform,
81+
@Nullable final String deviceMake,
82+
@Nullable final String deviceModel,
83+
@Nullable final String osName,
84+
@Nullable final String osVersion,
85+
final int androidSdkVersion) {
5986
this.platform = platform;
6087
this.deviceMake = deviceMake;
6188
this.deviceModel = deviceModel;
@@ -65,9 +92,57 @@ public DeviceInfo(@Nonnull final String platform,
6592
}
6693
}
6794

68-
public InnertubeClientRequestInfo(@Nonnull final ClientInfo clientInfo,
69-
@Nonnull final DeviceInfo deviceInfo) {
95+
private InnertubeClientRequestInfo(@Nonnull final ClientInfo clientInfo,
96+
@Nonnull final DeviceInfo deviceInfo) {
7097
this.clientInfo = clientInfo;
7198
this.deviceInfo = deviceInfo;
7299
}
100+
101+
@Nonnull
102+
public static InnertubeClientRequestInfo ofWebClient() {
103+
return new InnertubeClientRequestInfo(
104+
new InnertubeClientRequestInfo.ClientInfo(
105+
WEB_CLIENT_NAME, WEB_HARDCODED_CLIENT_VERSION, WATCH_CLIENT_SCREEN,
106+
WEB_CLIENT_ID, null),
107+
new InnertubeClientRequestInfo.DeviceInfo(DESKTOP_CLIENT_PLATFORM, null, null,
108+
null, null, -1));
109+
}
110+
111+
@Nonnull
112+
public static InnertubeClientRequestInfo ofWebEmbeddedPlayerClient() {
113+
return new InnertubeClientRequestInfo(
114+
new InnertubeClientRequestInfo.ClientInfo(WEB_EMBEDDED_CLIENT_NAME,
115+
WEB_REMIX_HARDCODED_CLIENT_VERSION, EMBED_CLIENT_SCREEN,
116+
WEB_EMBEDDED_CLIENT_ID, null),
117+
new InnertubeClientRequestInfo.DeviceInfo(DESKTOP_CLIENT_PLATFORM, null, null,
118+
null, null, -1));
119+
}
120+
121+
@Nonnull
122+
public static InnertubeClientRequestInfo ofTvHtml5Client() {
123+
return new InnertubeClientRequestInfo(
124+
new InnertubeClientRequestInfo.ClientInfo(TVHTML5_CLIENT_NAME,
125+
TVHTML5_CLIENT_VERSION, WATCH_CLIENT_SCREEN, TVHTML5_CLIENT_ID, null),
126+
new InnertubeClientRequestInfo.DeviceInfo(TVHTML5_CLIENT_PLATFORM,
127+
TVHTML5_DEVICE_MAKE, TVHTML5_DEVICE_MODEL_AND_OS_NAME,
128+
TVHTML5_DEVICE_MODEL_AND_OS_NAME, "", -1));
129+
}
130+
131+
@Nonnull
132+
public static InnertubeClientRequestInfo ofAndroidClient() {
133+
return new InnertubeClientRequestInfo(
134+
new InnertubeClientRequestInfo.ClientInfo(ANDROID_CLIENT_NAME,
135+
ANDROID_CLIENT_VERSION, WATCH_CLIENT_SCREEN, ANDROID_CLIENT_ID, null),
136+
new InnertubeClientRequestInfo.DeviceInfo(MOBILE_CLIENT_PLATFORM, null, null,
137+
"Android", "15", 35));
138+
}
139+
140+
@Nonnull
141+
public static InnertubeClientRequestInfo ofIosClient() {
142+
return new InnertubeClientRequestInfo(
143+
new InnertubeClientRequestInfo.ClientInfo(IOS_CLIENT_NAME, IOS_CLIENT_VERSION,
144+
WATCH_CLIENT_SCREEN, IOS_CLIENT_ID, null),
145+
new InnertubeClientRequestInfo.DeviceInfo(MOBILE_CLIENT_PLATFORM, "Apple",
146+
IOS_DEVICE_MODEL, "iOS", IOS_OS_VERSION, -1));
147+
}
73148
}

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

Lines changed: 12 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,11 @@
1717
import java.util.Map;
1818

1919
import static org.schabi.newpipe.extractor.NewPipe.getDownloader;
20-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_ID;
21-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_NAME;
22-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.ANDROID_CLIENT_VERSION;
23-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.DESKTOP_CLIENT_PLATFORM;
24-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.EMBED_CLIENT_SCREEN;
25-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_ID;
26-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_NAME;
27-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_CLIENT_VERSION;
28-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_DEVICE_MODEL;
29-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.IOS_OS_VERSION;
30-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.MOBILE_CLIENT_PLATFORM;
3120
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_ID;
32-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_NAME;
33-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_PLATFORM;
3421
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_CLIENT_VERSION;
35-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_DEVICE_MAKE;
36-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_DEVICE_MODEL_AND_OS_NAME;
3722
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.TVHTML5_USER_AGENT;
38-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WATCH_CLIENT_SCREEN;
39-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_CLIENT_ID;
40-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_CLIENT_NAME;
4123
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_ID;
42-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_NAME;
4324
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_EMBEDDED_CLIENT_VERSION;
44-
import static org.schabi.newpipe.extractor.services.youtube.ClientsConstants.WEB_REMIX_HARDCODED_CLIENT_VERSION;
4525
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.CONTENT_CHECK_OK;
4626
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.CPN;
4727
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.DISABLE_PRETTY_PRINT_PARAMETER;
@@ -75,20 +55,8 @@ public static JsonObject getWebMetadataPlayerResponse(
7555
@Nonnull final ContentCountry contentCountry,
7656
@Nonnull final String videoId) throws IOException, ExtractionException {
7757
final InnertubeClientRequestInfo innertubeClientRequestInfo =
78-
new InnertubeClientRequestInfo(
79-
new InnertubeClientRequestInfo.ClientInfo(
80-
WEB_CLIENT_NAME,
81-
getClientVersion(),
82-
WATCH_CLIENT_SCREEN,
83-
WEB_CLIENT_ID,
84-
null),
85-
new InnertubeClientRequestInfo.DeviceInfo(
86-
DESKTOP_CLIENT_PLATFORM,
87-
null,
88-
null,
89-
null,
90-
null,
91-
-1));
58+
InnertubeClientRequestInfo.ofWebClient();
59+
innertubeClientRequestInfo.clientInfo.clientVersion = getClientVersion();
9260

9361
final Map<String, List<String>> headers = getYouTubeHeaders();
9462

@@ -122,20 +90,7 @@ public static JsonObject getTvHtml5PlayerResponse(
12290
@Nonnull final String cpn,
12391
final int signatureTimestamp) throws IOException, ExtractionException {
12492
final InnertubeClientRequestInfo innertubeClientRequestInfo =
125-
new InnertubeClientRequestInfo(
126-
new InnertubeClientRequestInfo.ClientInfo(
127-
TVHTML5_CLIENT_NAME,
128-
TVHTML5_CLIENT_VERSION,
129-
WATCH_CLIENT_SCREEN,
130-
TVHTML5_CLIENT_ID,
131-
null),
132-
new InnertubeClientRequestInfo.DeviceInfo(
133-
TVHTML5_CLIENT_PLATFORM,
134-
TVHTML5_DEVICE_MAKE,
135-
TVHTML5_DEVICE_MODEL_AND_OS_NAME,
136-
TVHTML5_DEVICE_MODEL_AND_OS_NAME,
137-
"",
138-
-1));
93+
InnertubeClientRequestInfo.ofTvHtml5Client();
13994

14095
final Map<String, List<String>> headers = new HashMap<>(
14196
getClientHeaders(TVHTML5_CLIENT_ID, TVHTML5_CLIENT_VERSION));
@@ -175,20 +130,9 @@ public static JsonObject getWebFullPlayerResponse(
175130
@Nonnull final PoTokenResult webPoTokenResult,
176131
final int signatureTimestamp) throws IOException, ExtractionException {
177132
final InnertubeClientRequestInfo innertubeClientRequestInfo =
178-
new InnertubeClientRequestInfo(
179-
new InnertubeClientRequestInfo.ClientInfo(
180-
WEB_CLIENT_NAME,
181-
getClientVersion(),
182-
WATCH_CLIENT_SCREEN,
183-
WEB_CLIENT_ID,
184-
webPoTokenResult.visitorData),
185-
new InnertubeClientRequestInfo.DeviceInfo(
186-
DESKTOP_CLIENT_PLATFORM,
187-
null,
188-
null,
189-
null,
190-
null,
191-
-1));
133+
InnertubeClientRequestInfo.ofWebClient();
134+
innertubeClientRequestInfo.clientInfo.clientVersion = getClientVersion();
135+
innertubeClientRequestInfo.clientInfo.visitorData = webPoTokenResult.visitorData;
192136

193137
final JsonBuilder<JsonObject> builder = prepareJsonBuilder(localization, contentCountry,
194138
innertubeClientRequestInfo, null);
@@ -199,7 +143,7 @@ public static JsonObject getWebFullPlayerResponse(
199143

200144
addPoToken(builder, webPoTokenResult.playerRequestPoToken);
201145

202-
final byte[] body = JsonWriter.string(builder.end().done())
146+
final byte[] body = JsonWriter.string(builder.done())
203147
.getBytes(StandardCharsets.UTF_8);
204148

205149
final String url = YOUTUBEI_V1_URL + PLAYER + "?" + DISABLE_PRETTY_PRINT_PARAMETER;
@@ -218,20 +162,7 @@ public static JsonObject getWebEmbeddedPlayerResponse(
218162
@Nullable final PoTokenResult webEmbeddedPoTokenResult,
219163
final int signatureTimestamp) throws IOException, ExtractionException {
220164
final InnertubeClientRequestInfo innertubeClientRequestInfo =
221-
new InnertubeClientRequestInfo(
222-
new InnertubeClientRequestInfo.ClientInfo(
223-
WEB_EMBEDDED_CLIENT_NAME,
224-
WEB_REMIX_HARDCODED_CLIENT_VERSION,
225-
EMBED_CLIENT_SCREEN,
226-
WEB_EMBEDDED_CLIENT_ID,
227-
null),
228-
new InnertubeClientRequestInfo.DeviceInfo(
229-
DESKTOP_CLIENT_PLATFORM,
230-
null,
231-
null,
232-
null,
233-
null,
234-
-1));
165+
InnertubeClientRequestInfo.ofWebEmbeddedPlayerClient();
235166

236167
final Map<String, List<String>> headers = new HashMap<>(
237168
getClientHeaders(WEB_EMBEDDED_CLIENT_ID, WEB_EMBEDDED_CLIENT_VERSION));
@@ -273,20 +204,8 @@ public static JsonObject getAndroidPlayerResponse(
273204
@Nonnull final PoTokenResult androidPoTokenResult)
274205
throws IOException, ExtractionException {
275206
final InnertubeClientRequestInfo innertubeClientRequestInfo =
276-
new InnertubeClientRequestInfo(
277-
new InnertubeClientRequestInfo.ClientInfo(
278-
ANDROID_CLIENT_NAME,
279-
ANDROID_CLIENT_VERSION,
280-
WATCH_CLIENT_SCREEN,
281-
ANDROID_CLIENT_ID,
282-
androidPoTokenResult.visitorData),
283-
new InnertubeClientRequestInfo.DeviceInfo(
284-
MOBILE_CLIENT_PLATFORM,
285-
null,
286-
null,
287-
"Android",
288-
"15",
289-
35));
207+
InnertubeClientRequestInfo.ofAndroidClient();
208+
innertubeClientRequestInfo.clientInfo.visitorData = androidPoTokenResult.visitorData;
290209

291210
final Map<String, List<String>> headers =
292211
getMobileClientHeaders(getAndroidUserAgent(localization));
@@ -314,20 +233,7 @@ public static JsonObject getAndroidReelPlayerResponse(
314233
@Nonnull final String videoId,
315234
@Nonnull final String cpn) throws IOException, ExtractionException {
316235
final InnertubeClientRequestInfo innertubeClientRequestInfo =
317-
new InnertubeClientRequestInfo(
318-
new InnertubeClientRequestInfo.ClientInfo(
319-
ANDROID_CLIENT_NAME,
320-
ANDROID_CLIENT_VERSION,
321-
WATCH_CLIENT_SCREEN,
322-
ANDROID_CLIENT_ID,
323-
null),
324-
new InnertubeClientRequestInfo.DeviceInfo(
325-
MOBILE_CLIENT_PLATFORM,
326-
null,
327-
null,
328-
"Android",
329-
"15",
330-
35));
236+
InnertubeClientRequestInfo.ofAndroidClient();
331237

332238
final Map<String, List<String>> headers =
333239
getMobileClientHeaders(getAndroidUserAgent(localization));
@@ -367,20 +273,7 @@ public static JsonObject getIosPlayerResponse(@Nonnull final ContentCountry cont
367273
@Nullable final PoTokenResult iosPoTokenResult)
368274
throws IOException, ExtractionException {
369275
final InnertubeClientRequestInfo innertubeClientRequestInfo =
370-
new InnertubeClientRequestInfo(
371-
new InnertubeClientRequestInfo.ClientInfo(
372-
IOS_CLIENT_NAME,
373-
IOS_CLIENT_VERSION,
374-
WATCH_CLIENT_SCREEN,
375-
IOS_CLIENT_ID,
376-
null),
377-
new InnertubeClientRequestInfo.DeviceInfo(
378-
MOBILE_CLIENT_PLATFORM,
379-
"Apple",
380-
IOS_DEVICE_MODEL,
381-
"iOS",
382-
IOS_OS_VERSION,
383-
-1));
276+
InnertubeClientRequestInfo.ofIosClient();
384277

385278
final Map<String, List<String>> headers =
386279
getMobileClientHeaders(getIosUserAgent(localization));

0 commit comments

Comments
 (0)