From b9e463de49da516c2b0b21aea1a8197bf9c7c46d Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 18 Jun 2022 15:59:46 +0200 Subject: [PATCH] [Bandcamp] Send Content-Type header in POST requests This header was not sent before and was added and guessed by OkHttp. This can create issues when using other HTTP clients than OkHttp, such as Cronet. Also make use of StandardCharsets.UTF_8 when getting bytes of bodies instead of the platform default's charset, to make sure to prevent some encoding issues on some JVMs. --- .../extractors/BandcampExtractorHelper.java | 36 +++++++++---------- .../extractors/BandcampFeaturedExtractor.java | 13 ++++--- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java index 1ce6ac0d0..8b9cbedcf 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java @@ -6,22 +6,23 @@ import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; import com.grack.nanojson.JsonWriter; - import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.utils.Utils; +import javax.annotation.Nullable; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.time.DateTimeException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.util.Collections; import java.util.Locale; -import javax.annotation.Nullable; - public final class BandcampExtractorHelper { public static final String BASE_URL = "https://bandcamp.com"; @@ -43,8 +44,8 @@ public final class BandcampExtractorHelper { + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.charAt(0)) .responseBody(); - return JsonParser.object().from(jsonString) - .getString("bandcamp_url").replace("http://", "https://"); + return Utils.replaceHttpWithHttps(JsonParser.object().from(jsonString) + .getString("bandcamp_url")); } catch (final JsonParserException | ReCaptchaException | IOException e) { throw new ParsingException("Ids could not be translated to URL", e); @@ -60,19 +61,16 @@ public final class BandcampExtractorHelper { */ public static JsonObject getArtistDetails(final String id) throws ParsingException { try { - return - JsonParser.object().from( - NewPipe.getDownloader().post( - BASE_API_URL + "/mobile/22/band_details", - null, - JsonWriter.string() - .object() - .value("band_id", id) - .end() - .done() - .getBytes() - ).responseBody() - ); + return JsonParser.object().from(NewPipe.getDownloader().post( + BASE_API_URL + "/mobile/22/band_details", + Collections.singletonMap("Content-Type", + Collections.singletonList("application/json")), + JsonWriter.string() + .object() + .value("band_id", id) + .end() + .done() + .getBytes(StandardCharsets.UTF_8)).responseBody()); } catch (final IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("Could not download band details", e); } @@ -123,7 +121,7 @@ public final class BandcampExtractorHelper { /** * Whether the URL points to a radio kiosk. * @param url the URL to check - * @return true if the URL matches https://bandcamp.com/?show=SHOW_ID + * @return true if the URL matches {@code https://bandcamp.com/?show=SHOW_ID} */ public static boolean isRadioUrl(final String url) { return url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java index 3667f3da6..5cc4b5671 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java @@ -18,6 +18,8 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collections; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_API_URL; @@ -40,11 +42,12 @@ public class BandcampFeaturedExtractor extends KioskExtractor public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { try { - json = JsonParser.object().from( - getDownloader().post( - FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() - ).responseBody() - ); + json = JsonParser.object().from(getDownloader().post( + FEATURED_API_URL, + Collections.singletonMap("Content-Type", + Collections.singletonList("application/json")), + "{\"platform\":\"\",\"version\":0}".getBytes(StandardCharsets.UTF_8)) + .responseBody()); } catch (final JsonParserException e) { throw new ParsingException("Could not parse Bandcamp featured API response", e); }