From 808c8aa0872ef0bee4d8d042dc5d772babfde154 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 17:30:22 +0100 Subject: [PATCH] Add bandcamp weekly kiosk Unfortunately a little messy --- .../services/bandcamp/BandcampService.java | 31 +++-- .../extractors/BandcampFeaturedExtractor.java | 4 +- .../extractors/BandcampRadioExtractor.java | 74 +++++++++++ .../BandcampRadioInfoItemExtractor.java | 88 ++++++++++++ .../BandcampRadioStreamExtractor.java | 125 ++++++++++++++++++ .../BandcampFeaturedLinkHandlerFactory.java | 20 +-- .../BandcampStreamLinkHandlerFactory.java | 21 ++- .../BandcampFeaturedExtractorTest.java | 2 +- ...andcampFeaturedLinkHandlerFactoryTest.java | 52 ++++++++ .../bandcamp/BandcampRadioExtractorTest.java | 40 ++++++ .../BandcampRadioStreamExtractorTest.java | 37 ++++++ .../BandcampStreamLinkHandlerFactoryTest.java | 11 ++ 12 files changed, 477 insertions(+), 28 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioStreamExtractor.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedLinkHandlerFactoryTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioExtractorTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioStreamExtractorTest.java 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 658101bd3..1aa5b3c77 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 @@ -21,8 +21,10 @@ import java.io.IOException; import java.util.Collections; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.FEATURED_API_URL; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.KIOSK_FEATURED; -import static org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory.FEATURED_API_URL; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor.KIOSK_RADIO; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor.RADIO_API_URL; public class BandcampService extends StreamingService { @@ -79,14 +81,22 @@ public class BandcampService extends StreamingService { public KioskList getKioskList() throws ExtractionException { KioskList kioskList = new KioskList(this); + try { - kioskList - .addKioskEntry(new KioskList.KioskExtractorFactory() { - @Override - public KioskExtractor createNewKiosk(StreamingService streamingService, String url, String kioskId) throws ExtractionException { - return new BandcampFeaturedExtractor(BandcampService.this, new BandcampFeaturedLinkHandlerFactory().fromUrl(FEATURED_API_URL), kioskId); - } - }, new BandcampFeaturedLinkHandlerFactory(), KIOSK_FEATURED); + kioskList.addKioskEntry(new KioskList.KioskExtractorFactory() { + @Override + public KioskExtractor createNewKiosk(StreamingService streamingService, String url, String kioskId) throws ExtractionException { + return new BandcampFeaturedExtractor(BandcampService.this, new BandcampFeaturedLinkHandlerFactory().fromUrl(FEATURED_API_URL), kioskId); + } + }, new BandcampFeaturedLinkHandlerFactory(), KIOSK_FEATURED); + + + kioskList.addKioskEntry(new KioskList.KioskExtractorFactory() { + @Override + public KioskExtractor createNewKiosk(StreamingService streamingService, String url, String kioskId) throws ExtractionException { + return new BandcampRadioExtractor(BandcampService.this, new BandcampFeaturedLinkHandlerFactory().fromUrl(RADIO_API_URL), kioskId); + } + }, new BandcampFeaturedLinkHandlerFactory(), KIOSK_RADIO); kioskList.setDefaultKiosk(KIOSK_FEATURED); @@ -109,7 +119,10 @@ public class BandcampService extends StreamingService { @Override public StreamExtractor getStreamExtractor(LinkHandler linkHandler) { - return new BandcampStreamExtractor(this, linkHandler); + if (linkHandler.getUrl().matches("https?://bandcamp\\.com/\\?show=\\d+")) + return new BandcampRadioStreamExtractor(this, linkHandler); + else + return new BandcampStreamExtractor(this, linkHandler); } @Override 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 5e8f21d49..f8e67c6bd 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 @@ -22,11 +22,11 @@ import javax.annotation.Nonnull; import java.io.IOException; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; -import static org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory.FEATURED_API_URL; public class BandcampFeaturedExtractor extends KioskExtractor { public static final String KIOSK_FEATURED = "Featured"; + public static final String FEATURED_API_URL = "https://bandcamp.com/api/mobile/24/bootstrap_data"; public BandcampFeaturedExtractor(StreamingService streamingService, ListLinkHandler listLinkHandler, String kioskId) { super(streamingService, listLinkHandler, kioskId); @@ -40,7 +40,7 @@ public class BandcampFeaturedExtractor extends KioskExtractor { @Nonnull @Override public String getName() throws ParsingException { - return null; + return KIOSK_FEATURED; } @Nonnull diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioExtractor.java new file mode 100644 index 000000000..1e2f8aa7f --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioExtractor.java @@ -0,0 +1,74 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.InfoItemsCollector; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.downloader.Downloader; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.kiosk.KioskExtractor; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; +import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; + +import javax.annotation.Nonnull; +import java.io.IOException; + +public class BandcampRadioExtractor extends KioskExtractor { + + public static final String KIOSK_RADIO = "Radio"; + public static final String RADIO_API_URL = "https://bandcamp.com/api/bcweekly/1/list"; + + public BandcampRadioExtractor(StreamingService streamingService, ListLinkHandler linkHandler, String kioskId) { + super(streamingService, linkHandler, kioskId); + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return KIOSK_RADIO; + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws IOException, ExtractionException { + InfoItemsCollector c = new StreamInfoItemsCollector(getServiceId()); + + JSONObject json = new JSONObject( + getDownloader().get( + RADIO_API_URL + ).responseBody() + ); + + JSONArray radioShows = json.getJSONArray("results"); + + for (int i = 0; i < radioShows.length(); i++) { + JSONObject radioShow = radioShows.getJSONObject(i); + + c.commit( + new BandcampRadioInfoItemExtractor(radioShow) + ); + } + + return new InfoItemsPage(c, null); + } + + @Override + public String getNextPageUrl() throws IOException, ExtractionException { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { + return null; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioInfoItemExtractor.java new file mode 100644 index 000000000..7e7017140 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioInfoItemExtractor.java @@ -0,0 +1,88 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONObject; +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.stream.StreamInfoItemExtractor; +import org.schabi.newpipe.extractor.stream.StreamType; + +import javax.annotation.Nullable; +import java.io.IOException; + +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioStreamExtractor.query; + +public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { + + private JSONObject show; + + public BandcampRadioInfoItemExtractor(JSONObject radioShow) { + show = radioShow; + } + + @Override + public long getDuration() { + /* Duration is only present in the more detailed information that has to be queried seperately. + * Because the servers would probably not like over 300 queries every time someone opens the kiosk, + * we're just providing 0 here. + */ + //return query(show.getInt("id")).getLong("audio_duration"); + return 0; + } + + @Nullable + @Override + public String getTextualUploadDate() { + return show.getString("date"); + } + + @Nullable + @Override + public DateWrapper getUploadDate() { + return null; + } + + @Override + public String getName() throws ParsingException { + return show.getString("date"); + } + + @Override + public String getUrl() { + return "https://bandcamp.com/?show=" + show.getInt("id"); + } + + @Override + public String getThumbnailUrl() { + return getImageUrl(show.getLong("image_id"), false); + } + + @Override + public StreamType getStreamType() { + return StreamType.AUDIO_STREAM; + } + + @Override + public long getViewCount() { + return -1; + } + + @Override + public String getUploaderName() { + return ""; + } + + @Override + public String getUploaderUrl() { + return ""; + } + + @Override + public boolean isAd() { + return false; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioStreamExtractor.java new file mode 100644 index 000000000..2449f572f --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampRadioStreamExtractor.java @@ -0,0 +1,125 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.downloader.Downloader; +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.LinkHandler; +import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.stream.AudioStream; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; + +public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { + + private JSONObject showInfo; + private LinkHandler linkHandler; + + public BandcampRadioStreamExtractor(StreamingService service, LinkHandler linkHandler) { + super(service, linkHandler); + this.linkHandler = linkHandler; + } + + static JSONObject query(int id) throws ParsingException { + try { + return new JSONObject( + NewPipe.getDownloader().get("https://bandcamp.com/api/bcweekly/1/get?id=" + id).responseBody() + ); + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("could not get show data", e); + } + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + showInfo = query(Integer.parseInt(getId())); + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return showInfo.getString("subtitle"); // "audio_title" is a boring title + } + + @Nonnull + @Override + public String getUploaderUrl() { + return Jsoup.parse(showInfo.getString("image_caption")) + .getElementsByTag("a").first().attr("href"); + } + + @Nonnull + @Override + public String getUrl() throws ParsingException { + return linkHandler.getUrl(); + } + + @Nonnull + @Override + public String getUploaderName() { + return Jsoup.parse(showInfo.getString("image_caption")) + .getElementsByTag("a").first().text(); + } + + @Nullable + @Override + public String getTextualUploadDate() { + return showInfo.getString("published_date"); + } + + @Nonnull + @Override + public String getThumbnailUrl() throws ParsingException { + return getImageUrl(showInfo.getLong("show_image_id"), false); + } + + @Nonnull + @Override + public String getUploaderAvatarUrl() { + return "https://bandcamp.com/img/buttons/bandcamp-button-circle-whitecolor-512.png"; + } + + @Nonnull + @Override + public String getDescription() { + return showInfo.getString("desc"); + } + + @Override + public long getLength() { + return showInfo.getLong("audio_duration"); + } + + @Override + public List getAudioStreams() { + ArrayList list = new ArrayList<>(); + JSONObject streams = showInfo.getJSONObject("audio_stream"); + + if (streams.has("opus-lo")) { + list.add(new AudioStream( + streams.getString("opus-lo"), + MediaFormat.OPUS, 100 + )); + } + if (streams.has("mp3-128")) { + list.add(new AudioStream( + streams.getString("mp3-128"), + MediaFormat.MP3, 128 + )); + } + + return list; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java index 3fdcb33ba..0c5cb5fe8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java @@ -2,33 +2,35 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; -import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; import java.util.List; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.FEATURED_API_URL; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.KIOSK_FEATURED; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor.KIOSK_RADIO; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor.RADIO_API_URL; public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { - /** - * This kiosk doesn't have a corresponding website - */ - public static final String FEATURED_API_URL = "https://bandcamp.com/api/mobile/24/bootstrap_data"; - @Override public String getUrl(String id, List contentFilter, String sortFilter) { - if (id.equals(KIOSK_FEATURED)) return FEATURED_API_URL; + if (id.equals(KIOSK_FEATURED)) return FEATURED_API_URL; // doesn't have a website + else if (id.equals(KIOSK_RADIO)) return RADIO_API_URL; // doesn't have its own website else return null; } @Override public String getId(String url) { - return KIOSK_FEATURED; + if (url.matches("https?://bandcamp\\.com/\\?show=\\d+") || url.equals(RADIO_API_URL)) + return KIOSK_RADIO; + else if (url.equals(FEATURED_API_URL)) + return KIOSK_FEATURED; + else return null; } @Override public boolean onAcceptUrl(String url) { - return url.equals(FEATURED_API_URL); + return url.equals(FEATURED_API_URL) || (url.equals(RADIO_API_URL) || url.matches("https?://bandcamp\\.com/\\?show=\\d+")); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java index 0536594e1..80a297df8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java @@ -8,6 +8,8 @@ import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; /** * Tracks don't have standalone ids, they are always in combination with the band id. * That's why id = url. Instead, URLs are cleaned up so that they always look the same. + *

+ * Radio (bandcamp weekly) shows do have ids. */ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { @@ -17,7 +19,10 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { */ @Override public String getId(String url) throws ParsingException { - return getUrl(url); + if (url.matches("https?://bandcamp\\.com/\\?show=\\d+")) { + return url.split("bandcamp.com/\\?show=")[1]; + } else + return getUrl(url); } /** @@ -25,11 +30,13 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { * @see BandcampStreamLinkHandlerFactory */ @Override - public String getUrl(String url) { - if (url.endsWith("/")) - url = url.substring(0, url.length() - 1); - url = url.replace("http://", "https://").toLowerCase(); - return url; + public String getUrl(String input) { + if (input.matches("\\d+")) + return "https://bandcamp.com/?show=" + input; + if (input.endsWith("/")) + input = input.substring(0, input.length() - 1); + input = input.replace("http://", "https://").toLowerCase(); + return input; } /** @@ -42,6 +49,6 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { */ @Override public boolean onAcceptUrl(String url) { - return getUrl(url).matches("https?://.+\\..+/track/.+"); + return getUrl(url).matches("https?://.+\\..+/track/.+") || getUrl(url).matches("https?://bandcamp\\.com/\\?show=\\d+"); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.java index 258098d33..128841422 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.java @@ -31,7 +31,7 @@ public class BandcampFeaturedExtractorTest { } @Test - public void testKioskItems() throws ExtractionException, IOException { + public void testFeaturedCount() throws ExtractionException, IOException { List list = extractor.getInitialPage().getItems(); assertTrue(list.size() > 1); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedLinkHandlerFactoryTest.java new file mode 100644 index 000000000..3fd70369d --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedLinkHandlerFactoryTest.java @@ -0,0 +1,52 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory; + +import static org.junit.Assert.*; + +/** + * Tests for {@link BandcampFeaturedLinkHandlerFactory} + */ +public class BandcampFeaturedLinkHandlerFactoryTest { + + private static BandcampFeaturedLinkHandlerFactory linkHandler; + + @BeforeClass + public static void setUp() { + linkHandler = new BandcampFeaturedLinkHandlerFactory(); + } + + + @Test + public void testAcceptUrl() throws ParsingException { + // Tests expecting true + assertTrue(linkHandler.acceptUrl("https://bandcamp.com/?show=1")); + assertTrue(linkHandler.acceptUrl("http://bandcamp.com/?show=2")); + assertTrue(linkHandler.acceptUrl("https://bandcamp.com/api/mobile/24/bootstrap_data")); + assertTrue(linkHandler.acceptUrl("https://bandcamp.com/api/bcweekly/1/list")); + + // Tests expecting false + assertFalse(linkHandler.acceptUrl("https://bandcamp.com/?show=")); + assertFalse(linkHandler.acceptUrl("https://bandcamp.com/?show=a")); + assertFalse(linkHandler.acceptUrl("https://bandcamp.com/")); + } + + @Test + public void testGetUrl() throws ParsingException { + assertEquals("https://bandcamp.com/api/mobile/24/bootstrap_data", linkHandler.getUrl("Featured")); + assertEquals("https://bandcamp.com/api/bcweekly/1/list", linkHandler.getUrl("Radio")); + } + + @Test + public void testGetId() { + assertEquals("Featured", linkHandler.getId("https://bandcamp.com/api/mobile/24/bootstrap_data")); + assertEquals("Radio", linkHandler.getId("http://bandcamp.com/?show=1")); + assertEquals("Radio", linkHandler.getId("https://bandcamp.com/api/bcweekly/1/list")); + } + +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioExtractorTest.java new file mode 100644 index 000000000..4ec3f66a9 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioExtractorTest.java @@ -0,0 +1,40 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertTrue; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +/** + * Tests for {@link BandcampRadioExtractor} + */ +public class BandcampRadioExtractorTest { + + private static BandcampRadioExtractor extractor; + + @BeforeClass + public static void setUp() throws ExtractionException, IOException { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (BandcampRadioExtractor) bandcamp + .getKioskList() + .getExtractorById("Radio", null); + } + + @Test + public void testRadioCount() throws ExtractionException, IOException { + List list = bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); + System.out.println(list.size()); + assertTrue(list.size() > 300); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioStreamExtractorTest.java new file mode 100644 index 000000000..9c9350bc3 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampRadioStreamExtractorTest.java @@ -0,0 +1,37 @@ +package org.schabi.newpipe.extractor.services.bandcamp; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.extractor.Extractor; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioStreamExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; + +import java.io.IOException; + +import static org.junit.Assert.*; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +public class BandcampRadioStreamExtractorTest { + + @BeforeClass + public static void setUp() { + NewPipe.init(DownloaderTestImpl.getInstance()); + } + + @Test + public void testGettingCorrectStreamExtractor() throws ExtractionException { + assertTrue(bandcamp.getStreamExtractor("https://bandcamp.com/?show=3") instanceof BandcampRadioStreamExtractor); + assertFalse(bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/track/deflated") instanceof BandcampRadioStreamExtractor); + } + + @Test + public void testExtracting() throws ExtractionException, IOException { + BandcampRadioStreamExtractor e = (BandcampRadioStreamExtractor) bandcamp.getStreamExtractor("https://bandcamp.com/?show=230"); + e.fetchPage(); + assertEquals("Sound Movements", e.getName()); + assertEquals("Andrew Jervis", e.getUploaderName()); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java index ba4c26727..9cbd03295 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java @@ -30,6 +30,16 @@ public class BandcampStreamLinkHandlerFactoryTest { assertEquals("https://zachbenson.bandcamp.com/track/u-i-tonite", linkHandler.getUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/")); } + @Test + public void testGetRadioUrl() { + assertEquals("https://bandcamp.com/?show=1", linkHandler.getUrl("1")); + } + + @Test + public void testGetRadioId() throws ParsingException { + assertEquals("2", linkHandler.getId("https://bandcamp.com/?show=2")); + } + @Test public void testAcceptUrl() throws ParsingException { // Tests expecting false @@ -44,5 +54,6 @@ public class BandcampStreamLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); assertTrue(linkHandler.acceptUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/")); assertTrue(linkHandler.acceptUrl("https://interovgm.com/track/title")); + assertTrue(linkHandler.acceptUrl("http://bandcamP.com/?show=38")); } }