From 2d662d79ff26c67b39bbf6588837390bbd3b0da9 Mon Sep 17 00:00:00 2001 From: evermind Date: Mon, 6 Feb 2023 22:46:01 +0100 Subject: [PATCH] RUMBLE: fix getting video size for Rumble as they no longer support HEAD (discovered 20230203) --- .../org/schabi/newpipe/DownloaderImpl.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 9ddbe96df..27d63897c 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -14,6 +14,8 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.util.InfoCache; import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -115,7 +117,11 @@ public final class DownloaderImpl extends Downloader { public long getContentLength(final String url) throws IOException { try { final Response response = head(url); - return Long.parseLong(response.getHeader("Content-Length")); + if (response.responseCode() == 405) { // HEAD Method not allowed + return getContentLengthViaGet(url); + } else { + return Long.parseLong(response.getHeader("Content-Length")); + } } catch (final NumberFormatException e) { throw new IOException("Invalid content length", e); } catch (final ReCaptchaException e) { @@ -179,4 +185,16 @@ public final class DownloaderImpl extends Downloader { return new Response(response.code(), response.message(), response.headers().toMultimap(), responseBodyToReturn, latestUrl); } + + // some servers eg rumble do not allow HEAD requests anymore (discovered 202300203) + private long getContentLengthViaGet(final String url) throws IOException { + final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setInstanceFollowRedirects(true); + conn.setRequestProperty("User-Agent", USER_AGENT); + conn.setRequestProperty("Accept", "*/*"); + conn.setRequestProperty("Accept-Encoding", "*"); + final String contentSize = conn.getHeaderField("Content-Length"); + conn.disconnect(); + return Long.parseLong(contentSize); + } }