From 5281456899db32ffff9362202a72bad430d1f70c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 23:14:23 +0100 Subject: [PATCH] Bandcamp channel link handler factory --- .../services/bandcamp/BandcampService.java | 3 +- .../extractors/BandcampExtractorHelper.java | 3 +- .../extractors/BandcampStreamExtractor.java | 8 ++-- .../BandcampChannelLinkHandlerFactory.java | 46 +++++++++++++------ ...BandcampChannelLinkHandlerFactoryTest.java | 16 ++++++- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java index 7cf03009f..86e1f7dad 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java @@ -41,8 +41,7 @@ public class BandcampService extends StreamingService { @Override public ListLinkHandlerFactory getChannelLHFactory() { - //return new BandcampChannelLinkHandlerFactory(); TODO - return null; + return new BandcampChannelLinkHandlerFactory(); } @Override 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 452c46934..98ad88923 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 @@ -42,7 +42,8 @@ public class BandcampExtractorHelper { level--; if (level == 0) { return new JSONObject(firstHalfGone.substring(0, position + 1) - .replaceAll(" {4}//.+", "") // Remove comments in JSON + .replaceAll(" {4}//.+", "") // Remove "for the curious" in JSON + .replaceAll("// xxx: note - don't internationalize this variable", "") // Remove this comment ); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java index 0c872c92f..d9253b600 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java @@ -56,7 +56,7 @@ public class BandcampStreamExtractor extends StreamExtractor { try { return BandcampExtractorHelper.getJSONFromJavaScriptVariables(html, "TralbumData"); } catch (JSONException e) { - throw new ParsingException("Faulty JSON", e); + throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } } @@ -211,17 +211,17 @@ public class BandcampStreamExtractor extends StreamExtractor { } @Override - public StreamType getStreamType() throws ParsingException { + public StreamType getStreamType() { return StreamType.AUDIO_STREAM; } @Override - public StreamInfoItem getNextStream() throws IOException, ExtractionException { + public StreamInfoItem getNextStream() { return null; } @Override - public StreamInfoItemsCollector getRelatedStreams() throws IOException, ExtractionException { + public StreamInfoItemsCollector getRelatedStreams() { return null; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java index 24f19f761..e4521ffb0 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java @@ -2,13 +2,15 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; +import org.json.JSONObject; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; -import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.utils.ExtractorHelper; import java.io.IOException; import java.util.List; @@ -23,16 +25,41 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { public String getId(String url) throws ParsingException { try { String response = NewPipe.getDownloader().get(url).responseBody(); - return BandcampStreamExtractor.getAlbumInfoJson(response) - .getString("band_id"); + + // This variable contains band data! + JSONObject bandData = BandcampExtractorHelper.getJSONFromJavaScriptVariables(response, "BandData"); + + return String.valueOf(bandData.getLong("id")); + } catch (IOException | ReCaptchaException e) { throw new ParsingException("Download failed", e); } } + /** + * Fetch artist details from mobile endpoint, thereby receiving their URL. + * + * I once took a moment to note down how it works. + * + * @throws ParsingException + */ @Override public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { - return null; // TODO + try { + String data = NewPipe.getDownloader().post( + "https://bandcamp.com/api/mobile/22/band_details", + null, + ("{\"band_id\":\"" + id + "\"}").getBytes() + ).responseBody(); + + return new JSONObject(data) + .getString("bandcamp_url") + .replace("http://", "https://"); + + + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("Download failed", e); + } } /** @@ -40,17 +67,10 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { * where the profile is at * . * /releases */ @Override - public boolean onAcceptUrl(String url) throws ParsingException { - - // Ends with "bandcamp.com" or "bandcamp.com/"? - boolean endsWithBandcampCom = url.endsWith("bandcamp.com") - || url.endsWith("bandcamp.com/"); + public boolean onAcceptUrl(String url) { // Is a subdomain of bandcamp.com? - boolean isBandcampComSubdomain = url.matches("https?://.+\\.bandcamp\\.com"); - - // Is root of bandcamp.com subdomain? - boolean isBandcampComArtistPage = endsWithBandcampCom && isBandcampComSubdomain; + boolean isBandcampComArtistPage = url.matches("https?://.+\\.bandcamp\\.com/?"); boolean isCustomDomainReleases = url.matches("https?://.+\\..+/releases/?(?!.)"); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.java index d8c7497d7..7e46a096b 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.java @@ -30,11 +30,25 @@ public class BandcampChannelLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("http://interovgm.com/releases/")); assertTrue(linkHandler.acceptUrl("https://interovgm.com/releases")); assertTrue(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); + assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); // Tests expecting false assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); - assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); + } + + @Test + public void testGetId() throws ParsingException { + assertEquals("1196681540", linkHandler.getId("https://macbenson.bandcamp.com/")); + assertEquals("1581461772", linkHandler.getId("https://interovgm.com/releases")); + assertEquals("3321800855", linkHandler.getId("https://infiniteammo.bandcamp.com/")); + } + + @Test + public void testGetUrl() throws ParsingException { + assertEquals("https://macbenson.bandcamp.com", linkHandler.getUrl("1196681540")); + assertEquals("https://interovgm.com", linkHandler.getUrl("1581461772")); + assertEquals("https://infiniteammo.bandcamp.com", linkHandler.getUrl("3321800855")); } }