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"));
}
}