1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2024-12-23 00:20:32 +00:00

Add comments and use downloader user agent in YT data source

YoutubeHttpDataSource
This commit is contained in:
Stypox 2022-05-21 11:27:14 +02:00 committed by AudricV
parent 7ce2250d85
commit fa46b7bf85
No known key found for this signature in database
GPG Key ID: DA92EC7905614198
2 changed files with 22 additions and 41 deletions

View File

@ -44,6 +44,8 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.common.net.HttpHeaders; import com.google.common.net.HttpHeaders;
import org.schabi.newpipe.DownloaderImpl;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
@ -69,6 +71,10 @@ import java.util.zip.GZIPInputStream;
* (only where it's relevant) and also more parameters, such as {@code rn} and replaces the use of * (only where it's relevant) and also more parameters, such as {@code rn} and replaces the use of
* the {@code Range} header by the corresponding parameter ({@code range}), if enabled. * the {@code Range} header by the corresponding parameter ({@code range}), if enabled.
* </p> * </p>
*
* There are many unused methods in this class because everything was copied from {@link
* com.google.android.exoplayer2.upstream.DefaultHttpDataSource} with as little changes as possible.
* SonarQube warnings were also suppressed for the same reason.
*/ */
@SuppressWarnings({"squid:S3011", "squid:S4738"}) @SuppressWarnings({"squid:S3011", "squid:S4738"})
public final class YoutubeHttpDataSource extends BaseDataSource implements HttpDataSource { public final class YoutubeHttpDataSource extends BaseDataSource implements HttpDataSource {
@ -89,8 +95,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
private boolean allowCrossProtocolRedirects; private boolean allowCrossProtocolRedirects;
private boolean keepPostFor302Redirects; private boolean keepPostFor302Redirects;
@Nullable
private String userAgentForNonMobileStreams;
private boolean rangeParameterEnabled; private boolean rangeParameterEnabled;
private boolean rnParameterEnabled; private boolean rnParameterEnabled;
@ -111,25 +115,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
return this; return this;
} }
/**
* Sets the user agent that will be used, only for non-mobile streams.
*
* <p>
* The default is {@code null}, which causes the default user agent of the underlying
* platform to be used.
* </p>
*
* @param userAgentForNonMobileStreamsValue The user agent that will be used for non-mobile
* streams, or {@code null} to use the default
* user agent of the underlying platform.
* @return This factory.
*/
public Factory setUserAgentForNonMobileStreams(
@Nullable final String userAgentForNonMobileStreamsValue) {
userAgentForNonMobileStreams = userAgentForNonMobileStreamsValue;
return this;
}
/** /**
* Sets the connect timeout, in milliseconds. * Sets the connect timeout, in milliseconds.
* *
@ -262,7 +247,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
@Override @Override
public YoutubeHttpDataSource createDataSource() { public YoutubeHttpDataSource createDataSource() {
final YoutubeHttpDataSource dataSource = new YoutubeHttpDataSource( final YoutubeHttpDataSource dataSource = new YoutubeHttpDataSource(
userAgentForNonMobileStreams,
connectTimeoutMs, connectTimeoutMs,
readTimeoutMs, readTimeoutMs,
allowCrossProtocolRedirects, allowCrossProtocolRedirects,
@ -294,8 +278,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
private final int connectTimeoutMillis; private final int connectTimeoutMillis;
private final int readTimeoutMillis; private final int readTimeoutMillis;
@Nullable @Nullable
private final String userAgent;
@Nullable
private final RequestProperties defaultRequestProperties; private final RequestProperties defaultRequestProperties;
private final RequestProperties requestProperties; private final RequestProperties requestProperties;
private final boolean keepPostFor302Redirects; private final boolean keepPostFor302Redirects;
@ -316,8 +298,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
private long requestNumber; private long requestNumber;
@SuppressWarnings("checkstyle:ParameterNumber") @SuppressWarnings("checkstyle:ParameterNumber")
private YoutubeHttpDataSource(@Nullable final String userAgent, private YoutubeHttpDataSource(final int connectTimeoutMillis,
final int connectTimeoutMillis,
final int readTimeoutMillis, final int readTimeoutMillis,
final boolean allowCrossProtocolRedirects, final boolean allowCrossProtocolRedirects,
final boolean rangeParameterEnabled, final boolean rangeParameterEnabled,
@ -326,7 +307,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
@Nullable final Predicate<String> contentTypePredicate, @Nullable final Predicate<String> contentTypePredicate,
final boolean keepPostFor302Redirects) { final boolean keepPostFor302Redirects) {
super(true); super(true);
this.userAgent = userAgent;
this.connectTimeoutMillis = connectTimeoutMillis; this.connectTimeoutMillis = connectTimeoutMillis;
this.readTimeoutMillis = readTimeoutMillis; this.readTimeoutMillis = readTimeoutMillis;
this.allowCrossProtocolRedirects = allowCrossProtocolRedirects; this.allowCrossProtocolRedirects = allowCrossProtocolRedirects;
@ -637,6 +617,8 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
final boolean allowGzip, final boolean allowGzip,
final boolean followRedirects, final boolean followRedirects,
final Map<String, String> requestParameters) throws IOException { final Map<String, String> requestParameters) throws IOException {
// This is the method that contains breaking changes with respect to DefaultHttpDataSource!
String requestUrl = url.toString(); String requestUrl = url.toString();
// Don't add the request number parameter if it has been already added (for instance in // Don't add the request number parameter if it has been already added (for instance in
@ -687,18 +669,19 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
httpURLConnection.setRequestProperty(HttpHeaders.TE, "trailers"); httpURLConnection.setRequestProperty(HttpHeaders.TE, "trailers");
final boolean isAnAndroidStreamingUrl = isAndroidStreamingUrl(requestUrl); final boolean isAndroidStreamingUrl = isAndroidStreamingUrl(requestUrl);
final boolean isAnIosStreamingUrl = isIosStreamingUrl(requestUrl); final boolean isIosStreamingUrl = isIosStreamingUrl(requestUrl);
if (isAnAndroidStreamingUrl) { if (isAndroidStreamingUrl) {
// Improvement which may be done: find the content country used to request YouTube // Improvement which may be done: find the content country used to request YouTube
// contents to add it in the user agent instead of using the default // contents to add it in the user agent instead of using the default
httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT,
getAndroidUserAgent(null)); getAndroidUserAgent(null));
} else if (isAnIosStreamingUrl) { } else if (isIosStreamingUrl) {
httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT,
getIosUserAgent(null)); getIosUserAgent(null));
} else if (userAgent != null) { } else {
httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, userAgent); // non-mobile user agent
httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, DownloaderImpl.USER_AGENT);
} }
httpURLConnection.setRequestProperty(HttpHeaders.ACCEPT_ENCODING, httpURLConnection.setRequestProperty(HttpHeaders.ACCEPT_ENCODING,
@ -707,7 +690,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD
httpURLConnection.setDoOutput(httpBody != null); httpURLConnection.setDoOutput(httpBody != null);
// Mobile clients uses POST requests to fetch contents // Mobile clients uses POST requests to fetch contents
httpURLConnection.setRequestMethod(isAnAndroidStreamingUrl || isAnIosStreamingUrl httpURLConnection.setRequestMethod(isAndroidStreamingUrl || isIosStreamingUrl
? "POST" ? "POST"
: DataSpec.getStringForHttpMethod(httpMethod)); : DataSpec.getStringForHttpMethod(httpMethod));

View File

@ -93,11 +93,11 @@ public class PlayerDataSource {
// YouTube-specific data source factories use getYoutubeHttpDataSourceFactory() // YouTube-specific data source factories use getYoutubeHttpDataSourceFactory()
ytHlsCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, ytHlsCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,
getYoutubeHttpDataSourceFactory(false, false, userAgent)); getYoutubeHttpDataSourceFactory(false, false));
ytDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, ytDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,
getYoutubeHttpDataSourceFactory(true, true, userAgent)); getYoutubeHttpDataSourceFactory(true, true));
ytProgressiveDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, ytProgressiveDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,
getYoutubeHttpDataSourceFactory(false, true, userAgent)); getYoutubeHttpDataSourceFactory(false, true));
// set the maximum size to manifest creators // set the maximum size to manifest creators
YoutubeProgressiveDashManifestCreator.getCache().setMaximumSize(MAX_MANIFEST_CACHE_SIZE); YoutubeProgressiveDashManifestCreator.getCache().setMaximumSize(MAX_MANIFEST_CACHE_SIZE);
@ -187,12 +187,10 @@ public class PlayerDataSource {
private static YoutubeHttpDataSource.Factory getYoutubeHttpDataSourceFactory( private static YoutubeHttpDataSource.Factory getYoutubeHttpDataSourceFactory(
final boolean rangeParameterEnabled, final boolean rangeParameterEnabled,
final boolean rnParameterEnabled, final boolean rnParameterEnabled) {
final String userAgent) {
return new YoutubeHttpDataSource.Factory() return new YoutubeHttpDataSource.Factory()
.setRangeParameterEnabled(rangeParameterEnabled) .setRangeParameterEnabled(rangeParameterEnabled)
.setRnParameterEnabled(rnParameterEnabled) .setRnParameterEnabled(rnParameterEnabled);
.setUserAgentForNonMobileStreams(userAgent);
} }
private static void instantiateCacheIfNeeded(final Context context) { private static void instantiateCacheIfNeeded(final Context context) {