From fa46b7bf85caa29b94d9194e41a2ae2ace4db2c8 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 21 May 2022 11:27:14 +0200 Subject: [PATCH] Add comments and use downloader user agent in YT data source YoutubeHttpDataSource --- .../datasource/YoutubeHttpDataSource.java | 51 +++++++------------ .../player/helper/PlayerDataSource.java | 12 ++--- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java index acf9c6a47..c9abe65f6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java @@ -44,6 +44,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.google.common.net.HttpHeaders; +import org.schabi.newpipe.DownloaderImpl; + import java.io.IOException; import java.io.InputStream; 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 * the {@code Range} header by the corresponding parameter ({@code range}), if enabled. *

+ * + * 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"}) 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 keepPostFor302Redirects; - @Nullable - private String userAgentForNonMobileStreams; private boolean rangeParameterEnabled; private boolean rnParameterEnabled; @@ -111,25 +115,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD return this; } - /** - * Sets the user agent that will be used, only for non-mobile streams. - * - *

- * The default is {@code null}, which causes the default user agent of the underlying - * platform to be used. - *

- * - * @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. * @@ -262,7 +247,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD @Override public YoutubeHttpDataSource createDataSource() { final YoutubeHttpDataSource dataSource = new YoutubeHttpDataSource( - userAgentForNonMobileStreams, connectTimeoutMs, readTimeoutMs, allowCrossProtocolRedirects, @@ -294,8 +278,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD private final int connectTimeoutMillis; private final int readTimeoutMillis; @Nullable - private final String userAgent; - @Nullable private final RequestProperties defaultRequestProperties; private final RequestProperties requestProperties; private final boolean keepPostFor302Redirects; @@ -316,8 +298,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD private long requestNumber; @SuppressWarnings("checkstyle:ParameterNumber") - private YoutubeHttpDataSource(@Nullable final String userAgent, - final int connectTimeoutMillis, + private YoutubeHttpDataSource(final int connectTimeoutMillis, final int readTimeoutMillis, final boolean allowCrossProtocolRedirects, final boolean rangeParameterEnabled, @@ -326,7 +307,6 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD @Nullable final Predicate contentTypePredicate, final boolean keepPostFor302Redirects) { super(true); - this.userAgent = userAgent; this.connectTimeoutMillis = connectTimeoutMillis; this.readTimeoutMillis = readTimeoutMillis; this.allowCrossProtocolRedirects = allowCrossProtocolRedirects; @@ -637,6 +617,8 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD final boolean allowGzip, final boolean followRedirects, final Map requestParameters) throws IOException { + // This is the method that contains breaking changes with respect to DefaultHttpDataSource! + String requestUrl = url.toString(); // 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"); - final boolean isAnAndroidStreamingUrl = isAndroidStreamingUrl(requestUrl); - final boolean isAnIosStreamingUrl = isIosStreamingUrl(requestUrl); - if (isAnAndroidStreamingUrl) { + final boolean isAndroidStreamingUrl = isAndroidStreamingUrl(requestUrl); + final boolean isIosStreamingUrl = isIosStreamingUrl(requestUrl); + if (isAndroidStreamingUrl) { // 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 httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, getAndroidUserAgent(null)); - } else if (isAnIosStreamingUrl) { + } else if (isIosStreamingUrl) { httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, getIosUserAgent(null)); - } else if (userAgent != null) { - httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, userAgent); + } else { + // non-mobile user agent + httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, DownloaderImpl.USER_AGENT); } httpURLConnection.setRequestProperty(HttpHeaders.ACCEPT_ENCODING, @@ -707,7 +690,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD httpURLConnection.setDoOutput(httpBody != null); // Mobile clients uses POST requests to fetch contents - httpURLConnection.setRequestMethod(isAnAndroidStreamingUrl || isAnIosStreamingUrl + httpURLConnection.setRequestMethod(isAndroidStreamingUrl || isIosStreamingUrl ? "POST" : DataSpec.getStringForHttpMethod(httpMethod)); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java index f732e834f..8b7689bac 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java @@ -93,11 +93,11 @@ public class PlayerDataSource { // YouTube-specific data source factories use getYoutubeHttpDataSourceFactory() ytHlsCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, - getYoutubeHttpDataSourceFactory(false, false, userAgent)); + getYoutubeHttpDataSourceFactory(false, false)); ytDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, - getYoutubeHttpDataSourceFactory(true, true, userAgent)); + getYoutubeHttpDataSourceFactory(true, true)); ytProgressiveDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache, - getYoutubeHttpDataSourceFactory(false, true, userAgent)); + getYoutubeHttpDataSourceFactory(false, true)); // set the maximum size to manifest creators YoutubeProgressiveDashManifestCreator.getCache().setMaximumSize(MAX_MANIFEST_CACHE_SIZE); @@ -187,12 +187,10 @@ public class PlayerDataSource { private static YoutubeHttpDataSource.Factory getYoutubeHttpDataSourceFactory( final boolean rangeParameterEnabled, - final boolean rnParameterEnabled, - final String userAgent) { + final boolean rnParameterEnabled) { return new YoutubeHttpDataSource.Factory() .setRangeParameterEnabled(rangeParameterEnabled) - .setRnParameterEnabled(rnParameterEnabled) - .setUserAgentForNonMobileStreams(userAgent); + .setRnParameterEnabled(rnParameterEnabled); } private static void instantiateCacheIfNeeded(final Context context) {