parent
13ef11e9c8
commit
808c8aa087
|
@ -21,8 +21,10 @@ import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO;
|
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.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 {
|
public class BandcampService extends StreamingService {
|
||||||
|
|
||||||
|
@ -79,15 +81,23 @@ public class BandcampService extends StreamingService {
|
||||||
public KioskList getKioskList() throws ExtractionException {
|
public KioskList getKioskList() throws ExtractionException {
|
||||||
|
|
||||||
KioskList kioskList = new KioskList(this);
|
KioskList kioskList = new KioskList(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
kioskList
|
kioskList.addKioskEntry(new KioskList.KioskExtractorFactory() {
|
||||||
.addKioskEntry(new KioskList.KioskExtractorFactory() {
|
|
||||||
@Override
|
@Override
|
||||||
public KioskExtractor createNewKiosk(StreamingService streamingService, String url, String kioskId) throws ExtractionException {
|
public KioskExtractor createNewKiosk(StreamingService streamingService, String url, String kioskId) throws ExtractionException {
|
||||||
return new BandcampFeaturedExtractor(BandcampService.this, new BandcampFeaturedLinkHandlerFactory().fromUrl(FEATURED_API_URL), kioskId);
|
return new BandcampFeaturedExtractor(BandcampService.this, new BandcampFeaturedLinkHandlerFactory().fromUrl(FEATURED_API_URL), kioskId);
|
||||||
}
|
}
|
||||||
}, new BandcampFeaturedLinkHandlerFactory(), KIOSK_FEATURED);
|
}, 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);
|
kioskList.setDefaultKiosk(KIOSK_FEATURED);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -109,6 +119,9 @@ public class BandcampService extends StreamingService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StreamExtractor getStreamExtractor(LinkHandler linkHandler) {
|
public StreamExtractor getStreamExtractor(LinkHandler linkHandler) {
|
||||||
|
if (linkHandler.getUrl().matches("https?://bandcamp\\.com/\\?show=\\d+"))
|
||||||
|
return new BandcampRadioStreamExtractor(this, linkHandler);
|
||||||
|
else
|
||||||
return new BandcampStreamExtractor(this, linkHandler);
|
return new BandcampStreamExtractor(this, linkHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,11 @@ import javax.annotation.Nonnull;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl;
|
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<InfoItem> {
|
public class BandcampFeaturedExtractor extends KioskExtractor<InfoItem> {
|
||||||
|
|
||||||
public static final String KIOSK_FEATURED = "Featured";
|
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) {
|
public BandcampFeaturedExtractor(StreamingService streamingService, ListLinkHandler listLinkHandler, String kioskId) {
|
||||||
super(streamingService, listLinkHandler, kioskId);
|
super(streamingService, listLinkHandler, kioskId);
|
||||||
|
@ -40,7 +40,7 @@ public class BandcampFeaturedExtractor extends KioskExtractor<InfoItem> {
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public String getName() throws ParsingException {
|
public String getName() throws ParsingException {
|
||||||
return null;
|
return KIOSK_FEATURED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
|
|
|
@ -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<InfoItem> {
|
||||||
|
|
||||||
|
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<InfoItem> 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<InfoItem>(c, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNextPageUrl() throws IOException, ExtractionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoItemsPage<InfoItem> getPage(String pageUrl) throws IOException, ExtractionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<AudioStream> getAudioStreams() {
|
||||||
|
ArrayList<AudioStream> 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,33 +2,35 @@
|
||||||
|
|
||||||
package org.schabi.newpipe.extractor.services.bandcamp.linkHandler;
|
package org.schabi.newpipe.extractor.services.bandcamp.linkHandler;
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
|
||||||
|
|
||||||
import java.util.List;
|
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.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 {
|
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
|
@Override
|
||||||
public String getUrl(String id, List<String> contentFilter, String sortFilter) {
|
public String getUrl(String id, List<String> 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;
|
else return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getId(String url) {
|
public String getId(String url) {
|
||||||
|
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;
|
return KIOSK_FEATURED;
|
||||||
|
else return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onAcceptUrl(String url) {
|
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+"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
* 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.
|
* That's why id = url. Instead, URLs are cleaned up so that they always look the same.
|
||||||
|
* <br/><br/>
|
||||||
|
* Radio (bandcamp weekly) shows do have ids.
|
||||||
*/
|
*/
|
||||||
public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory {
|
public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
|
|
||||||
|
@ -17,6 +19,9 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getId(String url) throws ParsingException {
|
public String getId(String url) throws ParsingException {
|
||||||
|
if (url.matches("https?://bandcamp\\.com/\\?show=\\d+")) {
|
||||||
|
return url.split("bandcamp.com/\\?show=")[1];
|
||||||
|
} else
|
||||||
return getUrl(url);
|
return getUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,11 +30,13 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
* @see BandcampStreamLinkHandlerFactory
|
* @see BandcampStreamLinkHandlerFactory
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getUrl(String url) {
|
public String getUrl(String input) {
|
||||||
if (url.endsWith("/"))
|
if (input.matches("\\d+"))
|
||||||
url = url.substring(0, url.length() - 1);
|
return "https://bandcamp.com/?show=" + input;
|
||||||
url = url.replace("http://", "https://").toLowerCase();
|
if (input.endsWith("/"))
|
||||||
return url;
|
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
|
@Override
|
||||||
public boolean onAcceptUrl(String url) {
|
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+");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class BandcampFeaturedExtractorTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testKioskItems() throws ExtractionException, IOException {
|
public void testFeaturedCount() throws ExtractionException, IOException {
|
||||||
List<InfoItem> list = extractor.getInitialPage().getItems();
|
List<InfoItem> list = extractor.getInitialPage().getItems();
|
||||||
assertTrue(list.size() > 1);
|
assertTrue(list.size() > 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<InfoItem> list = bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems();
|
||||||
|
System.out.println(list.size());
|
||||||
|
assertTrue(list.size() > 300);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -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/"));
|
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
|
@Test
|
||||||
public void testAcceptUrl() throws ParsingException {
|
public void testAcceptUrl() throws ParsingException {
|
||||||
// Tests expecting false
|
// Tests expecting false
|
||||||
|
@ -44,5 +54,6 @@ public class BandcampStreamLinkHandlerFactoryTest {
|
||||||
assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen"));
|
assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen"));
|
||||||
assertTrue(linkHandler.acceptUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/"));
|
assertTrue(linkHandler.acceptUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/"));
|
||||||
assertTrue(linkHandler.acceptUrl("https://interovgm.com/track/title"));
|
assertTrue(linkHandler.acceptUrl("https://interovgm.com/track/title"));
|
||||||
|
assertTrue(linkHandler.acceptUrl("http://bandcamP.com/?show=38"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue