From a579337c9a4d317f2c8f247201a57de11c9e196e Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 19:00:07 +0100 Subject: [PATCH 01/91] Bandcamp service with support for streams and searches --- extractor/build.gradle | 1 + .../schabi/newpipe/extractor/ServiceList.java | 5 +- .../services/bandcamp/BandcampService.java | 102 ++++++++ .../extractors/BandcampExtractorHelper.java | 83 +++++++ .../extractors/BandcampSearchExtractor.java | 123 ++++++++++ .../extractors/BandcampStreamExtractor.java | 224 ++++++++++++++++++ .../BandcampStreamInfoItemExtractor.java | 87 +++++++ .../BandcampChannelLinkHandlerFactory.java | 59 +++++ .../BandcampSearchQueryHandlerFactory.java | 30 +++ .../BandcampStreamLinkHandlerFactory.java | 47 ++++ ...BandcampChannelLinkHandlerFactoryTest.java | 40 ++++ .../bandcamp/BandcampSearchExtractorTest.java | 55 +++++ ...BandcampSearchQueryHandlerFactoryTest.java | 34 +++ .../bandcamp/BandcampStreamExtractorTest.java | 64 +++++ .../BandcampStreamLinkHandlerFactoryTest.java | 47 ++++ 15 files changed, 1000 insertions(+), 1 deletion(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java diff --git a/extractor/build.gradle b/extractor/build.gradle index 1b7fbf001..cc2f69dab 100644 --- a/extractor/build.gradle +++ b/extractor/build.gradle @@ -6,6 +6,7 @@ dependencies { implementation 'org.mozilla:rhino:1.7.7.1' implementation 'com.github.spotbugs:spotbugs-annotations:3.1.0' implementation 'org.nibor.autolink:autolink:0.8.0' + implementation 'org.json:json:20190722' testImplementation 'junit:junit:4.12' } \ No newline at end of file diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java b/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java index 6be1cea40..742d342df 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.schabi.newpipe.extractor.services.bandcamp.BandcampService; import org.schabi.newpipe.extractor.services.media_ccc.MediaCCCService; import org.schabi.newpipe.extractor.services.peertube.PeertubeService; import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudService; @@ -39,6 +40,7 @@ public final class ServiceList { public static final SoundcloudService SoundCloud; public static final MediaCCCService MediaCCC; public static final PeertubeService PeerTube; + public static final BandcampService bandcamp; /** * When creating a new service, put this service in the end of this list, @@ -49,7 +51,8 @@ public final class ServiceList { YouTube = new YoutubeService(0), SoundCloud = new SoundcloudService(1), MediaCCC = new MediaCCCService(2), - PeerTube = new PeertubeService(3) + PeerTube = new PeertubeService(3), + bandcamp = new BandcampService(4) )); /** 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 new file mode 100644 index 000000000..fd891365d --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java @@ -0,0 +1,102 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp; + +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; +import org.schabi.newpipe.extractor.comments.CommentsExtractor; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.kiosk.KioskList; +import org.schabi.newpipe.extractor.linkhandler.*; +import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; +import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor; +import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; + +import java.util.Collections; + +import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO; + +public class BandcampService extends StreamingService { + + public BandcampService(int id) { + super(id, "bandcamp", Collections.singletonList(AUDIO)); + } + + @Override + public String getBaseUrl() { + return "https://bandcamp.com"; + } + + @Override + public LinkHandlerFactory getStreamLHFactory() { + return new BandcampStreamLinkHandlerFactory(); + } + + @Override + public ListLinkHandlerFactory getChannelLHFactory() { + //return new BandcampChannelLinkHandlerFactory(); TODO + return null; + } + + @Override + public ListLinkHandlerFactory getPlaylistLHFactory() { + return null; + } + + @Override + public SearchQueryHandlerFactory getSearchQHFactory() { + return new BandcampSearchQueryHandlerFactory(); + } + + @Override + public ListLinkHandlerFactory getCommentsLHFactory() { + return null; + } + + @Override + public SearchExtractor getSearchExtractor(SearchQueryHandler queryHandler) { + return new BandcampSearchExtractor(this, queryHandler); + } + + @Override + public SuggestionExtractor getSuggestionExtractor() { + return null; + } + + @Override + public SubscriptionExtractor getSubscriptionExtractor() { + return null; + } + + @Override + public KioskList getKioskList() throws ExtractionException { + return null; + } + + @Override + public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler) throws ExtractionException { + return null; + } + + @Override + public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) throws ExtractionException { + return null; + } + + @Override + public StreamExtractor getStreamExtractor(LinkHandler linkHandler) throws ExtractionException { + return new BandcampStreamExtractor(this, linkHandler); + } + + @Override + public CommentsExtractor getCommentsExtractor(ListLinkHandler linkHandler) throws ExtractionException { + return null; + } +} 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 new file mode 100644 index 000000000..452c46934 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampExtractorHelper.java @@ -0,0 +1,83 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONException; +import org.json.JSONObject; +import org.schabi.newpipe.extractor.exceptions.ParsingException; + +import java.util.ArrayList; +import java.util.Arrays; + +public class BandcampExtractorHelper { + + /** + * Get JSON behind var $variable = out of web page + *
+ * Originally a part of bandcampDirect. + * + * @param html The HTML where the JSON we're looking for is stored inside a + * variable inside some JavaScript block + * @param variable Name of the variable + * @return The JsonObject stored in the variable with this name + */ + public static JSONObject getJSONFromJavaScriptVariables(String html, String variable) throws JSONException, ParsingException { + + String[] part = html.split("var " + variable + " = "); + + String firstHalfGone = part[1]; + + firstHalfGone = firstHalfGone.replaceAll("\" \\+ \"", ""); + + int position = -1; + int level = 0; + for (char character : firstHalfGone.toCharArray()) { + position++; + + switch (character) { + case '{': + level++; + continue; + case '}': + level--; + if (level == 0) { + return new JSONObject(firstHalfGone.substring(0, position + 1) + .replaceAll(" {4}//.+", "") // Remove comments in JSON + ); + } + } + } + + throw new ParsingException("Unexpected HTML: JSON never ends"); + } + + /** + * Concatenate all non-null and non-empty strings together while separating them using + * the comma parameter + */ + public static String smartConcatenate(String[] strings, String comma) { + StringBuilder result = new StringBuilder(); + + // Remove empty strings + ArrayList list = new ArrayList<>(Arrays.asList(strings)); + for (int i = list.size() - 1; i >= 0; i--) { + if (list.get(i) == null || list.get(i).isEmpty()) { + list.remove(i); + } + } + + // Append remaining strings to result + for (int i = 0; i < list.size(); i++) { + String string = list.get(i); + result.append(string); + + if (i != list.size() - 1) { + // This is not the last iteration yet + result.append(comma); + } + + } + + return String.valueOf(result); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java new file mode 100644 index 000000000..1b49ff70a --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -0,0 +1,123 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.schabi.newpipe.extractor.InfoItem; +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.linkhandler.SearchQueryHandler; +import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; +import org.schabi.newpipe.extractor.search.SearchExtractor; + +import javax.annotation.Nonnull; +import java.io.IOException; + +public class BandcampSearchExtractor extends SearchExtractor { + + public BandcampSearchExtractor(StreamingService service, SearchQueryHandler linkHandler) { + super(service, linkHandler); + } + + @Override + public String getSearchSuggestion() { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { + // okay apparently this is where we DOWNLOAD the page and then COMMIT its ENTRIES to an INFOITEMPAGE + String html = getDownloader().get(pageUrl).responseBody(); + + InfoItemsSearchCollector collector = getInfoItemSearchCollector(); + + + Document d = Jsoup.parse(html); + + Elements searchResultsElements = d.getElementsByClass("searchresult"); + + for (Element searchResult : + searchResultsElements) { + + Element resultInfo = searchResult.getElementsByClass("result-info").first(); + + String type = resultInfo + .getElementsByClass("itemtype").first().text(); + + String image = null; + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + image = img.attr("src"); + } + + String heading = resultInfo.getElementsByClass("heading").text(); + + String subhead = resultInfo.getElementsByClass("subhead").text(); + + String url = resultInfo.getElementsByClass("itemurl").text(); + + switch (type) { + default: + continue; + case "FAN": + //collector.commit Channel (?) with heading, url, image + break; + + case "ARTIST": + String id = resultInfo.getElementsByClass("itemurl").first() + .getElementsByTag("a").first() + .attr("href") // the link contains the id + .split("search_item_id=") + [1] // the number is behind its name + .split("&") // there is another attribute behind the name + [0]; // get the number + + //searchResults.add(new Artist(heading, Long.parseLong(id), image, subhead)); + //collector.commit Channel with heading, id, image, subhead + break; + + case "ALBUM": + String artist = subhead.split(" by")[0]; + //searchResults.add(new Album(heading, artist, url, image)); + //collector.commit Playlist with heading, artist, url, image + break; + + case "TRACK": + String album = subhead.split("from ")[0].split(" by")[0]; + + String[] splitBy = subhead.split(" by"); + String artist1 = null; + if (splitBy.length > 1) { + artist1 = subhead.split(" by")[1]; + } + collector.commit(new BandcampStreamInfoItemExtractor(heading, url, image, artist1, album)); + break; + } + + } + + + return new InfoItemsPage<>(getInfoItemSearchCollector(), null); + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws IOException, ExtractionException { + return getPage(getUrl());//new InfoItemsPage<>(getInfoItemSearchCollector(), null); + } + + @Override + public String getNextPageUrl() throws IOException, ExtractionException { + return null; + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + + } +} 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 new file mode 100644 index 000000000..0bb100c09 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamExtractor.java @@ -0,0 +1,224 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONException; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.schabi.newpipe.extractor.MediaFormat; +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.linkhandler.LinkHandler; +import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.stream.*; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.List; + +public class BandcampStreamExtractor extends StreamExtractor { + + private JSONObject albumJson; + private JSONObject current; + private Document document; + + public BandcampStreamExtractor(StreamingService service, LinkHandler linkHandler) { + super(service, linkHandler); + } + + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + String html = downloader.get(getLinkHandler().getUrl()).responseBody(); + document = Jsoup.parse(html); + albumJson = getAlbumInfoJson(html); + current = albumJson.getJSONObject("current"); + + if (albumJson.getJSONArray("trackinfo").length() > 1) { + // In this case, we are actually viewing an album page! + throw new ExtractionException("Page is actually an album, not a track"); + } + } + + /** + * Get the JSON that contains album's metadata from page + * + * @param html Website + * @return Album metadata JSON + * @throws ParsingException In case of a faulty website + */ + public static JSONObject getAlbumInfoJson(String html) throws ParsingException { + try { + return BandcampExtractorHelper.getJSONFromJavaScriptVariables(html, "TralbumData"); + } catch (JSONException e) { + throw new ParsingException("Faulty JSON", e); + } + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return current.getString("title"); + } + + @Nonnull + @Override + public String getUploaderUrl() throws ParsingException { + String[] parts = getUrl().split("/"); + // https: (/) (/) * .bandcamp.com (/) and leave out the rest + return "https://" + parts[2] + "/"; + } + + @Nonnull + @Override + public String getUrl() throws ParsingException { + return albumJson.getString("url").replace("http://", "https://"); + } + + @Nonnull + @Override + public String getUploaderName() throws ParsingException { + return albumJson.getString("artist"); + } + + @Nullable + @Override + public String getTextualUploadDate() throws ParsingException { + return current.getString("release_date"); + } + + @Nullable + @Override + public DateWrapper getUploadDate() { + return null; + } + + @Nonnull + @Override + public String getThumbnailUrl() throws ParsingException { + return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); + } + + @Nonnull + @Override + public String getUploaderAvatarUrl() { + return document.getElementsByClass("band-photo").first().attr("src"); + } + + @Nonnull + @Override + public String getDescription() { + return BandcampExtractorHelper.smartConcatenate( + new String[]{ + getStringOrNull(current, "about"), + getStringOrNull(current, "lyrics"), + getStringOrNull(current, "credits") + }, "\n\n" + ); + } + + /** + * Avoid exceptions like "JSONObject["about"] not a string." and instead just return null. + * This is for the case that the actual JSON has something like "about": null. + */ + private String getStringOrNull(JSONObject jsonObject, String value) { + try { + return jsonObject.getString(value); + } catch (JSONException e) { + return null; + } + } + + @Override + public int getAgeLimit() throws ParsingException { + return 0; + } + + @Override + public long getLength() throws ParsingException { + return 0; + } + + @Override + public long getTimeStamp() throws ParsingException { + return 0; + } + + @Override + public long getViewCount() throws ParsingException { + return -1; + } + + @Override + public long getLikeCount() throws ParsingException { + return -1; + } + + @Override + public long getDislikeCount() throws ParsingException { + return -1; + } + + @Nonnull + @Override + public String getDashMpdUrl() throws ParsingException { + return null; + } + + @Nonnull + @Override + public String getHlsUrl() throws ParsingException { + return null; + } + + @Override + public List getAudioStreams() throws IOException, ExtractionException { + return null; + } + + @Override + public List getVideoStreams() throws IOException, ExtractionException { + return null; + } + + @Override + public List getVideoOnlyStreams() throws IOException, ExtractionException { + return null; + } + + @Nonnull + @Override + public List getSubtitlesDefault() throws IOException, ExtractionException { + return null; + } + + @Nonnull + @Override + public List getSubtitles(MediaFormat format) throws IOException, ExtractionException { + return null; + } + + @Override + public StreamType getStreamType() throws ParsingException { + return null; + } + + @Override + public StreamInfoItem getNextStream() throws IOException, ExtractionException { + return null; + } + + @Override + public StreamInfoItemsCollector getRelatedStreams() throws IOException, ExtractionException { + return null; + } + + @Override + public String getErrorMessage() { + return null; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java new file mode 100644 index 000000000..d1d965797 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -0,0 +1,87 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +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; + +public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor { + + private String title; + private String url; + private String cover; + private String artist; + private String albumName; + + public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist, String albumName) { + this.title = title; + this.url = url; + this.cover = cover; + this.artist = artist; + this.albumName = albumName; + } + + @Override + public StreamType getStreamType() throws ParsingException { + return StreamType.AUDIO_STREAM; + } + + @Override + public long getDuration() throws ParsingException { + return -1; + } + + @Override + public long getViewCount() throws ParsingException { + return -1; + } + + @Override + public String getUploaderName() throws ParsingException { + return artist; + } + + @Override + public String getUploaderUrl() throws ParsingException { + return null; + } + + @Nullable + @Override + public String getTextualUploadDate() throws ParsingException { + return null; // TODO + } + + @Nullable + @Override + public DateWrapper getUploadDate() throws ParsingException { + return null; + } + + @Override + public String getName() throws ParsingException { + return title; + } + + @Override + public String getUrl() throws ParsingException { + return url; + } + + @Override + public String getThumbnailUrl() throws ParsingException { + return cover; + } + + /** + * There are no ads just like that, duh + */ + @Override + public boolean isAd() throws ParsingException { + return false; + } +} 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 new file mode 100644 index 000000000..24f19f761 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampChannelLinkHandlerFactory.java @@ -0,0 +1,59 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; + +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.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 java.io.IOException; +import java.util.List; + +/** + * Artist do have IDs that are useful + */ +public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { + + + @Override + public String getId(String url) throws ParsingException { + try { + String response = NewPipe.getDownloader().get(url).responseBody(); + return BandcampStreamExtractor.getAlbumInfoJson(response) + .getString("band_id"); + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("Download failed", e); + } + } + + @Override + public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { + return null; // TODO + } + + /** + * Matches * .bandcamp.com as well as custom domains + * 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/"); + + // Is a subdomain of bandcamp.com? + boolean isBandcampComSubdomain = url.matches("https?://.+\\.bandcamp\\.com"); + + // Is root of bandcamp.com subdomain? + boolean isBandcampComArtistPage = endsWithBandcampCom && isBandcampComSubdomain; + + boolean isCustomDomainReleases = url.matches("https?://.+\\..+/releases/?(?!.)"); + + return isBandcampComArtistPage || isCustomDomainReleases; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java new file mode 100644 index 000000000..3f23956fe --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java @@ -0,0 +1,30 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.List; + +public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory { + + private static final String SEARCH_URL = "https://bandcamp.com/search?q="; + + public static final String CHARSET_UTF_8 = "UTF-8"; + + + @Override + public String getUrl(String query, List contentFilter, String sortFilter) throws ParsingException { + try { + + return SEARCH_URL + + URLEncoder.encode(query, CHARSET_UTF_8); + + } catch (UnsupportedEncodingException e) { + throw new ParsingException("query \"" + query + "\" could not be encoded", e); + } + } +} 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 new file mode 100644 index 000000000..e534f925f --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampStreamLinkHandlerFactory.java @@ -0,0 +1,47 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; + +/** + * Tracks do have IDs, but they are not really useful. That's why id = url. + * Instead, URLs are cleaned up so that they always look the same. + */ +public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { + + + /** + * @see BandcampStreamLinkHandlerFactory + */ + @Override + public String getId(String url) throws ParsingException { + return getUrl(url); + } + + /** + * Clean up url + * @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; + } + + /** + * Sometimes, the root page of an artist is also an album or track + * page. In that case, it is assumed that one actually wants to open + * the profile and not the track it has set as the default one. + *

Urls are expected to be in this format to account for + * custom domains: + *
https:// * . * /track/ * + */ + @Override + public boolean onAcceptUrl(String url) { + return getUrl(url).matches("https?://.+\\..+/track/.+"); + } +} 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 new file mode 100644 index 000000000..d8c7497d7 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelLinkHandlerFactoryTest.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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; + +/** + * Test for {@link BandcampChannelLinkHandlerFactory} + */ +public class BandcampChannelLinkHandlerFactoryTest { + private static BandcampChannelLinkHandlerFactory linkHandler; + + @BeforeClass + public static void setUp() { + linkHandler = new BandcampChannelLinkHandlerFactory(); + NewPipe.init(DownloaderTestImpl.getInstance()); + } + + @Test + public void testAcceptUrl() throws ParsingException { + // Tests expecting true + assertTrue(linkHandler.acceptUrl("http://interovgm.com/releases/")); + assertTrue(linkHandler.acceptUrl("https://interovgm.com/releases")); + assertTrue(linkHandler.acceptUrl("http://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/")); + } + +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java new file mode 100644 index 000000000..11ce3d0d3 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -0,0 +1,55 @@ +// 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.ListExtractor; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +/** + * Test for {@link BandcampSearchExtractor} + */ +public class BandcampSearchExtractorTest { + + private static BandcampSearchExtractor extractor; + + @BeforeClass + public static void setUp() { + NewPipe.init(DownloaderTestImpl.getInstance()); + + } + + /** + * Tests whether searching bandcamp for "best friend's basement" returns + * the accordingly named song by Zach Benson + */ + @Test + public void testBestFriendsBasement() throws ExtractionException, IOException { + extractor = (BandcampSearchExtractor) bandcamp + .getSearchExtractor("best friend's basement"); + + ListExtractor.InfoItemsPage page = extractor.getInitialPage(); + InfoItem bestFriendsBasement = page.getItems().get(0); + + // The track by Zach Benson should be the first result, no? + assertEquals("Best Friend's Basement", bestFriendsBasement.getName()); + assertTrue(bestFriendsBasement.getThumbnailUrl().endsWith(".jpg")); + assertTrue(bestFriendsBasement.getThumbnailUrl().contains("f4.bcbits.com/img/")); + assertEquals(InfoItem.InfoType.STREAM, bestFriendsBasement.getInfoType()); + + + + + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java new file mode 100644 index 000000000..1a8fdac5b --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java @@ -0,0 +1,34 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; + +import static org.junit.Assert.assertEquals; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +public class BandcampSearchQueryHandlerFactoryTest { + + static BandcampSearchQueryHandlerFactory searchQuery; + + @BeforeClass + public static void setUp() { + NewPipe.init(DownloaderTestImpl.getInstance()); + + searchQuery = (BandcampSearchQueryHandlerFactory) bandcamp + .getSearchQHFactory(); + } + + @Test + public void testEncoding() throws ParsingException { + // Note: this isn't exactly as bandcamp does it (it wouldn't encode '!'), but both works + assertEquals("https://bandcamp.com/search?q=hello%21%22%C2%A7%24%25%26%2F%28%29%3D", searchQuery.getUrl("hello!\"ยง$%&/()=")); + // Note: bandcamp uses %20 instead of '+', but both works + assertEquals("https://bandcamp.com/search?q=search+query+with+spaces", searchQuery.getUrl("search query with spaces")); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java new file mode 100644 index 000000000..f64e5b555 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -0,0 +1,64 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +public class BandcampStreamExtractorTest { + + private static BandcampStreamExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (BandcampStreamExtractor) bandcamp + .getStreamExtractor("https://zachbenson.bandcamp.com/track/kitchen"); + extractor.fetchPage(); + } + + @Test(expected = ExtractionException.class) + public void testAlbum() throws ExtractionException { + bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/album/prom"); + } + + @Test + public void testServiceId() { + } + + @Test + public void testName() throws ParsingException { + assertEquals("kitchen", extractor.getName()); + } + + @Test + public void testUrl() throws ParsingException { + assertEquals("https://zachbenson.bandcamp.com/track/kitchen", extractor.getUrl()); + } + + @Test + public void testArtistUrl() throws ParsingException { + assertEquals("https://zachbenson.bandcamp.com/", extractor.getUploaderUrl()); + } + + @Test + public void testDescription() { + assertEquals(831, extractor.getDescription().length()); + } + + @Test + public void testArtistProfilePicture() { + String url = extractor.getUploaderAvatarUrl(); + assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); + } + +} 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 new file mode 100644 index 000000000..0eb760776 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java @@ -0,0 +1,47 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; + +/** + * Test for {@link BandcampStreamLinkHandlerFactory} + */ +public class BandcampStreamLinkHandlerFactoryTest { + + private static BandcampStreamLinkHandlerFactory linkHandler; + + @BeforeClass + public static void setUp() { + linkHandler = new BandcampStreamLinkHandlerFactory(); + NewPipe.init(DownloaderTestImpl.getInstance()); + } + + @Test + public void testUrlCleanup() { + assertEquals("https://zachbenson.bandcamp.com/track/u-i-tonite", linkHandler.getUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/")); + } + + @Test + public void testAcceptUrl() throws ParsingException { + // Tests expecting false + assertFalse(linkHandler.acceptUrl("http://interovgm.com/releases/")); + assertFalse(linkHandler.acceptUrl("https://interovgm.com/releases")); + assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); + assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); + assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); + + // Tests expecting true + 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")); + } +} From 43dc3c3d4c44de432ed0adb1483f284bd1055449 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 19:20:06 +0100 Subject: [PATCH 02/91] Return empty kiosk list instead of null --- .../newpipe/extractor/services/bandcamp/BandcampService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fd891365d..7cf03009f 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 @@ -77,7 +77,7 @@ public class BandcampService extends StreamingService { @Override public KioskList getKioskList() throws ExtractionException { - return null; + return new KioskList(this); } @Override From 80d67e22b7185596968e907b942b1f0f5acbc502 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 19:31:46 +0100 Subject: [PATCH 03/91] Return mp3-128 audio stream [experimental] --- .../bandcamp/extractors/BandcampStreamExtractor.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 0bb100c09..8ab4f8ce7 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 @@ -18,6 +18,7 @@ import org.schabi.newpipe.extractor.stream.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; +import java.util.ArrayList; import java.util.List; public class BandcampStreamExtractor extends StreamExtractor { @@ -177,7 +178,14 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public List getAudioStreams() throws IOException, ExtractionException { - return null; + List audioStreams = new ArrayList<>(); + + audioStreams.add(new AudioStream( + albumJson.getJSONArray("trackinfo").getJSONObject(0) + .getJSONArray("file").getJSONObject(0).getString("mp3-128"), + MediaFormat.MP3, 128 + )); + return audioStreams; } @Override @@ -204,7 +212,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public StreamType getStreamType() throws ParsingException { - return null; + return StreamType.AUDIO_STREAM; } @Override From c3d127ccd934c2cd6e8baedd9bce08e200aabe2e Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 21:47:06 +0100 Subject: [PATCH 04/91] Bandcamp audio stream test and fix --- .../bandcamp/extractors/BandcampStreamExtractor.java | 12 ++++++------ .../bandcamp/BandcampStreamExtractorTest.java | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) 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 8ab4f8ce7..0c872c92f 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 @@ -177,36 +177,36 @@ public class BandcampStreamExtractor extends StreamExtractor { } @Override - public List getAudioStreams() throws IOException, ExtractionException { + public List getAudioStreams() { List audioStreams = new ArrayList<>(); audioStreams.add(new AudioStream( albumJson.getJSONArray("trackinfo").getJSONObject(0) - .getJSONArray("file").getJSONObject(0).getString("mp3-128"), + .getJSONObject("file").getString("mp3-128"), MediaFormat.MP3, 128 )); return audioStreams; } @Override - public List getVideoStreams() throws IOException, ExtractionException { + public List getVideoStreams() { return null; } @Override - public List getVideoOnlyStreams() throws IOException, ExtractionException { + public List getVideoOnlyStreams() { return null; } @Nonnull @Override - public List getSubtitlesDefault() throws IOException, ExtractionException { + public List getSubtitlesDefault() { return null; } @Nonnull @Override - public List getSubtitles(MediaFormat format) throws IOException, ExtractionException { + public List getSubtitles(MediaFormat format) { return null; } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index f64e5b555..bcd925fcf 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -61,4 +61,10 @@ public class BandcampStreamExtractorTest { assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); } + @Test + public void testAudioStream() { + assertTrue(extractor.getAudioStreams().get(0).getUrl().contains("bcbits.com/stream")); + assertEquals(1, extractor.getAudioStreams().size()); + } + } From 5281456899db32ffff9362202a72bad430d1f70c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 21 Dec 2019 23:14:23 +0100 Subject: [PATCH 05/91] 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")); } } From a42c77425dfc5165a75546a1b9822789d3623de2 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 00:42:26 +0100 Subject: [PATCH 06/91] Bandcamp channel extractor (ignoring everything but tracks) --- .../services/bandcamp/BandcampService.java | 3 +- .../extractors/BandcampChannelExtractor.java | 155 ++++++++++++++++++ .../extractors/BandcampExtractorHelper.java | 25 ++- .../extractors/BandcampSearchExtractor.java | 4 +- .../extractors/BandcampStreamExtractor.java | 2 + .../BandcampStreamInfoItemExtractor.java | 4 +- .../BandcampChannelLinkHandlerFactory.java | 28 +--- .../BandcampStreamLinkHandlerFactory.java | 4 +- .../BandcampChannelExtractorTest.java | 42 +++++ ...BandcampChannelLinkHandlerFactoryTest.java | 10 ++ .../bandcamp/BandcampStreamExtractorTest.java | 5 + 11 files changed, 252 insertions(+), 30 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.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 86e1f7dad..4752e1f09 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 @@ -10,6 +10,7 @@ import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; @@ -81,7 +82,7 @@ public class BandcampService extends StreamingService { @Override public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler) throws ExtractionException { - return null; + return new BandcampChannelExtractor(this, linkHandler); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java new file mode 100644 index 000000000..bb39ca1d0 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -0,0 +1,155 @@ +// 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.jsoup.nodes.Document; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; +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.ListLinkHandler; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; + +import javax.annotation.Nonnull; +import java.io.IOException; + +public class BandcampChannelExtractor extends ChannelExtractor { + + private JSONObject channelInfo; + + public BandcampChannelExtractor(StreamingService service, ListLinkHandler linkHandler) throws ParsingException { + super(service, linkHandler); + + channelInfo = getArtistDetails(getId()); + } + + /** + * Fetch artist details from mobile endpoint. + * + * I once took a moment to note down how it works. + */ + public static JSONObject getArtistDetails(String id) throws ParsingException { + try { + return + new JSONObject( + NewPipe.getDownloader().post( + "https://bandcamp.com/api/mobile/22/band_details", + null, + ("{\"band_id\":\"" + id + "\"}").getBytes() + ).responseBody() + ); + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("Could not download band details", e); + } + } + + /** + * @param id The image ID + * @param album Whether this is the cover of an album + * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 + * but we don't want something as large as 3460x3460 here, do we?) + */ + public static String getImageUrl(long id, boolean album) { + return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; + } + + @Override + public String getAvatarUrl() { + return getImageUrl(channelInfo.getLong("bio_image_id"), false); + } + + /** + * Why does the mobile endpoint not contain the header?? Or at least not the same one? + * Anyway we're back to querying websites + */ + @Override + public String getBannerUrl() throws ParsingException { + try { + String html = getDownloader().get(channelInfo.getString("bandcamp_url")) + .responseBody(); + + return new Document(html).getElementById("customHeader") + .getElementsByTag("img") + .attr("src"); + + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("Could not download artist web site", e); + } + } + + /** + * I had to learn bandcamp stopped providing RSS feeds when appending /feed to any URL + * because too few people used it. Bummer! + */ + @Override + public String getFeedUrl() { + return null; + } + + @Override + public long getSubscriberCount() { + return -1; + } + + @Override + public String getDescription() { + return channelInfo.getString("bio"); + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws ParsingException { + + StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + + JSONArray discography = channelInfo.getJSONArray("discography"); + + for (int i = 0; i < discography.length(); i++) { + // I define discograph as an item that can appear in a discography + JSONObject discograph = discography.getJSONObject(i); + + if (!discograph.getString("item_type").equals("track")) continue; + + collector.commit(new BandcampStreamInfoItemExtractor( + discograph.getString("title"), + BandcampExtractorHelper.getStreamUrlFromIds( + discograph.getLong("band_id"), + discograph.getLong("item_id"), + discograph.getString("item_type") + ), + getImageUrl( + discograph.getLong("art_id"), true + ), + discograph.getString("band_name") + )); + } + + return new InfoItemsPage<>(collector, null); + } + + @Override + public String getNextPageUrl() { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) { + return null; + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + } + + @Nonnull + @Override + public String getName() { + return channelInfo.getString("name"); + } +} 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 98ad88923..b1668641c 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 @@ -4,8 +4,11 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import org.json.JSONException; 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 java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -21,7 +24,7 @@ public class BandcampExtractorHelper { * @param variable Name of the variable * @return The JsonObject stored in the variable with this name */ - public static JSONObject getJSONFromJavaScriptVariables(String html, String variable) throws JSONException, ParsingException { + public static JSONObject getJSONFromJavaScriptVariables(String html, String variable) throws JSONException, ArrayIndexOutOfBoundsException, ParsingException { String[] part = html.split("var " + variable + " = "); @@ -52,6 +55,26 @@ public class BandcampExtractorHelper { throw new ParsingException("Unexpected HTML: JSON never ends"); } + /** + * Translate all these parameters together to the URL of the corresponding album or track + * using the mobile api + */ + public static String getStreamUrlFromIds(long bandId, long itemId, String itemType) throws ParsingException { + + try { + String html = NewPipe.getDownloader().get( + "https://bandcamp.com/api/mobile/22/tralbum_details?band_id=" + bandId + + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.substring(0, 1)) + .responseBody(); + + return new JSONObject(html).getString("bandcamp_url").replace("http://", "https://"); + + } catch (JSONException | ReCaptchaException | IOException e) { + throw new ParsingException("Ids could not be translated to URL", e); + } + + } + /** * Concatenate all non-null and non-empty strings together while separating them using * the comma parameter diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 1b49ff70a..34f52af1e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -88,14 +88,12 @@ public class BandcampSearchExtractor extends SearchExtractor { break; case "TRACK": - String album = subhead.split("from ")[0].split(" by")[0]; - String[] splitBy = subhead.split(" by"); String artist1 = null; if (splitBy.length > 1) { artist1 = subhead.split(" by")[1]; } - collector.commit(new BandcampStreamInfoItemExtractor(heading, url, image, artist1, album)); + collector.commit(new BandcampStreamInfoItemExtractor(heading, url, image, artist1)); break; } 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 d9253b600..a8fa30004 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 @@ -57,6 +57,8 @@ public class BandcampStreamExtractor extends StreamExtractor { return BandcampExtractorHelper.getJSONFromJavaScriptVariables(html, "TralbumData"); } catch (JSONException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); + } catch (ArrayIndexOutOfBoundsException e) { + throw new ParsingException("JSON does not exist", e); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java index d1d965797..6cb96411e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -15,14 +15,12 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor private String url; private String cover; private String artist; - private String albumName; - public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist, String albumName) { + public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist) { this.title = title; this.url = url; this.cover = cover; this.artist = artist; - this.albumName = albumName; } @Override 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 e4521ffb0..0d57eac01 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,15 +2,14 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; +import org.json.JSONException; 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.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; 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; @@ -31,35 +30,24 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { return String.valueOf(bandData.getLong("id")); - } catch (IOException | ReCaptchaException e) { + } catch (IOException | ReCaptchaException | ArrayIndexOutOfBoundsException 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 + * Uses the mobile endpoint as a "translator" from id to url */ @Override public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { try { - String data = NewPipe.getDownloader().post( - "https://bandcamp.com/api/mobile/22/band_details", - null, - ("{\"band_id\":\"" + id + "\"}").getBytes() - ).responseBody(); - - return new JSONObject(data) + return BandcampChannelExtractor.getArtistDetails(id) .getString("bandcamp_url") .replace("http://", "https://"); - - - } catch (IOException | ReCaptchaException e) { - throw new ParsingException("Download failed", e); + } catch (JSONException e) { + throw new ParsingException("JSON does not contain URL (invalid id?) or is otherwise invalid", e); } + } /** 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 e534f925f..0536594e1 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 @@ -6,8 +6,8 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; /** - * Tracks do have IDs, but they are not really useful. That's why id = url. - * Instead, URLs are cleaned up so that they always look the same. + * 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. */ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java new file mode 100644 index 000000000..b39ae4f2f --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -0,0 +1,42 @@ +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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +public class BandcampChannelExtractorTest { + + private static BandcampChannelExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (BandcampChannelExtractor) bandcamp + .getChannelExtractor("https://zachbenson.bandcamp.com/"); + } + + @Test + public void testImageUrl() { + assertEquals("https://f4.bcbits.com/img/a2405652335_10.jpg", BandcampChannelExtractor.getImageUrl(2405652335L, true)); + assertEquals("https://f4.bcbits.com/img/17433693_10.jpg", BandcampChannelExtractor.getImageUrl(17433693L, false)); + } + + @Test + public void testTranslateIdsToUrl() throws ParsingException { + assertEquals("https://zachbenson.bandcamp.com/album/covers", BandcampExtractorHelper.getStreamUrlFromIds(2862267535L, 2063639444L, "album")); + // TODO write more test cases + } + + @Test + public void testLength() throws ParsingException { + assertTrue(extractor.getInitialPage().getItems().size() > 2); + } +} 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 7e46a096b..191f096c0 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 @@ -51,4 +51,14 @@ public class BandcampChannelLinkHandlerFactoryTest { assertEquals("https://infiniteammo.bandcamp.com", linkHandler.getUrl("3321800855")); } + @Test(expected = ParsingException.class) + public void testGetUrlWithInvalidId() throws ParsingException { + linkHandler.getUrl("0"); + } + + @Test(expected = ParsingException.class) + public void testGetIdWithInvalidUrl() throws ParsingException { + linkHandler.getId("https://bandcamp.com"); + } + } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index bcd925fcf..49b7c6f15 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -67,4 +67,9 @@ public class BandcampStreamExtractorTest { assertEquals(1, extractor.getAudioStreams().size()); } + @Test(expected = ParsingException.class) + public void testInvalidUrl() throws ExtractionException { + bandcamp.getStreamExtractor("https://bandcamp.com"); + } + } From 7730eb2ea13011b275296d24469623709c08f1f8 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 00:46:31 +0100 Subject: [PATCH 07/91] Bandcamp channel extractor: enforce https when getting banner url --- .../services/bandcamp/extractors/BandcampChannelExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index bb39ca1d0..1c6de58bb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -71,7 +71,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public String getBannerUrl() throws ParsingException { try { - String html = getDownloader().get(channelInfo.getString("bandcamp_url")) + String html = getDownloader().get(channelInfo.getString("bandcamp_url").replace("http://", "https://")) .responseBody(); return new Document(html).getElementById("customHeader") From d5cdc20be16e966fe3f3b5c60f26499bca046be3 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 01:05:34 +0100 Subject: [PATCH 08/91] Bandcmap channel extractor: fix getting banner url --- .../bandcamp/extractors/BandcampChannelExtractor.java | 6 ++++-- .../services/bandcamp/BandcampChannelExtractorTest.java | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 1c6de58bb..21289801d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import org.json.JSONArray; import org.json.JSONObject; -import org.jsoup.nodes.Document; +import org.jsoup.Jsoup; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; @@ -74,8 +74,10 @@ public class BandcampChannelExtractor extends ChannelExtractor { String html = getDownloader().get(channelInfo.getString("bandcamp_url").replace("http://", "https://")) .responseBody(); - return new Document(html).getElementById("customHeader") + return Jsoup.parse(html) + .getElementById("customHeader") .getElementsByTag("img") + .first() .attr("src"); } catch (IOException | ReCaptchaException e) { diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index b39ae4f2f..99a06d209 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -39,4 +39,10 @@ public class BandcampChannelExtractorTest { public void testLength() throws ParsingException { assertTrue(extractor.getInitialPage().getItems().size() > 2); } + + @Test + public void testGetBannerUrl() throws ParsingException { + // Why is this picture in png format when all other pictures are jpg? + assertTrue(extractor.getBannerUrl().endsWith(".png")); + } } From 91c0ec7ceabf643f67234c23d4a70b76f9e6ed82 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 01:14:35 +0100 Subject: [PATCH 09/91] Bandcamp stream extractor: catch NullPointerException --- .../bandcamp/extractors/BandcampStreamExtractor.java | 6 +++++- .../services/bandcamp/BandcampStreamExtractorTest.java | 5 +++++ .../bandcamp/BandcampStreamLinkHandlerFactoryTest.java | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) 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 a8fa30004..be4c03729 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 @@ -109,7 +109,11 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getUploaderAvatarUrl() { - return document.getElementsByClass("band-photo").first().attr("src"); + try { + return document.getElementsByClass("band-photo").first().attr("src"); + } catch (NullPointerException e) { + return ""; + } } @Nonnull diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 49b7c6f15..2f7a03bff 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -61,6 +61,11 @@ public class BandcampStreamExtractorTest { assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); } + @Test + public void testNoArtistProfilePicture() throws ExtractionException { + assertEquals("", bandcamp.getStreamExtractor("https://powertothequeerkids.bandcamp.com/track/human-nature").getUploaderAvatarUrl()); + } + @Test public void testAudioStream() { assertTrue(extractor.getAudioStreams().get(0).getUrl().contains("bcbits.com/stream")); 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 0eb760776..ba4c26727 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 @@ -38,6 +38,7 @@ public class BandcampStreamLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); + assertFalse(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); // Tests expecting true assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); From 794ca5eeaea99e3152278e562de5bca5851611c0 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 01:38:48 +0100 Subject: [PATCH 10/91] Bandcamp channel extractor: handel nonexistent images better --- .../bandcamp/extractors/BandcampChannelExtractor.java | 11 ++++++++++- .../bandcamp/extractors/BandcampExtractorHelper.java | 2 +- .../bandcamp/BandcampChannelExtractorTest.java | 11 +++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 21289801d..3f39603e6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; import org.schabi.newpipe.extractor.NewPipe; @@ -61,7 +62,12 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public String getAvatarUrl() { - return getImageUrl(channelInfo.getLong("bio_image_id"), false); + try { + return getImageUrl(channelInfo.getLong("bio_image_id"), false); + } catch (JSONException e) { + // In this case, the id is null and no image is available + return ""; + } } /** @@ -82,6 +88,9 @@ public class BandcampChannelExtractor extends ChannelExtractor { } catch (IOException | ReCaptchaException e) { throw new ParsingException("Could not download artist web site", e); + } catch (NullPointerException e) { + // No banner available + return ""; } } 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 b1668641c..b86504c62 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 @@ -85,7 +85,7 @@ public class BandcampExtractorHelper { // Remove empty strings ArrayList list = new ArrayList<>(Arrays.asList(strings)); for (int i = list.size() - 1; i >= 0; i--) { - if (list.get(i) == null || list.get(i).isEmpty()) { + if (list.get(i) == null || list.get(i).isEmpty() || list.get(i).equals("null")) { list.remove(i); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 99a06d209..d924b4fb2 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -4,6 +4,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.schabi.newpipe.DownloaderTestImpl; 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.services.bandcamp.extractors.BandcampChannelExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; @@ -45,4 +46,14 @@ public class BandcampChannelExtractorTest { // Why is this picture in png format when all other pictures are jpg? assertTrue(extractor.getBannerUrl().endsWith(".png")); } + + @Test + public void testGetNoAvatar() throws ExtractionException { + assertEquals("", bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getAvatarUrl()); + } + + @Test + public void testGetNoBanner() throws ExtractionException { + assertEquals("", bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getBannerUrl()); + } } From d05b14ae48e3c82e8cbe671d5a7cd7133f4c9fd4 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 01:55:04 +0100 Subject: [PATCH 11/91] Add channels (artists) to search results --- .../BandcampChannelInfoItemExtractor.java | 46 +++++++++++++++++++ .../extractors/BandcampSearchExtractor.java | 11 +---- .../bandcamp/BandcampSearchExtractorTest.java | 21 +++++++-- 3 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java new file mode 100644 index 000000000..b5d851eab --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -0,0 +1,46 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor; +import org.schabi.newpipe.extractor.exceptions.ParsingException; + +public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtractor { + + private String name, url, image, location; + + public BandcampChannelInfoItemExtractor(String name, String url, String image, String location) { + this.name = name; + this.url = url; + this.image = image; + this.location = location; + } + + @Override + public String getName() throws ParsingException { + return name; + } + + @Override + public String getUrl() throws ParsingException { + return url; + } + + @Override + public String getThumbnailUrl() throws ParsingException { + return image; + } + + @Override + public String getDescription() { + return location; + } + + @Override + public long getSubscriberCount() { + return -1; + } + + @Override + public long getStreamCount() { + return -1; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 34f52af1e..fc89002fc 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -69,16 +69,7 @@ public class BandcampSearchExtractor extends SearchExtractor { break; case "ARTIST": - String id = resultInfo.getElementsByClass("itemurl").first() - .getElementsByTag("a").first() - .attr("href") // the link contains the id - .split("search_item_id=") - [1] // the number is behind its name - .split("&") // there is another attribute behind the name - [0]; // get the number - - //searchResults.add(new Artist(heading, Long.parseLong(id), image, subhead)); - //collector.commit Channel with heading, id, image, subhead + collector.commit(new BandcampChannelInfoItemExtractor(heading, url, image, subhead)); break; case "ALBUM": diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 11ce3d0d3..5780e1612 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -5,10 +5,13 @@ 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.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; import java.io.IOException; @@ -36,8 +39,7 @@ public class BandcampSearchExtractorTest { */ @Test public void testBestFriendsBasement() throws ExtractionException, IOException { - extractor = (BandcampSearchExtractor) bandcamp - .getSearchExtractor("best friend's basement"); + SearchExtractor extractor = bandcamp.getSearchExtractor("best friend's basement"); ListExtractor.InfoItemsPage page = extractor.getInitialPage(); InfoItem bestFriendsBasement = page.getItems().get(0); @@ -47,9 +49,22 @@ public class BandcampSearchExtractorTest { assertTrue(bestFriendsBasement.getThumbnailUrl().endsWith(".jpg")); assertTrue(bestFriendsBasement.getThumbnailUrl().contains("f4.bcbits.com/img/")); assertEquals(InfoItem.InfoType.STREAM, bestFriendsBasement.getInfoType()); + } + /** + * Tests whether searching bandcamp for "C418" returns the artist's profile + */ + @Test + public void testC418() throws ExtractionException, IOException { + SearchExtractor extractor = bandcamp.getSearchExtractor("C418"); + InfoItem c418 = extractor.getInitialPage() + .getItems().get(0); - + // C418's artist profile should be the first result, no? + assertEquals("C418", c418.getName()); + assertTrue(c418.getThumbnailUrl().endsWith(".jpg")); + assertTrue(c418.getThumbnailUrl().contains("f4.bcbits.com/img/")); + assertEquals("https://c418.bandcamp.com", c418.getUrl()); } } From ba700bfb3e05752ea2e55ed57ce6973d0258a0e7 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 02:55:54 +0100 Subject: [PATCH 12/91] Add bandcamp playlists (albums) --- .../services/bandcamp/BandcampService.java | 6 +- .../BandcampChannelInfoItemExtractor.java | 2 + .../extractors/BandcampPlaylistExtractor.java | 133 ++++++++++++++++++ .../BandcampPlaylistInfoItemExtractor.java | 40 ++++++ .../extractors/BandcampSearchExtractor.java | 3 +- .../extractors/BandcampStreamExtractor.java | 10 +- .../BandcampStreamInfoItemExtractor.java | 28 ++-- .../BandcampPlaylistLinkHandlerFactory.java | 31 ++++ .../BandcampChannelExtractorTest.java | 2 + .../BandcampPlaylistExtractorTest.java | 29 ++++ ...andcampPlaylistLinkHandlerFactoryTest.java | 45 ++++++ .../bandcamp/BandcampSearchExtractorTest.java | 21 ++- 12 files changed, 330 insertions(+), 20 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.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 4752e1f09..211f7310f 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 @@ -11,9 +11,11 @@ import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampPlaylistLinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; import org.schabi.newpipe.extractor.stream.StreamExtractor; @@ -47,7 +49,7 @@ public class BandcampService extends StreamingService { @Override public ListLinkHandlerFactory getPlaylistLHFactory() { - return null; + return new BandcampPlaylistLinkHandlerFactory(); } @Override @@ -87,7 +89,7 @@ public class BandcampService extends StreamingService { @Override public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) throws ExtractionException { - return null; + return new BandcampPlaylistExtractor(this, linkHandler); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java index b5d851eab..33d999117 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -1,3 +1,5 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + package org.schabi.newpipe.extractor.services.bandcamp.extractors; import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java new file mode 100644 index 000000000..ac5e8998d --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -0,0 +1,133 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +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.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; + +import javax.annotation.Nonnull; +import java.io.IOException; + +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getJSONFromJavaScriptVariables; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor.getAlbumInfoJson; + +public class BandcampPlaylistExtractor extends PlaylistExtractor { + + private Document document; + private JSONObject albumJson; + private JSONArray trackInfo; + private String name; + + public BandcampPlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) { + super(service, linkHandler); + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + String html = downloader.get(getLinkHandler().getUrl()).responseBody(); + document = Jsoup.parse(html); + albumJson = getAlbumInfoJson(html); + trackInfo = albumJson.getJSONArray("trackinfo"); + + try { + name = getJSONFromJavaScriptVariables(html, "EmbedData").getString("album_title"); + } catch (JSONException e) { + throw new ParsingException("Faulty JSON; page likely does not contain album data", e); + } catch (ArrayIndexOutOfBoundsException e) { + throw new ParsingException("JSON does not exist", e); + } + + + + if (trackInfo.length() <= 1) { + // In this case, we are actually viewing a track page! + throw new ExtractionException("Page is actually a track, not an album"); + } + } + + @Override + public String getThumbnailUrl() throws ParsingException { + try { + return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); + } catch (NullPointerException e) { + return ""; + } + } + + @Override + public String getBannerUrl() { + return ""; + } + + @Override + public String getUploaderUrl() throws ParsingException { + String[] parts = getUrl().split("/"); + // https: (/) (/) * .bandcamp.com (/) and leave out the rest + return "https://" + parts[2] + "/"; + } + + @Override + public String getUploaderName() { + return albumJson.getString("artist"); + } + + @Override + public String getUploaderAvatarUrl() { + try { + return document.getElementsByClass("band-photo").first().attr("src"); + } catch (NullPointerException e) { + return ""; + } + } + + @Override + public long getStreamCount() { + return trackInfo.length(); + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws ExtractionException { + + StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + + for (int i = 0; i < trackInfo.length(); i++) { + JSONObject track = trackInfo.getJSONObject(i); + + collector.commit(new BandcampStreamInfoItemExtractor( + track.getString("title"), + getUploaderUrl() + track.getString("title_link"), + "", + "", + track.getLong("duration") + )); + } + + return new InfoItemsPage<>(collector, null); + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return name; + } + + @Override + public String getNextPageUrl() { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) { + return null; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java new file mode 100644 index 000000000..11aea8ea4 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -0,0 +1,40 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; + +public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { + + private String title, artist, url, cover; + + public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover) { + this.title = title; + this.artist = artist; + this.url = url; + this.cover = cover; + } + + @Override + public String getUploaderName() { + return artist; + } + + @Override + public long getStreamCount() { + return -1; + } + + @Override + public String getName() { + return title; + } + + @Override + public String getUrl() { + return url; + } + + @Override + public String getThumbnailUrl() { + return cover; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index fc89002fc..38891c004 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -74,8 +74,7 @@ public class BandcampSearchExtractor extends SearchExtractor { case "ALBUM": String artist = subhead.split(" by")[0]; - //searchResults.add(new Album(heading, artist, url, image)); - //collector.commit Playlist with heading, artist, url, image + collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image)); break; case "TRACK": 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 be4c03729..72c3a551c 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 @@ -50,7 +50,7 @@ public class BandcampStreamExtractor extends StreamExtractor { * * @param html Website * @return Album metadata JSON - * @throws ParsingException In case of a faulty website + * @throws ParsingException In case of a faulty website */ public static JSONObject getAlbumInfoJson(String html) throws ParsingException { try { @@ -103,7 +103,11 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getThumbnailUrl() throws ParsingException { - return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); + try { + return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); + } catch (NullPointerException e) { + return ""; + } } @Nonnull @@ -188,7 +192,7 @@ public class BandcampStreamExtractor extends StreamExtractor { audioStreams.add(new AudioStream( albumJson.getJSONArray("trackinfo").getJSONObject(0) - .getJSONObject("file").getString("mp3-128"), + .getJSONObject("file").getString("mp3-128"), MediaFormat.MP3, 128 )); return audioStreams; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java index 6cb96411e..4f2a5724f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -15,48 +15,54 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor private String url; private String cover; private String artist; + private long duration; public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist) { + this(title, url, cover, artist, -1); + } + + public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist, long duration) { this.title = title; this.url = url; this.cover = cover; this.artist = artist; + this.duration = duration; } @Override - public StreamType getStreamType() throws ParsingException { + public StreamType getStreamType() { return StreamType.AUDIO_STREAM; } @Override - public long getDuration() throws ParsingException { + public long getDuration() { + return duration; + } + + @Override + public long getViewCount() { return -1; } @Override - public long getViewCount() throws ParsingException { - return -1; - } - - @Override - public String getUploaderName() throws ParsingException { + public String getUploaderName() { return artist; } @Override - public String getUploaderUrl() throws ParsingException { + public String getUploaderUrl() { return null; } @Nullable @Override - public String getTextualUploadDate() throws ParsingException { + public String getTextualUploadDate() { return null; // TODO } @Nullable @Override - public DateWrapper getUploadDate() throws ParsingException { + public DateWrapper getUploadDate() { return null; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java new file mode 100644 index 000000000..e7aac43e2 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java @@ -0,0 +1,31 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +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; + +/** + * Just as with streams, the album ids are essentially useless for us. + */ +public class BandcampPlaylistLinkHandlerFactory extends ListLinkHandlerFactory { + @Override + public String getId(String url) throws ParsingException { + return getUrl(url); + } + + @Override + public String getUrl(String url, List contentFilter, String sortFilter) throws ParsingException { + if (url.endsWith("/")) + url = url.substring(0, url.length() - 1); + url = url.replace("http://", "https://").toLowerCase(); + return url; + } + + @Override + public boolean onAcceptUrl(String url) throws ParsingException { + return getUrl(url).matches("https?://.+\\..+/album/.+"); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index d924b4fb2..850529774 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -1,3 +1,5 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java new file mode 100644 index 000000000..e7482dfb5 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -0,0 +1,29 @@ +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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.schabi.newpipe.extractor.ServiceList.bandcamp; + +public class BandcampPlaylistExtractorTest { + + @BeforeClass + public static void setUp() { + NewPipe.init(DownloaderTestImpl.getInstance()); + } + + @Test + public void testCount() throws ExtractionException, IOException { + PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); + extractor.fetchPage(); + + assertEquals(5, extractor.getStreamCount()); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java new file mode 100644 index 000000000..1da3069c9 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java @@ -0,0 +1,45 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampPlaylistLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Test for {@link BandcampPlaylistLinkHandlerFactory} + */ +public class BandcampPlaylistLinkHandlerFactoryTest { + + private static BandcampPlaylistLinkHandlerFactory linkHandler; + + @BeforeClass + public static void setUp() { + linkHandler = new BandcampPlaylistLinkHandlerFactory(); + NewPipe.init(DownloaderTestImpl.getInstance()); + } + + @Test + public void testAcceptUrl() throws ParsingException { + // Tests expecting false + assertFalse(linkHandler.acceptUrl("http://interovgm.com/releases/")); + assertFalse(linkHandler.acceptUrl("https://interovgm.com/releases")); + assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); + assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); + assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); + assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); + assertFalse(linkHandler.acceptUrl("https://interovgm.com/track/title")); + + // Tests expecting true + assertTrue(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); + assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/album/prom")); + } + +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 5780e1612..98bdc843f 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -38,7 +38,7 @@ public class BandcampSearchExtractorTest { * the accordingly named song by Zach Benson */ @Test - public void testBestFriendsBasement() throws ExtractionException, IOException { + public void testStreamSearch() throws ExtractionException, IOException { SearchExtractor extractor = bandcamp.getSearchExtractor("best friend's basement"); ListExtractor.InfoItemsPage page = extractor.getInitialPage(); @@ -55,7 +55,7 @@ public class BandcampSearchExtractorTest { * Tests whether searching bandcamp for "C418" returns the artist's profile */ @Test - public void testC418() throws ExtractionException, IOException { + public void testChannelSearch() throws ExtractionException, IOException { SearchExtractor extractor = bandcamp.getSearchExtractor("C418"); InfoItem c418 = extractor.getInitialPage() .getItems().get(0); @@ -67,4 +67,21 @@ public class BandcampSearchExtractorTest { assertEquals("https://c418.bandcamp.com", c418.getUrl()); } + + /** + * Tests whether searching bandcamp for "minecraft volume alpha" returns the corresponding album + */ + @Test + public void testAlbumSearch() throws ExtractionException, IOException { + SearchExtractor extractor = bandcamp.getSearchExtractor("minecraft volume alpha"); + InfoItem minecraft = extractor.getInitialPage() + .getItems().get(0); + + // C418's artist profile should be the first result, no? + assertEquals("Minecraft - Volume Alpha", minecraft.getName()); + assertTrue(minecraft.getThumbnailUrl().endsWith(".jpg")); + assertTrue(minecraft.getThumbnailUrl().contains("f4.bcbits.com/img/")); + assertEquals("https://c418.bandcamp.com/album/minecraft-volume-alpha", minecraft.getUrl()); + + } } From 655df356a2b7c407211e3f1d05974ce5f5dd3d2d Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 03:10:54 +0100 Subject: [PATCH 13/91] Various improvements concerning bandcamp playlists --- .../extractors/BandcampPlaylistExtractor.java | 4 +-- .../BandcampPlaylistInfoItemExtractor.java | 20 ++++++++++++--- .../extractors/BandcampSearchExtractor.java | 2 +- .../BandcampStreamInfoItemExtractor.java | 25 ++++++++++++++++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index ac5e8998d..78c5f0213 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -107,8 +107,8 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { track.getString("title"), getUploaderUrl() + track.getString("title_link"), "", - "", - track.getLong("duration") + track.getLong("duration"), + getService() )); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index 11aea8ea4..5257691e6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -1,16 +1,24 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; +import java.io.IOException; + public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { private String title, artist, url, cover; + private StreamingService service; - public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover) { + public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover, StreamingService service) { this.title = title; this.artist = artist; this.url = url; this.cover = cover; + this.service = service; } @Override @@ -19,8 +27,14 @@ public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtrac } @Override - public long getStreamCount() { - return -1; + public long getStreamCount() throws ParsingException { + try { + PlaylistExtractor extractor = service.getPlaylistExtractor(url); + extractor.fetchPage(); + return extractor.getStreamCount(); + } catch (ExtractionException | IOException e) { + throw new ParsingException("Could not find out how many tracks there are", e); + } } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 38891c004..f31a50651 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -74,7 +74,7 @@ public class BandcampSearchExtractor extends SearchExtractor { case "ALBUM": String artist = subhead.split(" by")[0]; - collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image)); + collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image, getService())); break; case "TRACK": diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java index 4f2a5724f..dd51f7692 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -2,12 +2,16 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.localization.DateWrapper; +import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamType; import javax.annotation.Nullable; +import java.io.IOException; public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor { @@ -16,6 +20,12 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor private String cover; private String artist; private long duration; + private StreamingService service; + + public BandcampStreamInfoItemExtractor(String title, String url, String artist, long duration, StreamingService service) { + this(title, url, null, artist, duration); + this.service = service; + } public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist) { this(title, url, cover, artist, -1); @@ -76,9 +86,22 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor return url; } + /** + * There is no guarantee that every track of an album has the same cover art, so it needs to be fetched + * per-track if in playlist view + */ @Override public String getThumbnailUrl() throws ParsingException { - return cover; + if (cover != null) return cover; + else { + try { + StreamExtractor extractor = service.getStreamExtractor(getUrl()); + extractor.fetchPage(); + return extractor.getThumbnailUrl(); + } catch (ExtractionException | IOException e) { + throw new ParsingException("could not download cover art location", e); + } + } } /** From e12ddaef7f7ab8c447df2310490e5a37d23bd84a Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 12:53:15 +0100 Subject: [PATCH 14/91] Bandcamp playlist and search extractors: better and more tests --- .../extractors/BandcampChannelExtractor.java | 1 + .../extractors/BandcampPlaylistExtractor.java | 3 +- .../BandcampPlaylistExtractorTest.java | 36 ++++++++++++++++++- .../bandcamp/BandcampSearchExtractorTest.java | 7 +++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 3f39603e6..ddb8f3365 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -6,6 +6,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; +import org.schabi.newpipe.extractor.InfoItemsCollector; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 78c5f0213..4544644ea 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -7,6 +7,7 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; +import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; @@ -50,7 +51,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { if (trackInfo.length() <= 1) { // In this case, we are actually viewing a track page! - throw new ExtractionException("Page is actually a track, not an album"); + throw new ContentNotAvailableException("Album needs to be purchased or is actually a track"); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index e7482dfb5..c6572974a 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -1,17 +1,26 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; +import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +/** + * Tests for {@link BandcampPlaylistExtractor} + */ public class BandcampPlaylistExtractorTest { @BeforeClass @@ -19,6 +28,9 @@ public class BandcampPlaylistExtractorTest { NewPipe.init(DownloaderTestImpl.getInstance()); } + /** + * Test whether playlists contain the correct amount of items + */ @Test public void testCount() throws ExtractionException, IOException { PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); @@ -26,4 +38,26 @@ public class BandcampPlaylistExtractorTest { assertEquals(5, extractor.getStreamCount()); } + + /** + * Tests whether different stream thumbnails (track covers) get loaded correctly + */ + @Test + public void testDifferentTrackCovers() throws ExtractionException, IOException { + PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://zachbensonarchive.bandcamp.com/album/results-of-boredom"); + extractor.fetchPage(); + + List l = extractor.getInitialPage().getItems(); + assertEquals(extractor.getThumbnailUrl(), l.get(0).getThumbnailUrl()); + assertNotEquals(extractor.getThumbnailUrl(), l.get(5).getThumbnailUrl()); + } + + /** + * Test playlists with locked content + */ + @Test(expected = ContentNotAvailableException.class) + public void testLockedContent() throws ExtractionException, IOException { + PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); + extractor.fetchPage(); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 98bdc843f..45624fe76 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -10,8 +10,10 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelInfoItemExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; import java.io.IOException; @@ -77,11 +79,14 @@ public class BandcampSearchExtractorTest { InfoItem minecraft = extractor.getInitialPage() .getItems().get(0); - // C418's artist profile should be the first result, no? + // Minecraft volume alpha should be the first result, no? assertEquals("Minecraft - Volume Alpha", minecraft.getName()); assertTrue(minecraft.getThumbnailUrl().endsWith(".jpg")); assertTrue(minecraft.getThumbnailUrl().contains("f4.bcbits.com/img/")); assertEquals("https://c418.bandcamp.com/album/minecraft-volume-alpha", minecraft.getUrl()); + // Verify that playlists get counted correctly + assertEquals(24, ((PlaylistInfoItem) minecraft).getStreamCount()); + } } From ce2a88e56ff2e7c819429b8fff55f20775a5706d Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 13:28:02 +0100 Subject: [PATCH 15/91] Add bandcamp search suggestion extractor --- .../services/bandcamp/BandcampService.java | 7 +-- .../BandcampSuggestionExtractor.java | 51 +++++++++++++++++++ .../BandcampSuggestionExtractorTest.java | 41 +++++++++++++++ 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.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 211f7310f..103ff6ec4 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 @@ -10,10 +10,7 @@ import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.search.SearchExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.*; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampPlaylistLinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; @@ -69,7 +66,7 @@ public class BandcampService extends StreamingService { @Override public SuggestionExtractor getSuggestionExtractor() { - return null; + return new BandcampSuggestionExtractor(this); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java new file mode 100644 index 000000000..6cf5d70b2 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -0,0 +1,51 @@ +// 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.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.suggestion.SuggestionExtractor; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; + +import static org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory.CHARSET_UTF_8; + +public class BandcampSuggestionExtractor extends SuggestionExtractor { + + private static final String AUTOCOMPLETE_URL = "https://bandcamp.com/api/fuzzysearch/1/autocomplete?q="; + public BandcampSuggestionExtractor(StreamingService service) { + super(service); + } + + @Override + public List suggestionList(String query) throws IOException, ExtractionException { + Downloader downloader = NewPipe.getDownloader(); + + JSONObject fuzzyResults = new JSONObject( + downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, CHARSET_UTF_8)).responseBody() + ); + + JSONArray jsonArray = fuzzyResults.getJSONObject("auto") + .getJSONArray("results"); + + ArrayList suggestions = new ArrayList<>(); + + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject fuzzyResult = jsonArray.getJSONObject(i); + String res = fuzzyResult.getString("name"); + + if (!suggestions.contains(res)) suggestions.add(res); + } + + + + return suggestions; + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java new file mode 100644 index 000000000..77b4f26b5 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java @@ -0,0 +1,41 @@ +// 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.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSuggestionExtractor; + +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 BandcampSuggestionExtractor} + */ +public class BandcampSuggestionExtractorTest { + + private static BandcampSuggestionExtractor extractor; + + @BeforeClass + public static void setUp() { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (BandcampSuggestionExtractor) bandcamp.getSuggestionExtractor(); + } + + @Test + public void testSearchExample() throws IOException, ExtractionException { + List c418 = extractor.suggestionList("c418"); + + // When looking for c418, one should find C418 + assertTrue(c418.contains("C418")); + + // There should be five results, but we can't be sure of that forever + assertTrue(c418.size() > 2); + } +} From 9b16baffb7438af1f3b79f365cdc01a2a32dadbc Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 13:51:17 +0100 Subject: [PATCH 16/91] Bandcamp search: multiple pages --- .../extractors/BandcampSearchExtractor.java | 34 ++++++++++++++++--- .../BandcampSearchQueryHandlerFactory.java | 3 +- .../bandcamp/BandcampSearchExtractorTest.java | 13 +++++++ ...BandcampSearchQueryHandlerFactoryTest.java | 4 +-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index f31a50651..31b1b4b84 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -89,19 +89,45 @@ public class BandcampSearchExtractor extends SearchExtractor { } + // Count pages + Elements pageLists = d.getElementsByClass("pagelist"); + if (pageLists.size() == 0) + return new InfoItemsPage<>(collector, null); + + Elements pages = pageLists.first().getElementsByTag("li"); + + // Find current page + int currentPage = -1; + for (int i = 0; i < pages.size(); i++) { + Element page = pages.get(i); + if (page.getElementsByTag("span").size() > 0) { + currentPage = i + 1; + break; + } + } + + // Search results appear to be capped at six pages + assert pages.size() < 10; + + String nextUrl = null; + if (currentPage < pages.size()) { + nextUrl = pageUrl.substring(0, pageUrl.length() - 1) + (currentPage + 1); + } + + return new InfoItemsPage<>(collector, nextUrl); - return new InfoItemsPage<>(getInfoItemSearchCollector(), null); } @Nonnull @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - return getPage(getUrl());//new InfoItemsPage<>(getInfoItemSearchCollector(), null); + return getPage(getUrl()); } @Override - public String getNextPageUrl() throws IOException, ExtractionException { - return null; + public String getNextPageUrl() throws ExtractionException { + String url = getUrl(); + return url.substring(0, url.length() - 1).concat("2"); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java index 3f23956fe..0fad75d5f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java @@ -21,7 +21,8 @@ public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory try { return SEARCH_URL + - URLEncoder.encode(query, CHARSET_UTF_8); + URLEncoder.encode(query, CHARSET_UTF_8) + + "&page=1"; } catch (UnsupportedEncodingException e) { throw new ParsingException("query \"" + query + "\" could not be encoded", e); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 45624fe76..8cffcf73e 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -89,4 +89,17 @@ public class BandcampSearchExtractorTest { assertEquals(24, ((PlaylistInfoItem) minecraft).getStreamCount()); } + + /** + * Tests searches with multiple pages + */ + @Test + public void testMultiplePages() throws ExtractionException, IOException { + // A query practically guaranteed to have the maximum amount of pages + SearchExtractor extractor = bandcamp.getSearchExtractor("e"); + + assertEquals("https://bandcamp.com/search?q=e&page=2", extractor.getInitialPage().getNextPageUrl()); + + assertEquals("https://bandcamp.com/search?q=e&page=3", extractor.getPage(extractor.getNextPageUrl()).getNextPageUrl()); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java index 1a8fdac5b..4158e655b 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java @@ -27,8 +27,8 @@ public class BandcampSearchQueryHandlerFactoryTest { @Test public void testEncoding() throws ParsingException { // Note: this isn't exactly as bandcamp does it (it wouldn't encode '!'), but both works - assertEquals("https://bandcamp.com/search?q=hello%21%22%C2%A7%24%25%26%2F%28%29%3D", searchQuery.getUrl("hello!\"ยง$%&/()=")); + assertEquals("https://bandcamp.com/search?q=hello%21%22%C2%A7%24%25%26%2F%28%29%3D&page=1", searchQuery.getUrl("hello!\"ยง$%&/()=")); // Note: bandcamp uses %20 instead of '+', but both works - assertEquals("https://bandcamp.com/search?q=search+query+with+spaces", searchQuery.getUrl("search query with spaces")); + assertEquals("https://bandcamp.com/search?q=search+query+with+spaces&page=1", searchQuery.getUrl("search query with spaces")); } } From 13e4908b832e042141c3d8577b3cec4e69ee27d0 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 14:07:56 +0100 Subject: [PATCH 17/91] Bandcamp search extractor: read track count from result page --- .../BandcampPlaylistInfoItemExtractor.java | 16 +++++----------- .../extractors/BandcampSearchExtractor.java | 4 +++- .../bandcamp/BandcampSearchExtractorTest.java | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index 5257691e6..61551bac5 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -11,14 +11,14 @@ import java.io.IOException; public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { private String title, artist, url, cover; - private StreamingService service; + private int trackCount; - public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover, StreamingService service) { + public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover, int trackCount) { this.title = title; this.artist = artist; this.url = url; this.cover = cover; - this.service = service; + this.trackCount = trackCount; } @Override @@ -27,14 +27,8 @@ public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtrac } @Override - public long getStreamCount() throws ParsingException { - try { - PlaylistExtractor extractor = service.getPlaylistExtractor(url); - extractor.fetchPage(); - return extractor.getStreamCount(); - } catch (ExtractionException | IOException e) { - throw new ParsingException("Could not find out how many tracks there are", e); - } + public long getStreamCount() { + return trackCount; } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 31b1b4b84..6831cdf62 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -74,7 +74,9 @@ public class BandcampSearchExtractor extends SearchExtractor { case "ALBUM": String artist = subhead.split(" by")[0]; - collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image, getService())); + String length = resultInfo.getElementsByClass("length").text(); + int tracks = Integer.parseInt(length.split(" track")[0]); + collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image, tracks)); break; case "TRACK": diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 8cffcf73e..1e6f9b579 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -85,7 +85,7 @@ public class BandcampSearchExtractorTest { assertTrue(minecraft.getThumbnailUrl().contains("f4.bcbits.com/img/")); assertEquals("https://c418.bandcamp.com/album/minecraft-volume-alpha", minecraft.getUrl()); - // Verify that playlists get counted correctly + // Verify that playlist tracks counts get extracted correctly assertEquals(24, ((PlaylistInfoItem) minecraft).getStreamCount()); } From db02850d4f899e2226e2fcc99dd39bbcb70b0091 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 14:12:24 +0100 Subject: [PATCH 18/91] Bandcamp playlist extractor: support playlists with just one stream --- .../extractors/BandcampPlaylistExtractor.java | 6 +++--- .../bandcamp/BandcampPlaylistExtractorTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 4544644ea..e24e603de 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -49,9 +49,9 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { - if (trackInfo.length() <= 1) { - // In this case, we are actually viewing a track page! - throw new ContentNotAvailableException("Album needs to be purchased or is actually a track"); + if (trackInfo.length() < 0) { + // Albums without trackInfo need to be purchased before they can be played + throw new ContentNotAvailableException("Album needs to be purchased"); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index c6572974a..7400b1821 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -60,4 +60,16 @@ public class BandcampPlaylistExtractorTest { PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); extractor.fetchPage(); } + + /** + * Test playlist with just one track + */ + @Test + public void testSingleStreamPlaylist() throws ExtractionException, IOException { + PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://zachjohnson1.bandcamp.com/album/endless"); + extractor.fetchPage(); + + assertEquals(1, extractor.getStreamCount()); + + } } From 13ef11e9c8a1c60aaf8e68b63ad2fb88723569f9 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 15:15:12 +0100 Subject: [PATCH 19/91] Bandcamp featured kiosk --- .../services/bandcamp/BandcampService.java | 34 +++++-- .../extractors/BandcampFeaturedExtractor.java | 91 +++++++++++++++++++ .../BandcampFeaturedLinkHandlerFactory.java | 34 +++++++ .../BandcampFeaturedExtractorTest.java | 39 ++++++++ 4 files changed, 190 insertions(+), 8 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.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 103ff6ec4..658101bd3 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 @@ -6,22 +6,23 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.comments.CommentsExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.*; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampPlaylistLinkHandlerFactory; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.*; import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor; import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; +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.KIOSK_FEATURED; +import static org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory.FEATURED_API_URL; public class BandcampService extends StreamingService { @@ -76,7 +77,24 @@ public class BandcampService extends StreamingService { @Override public KioskList getKioskList() throws ExtractionException { - return new KioskList(this); + + 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.setDefaultKiosk(KIOSK_FEATURED); + + } catch (Exception e) { + throw new ExtractionException(e); + } + + return kioskList; } @Override @@ -85,17 +103,17 @@ public class BandcampService extends StreamingService { } @Override - public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) throws ExtractionException { + public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) { return new BandcampPlaylistExtractor(this, linkHandler); } @Override - public StreamExtractor getStreamExtractor(LinkHandler linkHandler) throws ExtractionException { + public StreamExtractor getStreamExtractor(LinkHandler linkHandler) { return new BandcampStreamExtractor(this, linkHandler); } @Override - public CommentsExtractor getCommentsExtractor(ListLinkHandler linkHandler) throws ExtractionException { + public CommentsExtractor getCommentsExtractor(ListLinkHandler linkHandler) { return null; } } 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 new file mode 100644 index 000000000..5e8f21d49 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampFeaturedExtractor.java @@ -0,0 +1,91 @@ +// 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.Collector; +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.PlaylistInfoItem; +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; +import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; +import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory; + +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 BandcampFeaturedExtractor(StreamingService streamingService, ListLinkHandler listLinkHandler, String kioskId) { + super(streamingService, listLinkHandler, kioskId); + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return null; + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws IOException, ExtractionException { + + InfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); + + JSONObject json = new JSONObject( + getDownloader().post( + FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() + ).responseBody() + ); + + JSONArray featuredStories = json.getJSONObject("feed_content") + .getJSONObject("stories") + .getJSONArray("featured"); + + for (int i = 0; i < featuredStories.length(); i++) { + JSONObject featuredStory = featuredStories.getJSONObject(i); + + if (featuredStory.isNull("album_title")) { + // Is not an album, ignore + continue; + } + + c.commit(new BandcampPlaylistInfoItemExtractor( + featuredStory.getString("album_title"), + featuredStory.getString("band_name"), + featuredStory.getString("item_url"), + featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : "", + featuredStory.getInt("num_streamable_tracks") + )); + } + + return new InfoItemsPage(c, null); + } + + @Override + public String getNextPageUrl() { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) { + return null; + } +} 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 new file mode 100644 index 000000000..3fdcb33ba --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampFeaturedLinkHandlerFactory.java @@ -0,0 +1,34 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +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.KIOSK_FEATURED; + +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; + else return null; + } + + @Override + public String getId(String url) { + return KIOSK_FEATURED; + } + + @Override + public boolean onAcceptUrl(String url) { + return url.equals(FEATURED_API_URL); + } +} 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 new file mode 100644 index 000000000..258098d33 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampFeaturedExtractorTest.java @@ -0,0 +1,39 @@ +// 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.BandcampFeaturedExtractor; + +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 BandcampFeaturedExtractor} + */ +public class BandcampFeaturedExtractorTest { + + private static BandcampFeaturedExtractor extractor; + + @BeforeClass + public static void setUp() throws ExtractionException, IOException { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (BandcampFeaturedExtractor) bandcamp + .getKioskList().getDefaultKioskExtractor(); + } + + @Test + public void testKioskItems() throws ExtractionException, IOException { + List list = extractor.getInitialPage().getItems(); + assertTrue(list.size() > 1); + } + +} From 808c8aa0872ef0bee4d8d042dc5d772babfde154 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 17:30:22 +0100 Subject: [PATCH 20/91] 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")); } } From f0d36dfa7eb1b35b99c6c593d4e6e247868e09fe Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 22 Dec 2019 17:36:50 +0100 Subject: [PATCH 21/91] Bandcamp radio: proper name, date shortened --- .../extractors/BandcampRadioInfoItemExtractor.java | 8 ++------ .../bandcamp/extractors/BandcampRadioStreamExtractor.java | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) 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 index 7e7017140..2aeb79af3 100644 --- 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 @@ -3,18 +3,14 @@ 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 { @@ -37,7 +33,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Nullable @Override public String getTextualUploadDate() { - return show.getString("date"); + return show.getString("date").replace(" 00:00:00 GMT", ""); } @Nullable @@ -48,7 +44,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Override public String getName() throws ParsingException { - return show.getString("date"); + return show.getString("subtitle"); } @Override 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 index 2449f572f..82bd0d287 100644 --- 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 @@ -1,6 +1,5 @@ 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; @@ -11,7 +10,6 @@ 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; @@ -76,7 +74,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nullable @Override public String getTextualUploadDate() { - return showInfo.getString("published_date"); + return showInfo.getString("published_date").replace(" 00:00:00 GMT", ""); } @Nonnull From 46e1f3922c8869db7bef79573c5f86dde3ab9b4f Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Fri, 3 Jan 2020 12:25:59 +0100 Subject: [PATCH 22/91] Refuse to load bandcamp playlists without content --- .../services/bandcamp/extractors/BandcampPlaylistExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index e24e603de..1886d4a92 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -49,7 +49,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { - if (trackInfo.length() < 0) { + if (trackInfo.length() <= 0) { // Albums without trackInfo need to be purchased before they can be played throw new ContentNotAvailableException("Album needs to be purchased"); } From ba967f1a1520f7fadded3b6bfd67c4da0f188c2b Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Fri, 3 Jan 2020 13:13:42 +0100 Subject: [PATCH 23/91] Workaround enourmous load times for long bandcamp playlists Additionally, get cover art from json instead of html --- .../extractors/BandcampPlaylistExtractor.java | 42 +++++++++++++------ .../extractors/BandcampStreamExtractor.java | 9 ++-- .../BandcampPlaylistExtractorTest.java | 16 +++++++ .../bandcamp/BandcampRadioExtractorTest.java | 1 - 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 1886d4a92..64f26b2e9 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -18,11 +18,19 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; 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.extractors.BandcampExtractorHelper.getJSONFromJavaScriptVariables; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor.getAlbumInfoJson; public class BandcampPlaylistExtractor extends PlaylistExtractor { + /** + * An arbitrarily chosen number above which cover arts won't be fetched individually for each track; + * instead, it will be assumed that every track has the same cover art as the album, which is not + * always the case. + */ + private static final int MAXIMUM_INDIVIDUAL_COVER_ARTS = 10; + private Document document; private JSONObject albumJson; private JSONArray trackInfo; @@ -57,11 +65,8 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { @Override public String getThumbnailUrl() throws ParsingException { - try { - return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); - } catch (NullPointerException e) { - return ""; - } + if (albumJson.isNull("art_id")) return ""; + else return getImageUrl(albumJson.getLong("art_id"), true); } @Override @@ -104,13 +109,26 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { for (int i = 0; i < trackInfo.length(); i++) { JSONObject track = trackInfo.getJSONObject(i); - collector.commit(new BandcampStreamInfoItemExtractor( - track.getString("title"), - getUploaderUrl() + track.getString("title_link"), - "", - track.getLong("duration"), - getService() - )); + if (trackInfo.length() < MAXIMUM_INDIVIDUAL_COVER_ARTS) { + // Load cover art of every track individually + collector.commit(new BandcampStreamInfoItemExtractor( + track.getString("title"), + getUploaderUrl() + track.getString("title_link"), + "", + track.getLong("duration"), + getService() + )); + } else { + // Pretend every track has the same cover art as the album + collector.commit(new BandcampStreamInfoItemExtractor( + track.getString("title"), + getUploaderUrl() + track.getString("title_link"), + getThumbnailUrl(), + "", + track.getLong("duration") + )); + } + } return new InfoItemsPage<>(collector, null); 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 72c3a551c..c76cb474b 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 @@ -21,6 +21,8 @@ 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 BandcampStreamExtractor extends StreamExtractor { private JSONObject albumJson; @@ -103,11 +105,8 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getThumbnailUrl() throws ParsingException { - try { - return document.getElementsByAttributeValue("property", "og:image").get(0).attr("content"); - } catch (NullPointerException e) { - return ""; - } + if (albumJson.isNull("art_id")) return ""; + else return getImageUrl(albumJson.getLong("art_id"), true); } @Nonnull diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index 7400b1821..7d930ca8f 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -52,6 +52,22 @@ public class BandcampPlaylistExtractorTest { assertNotEquals(extractor.getThumbnailUrl(), l.get(5).getThumbnailUrl()); } + /** + * Tests that no attempt to load every track's cover individually is made + */ + @Test(timeout = 10000L) + public void testDifferentTrackCoversDuration() throws ExtractionException, IOException { + PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://infiniteammo.bandcamp.com/album/night-in-the-woods-vol-1-at-the-end-of-everything"); + extractor.fetchPage(); + + /* All tracks in this album have the same cover art, but I don't know any albums with more than 10 tracks + * that has at least one track with a cover art different from the rest. + */ + List l = extractor.getInitialPage().getItems(); + assertEquals(extractor.getThumbnailUrl(), l.get(0).getThumbnailUrl()); + assertEquals(extractor.getThumbnailUrl(), l.get(5).getThumbnailUrl()); + } + /** * Test playlists with locked content */ 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 index 4ec3f66a9..03ea7e3b1 100644 --- 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 @@ -34,7 +34,6 @@ public class BandcampRadioExtractorTest { @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); } } From 7b5702bdc2a84a37f158b41bbfe7f708507ea10d Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 11 Jan 2020 16:32:45 +0100 Subject: [PATCH 24/91] Add bandcamp to list of supported services in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3cf4e4c5b..9bbdb826a 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ The following sites are currently supported: - YouTube - SoundCloud - MediaCCC +- bandcamp ## License From a1523eb293acbf074b51972b272b901f7bc9144f Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Tue, 17 Mar 2020 20:40:25 +0100 Subject: [PATCH 25/91] Update Bandcamp service to latest interface changes --- .../BandcampRadioStreamExtractor.java | 23 ++++- .../extractors/BandcampStreamExtractor.java | 87 +++++++++++++++++-- .../bandcamp/BandcampStreamExtractorTest.java | 20 ++++- 3 files changed, 122 insertions(+), 8 deletions(-) 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 index 82bd0d287..3c1148c7c 100644 --- 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 @@ -11,6 +11,7 @@ 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.stream.AudioStream; +import org.schabi.newpipe.extractor.stream.Description; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -91,8 +92,8 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nonnull @Override - public String getDescription() { - return showInfo.getString("desc"); + public Description getDescription() { + return new Description(showInfo.getString("desc"), Description.PLAIN_TEXT); } @Override @@ -120,4 +121,22 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { return list; } + + @Nonnull + @Override + public String getLicence() { + return ""; + } + + @Nonnull + @Override + public String getCategory() { + return ""; + } + + @Nonnull + @Override + public List getTags() { + return new ArrayList<>(); + } } 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 c76cb474b..2300809d7 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 @@ -6,6 +6,8 @@ import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; @@ -20,6 +22,7 @@ import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; @@ -121,14 +124,15 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override - public String getDescription() { - return BandcampExtractorHelper.smartConcatenate( + public Description getDescription() { + String s = BandcampExtractorHelper.smartConcatenate( new String[]{ getStringOrNull(current, "about"), getStringOrNull(current, "lyrics"), getStringOrNull(current, "credits") }, "\n\n" ); + return new Description(s, Description.PLAIN_TEXT); } /** @@ -176,7 +180,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getDashMpdUrl() throws ParsingException { - return null; + return ""; } @Nonnull @@ -210,13 +214,13 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public List getSubtitlesDefault() { - return null; + return new ArrayList<>(); } @Nonnull @Override public List getSubtitles(MediaFormat format) { - return null; + return new ArrayList<>(); } @Override @@ -238,4 +242,77 @@ public class BandcampStreamExtractor extends StreamExtractor { public String getErrorMessage() { return null; } + + @Nonnull + @Override + public String getHost() { + return ""; + } + + @Nonnull + @Override + public String getPrivacy() { + return ""; + } + + @Nonnull + @Override + public String getCategory() { + // Get first tag from html, which is the artist's Genre + return document.getElementsByAttributeValue("itemprop", "keywords").first().text(); + } + + @Nonnull + @Override + public String getLicence() { + + int license = current.getInt("license_type"); + + // Tests resulted in this mapping of ints to licence: https://cloud.disroot.org/s/ZTWBxbQ9fKRmRWJ/preview + + switch (license) { + case 1: + return "All rights reserved ยฉ"; + case 2: + return "CC BY-NC-ND 3.0"; + case 3: + return "CC BY-NC-SA 3.0"; + case 4: + return "CC BY-NC 3.0"; + case 5: + return "CC BY-ND 3.0"; + case 8: + return "CC BY-SA 3.0"; + case 6: + return "CC BY 3.0"; + default: + return "Unknown license (internal ID " + license + ")"; + } + } + + @Nullable + @Override + public Locale getLanguageInfo() { + return null; + } + + @Nonnull + @Override + public List getTags() { + Elements tagElements = document.getElementsByAttributeValue("itemprop", "keywords"); + + ArrayList tags = new ArrayList<>(); + + for (Element e : tagElements) { + tags.add(e.text()); + } + + return tags; + } + + @Nonnull + @Override + public String getSupportInfo() { + return ""; + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 2f7a03bff..5574c3408 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -9,6 +9,9 @@ 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.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.stream.StreamExtractor; + +import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -52,7 +55,7 @@ public class BandcampStreamExtractorTest { @Test public void testDescription() { - assertEquals(831, extractor.getDescription().length()); + assertEquals(831, extractor.getDescription().getContent().length()); } @Test @@ -77,4 +80,19 @@ public class BandcampStreamExtractorTest { bandcamp.getStreamExtractor("https://bandcamp.com"); } + @Test + public void testCategory() throws ExtractionException, IOException { + StreamExtractor se = bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); + se.fetchPage(); + assertEquals("acoustic", se.getCategory()); + } + + @Test + public void testLicense() throws ExtractionException, IOException { + StreamExtractor se = bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); + se.fetchPage(); + assertEquals("CC BY 3.0", se.getLicence()); + } + + } From 9c239371f4cb8b781827a06eaa827e0b328f89b4 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 19 Apr 2020 14:29:39 +0200 Subject: [PATCH 26/91] Change nanojson dependency to @wb9688's fork --- build.gradle | 1 + extractor/build.gradle | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a62598060..6f349545f 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ allprojects { repositories { jcenter() + maven { url "https://jitpack.io" } } } diff --git a/extractor/build.gradle b/extractor/build.gradle index cc2f69dab..062861a0e 100644 --- a/extractor/build.gradle +++ b/extractor/build.gradle @@ -1,7 +1,9 @@ + + dependencies { implementation project(':timeago-parser') - implementation 'com.grack:nanojson:1.1' + implementation 'com.github.wb9688:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' implementation 'org.jsoup:jsoup:1.9.2' implementation 'org.mozilla:rhino:1.7.7.1' implementation 'com.github.spotbugs:spotbugs-annotations:3.1.0' From b100b9873ff1e6177ad53510ad4b39dd92a78ff7 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 19 Mar 2020 11:18:29 +0100 Subject: [PATCH 27/91] Bandcmap: Use nanojson fork instead of org.json --- extractor/build.gradle | 5 +- .../extractors/BandcampChannelExtractor.java | 31 +++++----- .../extractors/BandcampExtractorHelper.java | 15 ++--- .../extractors/BandcampFeaturedExtractor.java | 57 +++++++++++-------- .../extractors/BandcampPlaylistExtractor.java | 24 ++++---- .../extractors/BandcampRadioExtractor.java | 38 ++++++++----- .../BandcampRadioInfoItemExtractor.java | 6 +- .../BandcampRadioStreamExtractor.java | 14 +++-- .../extractors/BandcampStreamExtractor.java | 38 +++++-------- .../BandcampSuggestionExtractor.java | 36 +++++++----- .../BandcampChannelLinkHandlerFactory.java | 10 ++-- 11 files changed, 142 insertions(+), 132 deletions(-) diff --git a/extractor/build.gradle b/extractor/build.gradle index 062861a0e..7372288a2 100644 --- a/extractor/build.gradle +++ b/extractor/build.gradle @@ -1,5 +1,3 @@ - - dependencies { implementation project(':timeago-parser') @@ -8,7 +6,6 @@ dependencies { implementation 'org.mozilla:rhino:1.7.7.1' implementation 'com.github.spotbugs:spotbugs-annotations:3.1.0' implementation 'org.nibor.autolink:autolink:0.8.0' - implementation 'org.json:json:20190722' testImplementation 'junit:junit:4.12' -} \ No newline at end of file +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index ddb8f3365..9c1572cd4 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -2,11 +2,11 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.jsoup.Jsoup; -import org.schabi.newpipe.extractor.InfoItemsCollector; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; @@ -23,7 +23,7 @@ import java.io.IOException; public class BandcampChannelExtractor extends ChannelExtractor { - private JSONObject channelInfo; + private JsonObject channelInfo; public BandcampChannelExtractor(StreamingService service, ListLinkHandler linkHandler) throws ParsingException { super(service, linkHandler); @@ -36,17 +36,17 @@ public class BandcampChannelExtractor extends ChannelExtractor { * * I once took a moment to note down how it works. */ - public static JSONObject getArtistDetails(String id) throws ParsingException { + public static JsonObject getArtistDetails(String id) throws ParsingException { try { return - new JSONObject( + JsonParser.object().from( NewPipe.getDownloader().post( "https://bandcamp.com/api/mobile/22/band_details", null, ("{\"band_id\":\"" + id + "\"}").getBytes() ).responseBody() ); - } catch (IOException | ReCaptchaException e) { + } catch (IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("Could not download band details", e); } } @@ -63,12 +63,9 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public String getAvatarUrl() { - try { - return getImageUrl(channelInfo.getLong("bio_image_id"), false); - } catch (JSONException e) { - // In this case, the id is null and no image is available - return ""; - } + if (channelInfo.getLong("bio_image_id") == 0) return ""; + + return getImageUrl(channelInfo.getLong("bio_image_id"), false); } /** @@ -120,11 +117,11 @@ public class BandcampChannelExtractor extends ChannelExtractor { StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); - JSONArray discography = channelInfo.getJSONArray("discography"); + JsonArray discography = channelInfo.getArray("discography"); - for (int i = 0; i < discography.length(); i++) { + for (int i = 0; i < discography.size(); i++) { // I define discograph as an item that can appear in a discography - JSONObject discograph = discography.getJSONObject(i); + JsonObject discograph = discography.getObject(i); if (!discograph.getString("item_type").equals("track")) continue; 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 b86504c62..39c7d1fdd 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 @@ -2,8 +2,9 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -24,7 +25,7 @@ public class BandcampExtractorHelper { * @param variable Name of the variable * @return The JsonObject stored in the variable with this name */ - public static JSONObject getJSONFromJavaScriptVariables(String html, String variable) throws JSONException, ArrayIndexOutOfBoundsException, ParsingException { + public static JsonObject getJSONFromJavaScriptVariables(String html, String variable) throws JsonParserException, ArrayIndexOutOfBoundsException, ParsingException { String[] part = html.split("var " + variable + " = "); @@ -44,7 +45,7 @@ public class BandcampExtractorHelper { case '}': level--; if (level == 0) { - return new JSONObject(firstHalfGone.substring(0, position + 1) + return JsonParser.object().from(firstHalfGone.substring(0, position + 1) .replaceAll(" {4}//.+", "") // Remove "for the curious" in JSON .replaceAll("// xxx: note - don't internationalize this variable", "") // Remove this comment ); @@ -62,14 +63,14 @@ public class BandcampExtractorHelper { public static String getStreamUrlFromIds(long bandId, long itemId, String itemType) throws ParsingException { try { - String html = NewPipe.getDownloader().get( + String jsonString = NewPipe.getDownloader().get( "https://bandcamp.com/api/mobile/22/tralbum_details?band_id=" + bandId + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.substring(0, 1)) .responseBody(); - return new JSONObject(html).getString("bandcamp_url").replace("http://", "https://"); + return JsonParser.object().from(jsonString).getString("bandcamp_url").replace("http://", "https://"); - } catch (JSONException | ReCaptchaException | IOException e) { + } catch (JsonParserException | ReCaptchaException | IOException e) { throw new ParsingException("Ids could not be translated to URL", e); } 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 f8e67c6bd..37bfd1aea 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 @@ -2,8 +2,10 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONArray; -import org.json.JSONObject; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.Collector; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.InfoItemsCollector; @@ -49,34 +51,41 @@ public class BandcampFeaturedExtractor extends KioskExtractor { InfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); - JSONObject json = new JSONObject( - getDownloader().post( - FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() - ).responseBody() - ); + try { - JSONArray featuredStories = json.getJSONObject("feed_content") - .getJSONObject("stories") - .getJSONArray("featured"); - for (int i = 0; i < featuredStories.length(); i++) { - JSONObject featuredStory = featuredStories.getJSONObject(i); + JsonObject json = JsonParser.object().from( + getDownloader().post( + FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() + ).responseBody() + ); - if (featuredStory.isNull("album_title")) { - // Is not an album, ignore - continue; + JsonArray featuredStories = json.getObject("feed_content") + .getObject("stories") + .getArray("featured"); + + for (int i = 0; i < featuredStories.size(); i++) { + JsonObject featuredStory = featuredStories.getObject(i); + + if (featuredStory.isNull("album_title")) { + // Is not an album, ignore + continue; + } + + c.commit(new BandcampPlaylistInfoItemExtractor( + featuredStory.getString("album_title"), + featuredStory.getString("band_name"), + featuredStory.getString("item_url"), + featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : "", + featuredStory.getInt("num_streamable_tracks") + )); } - c.commit(new BandcampPlaylistInfoItemExtractor( - featuredStory.getString("album_title"), - featuredStory.getString("band_name"), - featuredStory.getString("item_url"), - featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : "", - featuredStory.getInt("num_streamable_tracks") - )); + return new InfoItemsPage(c, null); + } catch (JsonParserException e) { + e.printStackTrace(); + throw new ParsingException("JSON error", e); } - - return new InfoItemsPage(c, null); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 64f26b2e9..ddb78d3fa 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -1,8 +1,8 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParserException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.schabi.newpipe.extractor.StreamingService; @@ -32,8 +32,8 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { private static final int MAXIMUM_INDIVIDUAL_COVER_ARTS = 10; private Document document; - private JSONObject albumJson; - private JSONArray trackInfo; + private JsonObject albumJson; + private JsonArray trackInfo; private String name; public BandcampPlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) { @@ -45,11 +45,11 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { String html = downloader.get(getLinkHandler().getUrl()).responseBody(); document = Jsoup.parse(html); albumJson = getAlbumInfoJson(html); - trackInfo = albumJson.getJSONArray("trackinfo"); + trackInfo = albumJson.getArray("trackinfo"); try { name = getJSONFromJavaScriptVariables(html, "EmbedData").getString("album_title"); - } catch (JSONException e) { + } catch (JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } catch (ArrayIndexOutOfBoundsException e) { throw new ParsingException("JSON does not exist", e); @@ -57,7 +57,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { - if (trackInfo.length() <= 0) { + if (trackInfo.size() <= 0) { // Albums without trackInfo need to be purchased before they can be played throw new ContentNotAvailableException("Album needs to be purchased"); } @@ -97,7 +97,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { @Override public long getStreamCount() { - return trackInfo.length(); + return trackInfo.size(); } @Nonnull @@ -106,10 +106,10 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); - for (int i = 0; i < trackInfo.length(); i++) { - JSONObject track = trackInfo.getJSONObject(i); + for (int i = 0; i < trackInfo.size(); i++) { + JsonObject track = trackInfo.getObject(i); - if (trackInfo.length() < MAXIMUM_INDIVIDUAL_COVER_ARTS) { + if (trackInfo.size() < MAXIMUM_INDIVIDUAL_COVER_ARTS) { // Load cover art of every track individually collector.commit(new BandcampStreamInfoItemExtractor( track.getString("title"), 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 index 1e2f8aa7f..e7ff3417a 100644 --- 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 @@ -2,8 +2,10 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONArray; -import org.json.JSONObject; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.InfoItemsCollector; import org.schabi.newpipe.extractor.StreamingService; @@ -12,7 +14,7 @@ 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.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import javax.annotation.Nonnull; @@ -43,20 +45,26 @@ public class BandcampRadioExtractor extends KioskExtractor { public InfoItemsPage getInitialPage() throws IOException, ExtractionException { InfoItemsCollector c = new StreamInfoItemsCollector(getServiceId()); - JSONObject json = new JSONObject( - getDownloader().get( - RADIO_API_URL - ).responseBody() - ); + try { - JSONArray radioShows = json.getJSONArray("results"); - - for (int i = 0; i < radioShows.length(); i++) { - JSONObject radioShow = radioShows.getJSONObject(i); - - c.commit( - new BandcampRadioInfoItemExtractor(radioShow) + JsonObject json = JsonParser.object().from( + getDownloader().get( + RADIO_API_URL + ).responseBody() ); + + JsonArray radioShows = json.getArray("results"); + + for (int i = 0; i < radioShows.size(); i++) { + JsonObject radioShow = radioShows.getObject(i); + + c.commit( + new BandcampRadioInfoItemExtractor(radioShow) + ); + } + + } catch (JsonParserException e) { + e.printStackTrace(); } return new InfoItemsPage(c, 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 index 2aeb79af3..adae3e557 100644 --- 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 @@ -2,7 +2,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor; @@ -14,9 +14,9 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { - private JSONObject show; + private JsonObject show; - public BandcampRadioInfoItemExtractor(JSONObject radioShow) { + public BandcampRadioInfoItemExtractor(JsonObject radioShow) { show = radioShow; } 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 index 3c1148c7c..98518b442 100644 --- 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 @@ -1,6 +1,8 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.jsoup.Jsoup; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.NewPipe; @@ -23,7 +25,7 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { - private JSONObject showInfo; + private JsonObject showInfo; private LinkHandler linkHandler; public BandcampRadioStreamExtractor(StreamingService service, LinkHandler linkHandler) { @@ -31,12 +33,12 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { this.linkHandler = linkHandler; } - static JSONObject query(int id) throws ParsingException { + static JsonObject query(int id) throws ParsingException { try { - return new JSONObject( + return JsonParser.object().from( NewPipe.getDownloader().get("https://bandcamp.com/api/bcweekly/1/get?id=" + id).responseBody() ); - } catch (IOException | ReCaptchaException e) { + } catch (IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("could not get show data", e); } } @@ -104,7 +106,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Override public List getAudioStreams() { ArrayList list = new ArrayList<>(); - JSONObject streams = showInfo.getJSONObject("audio_stream"); + JsonObject streams = showInfo.getObject("audio_stream"); if (streams.has("opus-lo")) { list.add(new AudioStream( 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 2300809d7..3785f8a13 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 @@ -2,8 +2,8 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParserException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -28,8 +28,8 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampStreamExtractor extends StreamExtractor { - private JSONObject albumJson; - private JSONObject current; + private JsonObject albumJson; + private JsonObject current; private Document document; public BandcampStreamExtractor(StreamingService service, LinkHandler linkHandler) { @@ -42,9 +42,9 @@ public class BandcampStreamExtractor extends StreamExtractor { String html = downloader.get(getLinkHandler().getUrl()).responseBody(); document = Jsoup.parse(html); albumJson = getAlbumInfoJson(html); - current = albumJson.getJSONObject("current"); + current = albumJson.getObject("current"); - if (albumJson.getJSONArray("trackinfo").length() > 1) { + if (albumJson.getArray("trackinfo").size() > 1) { // In this case, we are actually viewing an album page! throw new ExtractionException("Page is actually an album, not a track"); } @@ -57,10 +57,10 @@ public class BandcampStreamExtractor extends StreamExtractor { * @return Album metadata JSON * @throws ParsingException In case of a faulty website */ - public static JSONObject getAlbumInfoJson(String html) throws ParsingException { + public static JsonObject getAlbumInfoJson(String html) throws ParsingException { try { return BandcampExtractorHelper.getJSONFromJavaScriptVariables(html, "TralbumData"); - } catch (JSONException e) { + } catch (JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } catch (ArrayIndexOutOfBoundsException e) { throw new ParsingException("JSON does not exist", e); @@ -127,26 +127,14 @@ public class BandcampStreamExtractor extends StreamExtractor { public Description getDescription() { String s = BandcampExtractorHelper.smartConcatenate( new String[]{ - getStringOrNull(current, "about"), - getStringOrNull(current, "lyrics"), - getStringOrNull(current, "credits") + current.getString("about"), + current.getString("lyrics"), + current.getString("credits") }, "\n\n" ); return new Description(s, Description.PLAIN_TEXT); } - /** - * Avoid exceptions like "JSONObject["about"] not a string." and instead just return null. - * This is for the case that the actual JSON has something like "about": null. - */ - private String getStringOrNull(JSONObject jsonObject, String value) { - try { - return jsonObject.getString(value); - } catch (JSONException e) { - return null; - } - } - @Override public int getAgeLimit() throws ParsingException { return 0; @@ -194,8 +182,8 @@ public class BandcampStreamExtractor extends StreamExtractor { List audioStreams = new ArrayList<>(); audioStreams.add(new AudioStream( - albumJson.getJSONArray("trackinfo").getJSONObject(0) - .getJSONObject("file").getString("mp3-128"), + albumJson.getArray("trackinfo").getObject(0) + .getObject("file").getString("mp3-128"), MediaFormat.MP3, 128 )); return audioStreams; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index 6cf5d70b2..4a819ed40 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -2,8 +2,10 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.json.JSONArray; -import org.json.JSONObject; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; @@ -28,24 +30,30 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { public List suggestionList(String query) throws IOException, ExtractionException { Downloader downloader = NewPipe.getDownloader(); - JSONObject fuzzyResults = new JSONObject( - downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, CHARSET_UTF_8)).responseBody() - ); + try { + JsonObject fuzzyResults = JsonParser.object().from( + downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, CHARSET_UTF_8)).responseBody() + ); - JSONArray jsonArray = fuzzyResults.getJSONObject("auto") - .getJSONArray("results"); + JsonArray jsonArray = fuzzyResults.getObject("auto") + .getArray("results"); - ArrayList suggestions = new ArrayList<>(); + ArrayList suggestions = new ArrayList<>(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject fuzzyResult = jsonArray.getJSONObject(i); - String res = fuzzyResult.getString("name"); + for (int i = 0; i < jsonArray.size(); i++) { + JsonObject fuzzyResult = jsonArray.getObject(i); + String res = fuzzyResult.getString("name"); - if (!suggestions.contains(res)) suggestions.add(res); + if (!suggestions.contains(res)) suggestions.add(res); + } + + return suggestions; + } catch (JsonParserException e) { + e.printStackTrace(); + + return new ArrayList<>(); } - - return suggestions; } } 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 0d57eac01..94b45771e 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,8 +2,8 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -26,11 +26,11 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { String response = NewPipe.getDownloader().get(url).responseBody(); // This variable contains band data! - JSONObject bandData = BandcampExtractorHelper.getJSONFromJavaScriptVariables(response, "BandData"); + JsonObject bandData = BandcampExtractorHelper.getJSONFromJavaScriptVariables(response, "BandData"); return String.valueOf(bandData.getLong("id")); - } catch (IOException | ReCaptchaException | ArrayIndexOutOfBoundsException e) { + } catch (IOException | ReCaptchaException | ArrayIndexOutOfBoundsException | JsonParserException e) { throw new ParsingException("Download failed", e); } } @@ -44,7 +44,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { return BandcampChannelExtractor.getArtistDetails(id) .getString("bandcamp_url") .replace("http://", "https://"); - } catch (JSONException e) { + } catch (NullPointerException e) { throw new ParsingException("JSON does not contain URL (invalid id?) or is otherwise invalid", e); } From c133190c53ab9df70d3a809fd94c6e59dbba73fc Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 21:55:35 +0200 Subject: [PATCH 28/91] Bandcamp capitalization --- README.md | 2 +- .../org/schabi/newpipe/extractor/ServiceList.java | 4 ++-- .../bandcamp/BandcampChannelExtractorTest.java | 8 ++++---- .../bandcamp/BandcampFeaturedExtractorTest.java | 4 ++-- .../bandcamp/BandcampPlaylistExtractorTest.java | 12 ++++++------ .../bandcamp/BandcampRadioExtractorTest.java | 6 +++--- .../bandcamp/BandcampRadioStreamExtractorTest.java | 8 ++++---- .../bandcamp/BandcampSearchExtractorTest.java | 10 +++++----- .../BandcampSearchQueryHandlerFactoryTest.java | 4 ++-- .../bandcamp/BandcampStreamExtractorTest.java | 14 +++++++------- .../bandcamp/BandcampSuggestionExtractorTest.java | 4 ++-- 11 files changed, 38 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 2efee965a..368886dfb 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ The following sites are currently supported: - SoundCloud - MediaCCC - PeerTube (no P2P) -- bandcamp +- Bandcamp ## License diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java b/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java index d91083bfd..5bfc5692f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/ServiceList.java @@ -40,7 +40,7 @@ public final class ServiceList { public static final SoundcloudService SoundCloud; public static final MediaCCCService MediaCCC; public static final PeertubeService PeerTube; - public static final BandcampService bandcamp; + public static final BandcampService Bandcamp; /** * When creating a new service, put this service in the end of this list, @@ -52,7 +52,7 @@ public final class ServiceList { SoundCloud = new SoundcloudService(1), MediaCCC = new MediaCCCService(2), PeerTube = new PeertubeService(3), - bandcamp = new BandcampService(4) + Bandcamp = new BandcampService(4) )); /** diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 850529774..6aea55939 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -13,7 +13,7 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtract import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampChannelExtractorTest { @@ -22,7 +22,7 @@ public class BandcampChannelExtractorTest { @BeforeClass public static void setUp() throws Exception { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampChannelExtractor) bandcamp + extractor = (BandcampChannelExtractor) Bandcamp .getChannelExtractor("https://zachbenson.bandcamp.com/"); } @@ -51,11 +51,11 @@ public class BandcampChannelExtractorTest { @Test public void testGetNoAvatar() throws ExtractionException { - assertEquals("", bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getAvatarUrl()); + assertEquals("", Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getAvatarUrl()); } @Test public void testGetNoBanner() throws ExtractionException { - assertEquals("", bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getBannerUrl()); + assertEquals("", Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getBannerUrl()); } } 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 128841422..e02e45932 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 @@ -14,7 +14,7 @@ import java.io.IOException; import java.util.List; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampFeaturedExtractor} @@ -26,7 +26,7 @@ public class BandcampFeaturedExtractorTest { @BeforeClass public static void setUp() throws ExtractionException, IOException { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampFeaturedExtractor) bandcamp + extractor = (BandcampFeaturedExtractor) Bandcamp .getKioskList().getDefaultKioskExtractor(); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index 7d930ca8f..fc2f434cd 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.List; import static org.junit.Assert.*; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampPlaylistExtractor} @@ -33,7 +33,7 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testCount() throws ExtractionException, IOException { - PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); + PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); extractor.fetchPage(); assertEquals(5, extractor.getStreamCount()); @@ -44,7 +44,7 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testDifferentTrackCovers() throws ExtractionException, IOException { - PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://zachbensonarchive.bandcamp.com/album/results-of-boredom"); + PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachbensonarchive.bandcamp.com/album/results-of-boredom"); extractor.fetchPage(); List l = extractor.getInitialPage().getItems(); @@ -57,7 +57,7 @@ public class BandcampPlaylistExtractorTest { */ @Test(timeout = 10000L) public void testDifferentTrackCoversDuration() throws ExtractionException, IOException { - PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://infiniteammo.bandcamp.com/album/night-in-the-woods-vol-1-at-the-end-of-everything"); + PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://infiniteammo.bandcamp.com/album/night-in-the-woods-vol-1-at-the-end-of-everything"); extractor.fetchPage(); /* All tracks in this album have the same cover art, but I don't know any albums with more than 10 tracks @@ -73,7 +73,7 @@ public class BandcampPlaylistExtractorTest { */ @Test(expected = ContentNotAvailableException.class) public void testLockedContent() throws ExtractionException, IOException { - PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); + PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); extractor.fetchPage(); } @@ -82,7 +82,7 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testSingleStreamPlaylist() throws ExtractionException, IOException { - PlaylistExtractor extractor = bandcamp.getPlaylistExtractor("https://zachjohnson1.bandcamp.com/album/endless"); + PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachjohnson1.bandcamp.com/album/endless"); extractor.fetchPage(); assertEquals(1, extractor.getStreamCount()); 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 index 03ea7e3b1..c1f493c92 100644 --- 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 @@ -14,7 +14,7 @@ import java.io.IOException; import java.util.List; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampRadioExtractor} @@ -26,14 +26,14 @@ public class BandcampRadioExtractorTest { @BeforeClass public static void setUp() throws ExtractionException, IOException { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampRadioExtractor) bandcamp + extractor = (BandcampRadioExtractor) Bandcamp .getKioskList() .getExtractorById("Radio", null); } @Test public void testRadioCount() throws ExtractionException, IOException { - List list = bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); + List list = Bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); 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 index 9c9350bc3..760a833f7 100644 --- 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 @@ -12,7 +12,7 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamE import java.io.IOException; import static org.junit.Assert.*; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampRadioStreamExtractorTest { @@ -23,13 +23,13 @@ public class BandcampRadioStreamExtractorTest { @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); + 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"); + 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/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 1e6f9b579..ba8c147b5 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -20,7 +20,7 @@ import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Test for {@link BandcampSearchExtractor} @@ -41,7 +41,7 @@ public class BandcampSearchExtractorTest { */ @Test public void testStreamSearch() throws ExtractionException, IOException { - SearchExtractor extractor = bandcamp.getSearchExtractor("best friend's basement"); + SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement"); ListExtractor.InfoItemsPage page = extractor.getInitialPage(); InfoItem bestFriendsBasement = page.getItems().get(0); @@ -58,7 +58,7 @@ public class BandcampSearchExtractorTest { */ @Test public void testChannelSearch() throws ExtractionException, IOException { - SearchExtractor extractor = bandcamp.getSearchExtractor("C418"); + SearchExtractor extractor = Bandcamp.getSearchExtractor("C418"); InfoItem c418 = extractor.getInitialPage() .getItems().get(0); @@ -75,7 +75,7 @@ public class BandcampSearchExtractorTest { */ @Test public void testAlbumSearch() throws ExtractionException, IOException { - SearchExtractor extractor = bandcamp.getSearchExtractor("minecraft volume alpha"); + SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha"); InfoItem minecraft = extractor.getInitialPage() .getItems().get(0); @@ -96,7 +96,7 @@ public class BandcampSearchExtractorTest { @Test public void testMultiplePages() throws ExtractionException, IOException { // A query practically guaranteed to have the maximum amount of pages - SearchExtractor extractor = bandcamp.getSearchExtractor("e"); + SearchExtractor extractor = Bandcamp.getSearchExtractor("e"); assertEquals("https://bandcamp.com/search?q=e&page=2", extractor.getInitialPage().getNextPageUrl()); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java index 4158e655b..4271bc97c 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java @@ -10,7 +10,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; import static org.junit.Assert.assertEquals; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampSearchQueryHandlerFactoryTest { @@ -20,7 +20,7 @@ public class BandcampSearchQueryHandlerFactoryTest { public static void setUp() { NewPipe.init(DownloaderTestImpl.getInstance()); - searchQuery = (BandcampSearchQueryHandlerFactory) bandcamp + searchQuery = (BandcampSearchQueryHandlerFactory) Bandcamp .getSearchQHFactory(); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 5574c3408..1e5bd7eb9 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -15,7 +15,7 @@ import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampStreamExtractorTest { @@ -24,14 +24,14 @@ public class BandcampStreamExtractorTest { @BeforeClass public static void setUp() throws Exception { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampStreamExtractor) bandcamp + extractor = (BandcampStreamExtractor) Bandcamp .getStreamExtractor("https://zachbenson.bandcamp.com/track/kitchen"); extractor.fetchPage(); } @Test(expected = ExtractionException.class) public void testAlbum() throws ExtractionException { - bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/album/prom"); + Bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/album/prom"); } @Test @@ -66,7 +66,7 @@ public class BandcampStreamExtractorTest { @Test public void testNoArtistProfilePicture() throws ExtractionException { - assertEquals("", bandcamp.getStreamExtractor("https://powertothequeerkids.bandcamp.com/track/human-nature").getUploaderAvatarUrl()); + assertEquals("", Bandcamp.getStreamExtractor("https://powertothequeerkids.bandcamp.com/track/human-nature").getUploaderAvatarUrl()); } @Test @@ -77,19 +77,19 @@ public class BandcampStreamExtractorTest { @Test(expected = ParsingException.class) public void testInvalidUrl() throws ExtractionException { - bandcamp.getStreamExtractor("https://bandcamp.com"); + Bandcamp.getStreamExtractor("https://bandcamp.com"); } @Test public void testCategory() throws ExtractionException, IOException { - StreamExtractor se = bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); + StreamExtractor se = Bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); se.fetchPage(); assertEquals("acoustic", se.getCategory()); } @Test public void testLicense() throws ExtractionException, IOException { - StreamExtractor se = bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); + StreamExtractor se = Bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); se.fetchPage(); assertEquals("CC BY 3.0", se.getLicence()); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java index 77b4f26b5..68cdae518 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java @@ -13,7 +13,7 @@ import java.io.IOException; import java.util.List; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.bandcamp; +import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampSuggestionExtractor} @@ -25,7 +25,7 @@ public class BandcampSuggestionExtractorTest { @BeforeClass public static void setUp() { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampSuggestionExtractor) bandcamp.getSuggestionExtractor(); + extractor = (BandcampSuggestionExtractor) Bandcamp.getSuggestionExtractor(); } @Test From 67de0285e155f41c6810305b8dfe135da20086df Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:03:29 +0200 Subject: [PATCH 29/91] Bandcamp: Generate query JSON in a proper way --- .../extractors/BandcampChannelExtractor.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 9c1572cd4..fd068e60e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -2,10 +2,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import com.grack.nanojson.JsonArray; -import com.grack.nanojson.JsonObject; -import com.grack.nanojson.JsonParser; -import com.grack.nanojson.JsonParserException; +import com.grack.nanojson.*; import org.jsoup.Jsoup; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; @@ -43,7 +40,12 @@ public class BandcampChannelExtractor extends ChannelExtractor { NewPipe.getDownloader().post( "https://bandcamp.com/api/mobile/22/band_details", null, - ("{\"band_id\":\"" + id + "\"}").getBytes() + JsonWriter.string() + .object() + .value("band_id", id) + .end() + .done() + .getBytes() ).responseBody() ); } catch (IOException | ReCaptchaException | JsonParserException e) { From 433d72c26a9b96527ab02bc7827bb8534f53ae0b Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:04:10 +0200 Subject: [PATCH 30/91] Depend on nanojson fork in timeago-parser --- timeago-parser/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timeago-parser/build.gradle b/timeago-parser/build.gradle index bd99b48bb..3175269d0 100644 --- a/timeago-parser/build.gradle +++ b/timeago-parser/build.gradle @@ -1,6 +1,6 @@ dependencies { testImplementation 'junit:junit:4.12' - implementation 'com.grack:nanojson:1.1' + implementation 'com.github.wb9688:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' implementation 'com.github.spotbugs:spotbugs-annotations:3.1.0' } \ No newline at end of file From 00c03330596b00b2c6246cc29b5dccd84df1d7d5 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:06:48 +0200 Subject: [PATCH 31/91] Bandcamp: Fetch channelInfo in onFetchPage --- .../extractors/BandcampChannelExtractor.java | 5 +-- .../extractors/BandcampFeaturedExtractor.java | 8 +--- .../BandcampPlaylistInfoItemExtractor.java | 40 ++++++++++++++----- .../BandcampChannelExtractorTest.java | 10 ++++- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index fd068e60e..66d972ce0 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -22,10 +22,8 @@ public class BandcampChannelExtractor extends ChannelExtractor { private JsonObject channelInfo; - public BandcampChannelExtractor(StreamingService service, ListLinkHandler linkHandler) throws ParsingException { + public BandcampChannelExtractor(StreamingService service, ListLinkHandler linkHandler) { super(service, linkHandler); - - channelInfo = getArtistDetails(getId()); } /** @@ -156,6 +154,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + channelInfo = getArtistDetails(getId()); } @Nonnull 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 37bfd1aea..986bdc3b2 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 @@ -72,13 +72,7 @@ public class BandcampFeaturedExtractor extends KioskExtractor { continue; } - c.commit(new BandcampPlaylistInfoItemExtractor( - featuredStory.getString("album_title"), - featuredStory.getString("band_name"), - featuredStory.getString("item_url"), - featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : "", - featuredStory.getInt("num_streamable_tracks") - )); + c.commit(new BandcampPlaylistInfoItemExtractor(featuredStory)); } return new InfoItemsPage(c, null); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index 61551bac5..e146766c3 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -1,24 +1,44 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; import java.io.IOException; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; + public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { private String title, artist, url, cover; private int trackCount; - public BandcampPlaylistInfoItemExtractor(String title, String artist, String url, String cover, int trackCount) { - this.title = title; - this.artist = artist; - this.url = url; - this.cover = cover; - this.trackCount = trackCount; + public BandcampPlaylistInfoItemExtractor(Element searchResult) { + + Element resultInfo = searchResult.getElementsByClass("result-info").first(); + + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + cover = img.attr("src"); + } + + title = resultInfo.getElementsByClass("heading").text(); + url = resultInfo.getElementsByClass("itemurl").text(); + + artist = resultInfo.getElementsByClass("subhead").text() + .split(" by")[0]; + + String length = resultInfo.getElementsByClass("length").text(); + trackCount = Integer.parseInt(length.split(" track")[0]); + + } + + public BandcampPlaylistInfoItemExtractor(JsonObject featuredStory) { + title = featuredStory.getString("album_title"); + artist = featuredStory.getString("band_name"); + url = featuredStory.getString("item_url"); + cover = featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : ""; + trackCount = featuredStory.getInt("num_streamable_tracks"); } @Override diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 6aea55939..0d861eab3 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -6,6 +6,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.schabi.newpipe.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; @@ -18,12 +19,17 @@ import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampChannelExtractorTest { private static BandcampChannelExtractor extractor; + private static ChannelExtractor noAvatarExtractor; @BeforeClass public static void setUp() throws Exception { NewPipe.init(DownloaderTestImpl.getInstance()); extractor = (BandcampChannelExtractor) Bandcamp .getChannelExtractor("https://zachbenson.bandcamp.com/"); + extractor.fetchPage(); + + noAvatarExtractor = Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/"); + noAvatarExtractor.fetchPage(); } @Test @@ -51,11 +57,11 @@ public class BandcampChannelExtractorTest { @Test public void testGetNoAvatar() throws ExtractionException { - assertEquals("", Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getAvatarUrl()); + assertEquals("", noAvatarExtractor.getAvatarUrl()); } @Test public void testGetNoBanner() throws ExtractionException { - assertEquals("", Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/").getBannerUrl()); + assertEquals("", noAvatarExtractor.getBannerUrl()); } } From 82099592c72fff0f5aac77e0cd8d5b67269ff70c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:30:00 +0200 Subject: [PATCH 32/91] Bandcamp: Move code from SearchExtractor to InfoItemExtractors --- .../BandcampChannelInfoItemExtractor.java | 21 +++++++++--- .../BandcampPlaylistInfoItemExtractor.java | 3 +- .../extractors/BandcampSearchExtractor.java | 33 +++---------------- .../BandcampStreamInfoItemExtractor.java | 20 +++++++++++ 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java index 33d999117..2ff853407 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; +import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor; import org.schabi.newpipe.extractor.exceptions.ParsingException; @@ -9,11 +10,21 @@ public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtracto private String name, url, image, location; - public BandcampChannelInfoItemExtractor(String name, String url, String image, String location) { - this.name = name; - this.url = url; - this.image = image; - this.location = location; + public BandcampChannelInfoItemExtractor(Element searchResult) { + + Element resultInfo = searchResult.getElementsByClass("result-info").first(); + + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + image = img.attr("src"); + } + + name = resultInfo.getElementsByClass("heading").text(); + + location = resultInfo.getElementsByClass("subhead").text(); + + url = resultInfo.getElementsByClass("itemurl").text(); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index e146766c3..75d841723 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -1,10 +1,9 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; +import com.grack.nanojson.JsonObject; import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; -import java.io.IOException; - import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index cd27a01d9..3f6a35b1a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -43,49 +43,26 @@ public class BandcampSearchExtractor extends SearchExtractor { for (Element searchResult : searchResultsElements) { - Element resultInfo = searchResult.getElementsByClass("result-info").first(); - - String type = resultInfo + String type = searchResult.getElementsByClass("result-info").first() .getElementsByClass("itemtype").first().text(); - String image = null; - Element img = searchResult.getElementsByClass("art").first() - .getElementsByTag("img").first(); - if (img != null) { - image = img.attr("src"); - } - - String heading = resultInfo.getElementsByClass("heading").text(); - - String subhead = resultInfo.getElementsByClass("subhead").text(); - - String url = resultInfo.getElementsByClass("itemurl").text(); - switch (type) { default: continue; case "FAN": - //collector.commit Channel (?) with heading, url, image + // don't display fan results break; case "ARTIST": - collector.commit(new BandcampChannelInfoItemExtractor(heading, url, image, subhead)); + collector.commit(new BandcampChannelInfoItemExtractor(searchResult)); break; case "ALBUM": - String artist = subhead.split(" by")[0]; - String length = resultInfo.getElementsByClass("length").text(); - int tracks = Integer.parseInt(length.split(" track")[0]); - collector.commit(new BandcampPlaylistInfoItemExtractor(heading, artist, url, image, tracks)); + collector.commit(new BandcampPlaylistInfoItemExtractor(searchResult)); break; case "TRACK": - String[] splitBy = subhead.split(" by"); - String artist1 = null; - if (splitBy.length > 1) { - artist1 = subhead.split(" by")[1]; - } - collector.commit(new BandcampStreamInfoItemExtractor(heading, url, image, artist1)); + collector.commit(new BandcampStreamInfoItemExtractor(searchResult)); break; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java index dd51f7692..e29ac241b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; +import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; @@ -31,6 +32,25 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor this(title, url, cover, artist, -1); } + public BandcampStreamInfoItemExtractor(Element searchResult) { + Element resultInfo = searchResult.getElementsByClass("result-info").first(); + + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + cover = img.attr("src"); + } + + title = resultInfo.getElementsByClass("heading").text(); + url = resultInfo.getElementsByClass("itemurl").text(); + + String subhead = resultInfo.getElementsByClass("subhead").text(); + String[] splitBy = subhead.split(" by"); + if (splitBy.length > 1) { + artist = subhead.split(" by")[1]; + } + } + public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist, long duration) { this.title = title; this.url = url; From 965bce00cf61fb06513b6bbbc79e352dde828956 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:32:55 +0200 Subject: [PATCH 33/91] Bandcamp stream extractor: return NO_AGE_LIMIT --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3785f8a13..65ef05455 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 @@ -137,7 +137,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public int getAgeLimit() throws ParsingException { - return 0; + return NO_AGE_LIMIT; } @Override From 9201e0d3ea40dbbe0ae5e9e3d713365125e823c6 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 22:46:54 +0200 Subject: [PATCH 34/91] Don't declare exceptions that can't actually be thrown --- .../extractors/BandcampFeaturedExtractor.java | 4 ---- .../extractors/BandcampRadioExtractor.java | 2 +- .../extractors/BandcampStreamExtractor.java | 20 +++++++++---------- .../BandcampStreamInfoItemExtractor.java | 2 +- 4 files changed, 12 insertions(+), 16 deletions(-) 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 986bdc3b2..0456b4c2e 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 @@ -6,7 +6,6 @@ import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; -import org.schabi.newpipe.extractor.Collector; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.InfoItemsCollector; import org.schabi.newpipe.extractor.StreamingService; @@ -15,10 +14,7 @@ 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.PlaylistInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; -import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampFeaturedLinkHandlerFactory; import javax.annotation.Nonnull; import java.io.IOException; 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 index e7ff3417a..55a16edbe 100644 --- 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 @@ -76,7 +76,7 @@ public class BandcampRadioExtractor extends KioskExtractor { } @Override - public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { + public InfoItemsPage getPage(String pageUrl) { return null; } } 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 65ef05455..e38315af6 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 @@ -89,13 +89,13 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override - public String getUploaderName() throws ParsingException { + public String getUploaderName() { return albumJson.getString("artist"); } @Nullable @Override - public String getTextualUploadDate() throws ParsingException { + public String getTextualUploadDate() { return current.getString("release_date"); } @@ -136,44 +136,44 @@ public class BandcampStreamExtractor extends StreamExtractor { } @Override - public int getAgeLimit() throws ParsingException { + public int getAgeLimit() { return NO_AGE_LIMIT; } @Override - public long getLength() throws ParsingException { + public long getLength() { return 0; } @Override - public long getTimeStamp() throws ParsingException { + public long getTimeStamp() { return 0; } @Override - public long getViewCount() throws ParsingException { + public long getViewCount() { return -1; } @Override - public long getLikeCount() throws ParsingException { + public long getLikeCount() { return -1; } @Override - public long getDislikeCount() throws ParsingException { + public long getDislikeCount() { return -1; } @Nonnull @Override - public String getDashMpdUrl() throws ParsingException { + public String getDashMpdUrl() { return ""; } @Nonnull @Override - public String getHlsUrl() throws ParsingException { + public String getHlsUrl() { return null; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java index e29ac241b..4c2cd2319 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java @@ -128,7 +128,7 @@ public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor * There are no ads just like that, duh */ @Override - public boolean isAd() throws ParsingException { + public boolean isAd() { return false; } } From 10ae3db1184036e79c311583a3a0f2a6af5df6ad Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 23:03:12 +0200 Subject: [PATCH 35/91] Bandcamp javadoc: Replace br tags with p tags --- .../extractors/BandcampExtractorHelper.java | 6 +++--- .../BandcampStreamLinkHandlerFactory.java | 14 +++++++------- 2 files changed, 10 insertions(+), 10 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 39c7d1fdd..a9f4ec746 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 @@ -16,9 +16,9 @@ import java.util.Arrays; public class BandcampExtractorHelper { /** - * Get JSON behind var $variable = out of web page - *
- * Originally a part of bandcampDirect. + *

Get JSON behind var $variable = out of web page

+ * + *

Originally a part of bandcampDirect.

* * @param html The HTML where the JSON we're looking for is stored inside a * variable inside some JavaScript block 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 80a297df8..2d7495b97 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 @@ -6,10 +6,10 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; 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. + *

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 { @@ -43,9 +43,9 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { * Sometimes, the root page of an artist is also an album or track * page. In that case, it is assumed that one actually wants to open * the profile and not the track it has set as the default one. - *

Urls are expected to be in this format to account for - * custom domains: - *
https:// * . * /track/ * + *

Urls are expected to be in this format to account for + * custom domains:

+ * https:// * . * /track/ * */ @Override public boolean onAcceptUrl(String url) { From 8c70dab8c5fe978d74b381bdc92915222bd928ea Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 23:03:46 +0200 Subject: [PATCH 36/91] Bandcamp search query handler factory: inline variable --- .../bandcamp/extractors/BandcampSuggestionExtractor.java | 4 +--- .../linkHandler/BandcampSearchQueryHandlerFactory.java | 8 ++------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index 4a819ed40..ac75d859a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -17,8 +17,6 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import static org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory.CHARSET_UTF_8; - public class BandcampSuggestionExtractor extends SuggestionExtractor { private static final String AUTOCOMPLETE_URL = "https://bandcamp.com/api/fuzzysearch/1/autocomplete?q="; @@ -32,7 +30,7 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { try { JsonObject fuzzyResults = JsonParser.object().from( - downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, CHARSET_UTF_8)).responseBody() + downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, "UTF-8")).responseBody() ); JsonArray jsonArray = fuzzyResults.getObject("auto") diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java index 0fad75d5f..4a90c6c0e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java @@ -11,17 +11,13 @@ import java.util.List; public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory { - private static final String SEARCH_URL = "https://bandcamp.com/search?q="; - - public static final String CHARSET_UTF_8 = "UTF-8"; - @Override public String getUrl(String query, List contentFilter, String sortFilter) throws ParsingException { try { - return SEARCH_URL + - URLEncoder.encode(query, CHARSET_UTF_8) + return "https://bandcamp.com/search?q=" + + URLEncoder.encode(query, "UTF-8") + "&page=1"; } catch (UnsupportedEncodingException e) { From b5e251c82fdd61ba1187d5615364065f55212a75 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 23:06:41 +0200 Subject: [PATCH 37/91] =?UTF-8?q?Bandcamp=20channel=20extractor:=20package?= =?UTF-8?q?-private=20access=20for=20getImageUrl(=E2=80=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bandcamp/extractors/BandcampChannelExtractor.java | 2 +- .../services/bandcamp/BandcampChannelExtractorTest.java | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 66d972ce0..8b3cabfdb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -57,7 +57,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 * but we don't want something as large as 3460x3460 here, do we?) */ - public static String getImageUrl(long id, boolean album) { + static String getImageUrl(long id, boolean album) { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 0d861eab3..fe329d398 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -32,12 +32,6 @@ public class BandcampChannelExtractorTest { noAvatarExtractor.fetchPage(); } - @Test - public void testImageUrl() { - assertEquals("https://f4.bcbits.com/img/a2405652335_10.jpg", BandcampChannelExtractor.getImageUrl(2405652335L, true)); - assertEquals("https://f4.bcbits.com/img/17433693_10.jpg", BandcampChannelExtractor.getImageUrl(17433693L, false)); - } - @Test public void testTranslateIdsToUrl() throws ParsingException { assertEquals("https://zachbenson.bandcamp.com/album/covers", BandcampExtractorHelper.getStreamUrlFromIds(2862267535L, 2063639444L, "album")); From 5009d9f53b762af578b5b0cd4b932869e62c6c7a Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 23:25:00 +0200 Subject: [PATCH 38/91] Bandcamp tests: remove certain tests --- .../services/bandcamp/BandcampStreamExtractorTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 1e5bd7eb9..ccb891ce0 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -29,11 +29,6 @@ public class BandcampStreamExtractorTest { extractor.fetchPage(); } - @Test(expected = ExtractionException.class) - public void testAlbum() throws ExtractionException { - Bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/album/prom"); - } - @Test public void testServiceId() { } @@ -75,11 +70,6 @@ public class BandcampStreamExtractorTest { assertEquals(1, extractor.getAudioStreams().size()); } - @Test(expected = ParsingException.class) - public void testInvalidUrl() throws ExtractionException { - Bandcamp.getStreamExtractor("https://bandcamp.com"); - } - @Test public void testCategory() throws ExtractionException, IOException { StreamExtractor se = Bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); From f71bd29d58be131bb3783607a3395251fdb4cd29 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 20 Apr 2020 23:52:12 +0200 Subject: [PATCH 39/91] Bandcamp playlist extractor: add more tests --- .../BandcampPlaylistExtractorTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index fc2f434cd..8af486a1d 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -8,8 +8,11 @@ import org.schabi.newpipe.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; @@ -88,4 +91,61 @@ public class BandcampPlaylistExtractorTest { assertEquals(1, extractor.getStreamCount()); } + + public static class ComingOfAge { + + private static PlaylistExtractor extractor; + + @BeforeClass + public static void setUp() throws ExtractionException, IOException { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = Bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); + extractor.fetchPage(); + } + + @Test + public void getThumbnailUrl() throws ParsingException { + assertTrue(extractor.getThumbnailUrl().contains("f4.bcbits.com/img")); + } + + @Test + public void getBannerUrl() throws ParsingException { + assertEquals("", extractor.getBannerUrl()); + } + + @Test + public void getUploaderUrl() throws ParsingException { + assertTrue(extractor.getUploaderUrl().contains("macbenson.bandcamp.com")); + } + + @Test + public void getUploaderName() throws ParsingException { + assertEquals("mac benson", extractor.getUploaderName()); + } + + @Test + public void getUploaderAvatarUrl() throws ParsingException { + assertTrue(extractor.getUploaderAvatarUrl().contains("f4.bcbits.com/img")); + } + + @Test + public void getStreamCount() throws ParsingException { + assertEquals(5, extractor.getStreamCount()); + } + + @Test + public void getInitialPage() throws IOException, ExtractionException { + assertNotNull(extractor.getInitialPage().getItems().get(0)); + } + + @Test + public void getName() throws ParsingException { + assertEquals("Coming of Age", extractor.getName()); + } + + @Test + public void getNextPageUrl() throws IOException, ExtractionException { + assertNull(extractor.getNextPageUrl()); + } + } } From 9bc7a470abb3189b45d147b6f09ceb54338bf1d5 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 26 Apr 2020 23:02:14 +0200 Subject: [PATCH 40/91] Replace fori with foreach loop --- .../bandcamp/extractors/BandcampSuggestionExtractor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index ac75d859a..5ef4f3d56 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -38,9 +38,8 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { ArrayList suggestions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject fuzzyResult = jsonArray.getObject(i); - String res = fuzzyResult.getString("name"); + for (Object fuzzyResult : jsonArray) { + String res = ((JsonObject) fuzzyResult).getString("name"); if (!suggestions.contains(res)) suggestions.add(res); } From a3e8e1c70ed60d3b2e622d4b50eb461d289e9601 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 26 Apr 2020 23:05:56 +0200 Subject: [PATCH 41/91] Bandcamp: move own methods to helper class --- .../extractors/BandcampChannelExtractor.java | 42 ++----------------- .../extractors/BandcampExtractorHelper.java | 36 ++++++++++++++++ .../extractors/BandcampFeaturedExtractor.java | 2 - .../extractors/BandcampPlaylistExtractor.java | 2 +- .../BandcampPlaylistInfoItemExtractor.java | 2 +- .../BandcampRadioInfoItemExtractor.java | 2 +- .../BandcampRadioStreamExtractor.java | 2 +- .../extractors/BandcampStreamExtractor.java | 2 +- .../BandcampChannelLinkHandlerFactory.java | 3 +- 9 files changed, 45 insertions(+), 48 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 8b3cabfdb..4da4a44ef 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -4,7 +4,6 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import com.grack.nanojson.*; import org.jsoup.Jsoup; -import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.downloader.Downloader; @@ -26,46 +25,11 @@ public class BandcampChannelExtractor extends ChannelExtractor { super(service, linkHandler); } - /** - * Fetch artist details from mobile endpoint. - * - * I once took a moment to note down how it works. - */ - public static JsonObject getArtistDetails(String id) throws ParsingException { - try { - return - JsonParser.object().from( - NewPipe.getDownloader().post( - "https://bandcamp.com/api/mobile/22/band_details", - null, - JsonWriter.string() - .object() - .value("band_id", id) - .end() - .done() - .getBytes() - ).responseBody() - ); - } catch (IOException | ReCaptchaException | JsonParserException e) { - throw new ParsingException("Could not download band details", e); - } - } - - /** - * @param id The image ID - * @param album Whether this is the cover of an album - * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 - * but we don't want something as large as 3460x3460 here, do we?) - */ - static String getImageUrl(long id, boolean album) { - return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; - } - @Override public String getAvatarUrl() { if (channelInfo.getLong("bio_image_id") == 0) return ""; - return getImageUrl(channelInfo.getLong("bio_image_id"), false); + return BandcampExtractorHelper.getImageUrl(channelInfo.getLong("bio_image_id"), false); } /** @@ -132,7 +96,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { discograph.getLong("item_id"), discograph.getString("item_type") ), - getImageUrl( + BandcampExtractorHelper.getImageUrl( discograph.getLong("art_id"), true ), discograph.getString("band_name") @@ -154,7 +118,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { - channelInfo = getArtistDetails(getId()); + channelInfo = BandcampExtractorHelper.getArtistDetails(getId()); } @Nonnull 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 a9f4ec746..5371681a4 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 @@ -5,6 +5,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; +import com.grack.nanojson.JsonWriter; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -105,4 +106,39 @@ public class BandcampExtractorHelper { return String.valueOf(result); } + + /** + * Fetch artist details from mobile endpoint. + * + * I once took a moment to note down how it works. + */ + public static JsonObject getArtistDetails(String id) throws ParsingException { + try { + return + JsonParser.object().from( + NewPipe.getDownloader().post( + "https://bandcamp.com/api/mobile/22/band_details", + null, + JsonWriter.string() + .object() + .value("band_id", id) + .end() + .done() + .getBytes() + ).responseBody() + ); + } catch (IOException | ReCaptchaException | JsonParserException e) { + throw new ParsingException("Could not download band details", e); + } + } + + /** + * @param id The image ID + * @param album Whether this is the cover of an album + * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 + * but we don't want something as large as 3460x3460 here, do we?) + */ + static String getImageUrl(long id, boolean album) { + return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; + } } 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 0456b4c2e..d5d3c412d 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 @@ -19,8 +19,6 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; - public class BandcampFeaturedExtractor extends KioskExtractor { public static final String KIOSK_FEATURED = "Featured"; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index ddb78d3fa..ddc2b6b40 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -18,7 +18,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; 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.extractors.BandcampExtractorHelper.getImageUrl; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getJSONFromJavaScriptVariables; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor.getAlbumInfoJson; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index 75d841723..668dcddd7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -4,7 +4,7 @@ import com.grack.nanojson.JsonObject; import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { 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 index adae3e557..808c1afd3 100644 --- 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 @@ -10,7 +10,7 @@ import org.schabi.newpipe.extractor.stream.StreamType; import javax.annotation.Nullable; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { 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 index 98518b442..3780671ac 100644 --- 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 @@ -21,7 +21,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { 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 e38315af6..8353959fc 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 @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; public class BandcampStreamExtractor extends StreamExtractor { 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 94b45771e..370057dde 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 @@ -8,7 +8,6 @@ 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.linkhandler.ListLinkHandlerFactory; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; import java.io.IOException; @@ -41,7 +40,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { @Override public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { try { - return BandcampChannelExtractor.getArtistDetails(id) + return BandcampExtractorHelper.getArtistDetails(id) .getString("bandcamp_url") .replace("http://", "https://"); } catch (NullPointerException e) { From fff21caa87dfe6fcac5edee14a222d18e5d68618 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 25 May 2020 17:02:49 +0200 Subject: [PATCH 42/91] Fix Bandcamp no avatar test I own the bandcamp artist account called "NewPipeExtractorTest", so it shouldn't break again. --- .../services/bandcamp/BandcampChannelExtractorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index fe329d398..8224896cf 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -28,7 +28,7 @@ public class BandcampChannelExtractorTest { .getChannelExtractor("https://zachbenson.bandcamp.com/"); extractor.fetchPage(); - noAvatarExtractor = Bandcamp.getChannelExtractor("https://powertothequeerkids.bandcamp.com/"); + noAvatarExtractor = Bandcamp.getChannelExtractor("https://npet.bandcamp.com/"); noAvatarExtractor.fetchPage(); } From 692b2d06f48d469f965b74093c14060a77f6c555 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 25 May 2020 18:51:31 +0200 Subject: [PATCH 43/91] Bandcamp: read info item data in place and not in advance --- .../extractors/BandcampChannelExtractor.java | 14 +- .../BandcampChannelInfoItemExtractor.java | 30 ++-- .../extractors/BandcampExtractorHelper.java | 2 +- .../extractors/BandcampFeaturedExtractor.java | 11 +- .../extractors/BandcampPlaylistExtractor.java | 19 +-- .../BandcampPlaylistInfoItemExtractor.java | 50 ++----- ...campPlaylistInfoItemFeaturedExtractor.java | 41 ++++++ .../BandcampRadioInfoItemExtractor.java | 2 +- .../extractors/BandcampSearchExtractor.java | 4 +- .../BandcampStreamInfoItemExtractor.java | 134 ------------------ ...campDiscographStreamInfoItemExtractor.java | 46 ++++++ ...ndcampPlaylistStreamInfoItemExtractor.java | 69 +++++++++ ...BandcampSearchStreamInfoItemExtractor.java | 48 +++++++ .../BandcampStreamInfoItemExtractor.java | 54 +++++++ .../BandcampFeaturedExtractorTest.java | 3 +- .../BandcampPlaylistExtractorTest.java | 2 - 16 files changed, 303 insertions(+), 226 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java delete mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 4da4a44ef..446b962c7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -11,6 +11,7 @@ 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.ListLinkHandler; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem.BandcampDiscographStreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; @@ -89,18 +90,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { if (!discograph.getString("item_type").equals("track")) continue; - collector.commit(new BandcampStreamInfoItemExtractor( - discograph.getString("title"), - BandcampExtractorHelper.getStreamUrlFromIds( - discograph.getLong("band_id"), - discograph.getLong("item_id"), - discograph.getString("item_type") - ), - BandcampExtractorHelper.getImageUrl( - discograph.getLong("art_id"), true - ), - discograph.getString("band_name") - )); + collector.commit(new BandcampDiscographStreamInfoItemExtractor(discograph, getUrl())); } return new InfoItemsPage<>(collector, null); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java index 2ff853407..3baf45b3e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -8,43 +8,35 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtractor { - private String name, url, image, location; + private final Element resultInfo, searchResult; public BandcampChannelInfoItemExtractor(Element searchResult) { - - Element resultInfo = searchResult.getElementsByClass("result-info").first(); - - Element img = searchResult.getElementsByClass("art").first() - .getElementsByTag("img").first(); - if (img != null) { - image = img.attr("src"); - } - - name = resultInfo.getElementsByClass("heading").text(); - - location = resultInfo.getElementsByClass("subhead").text(); - - url = resultInfo.getElementsByClass("itemurl").text(); + this.searchResult = searchResult; + resultInfo = searchResult.getElementsByClass("result-info").first(); } @Override public String getName() throws ParsingException { - return name; + return resultInfo.getElementsByClass("heading").text(); } @Override public String getUrl() throws ParsingException { - return url; + return resultInfo.getElementsByClass("itemurl").text(); } @Override public String getThumbnailUrl() throws ParsingException { - return image; + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + return img.attr("src"); + } else return null; } @Override public String getDescription() { - return location; + return resultInfo.getElementsByClass("subhead").text(); } @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 5371681a4..cfe5c2df2 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 @@ -138,7 +138,7 @@ public class BandcampExtractorHelper { * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 * but we don't want something as large as 3460x3460 here, do we?) */ - static String getImageUrl(long id, boolean album) { + public static String getImageUrl(long id, boolean album) { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } } 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 d5d3c412d..82905d239 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 @@ -14,12 +14,13 @@ 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.PlaylistInfoItem; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; -public class BandcampFeaturedExtractor extends KioskExtractor { +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"; @@ -41,9 +42,9 @@ public class BandcampFeaturedExtractor extends KioskExtractor { @Nonnull @Override - public InfoItemsPage getInitialPage() throws IOException, ExtractionException { + public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - InfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); + PlaylistInfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); try { @@ -66,10 +67,10 @@ public class BandcampFeaturedExtractor extends KioskExtractor { continue; } - c.commit(new BandcampPlaylistInfoItemExtractor(featuredStory)); + c.commit(new BandcampPlaylistInfoItemFeaturedExtractor(featuredStory)); } - return new InfoItemsPage(c, null); + return new InfoItemsPage<>(c, null); } catch (JsonParserException e) { e.printStackTrace(); throw new ParsingException("JSON error", e); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index ddc2b6b40..b57644400 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -12,6 +12,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem.BandcampPlaylistStreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; @@ -111,22 +112,12 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { if (trackInfo.size() < MAXIMUM_INDIVIDUAL_COVER_ARTS) { // Load cover art of every track individually - collector.commit(new BandcampStreamInfoItemExtractor( - track.getString("title"), - getUploaderUrl() + track.getString("title_link"), - "", - track.getLong("duration"), - getService() - )); + collector.commit(new BandcampPlaylistStreamInfoItemExtractor( + track, getUploaderUrl(), getService())); } else { // Pretend every track has the same cover art as the album - collector.commit(new BandcampStreamInfoItemExtractor( - track.getString("title"), - getUploaderUrl() + track.getString("title_link"), - getThumbnailUrl(), - "", - track.getLong("duration") - )); + collector.commit(new BandcampPlaylistStreamInfoItemExtractor( + track, getUploaderUrl(), getThumbnailUrl())); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index 668dcddd7..b28d13d72 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -4,64 +4,42 @@ import com.grack.nanojson.JsonObject; import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; - public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { - - private String title, artist, url, cover; - private int trackCount; + private final Element searchResult, resultInfo; public BandcampPlaylistInfoItemExtractor(Element searchResult) { - - Element resultInfo = searchResult.getElementsByClass("result-info").first(); - - Element img = searchResult.getElementsByClass("art").first() - .getElementsByTag("img").first(); - if (img != null) { - cover = img.attr("src"); - } - - title = resultInfo.getElementsByClass("heading").text(); - url = resultInfo.getElementsByClass("itemurl").text(); - - artist = resultInfo.getElementsByClass("subhead").text() - .split(" by")[0]; - - String length = resultInfo.getElementsByClass("length").text(); - trackCount = Integer.parseInt(length.split(" track")[0]); - - } - - public BandcampPlaylistInfoItemExtractor(JsonObject featuredStory) { - title = featuredStory.getString("album_title"); - artist = featuredStory.getString("band_name"); - url = featuredStory.getString("item_url"); - cover = featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : ""; - trackCount = featuredStory.getInt("num_streamable_tracks"); + this.searchResult = searchResult; + resultInfo = searchResult.getElementsByClass("result-info").first(); } @Override public String getUploaderName() { - return artist; + return resultInfo.getElementsByClass("subhead").text() + .split(" by")[0]; } @Override public long getStreamCount() { - return trackCount; + String length = resultInfo.getElementsByClass("length").text(); + return Integer.parseInt(length.split(" track")[0]); } @Override public String getName() { - return title; + return resultInfo.getElementsByClass("heading").text(); } @Override public String getUrl() { - return url; + return resultInfo.getElementsByClass("itemurl").text(); } @Override public String getThumbnailUrl() { - return cover; + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + return img.attr("src"); + } else return null; } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java new file mode 100644 index 000000000..814794284 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java @@ -0,0 +1,41 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors; + +import com.grack.nanojson.JsonObject; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; + +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; + +public class BandcampPlaylistInfoItemFeaturedExtractor implements PlaylistInfoItemExtractor { + + private final JsonObject featuredStory; + + public BandcampPlaylistInfoItemFeaturedExtractor(JsonObject featuredStory) { + this.featuredStory = featuredStory; + } + + @Override + public String getUploaderName() { + return featuredStory.getString("band_name"); + } + + @Override + public long getStreamCount() { + return featuredStory.getInt("num_streamable_tracks"); + } + + @Override + public String getName() { + return featuredStory.getString("album_title"); + } + + @Override + public String getUrl() { + return featuredStory.getString("item_url"); + } + + @Override + public String getThumbnailUrl() { + return featuredStory.has("art_id") ? getImageUrl(featuredStory.getLong("art_id"), true) : ""; + } +} 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 index 808c1afd3..ebc843195 100644 --- 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 @@ -22,7 +22,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Override public long getDuration() { - /* Duration is only present in the more detailed information that has to be queried seperately. + /* Duration is only present in the more detailed information that has to be queried separately. * Because the servers would probably not like over 300 queries every time someone opens the kiosk, * we're just providing 0 here. */ diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 3f6a35b1a..8897d0406 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -13,6 +13,8 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler; import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem.BandcampPlaylistStreamInfoItemExtractor; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem.BandcampSearchStreamInfoItemExtractor; import javax.annotation.Nonnull; import java.io.IOException; @@ -62,7 +64,7 @@ public class BandcampSearchExtractor extends SearchExtractor { break; case "TRACK": - collector.commit(new BandcampStreamInfoItemExtractor(searchResult)); + collector.commit(new BandcampSearchStreamInfoItemExtractor(searchResult, null)); break; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java deleted file mode 100644 index 4c2cd2319..000000000 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampStreamInfoItemExtractor.java +++ /dev/null @@ -1,134 +0,0 @@ -// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later - -package org.schabi.newpipe.extractor.services.bandcamp.extractors; - -import org.jsoup.nodes.Element; -import org.schabi.newpipe.extractor.StreamingService; -import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.localization.DateWrapper; -import org.schabi.newpipe.extractor.stream.StreamExtractor; -import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor; -import org.schabi.newpipe.extractor.stream.StreamType; - -import javax.annotation.Nullable; -import java.io.IOException; - -public class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor { - - private String title; - private String url; - private String cover; - private String artist; - private long duration; - private StreamingService service; - - public BandcampStreamInfoItemExtractor(String title, String url, String artist, long duration, StreamingService service) { - this(title, url, null, artist, duration); - this.service = service; - } - - public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist) { - this(title, url, cover, artist, -1); - } - - public BandcampStreamInfoItemExtractor(Element searchResult) { - Element resultInfo = searchResult.getElementsByClass("result-info").first(); - - Element img = searchResult.getElementsByClass("art").first() - .getElementsByTag("img").first(); - if (img != null) { - cover = img.attr("src"); - } - - title = resultInfo.getElementsByClass("heading").text(); - url = resultInfo.getElementsByClass("itemurl").text(); - - String subhead = resultInfo.getElementsByClass("subhead").text(); - String[] splitBy = subhead.split(" by"); - if (splitBy.length > 1) { - artist = subhead.split(" by")[1]; - } - } - - public BandcampStreamInfoItemExtractor(String title, String url, String cover, String artist, long duration) { - this.title = title; - this.url = url; - this.cover = cover; - this.artist = artist; - this.duration = duration; - } - - @Override - public StreamType getStreamType() { - return StreamType.AUDIO_STREAM; - } - - @Override - public long getDuration() { - return duration; - } - - @Override - public long getViewCount() { - return -1; - } - - @Override - public String getUploaderName() { - return artist; - } - - @Override - public String getUploaderUrl() { - return null; - } - - @Nullable - @Override - public String getTextualUploadDate() { - return null; // TODO - } - - @Nullable - @Override - public DateWrapper getUploadDate() { - return null; - } - - @Override - public String getName() throws ParsingException { - return title; - } - - @Override - public String getUrl() throws ParsingException { - return url; - } - - /** - * There is no guarantee that every track of an album has the same cover art, so it needs to be fetched - * per-track if in playlist view - */ - @Override - public String getThumbnailUrl() throws ParsingException { - if (cover != null) return cover; - else { - try { - StreamExtractor extractor = service.getStreamExtractor(getUrl()); - extractor.fetchPage(); - return extractor.getThumbnailUrl(); - } catch (ExtractionException | IOException e) { - throw new ParsingException("could not download cover art location", e); - } - } - } - - /** - * There are no ads just like that, duh - */ - @Override - public boolean isAd() { - return false; - } -} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java new file mode 100644 index 000000000..4c76b404d --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java @@ -0,0 +1,46 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem; + +import com.grack.nanojson.JsonObject; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; + +public class BandcampDiscographStreamInfoItemExtractor extends BandcampStreamInfoItemExtractor { + + private final JsonObject discograph; + public BandcampDiscographStreamInfoItemExtractor(JsonObject discograph, String uploaderUrl) { + super(uploaderUrl); + + this.discograph = discograph; + } + + @Override + public String getUploaderName() { + return discograph.getString("band_name"); + } + + @Override + public String getName() { + return discograph.getString("title"); + } + + @Override + public String getUrl() throws ParsingException { + return BandcampExtractorHelper.getStreamUrlFromIds( + discograph.getLong("band_id"), + discograph.getLong("item_id"), + discograph.getString("item_type") + ); + } + + @Override + public String getThumbnailUrl() throws ParsingException { + return BandcampExtractorHelper.getImageUrl( + discograph.getLong("art_id"), true + ); + } + + @Override + public long getDuration() { + return -1; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java new file mode 100644 index 000000000..6faf397ae --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java @@ -0,0 +1,69 @@ +// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later + +package org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem; + +import com.grack.nanojson.JsonObject; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.stream.StreamExtractor; + +import java.io.IOException; + + +public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoItemExtractor { + + private final JsonObject track; + private String substituteCoverUrl; + private StreamingService service; + + public BandcampPlaylistStreamInfoItemExtractor(JsonObject track, String uploaderUrl, StreamingService service) { + super(uploaderUrl); + this.track = track; + this.service = service; + } + + public BandcampPlaylistStreamInfoItemExtractor(JsonObject track, String uploaderUrl, String substituteCoverUrl) { + this(track, uploaderUrl, (StreamingService) null); + this.substituteCoverUrl = substituteCoverUrl; + } + + @Override + public String getName() { + return track.getString("title"); + } + + @Override + public String getUrl() { + return getUploaderUrl() + track.getString("title_link"); + } + + @Override + public long getDuration() { + return track.getLong("duration"); + } + + @Override + public String getUploaderName() { + return ""; + } + + /** + * Each track can have its own cover art. Therefore, unless a substitute is provided, + * the thumbnail is extracted using a stream extractor. + */ + @Override + public String getThumbnailUrl() throws ParsingException { + if (substituteCoverUrl != null) { + return substituteCoverUrl; + } else { + try { + StreamExtractor extractor = service.getStreamExtractor(getUrl()); + extractor.fetchPage(); + return extractor.getThumbnailUrl(); + } catch (ExtractionException | IOException e) { + throw new ParsingException("could not download cover art location", e); + } + } + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java new file mode 100644 index 000000000..51fbe019d --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java @@ -0,0 +1,48 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem; + +import org.jsoup.nodes.Element; +import org.schabi.newpipe.extractor.exceptions.ParsingException; + +public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoItemExtractor { + + private final Element resultInfo, searchResult; + + public BandcampSearchStreamInfoItemExtractor(Element searchResult, String uploaderUrl) { + super(uploaderUrl); + this.searchResult = searchResult; + resultInfo = searchResult.getElementsByClass("result-info").first(); + } + + @Override + public String getUploaderName() throws ParsingException { + String subhead = resultInfo.getElementsByClass("subhead").text(); + String[] splitBy = subhead.split(" by"); + if (splitBy.length > 1) { + return splitBy[1]; + } else throw new ParsingException("Uploader name was not found as expected"); + } + + @Override + public String getName() throws ParsingException { + return resultInfo.getElementsByClass("heading").text(); + } + + @Override + public String getUrl() throws ParsingException { + return resultInfo.getElementsByClass("itemurl").text(); + } + + @Override + public String getThumbnailUrl() throws ParsingException { + Element img = searchResult.getElementsByClass("art").first() + .getElementsByTag("img").first(); + if (img != null) { + return img.attr("src"); + } else return null; + } + + @Override + public long getDuration() { + return -1; + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java new file mode 100644 index 000000000..a8a3ceb46 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java @@ -0,0 +1,54 @@ +package org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem; + +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; + +/** + * Implements methods that return a constant value for better readability in + * subclasses. + */ +public abstract class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor { + private final String uploaderUrl; + + public BandcampStreamInfoItemExtractor(String uploaderUrl) { + this.uploaderUrl = uploaderUrl; + } + + @Override + public StreamType getStreamType() { + return StreamType.AUDIO_STREAM; + } + + @Override + public long getViewCount() { + return -1; + } + + @Override + public String getUploaderUrl() { + return uploaderUrl; + } + + @Nullable + @Override + public String getTextualUploadDate() { + return null; + } + + @Nullable + @Override + public DateWrapper getUploadDate() { + return null; + } + + /** + * There are no ads just like that, duh + */ + @Override + public boolean isAd() { + return false; + } +} 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 e02e45932..09f516be9 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 @@ -8,6 +8,7 @@ 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.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor; import java.io.IOException; @@ -32,7 +33,7 @@ public class BandcampFeaturedExtractorTest { @Test public void testFeaturedCount() throws ExtractionException, IOException { - List list = extractor.getInitialPage().getItems(); + List list = extractor.getInitialPage().getItems(); assertTrue(list.size() > 1); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index 8af486a1d..88836efab 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -11,8 +11,6 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; From e08256ebc6ac71f3d1b3d94db1f81359e3e69cb9 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 25 May 2020 19:17:27 +0200 Subject: [PATCH 44/91] Remove "url cleanup" in Bandcamp link handlers --- .../linkHandler/BandcampPlaylistLinkHandlerFactory.java | 7 ++----- .../linkHandler/BandcampStreamLinkHandlerFactory.java | 9 +++------ .../bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java | 1 + .../bandcamp/BandcampStreamLinkHandlerFactoryTest.java | 5 ----- 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java index e7aac43e2..9a736b30f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java @@ -18,14 +18,11 @@ public class BandcampPlaylistLinkHandlerFactory extends ListLinkHandlerFactory { @Override public String getUrl(String url, List contentFilter, String sortFilter) throws ParsingException { - if (url.endsWith("/")) - url = url.substring(0, url.length() - 1); - url = url.replace("http://", "https://").toLowerCase(); return url; } @Override - public boolean onAcceptUrl(String url) throws ParsingException { - return getUrl(url).matches("https?://.+\\..+/album/.+"); + public boolean onAcceptUrl(String url) { + return url.toLowerCase().matches("https?://.+\\..+/album/.+"); } } 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 2d7495b97..176c2e2ba 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 @@ -7,7 +7,7 @@ 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.

+ * That's why id = url.

* *

Radio (bandcamp weekly) shows do have ids.

*/ @@ -33,10 +33,7 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { 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; + else return input; } /** @@ -49,6 +46,6 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { */ @Override public boolean onAcceptUrl(String url) { - return getUrl(url).matches("https?://.+\\..+/track/.+") || getUrl(url).matches("https?://bandcamp\\.com/\\?show=\\d+"); + return url.toLowerCase().matches("https?://.+\\..+/track/.+") || url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java index 1da3069c9..f9cf9b1a7 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java @@ -40,6 +40,7 @@ public class BandcampPlaylistLinkHandlerFactoryTest { // Tests expecting true assertTrue(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/album/prom")); + assertTrue(linkHandler.acceptUrl("https://MACBENSON.BANDCAMP.COM/ALBUM/COMING-OF-AGE")); } } 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 9cbd03295..3942fb1f1 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 @@ -25,11 +25,6 @@ public class BandcampStreamLinkHandlerFactoryTest { NewPipe.init(DownloaderTestImpl.getInstance()); } - @Test - public void testUrlCleanup() { - 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")); From 89b0639faa9948befa7f8c651a21e3d2e415b826 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Mon, 25 May 2020 20:22:23 +0200 Subject: [PATCH 45/91] New Bandcamp tests for channel extractor --- .../BandcampChannelExtractorTest.java | 91 +++++++++++++------ .../bandcamp/BandcampStreamExtractorTest.java | 6 ++ 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 8224896cf..2d1c38e30 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -8,54 +8,89 @@ import org.schabi.newpipe.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; +import org.schabi.newpipe.extractor.services.BaseChannelExtractorTest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import java.io.IOException; + +import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; -public class BandcampChannelExtractorTest { +public class BandcampChannelExtractorTest implements BaseChannelExtractorTest { - private static BandcampChannelExtractor extractor; - private static ChannelExtractor noAvatarExtractor; + private static ChannelExtractor extractor; @BeforeClass public static void setUp() throws Exception { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = (BandcampChannelExtractor) Bandcamp - .getChannelExtractor("https://zachbenson.bandcamp.com/"); + extractor = Bandcamp.getChannelExtractor("https://npet.bandcamp.com/releases"); extractor.fetchPage(); - - noAvatarExtractor = Bandcamp.getChannelExtractor("https://npet.bandcamp.com/"); - noAvatarExtractor.fetchPage(); } @Test - public void testTranslateIdsToUrl() throws ParsingException { - assertEquals("https://zachbenson.bandcamp.com/album/covers", BandcampExtractorHelper.getStreamUrlFromIds(2862267535L, 2063639444L, "album")); - // TODO write more test cases + public void testLength() throws ExtractionException, IOException { + assertTrue(extractor.getInitialPage().getItems().size() >= 1); } + @Override @Test - public void testLength() throws ParsingException { - assertTrue(extractor.getInitialPage().getItems().size() > 2); + public void testDescription() throws Exception { + assertEquals("This string will be tested for in NewPipeExtractor tests.", extractor.getDescription()); } - @Test - public void testGetBannerUrl() throws ParsingException { - // Why is this picture in png format when all other pictures are jpg? - assertTrue(extractor.getBannerUrl().endsWith(".png")); + @Override + public void testAvatarUrl() throws Exception { + // Has no avatar + assertEquals("", extractor.getAvatarUrl()); } - @Test - public void testGetNoAvatar() throws ExtractionException { - assertEquals("", noAvatarExtractor.getAvatarUrl()); + @Override + public void testBannerUrl() throws Exception { + // Has no banner + assertEquals("", extractor.getBannerUrl()); } - @Test - public void testGetNoBanner() throws ExtractionException { - assertEquals("", noAvatarExtractor.getBannerUrl()); + @Override + public void testFeedUrl() throws Exception { + assertNull(extractor.getFeedUrl()); + } + + @Override + public void testSubscriberCount() throws Exception { + assertEquals(-1, extractor.getSubscriberCount()); + } + + @Override + public void testRelatedItems() throws Exception { + // not implemented + } + + @Override + public void testMoreRelatedItems() throws Exception { + // not implemented + } + + @Override + public void testServiceId() throws Exception { + assertEquals(4, extractor.getServiceId()); + } + + @Override + public void testName() throws Exception { + assertEquals("NewPipeExtractorTest", extractor.getName()); + } + + @Override + public void testId() throws Exception { + assertEquals("https://npet.bandcamp.com/", extractor.getId()); + } + + @Override + public void testUrl() throws Exception { + assertEquals("https://npet.bandcamp.com/releases", extractor.getUrl()); + } + + @Override + public void testOriginalUrl() throws Exception { + assertEquals("https://npet.bandcamp.com/releases", extractor.getUrl()); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index ccb891ce0..c4d268226 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -8,6 +8,7 @@ import org.schabi.newpipe.DownloaderTestImpl; 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.services.bandcamp.extractors.BandcampExtractorHelper; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamExtractor; @@ -84,5 +85,10 @@ public class BandcampStreamExtractorTest { assertEquals("CC BY 3.0", se.getLicence()); } + @Test + public void testTranslateIdsToUrl() throws ParsingException { + assertEquals("https://zachbenson.bandcamp.com/album/covers", BandcampExtractorHelper.getStreamUrlFromIds(2862267535L, 2063639444L, "album")); + // TODO write more test cases + } } From 9fa9d920a9e17b7703bed8fde5cd4db4be8705aa Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Wed, 3 Jun 2020 21:35:11 +0200 Subject: [PATCH 46/91] Bandcamp: Implement new methods required due to interface changes --- .../extractors/BandcampChannelExtractor.java | 15 +++++++++++++++ .../extractors/BandcampPlaylistExtractor.java | 18 ++++++++++++++++++ .../extractors/BandcampSearchExtractor.java | 5 +++++ .../extractors/BandcampStreamExtractor.java | 18 ++++++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 446b962c7..5a8d4d5f6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -76,6 +76,21 @@ public class BandcampChannelExtractor extends ChannelExtractor { return channelInfo.getString("bio"); } + @Override + public String getParentChannelName() { + return null; + } + + @Override + public String getParentChannelUrl() { + return null; + } + + @Override + public String getParentChannelAvatarUrl() { + return null; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws ParsingException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index b57644400..7b9da51cd 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -101,6 +101,24 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { return trackInfo.size(); } + @Nonnull + @Override + public String getSubChannelName() { + return ""; + } + + @Nonnull + @Override + public String getSubChannelUrl() { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws ExtractionException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 8897d0406..4b5672b49 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -30,6 +30,11 @@ public class BandcampSearchExtractor extends SearchExtractor { return null; } + @Override + public boolean isCorrectedSearch() { + return false; + } + @Override public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { // okay apparently this is where we DOWNLOAD the page and then COMMIT its ENTRIES to an INFOITEMPAGE 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 8353959fc..b6ed0a5da 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 @@ -122,6 +122,24 @@ public class BandcampStreamExtractor extends StreamExtractor { } } + @Nonnull + @Override + public String getSubChannelUrl() { + return ""; + } + + @Nonnull + @Override + public String getSubChannelName() { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() { + return ""; + } + @Nonnull @Override public Description getDescription() { From 3940138fc51306c9ad9010e5776f313bf5d919e8 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Wed, 3 Jun 2020 22:41:27 +0200 Subject: [PATCH 47/91] Fix Bandcamp capitalization in one more spot --- .../newpipe/extractor/services/bandcamp/BandcampService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1aa5b3c77..a94638a3f 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 @@ -29,7 +29,7 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampService extends StreamingService { public BandcampService(int id) { - super(id, "bandcamp", Collections.singletonList(AUDIO)); + super(id, "Bandcamp", Collections.singletonList(AUDIO)); } @Override From de776561b0eeff079f614a97a2ecf1f46c6a1581 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 12:02:18 +0200 Subject: [PATCH 48/91] Bandcamp: fix loading uploader from streams in search --- .../BandcampSearchStreamInfoItemExtractor.java | 8 +++++--- .../services/bandcamp/BandcampSearchExtractorTest.java | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java index 51fbe019d..6d88edc1c 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java @@ -14,12 +14,14 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte } @Override - public String getUploaderName() throws ParsingException { + public String getUploaderName() { String subhead = resultInfo.getElementsByClass("subhead").text(); - String[] splitBy = subhead.split(" by"); + String[] splitBy = subhead.split("by "); if (splitBy.length > 1) { return splitBy[1]; - } else throw new ParsingException("Uploader name was not found as expected"); + } else { + return splitBy[0]; + } } @Override diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index ba8c147b5..a1b44b63b 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -15,6 +15,7 @@ import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; @@ -44,10 +45,11 @@ public class BandcampSearchExtractorTest { SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement"); ListExtractor.InfoItemsPage page = extractor.getInitialPage(); - InfoItem bestFriendsBasement = page.getItems().get(0); + StreamInfoItem bestFriendsBasement = (StreamInfoItem) page.getItems().get(0); // The track by Zach Benson should be the first result, no? assertEquals("Best Friend's Basement", bestFriendsBasement.getName()); + assertEquals("Zach Benson", bestFriendsBasement.getUploaderName()); assertTrue(bestFriendsBasement.getThumbnailUrl().endsWith(".jpg")); assertTrue(bestFriendsBasement.getThumbnailUrl().contains("f4.bcbits.com/img/")); assertEquals(InfoItem.InfoType.STREAM, bestFriendsBasement.getInfoType()); From 8f6c00f8d81d16de1b2f08a72452ebc5ad03c88c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 12:12:20 +0200 Subject: [PATCH 49/91] Use default test in BandcampSearchExtractorTest --- .../bandcamp/BandcampSearchExtractorTest.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index a1b44b63b..532f27a53 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -9,9 +9,11 @@ import org.schabi.newpipe.extractor.Extractor; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.DefaultSearchExtractorTest; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; @@ -19,6 +21,8 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; +import javax.annotation.Nullable; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; @@ -28,8 +32,6 @@ import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; */ public class BandcampSearchExtractorTest { - private static BandcampSearchExtractor extractor; - @BeforeClass public static void setUp() { NewPipe.init(DownloaderTestImpl.getInstance()); @@ -104,4 +106,25 @@ public class BandcampSearchExtractorTest { assertEquals("https://bandcamp.com/search?q=e&page=3", extractor.getPage(extractor.getNextPageUrl()).getNextPageUrl()); } + + public static class DefaultTest extends DefaultSearchExtractorTest { + private static SearchExtractor extractor; + private static final String QUERY = "test"; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = Bandcamp.getSearchExtractor(QUERY); + extractor.fetchPage(); + } + + @Override public SearchExtractor extractor() { return extractor; } + @Override public StreamingService expectedService() { return Bandcamp; } + @Override public String expectedName() { return QUERY; } + @Override public String expectedId() { return QUERY; } + @Override public String expectedUrlContains() { return "bandcamp.com/search?q=" + QUERY; } + @Override public String expectedOriginalUrlContains() { return "bandcamp.com/search?q=" + QUERY; } + @Override public String expectedSearchString() { return QUERY; } + @Nullable @Override public String expectedSearchSuggestion() { return null; } + } } From e98bff8ae96f498987add5fbd182385f0d9899a2 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 12:30:53 +0200 Subject: [PATCH 50/91] Improved Bandcamp radio stream extractor tests --- .../BandcampRadioStreamExtractorTest.java | 75 ++++++++++++++++++- 1 file changed, 71 insertions(+), 4 deletions(-) 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 index 760a833f7..2da8ec913 100644 --- 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 @@ -6,8 +6,10 @@ 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.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioStreamExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; +import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; @@ -16,9 +18,15 @@ import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; public class BandcampRadioStreamExtractorTest { + private static StreamExtractor e; + + private static final String SHOW_URL = "https://bandcamp.com/?show=230"; + @BeforeClass - public static void setUp() { + public static void setUp() throws IOException, ExtractionException { NewPipe.init(DownloaderTestImpl.getInstance()); + e = Bandcamp.getStreamExtractor(SHOW_URL); + e.fetchPage(); } @Test @@ -28,10 +36,69 @@ public class BandcampRadioStreamExtractorTest { } @Test - public void testExtracting() throws ExtractionException, IOException { - BandcampRadioStreamExtractor e = (BandcampRadioStreamExtractor) Bandcamp.getStreamExtractor("https://bandcamp.com/?show=230"); - e.fetchPage(); + public void testGetName() throws ParsingException { assertEquals("Sound Movements", e.getName()); + } + + @Test + public void testGetUploaderUrl() { + } + + @Test + public void testGetUrl() throws ParsingException { + assertEquals(SHOW_URL, e.getUrl()); + } + + @Test + public void testGetUploaderName() throws ParsingException { assertEquals("Andrew Jervis", e.getUploaderName()); } + + @Test + public void testGetTextualUploadDate() throws ParsingException { + assertEquals("16 May 2017", e.getTextualUploadDate()); + + } + + @Test + public void testGetThumbnailUrl() throws ParsingException { + assertTrue(e.getThumbnailUrl().contains("bcbits.com/img")); + } + + @Test + public void testGetUploaderAvatarUrl() throws ParsingException { + assertTrue(e.getUploaderAvatarUrl().contains("bandcamp-button")); + + } + + @Test + public void testGetDescription() throws ParsingException { + assertEquals("Featuring special guests Nick Hakim and Elbows, plus fresh cuts from Eddie Palmieri, KRS One, Ladi6, and Moonchild.", e.getDescription().getContent()); + + } + + @Test + public void testGetLength() throws ParsingException { + assertEquals(5619, e.getLength()); + } + + @Test + public void testGetAudioStreams() throws ExtractionException, IOException { + assertEquals(2, e.getAudioStreams().size()); + } + + @Test + public void testGetLicence() throws ParsingException { + assertEquals("", e.getLicence()); + } + + @Test + public void testGetCategory() throws ParsingException { + assertEquals("", e.getCategory()); + } + + @Test + public void testGetTags() throws ParsingException { + assertEquals(0, e.getTags().size()); + } } From 6822fe3dc8c1502c7dd83d0a0dcd6154ce505cfd Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 13:03:16 +0200 Subject: [PATCH 51/91] Bandcamp: Get Stream upload date --- .../bandcamp/extractors/BandcampStreamExtractor.java | 2 +- .../services/bandcamp/BandcampStreamExtractorTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) 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 b6ed0a5da..b33670ecc 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 @@ -96,7 +96,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nullable @Override public String getTextualUploadDate() { - return current.getString("release_date"); + return current.getString("publish_date").replaceAll(" \\d+:\\d+:\\d+ .+", ""); } @Nullable diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index c4d268226..c280bcb77 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -60,6 +60,11 @@ public class BandcampStreamExtractorTest { assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); } + @Test + public void testUploadDate() { + assertEquals("27 Sep 2019", extractor.getTextualUploadDate()); + } + @Test public void testNoArtistProfilePicture() throws ExtractionException { assertEquals("", Bandcamp.getStreamExtractor("https://powertothequeerkids.bandcamp.com/track/human-nature").getUploaderAvatarUrl()); From 1be20ceeec6a06aa1030f3912545428e2137397c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 14:09:21 +0200 Subject: [PATCH 52/91] Bandcamp: parse date --- .../BandcampRadioStreamExtractor.java | 2 +- .../extractors/BandcampStreamExtractor.java | 18 +++++++++++++++--- .../BandcampRadioStreamExtractorTest.java | 5 +++++ .../bandcamp/BandcampStreamExtractorTest.java | 5 +++-- 4 files changed, 24 insertions(+), 6 deletions(-) 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 index 3780671ac..8a69931c0 100644 --- 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 @@ -77,7 +77,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nullable @Override public String getTextualUploadDate() { - return showInfo.getString("published_date").replace(" 00:00:00 GMT", ""); + return showInfo.getString("published_date"); } @Nonnull 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 b33670ecc..1e69fa9f1 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 @@ -20,7 +20,11 @@ import org.schabi.newpipe.extractor.stream.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.List; import java.util.Locale; @@ -96,13 +100,21 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nullable @Override public String getTextualUploadDate() { - return current.getString("publish_date").replaceAll(" \\d+:\\d+:\\d+ .+", ""); + return current.getString("publish_date"); } @Nullable @Override - public DateWrapper getUploadDate() { - return null; + public DateWrapper getUploadDate() throws ParsingException { + try { + Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(getTextualUploadDate()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return new DateWrapper(calendar, false); + } catch (ParseException e) { + e.printStackTrace(); + throw new ParsingException("Could not extract date", e); + } } @Nonnull 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 index 2da8ec913..7dd371c28 100644 --- 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 @@ -12,6 +12,7 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamE import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; +import java.util.Calendar; import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; @@ -57,7 +58,11 @@ public class BandcampRadioStreamExtractorTest { @Test public void testGetTextualUploadDate() throws ParsingException { assertEquals("16 May 2017", e.getTextualUploadDate()); + } + @Test + public void testUploadDate() throws ParsingException { + assertEquals(136, e.getUploadDate().date().get(Calendar.DAY_OF_YEAR)); } @Test diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index c280bcb77..7c8d4c863 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -13,6 +13,7 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamE import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; +import java.util.Calendar; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -61,8 +62,8 @@ public class BandcampStreamExtractorTest { } @Test - public void testUploadDate() { - assertEquals("27 Sep 2019", extractor.getTextualUploadDate()); + public void testUploadDate() throws ParsingException { + assertEquals(270, extractor.getUploadDate().date().get(Calendar.DAY_OF_YEAR)); } @Test From 34b6928124bd0860061deea2e38cbd24dd40085c Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 14:25:38 +0200 Subject: [PATCH 53/91] Don't print stacktrace before throwing new exception --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 1 - 1 file changed, 1 deletion(-) 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 1e69fa9f1..62b85f1d3 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 @@ -112,7 +112,6 @@ public class BandcampStreamExtractor extends StreamExtractor { calendar.setTime(date); return new DateWrapper(calendar, false); } catch (ParseException e) { - e.printStackTrace(); throw new ParsingException("Could not extract date", e); } } From ea49202f64e11198a959a51c396b4bbd68370acb Mon Sep 17 00:00:00 2001 From: fynngodau Date: Thu, 4 Jun 2020 18:26:58 +0200 Subject: [PATCH 54/91] Don't display internal license id Co-authored-by: bopol --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 62b85f1d3..1ed353771 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 @@ -303,7 +303,7 @@ public class BandcampStreamExtractor extends StreamExtractor { case 6: return "CC BY 3.0"; default: - return "Unknown license (internal ID " + license + ")"; + return "Unknown"; } } From 27e7aad159c9081b6af2b84430a6f50bc01ab987 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:04:25 +0200 Subject: [PATCH 55/91] Bandcamp: Improve code style --- .../services/bandcamp/extractors/BandcampExtractorHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 cfe5c2df2..c9e21b31f 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 @@ -9,6 +9,7 @@ import com.grack.nanojson.JsonWriter; 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.utils.Utils; import java.io.IOException; import java.util.ArrayList; @@ -87,7 +88,7 @@ public class BandcampExtractorHelper { // Remove empty strings ArrayList list = new ArrayList<>(Arrays.asList(strings)); for (int i = list.size() - 1; i >= 0; i--) { - if (list.get(i) == null || list.get(i).isEmpty() || list.get(i).equals("null")) { + if (Utils.isNullOrEmpty(list) || list.get(i).equals("null")) { list.remove(i); } } From e6ecd919297ef9f75a67834c5b9a519113c0c7bb Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:12:10 +0200 Subject: [PATCH 56/91] Bandcamp: Test full date --- .../bandcamp/BandcampRadioStreamExtractorTest.java | 12 ++++++++++-- .../bandcamp/BandcampStreamExtractorTest.java | 9 ++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) 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 index 7dd371c28..0ada81f33 100644 --- 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 @@ -13,6 +13,7 @@ import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; import java.util.Calendar; +import java.util.TimeZone; import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; @@ -57,12 +58,19 @@ public class BandcampRadioStreamExtractorTest { @Test public void testGetTextualUploadDate() throws ParsingException { - assertEquals("16 May 2017", e.getTextualUploadDate()); + assertEquals("16 May 2017 00:00:00 GMT", e.getTextualUploadDate()); } @Test public void testUploadDate() throws ParsingException { - assertEquals(136, e.getUploadDate().date().get(Calendar.DAY_OF_YEAR)); + final Calendar expectedCalendar = Calendar.getInstance(); + + // 16 May 2017 00:00:00 GMT + expectedCalendar.setTimeZone(TimeZone.getTimeZone("GMT")); + expectedCalendar.setTimeInMillis(0); + expectedCalendar.set(2017, Calendar.MAY, 16); + + assertEquals(expectedCalendar.getTimeInMillis(), e.getUploadDate().date().getTimeInMillis()); } @Test diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 7c8d4c863..c631ca964 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -14,6 +14,7 @@ import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; import java.util.Calendar; +import java.util.TimeZone; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -63,7 +64,13 @@ public class BandcampStreamExtractorTest { @Test public void testUploadDate() throws ParsingException { - assertEquals(270, extractor.getUploadDate().date().get(Calendar.DAY_OF_YEAR)); + final Calendar expectedCalendar = Calendar.getInstance(); + // 27 Sep 2019 21:49:14 GMT + expectedCalendar.setTimeZone(TimeZone.getTimeZone("GMT")); + expectedCalendar.set(2019, Calendar.SEPTEMBER, 27, 21, 49, 14); + expectedCalendar.set(Calendar.MILLISECOND, 0); + + assertEquals(expectedCalendar.getTimeInMillis(), extractor.getUploadDate().date().getTimeInMillis()); } @Test From 0950a955775aca216099f0bc9cba6d38b27fac5a Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:16:08 +0200 Subject: [PATCH 57/91] Fix for testing wrong object for null or empty --- .../services/bandcamp/extractors/BandcampExtractorHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c9e21b31f..37c4ff96b 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 @@ -88,7 +88,7 @@ public class BandcampExtractorHelper { // Remove empty strings ArrayList list = new ArrayList<>(Arrays.asList(strings)); for (int i = list.size() - 1; i >= 0; i--) { - if (Utils.isNullOrEmpty(list) || list.get(i).equals("null")) { + if (Utils.isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { list.remove(i); } } From 8fa81537c0befa7664a69114b80b989716578fd3 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:17:51 +0200 Subject: [PATCH 58/91] Better bandcamp stream extractor description test --- .../services/bandcamp/BandcampStreamExtractorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index c631ca964..11b3fa486 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -53,7 +53,7 @@ public class BandcampStreamExtractorTest { @Test public void testDescription() { - assertEquals(831, extractor.getDescription().getContent().length()); + assertTrue(extractor.getDescription().getContent().contains("Boy, you've taken up my thoughts")); } @Test From 52103ac61fb84a6fe7bfade499baebd3e360303a Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:27:13 +0200 Subject: [PATCH 59/91] Remove "useless" comments --- .../bandcamp/BandcampChannelLinkHandlerFactoryTest.java | 2 -- .../bandcamp/BandcampFeaturedLinkHandlerFactoryTest.java | 2 -- .../bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java | 2 -- .../services/bandcamp/BandcampStreamLinkHandlerFactoryTest.java | 2 -- .../services/bandcamp/BandcampSuggestionExtractorTest.java | 1 - 5 files changed, 9 deletions(-) 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 191f096c0..ad48da1c0 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 @@ -26,13 +26,11 @@ public class BandcampChannelLinkHandlerFactoryTest { @Test public void testAcceptUrl() throws ParsingException { - // Tests expecting true 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")); } 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 index 3fd70369d..38559782b 100644 --- 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 @@ -24,13 +24,11 @@ public class BandcampFeaturedLinkHandlerFactoryTest { @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/")); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java index f9cf9b1a7..11fe3acd7 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java @@ -28,7 +28,6 @@ public class BandcampPlaylistLinkHandlerFactoryTest { @Test public void testAcceptUrl() throws ParsingException { - // Tests expecting false assertFalse(linkHandler.acceptUrl("http://interovgm.com/releases/")); assertFalse(linkHandler.acceptUrl("https://interovgm.com/releases")); assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); @@ -37,7 +36,6 @@ public class BandcampPlaylistLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); assertFalse(linkHandler.acceptUrl("https://interovgm.com/track/title")); - // Tests expecting true assertTrue(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/album/prom")); assertTrue(linkHandler.acceptUrl("https://MACBENSON.BANDCAMP.COM/ALBUM/COMING-OF-AGE")); 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 3942fb1f1..69a7c2bf1 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 @@ -37,7 +37,6 @@ public class BandcampStreamLinkHandlerFactoryTest { @Test public void testAcceptUrl() throws ParsingException { - // Tests expecting false assertFalse(linkHandler.acceptUrl("http://interovgm.com/releases/")); assertFalse(linkHandler.acceptUrl("https://interovgm.com/releases")); assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); @@ -45,7 +44,6 @@ public class BandcampStreamLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); assertFalse(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); - // Tests expecting true 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")); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java index 68cdae518..393ca01c6 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java @@ -32,7 +32,6 @@ public class BandcampSuggestionExtractorTest { public void testSearchExample() throws IOException, ExtractionException { List c418 = extractor.suggestionList("c418"); - // When looking for c418, one should find C418 assertTrue(c418.contains("C418")); // There should be five results, but we can't be sure of that forever From 4dd9540782a3c3bb831a87a12aa3d7cb25e16e0e Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:27:39 +0200 Subject: [PATCH 60/91] Bandcamp license switch order --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1ed353771..11bbc2ec4 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 @@ -298,10 +298,10 @@ public class BandcampStreamExtractor extends StreamExtractor { return "CC BY-NC 3.0"; case 5: return "CC BY-ND 3.0"; - case 8: - return "CC BY-SA 3.0"; case 6: return "CC BY 3.0"; + case 8: + return "CC BY-SA 3.0"; default: return "Unknown"; } From e13f341a458f7bc8b6a7d54026a415f8758eff07 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:29:37 +0200 Subject: [PATCH 61/91] Bandcamp stream extractor: test service id --- .../extractor/services/bandcamp/BandcampStreamExtractorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 11b3fa486..423a08fd1 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -34,6 +34,7 @@ public class BandcampStreamExtractorTest { @Test public void testServiceId() { + assertEquals(4, extractor.getServiceId()); } @Test From 9a555d97e5fcd4c0a74a77014ab53f7a82ef6b3a Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:31:01 +0200 Subject: [PATCH 62/91] Remove useless bandcamp tests --- .../BandcampRadioStreamExtractorTest.java | 15 --------------- 1 file changed, 15 deletions(-) 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 index 0ada81f33..d9c2b9839 100644 --- 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 @@ -99,19 +99,4 @@ public class BandcampRadioStreamExtractorTest { public void testGetAudioStreams() throws ExtractionException, IOException { assertEquals(2, e.getAudioStreams().size()); } - - @Test - public void testGetLicence() throws ParsingException { - assertEquals("", e.getLicence()); - } - - @Test - public void testGetCategory() throws ParsingException { - assertEquals("", e.getCategory()); - } - - @Test - public void testGetTags() throws ParsingException { - assertEquals(0, e.getTags().size()); - } } From 39b55b5b42d39dabf0f2cedc463e002bbc254ca8 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:32:19 +0200 Subject: [PATCH 63/91] Bandcamp radio stream extractor: test uploader url --- .../services/bandcamp/BandcampRadioStreamExtractorTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index d9c2b9839..5b35a19b3 100644 --- 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 @@ -43,7 +43,8 @@ public class BandcampRadioStreamExtractorTest { } @Test - public void testGetUploaderUrl() { + public void testGetUploaderUrl() throws ParsingException { + assertEquals("http://bandcamp.com/andrewjervis", e.getUploaderUrl()); } @Test From 96de834b676e26d0813ff4816f88fbbce78e5f49 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 4 Jun 2020 19:36:58 +0200 Subject: [PATCH 64/91] Bandcamp: parse date from radio info item --- .../extractors/BandcampExtractorHelper.java | 17 +++++++++++++++-- .../BandcampRadioInfoItemExtractor.java | 6 +++--- .../extractors/BandcampStreamExtractor.java | 9 +-------- 3 files changed, 19 insertions(+), 13 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 37c4ff96b..707eaf062 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 @@ -9,11 +9,13 @@ import com.grack.nanojson.JsonWriter; 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 java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; public class BandcampExtractorHelper { @@ -142,4 +144,15 @@ public class BandcampExtractorHelper { public static String getImageUrl(long id, boolean album) { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } + + static DateWrapper parseDate(String textDate) throws ParsingException { + try { + Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(textDate); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return new DateWrapper(calendar, false); + } catch (ParseException e) { + throw new ParsingException("Could not extract date", e); + } + } } 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 index ebc843195..3e6dadf01 100644 --- 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 @@ -33,13 +33,13 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Nullable @Override public String getTextualUploadDate() { - return show.getString("date").replace(" 00:00:00 GMT", ""); + return show.getString("date"); } @Nullable @Override - public DateWrapper getUploadDate() { - return null; + public DateWrapper getUploadDate() throws ParsingException { + return BandcampExtractorHelper.parseDate(getTextualUploadDate()); } @Override 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 11bbc2ec4..282259275 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 @@ -106,14 +106,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nullable @Override public DateWrapper getUploadDate() throws ParsingException { - try { - Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(getTextualUploadDate()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - return new DateWrapper(calendar, false); - } catch (ParseException e) { - throw new ParsingException("Could not extract date", e); - } + return BandcampExtractorHelper.parseDate(getTextualUploadDate()); } @Nonnull From 932d094d6ab85ab4c439e1df07c53a312fe35c2e Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 2 Aug 2020 16:55:18 +0200 Subject: [PATCH 65/91] Upgrade featured playlist urls to https --- .../BandcampPlaylistInfoItemFeaturedExtractor.java | 3 +-- .../services/bandcamp/BandcampFeaturedExtractorTest.java | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java index 814794284..968bff22a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java @@ -1,7 +1,6 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; import com.grack.nanojson.JsonObject; -import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; @@ -31,7 +30,7 @@ public class BandcampPlaylistInfoItemFeaturedExtractor implements PlaylistInfoIt @Override public String getUrl() { - return featuredStory.getString("item_url"); + return featuredStory.getString("item_url").replaceAll("http://", "https://"); } @Override 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 09f516be9..f0502d579 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 @@ -37,4 +37,10 @@ public class BandcampFeaturedExtractorTest { assertTrue(list.size() > 1); } + @Test + public void testHttps() throws ExtractionException, IOException { + List list = extractor.getInitialPage().getItems(); + assertTrue(list.get(0).getUrl().contains("https://")); + } + } From cfe88a74c1a9eb692ba4f5c1281a47dd04755f5b Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sun, 9 Aug 2020 10:07:49 +0200 Subject: [PATCH 66/91] Throw ContentNotSupportedException when opening radio uploader channel --- .../bandcamp/extractors/BandcampRadioStreamExtractor.java | 6 +++--- .../bandcamp/BandcampRadioStreamExtractorTest.java | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) 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 index 360009ea5..3500b862f 100644 --- 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 @@ -8,6 +8,7 @@ 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.ContentNotSupportedException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -56,9 +57,8 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nonnull @Override - public String getUploaderUrl() { - return Jsoup.parse(showInfo.getString("image_caption")) - .getElementsByTag("a").first().attr("href").trim(); + public String getUploaderUrl() throws ContentNotSupportedException { + throw new ContentNotSupportedException("Fan pages are not supported"); } @Nonnull 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 index 5b35a19b3..ecbed677c 100644 --- 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 @@ -3,12 +3,11 @@ 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.ContentNotSupportedException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioStreamExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamExtractor; import java.io.IOException; @@ -42,9 +41,9 @@ public class BandcampRadioStreamExtractorTest { assertEquals("Sound Movements", e.getName()); } - @Test + @Test(expected = ContentNotSupportedException.class) public void testGetUploaderUrl() throws ParsingException { - assertEquals("http://bandcamp.com/andrewjervis", e.getUploaderUrl()); + e.getUploaderUrl(); } @Test From 81b5e7cf3d22015d58ef4817ec687048473dcebe Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 8 Oct 2020 17:56:03 +0200 Subject: [PATCH 67/91] Fix extractor --- .../extractors/BandcampExtractorHelper.java | 37 ++++--------------- .../extractors/BandcampPlaylistExtractor.java | 4 +- .../extractors/BandcampStreamExtractor.java | 10 ++--- .../BandcampChannelLinkHandlerFactory.java | 2 +- 4 files changed, 14 insertions(+), 39 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 707eaf062..a239c440a 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,6 +6,8 @@ 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.Document; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; @@ -20,7 +22,7 @@ import java.util.*; public class BandcampExtractorHelper { /** - *

Get JSON behind var $variable = out of web page

+ *

Get an attribute of a web page as JSON * *

Originally a part of bandcampDirect.

* @@ -29,35 +31,10 @@ public class BandcampExtractorHelper { * @param variable Name of the variable * @return The JsonObject stored in the variable with this name */ - public static JsonObject getJSONFromJavaScriptVariables(String html, String variable) throws JsonParserException, ArrayIndexOutOfBoundsException, ParsingException { - - String[] part = html.split("var " + variable + " = "); - - String firstHalfGone = part[1]; - - firstHalfGone = firstHalfGone.replaceAll("\" \\+ \"", ""); - - int position = -1; - int level = 0; - for (char character : firstHalfGone.toCharArray()) { - position++; - - switch (character) { - case '{': - level++; - continue; - case '}': - level--; - if (level == 0) { - return JsonParser.object().from(firstHalfGone.substring(0, position + 1) - .replaceAll(" {4}//.+", "") // Remove "for the curious" in JSON - .replaceAll("// xxx: note - don't internationalize this variable", "") // Remove this comment - ); - } - } - } - - throw new ParsingException("Unexpected HTML: JSON never ends"); + public static JsonObject getJsonData(String html, String variable) throws JsonParserException, ArrayIndexOutOfBoundsException, ParsingException { + Document document = Jsoup.parse(html); + String json = document.getElementsByAttribute(variable).attr(variable); + return JsonParser.object().from(json); } /** diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index f06d51d38..b7e812695 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -21,7 +21,7 @@ import javax.annotation.Nonnull; import java.io.IOException; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getJSONFromJavaScriptVariables; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getJsonData; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor.getAlbumInfoJson; public class BandcampPlaylistExtractor extends PlaylistExtractor { @@ -50,7 +50,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { trackInfo = albumJson.getArray("trackinfo"); try { - name = getJSONFromJavaScriptVariables(html, "EmbedData").getString("album_title"); + name = getJsonData(html, "data-embed").getString("album_title"); } catch (JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } catch (ArrayIndexOutOfBoundsException e) { 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 a0da730fc..ae172ed15 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 @@ -20,11 +20,7 @@ import org.schabi.newpipe.extractor.stream.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; import java.util.List; import java.util.Locale; @@ -63,7 +59,7 @@ public class BandcampStreamExtractor extends StreamExtractor { */ public static JsonObject getAlbumInfoJson(String html) throws ParsingException { try { - return BandcampExtractorHelper.getJSONFromJavaScriptVariables(html, "TralbumData"); + return BandcampExtractorHelper.getJsonData(html, "data-tralbum"); } catch (JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } catch (ArrayIndexOutOfBoundsException e) { @@ -264,7 +260,9 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public String getCategory() { // Get first tag from html, which is the artist's Genre - return document.getElementsByAttributeValue("itemprop", "keywords").first().text(); + return document + .getElementsByClass("tralbum-tags").first() + .getElementsByClass("tag").first().text(); } @Nonnull 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 370057dde..825add10b 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 @@ -25,7 +25,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { String response = NewPipe.getDownloader().get(url).responseBody(); // This variable contains band data! - JsonObject bandData = BandcampExtractorHelper.getJSONFromJavaScriptVariables(response, "BandData"); + JsonObject bandData = BandcampExtractorHelper.getJsonData(response, "data-band"); return String.valueOf(bandData.getLong("id")); From 186936d04151d5d8030a46acbc0376560149f387 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 19 Nov 2020 22:33:52 +0100 Subject: [PATCH 68/91] Various changes regarding tests --- .../BandcampRadioInfoItemExtractor.java | 1 + .../extractors/BandcampStreamExtractor.java | 5 +- ...ndcampPlaylistStreamInfoItemExtractor.java | 5 +- .../BandcampChannelExtractorTest.java | 4 +- ...BandcampChannelLinkHandlerFactoryTest.java | 1 + .../BandcampFeaturedExtractorTest.java | 39 +++- .../BandcampPlaylistExtractorTest.java | 52 ++++- .../bandcamp/BandcampRadioExtractorTest.java | 41 +++- .../bandcamp/BandcampSearchExtractorTest.java | 2 +- .../bandcamp/BandcampStreamExtractorTest.java | 190 ++++++++++++------ 10 files changed, 256 insertions(+), 84 deletions(-) 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 index 3e6dadf01..f478d985e 100644 --- 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 @@ -69,6 +69,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Override public String getUploaderName() { + // JSON does not contain uploader name return ""; } 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 ae172ed15..1561a98ab 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 @@ -21,6 +21,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; @@ -209,12 +210,12 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public List getVideoStreams() { - return null; + return Collections.EMPTY_LIST; } @Override public List getVideoOnlyStreams() { - return null; + return Collections.EMPTY_LIST; } @Nonnull diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java index 6faf397ae..15e5116e9 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java @@ -15,7 +15,7 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI private final JsonObject track; private String substituteCoverUrl; - private StreamingService service; + private final StreamingService service; public BandcampPlaylistStreamInfoItemExtractor(JsonObject track, String uploaderUrl, StreamingService service) { super(uploaderUrl); @@ -45,6 +45,9 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI @Override public String getUploaderName() { + /* Tracks can have an individual artist name, but it is not included in the + * given JSON. + */ return ""; } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 2d1c38e30..a5ccabf9d 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -70,8 +70,8 @@ public class BandcampChannelExtractorTest implements BaseChannelExtractorTest { } @Override - public void testServiceId() throws Exception { - assertEquals(4, extractor.getServiceId()); + public void testServiceId() { + assertEquals(Bandcamp.getServiceId(), extractor.getServiceId()); } @Override 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 ad48da1c0..e07daf7d1 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 @@ -40,6 +40,7 @@ public class BandcampChannelLinkHandlerFactoryTest { assertEquals("1196681540", linkHandler.getId("https://macbenson.bandcamp.com/")); assertEquals("1581461772", linkHandler.getId("https://interovgm.com/releases")); assertEquals("3321800855", linkHandler.getId("https://infiniteammo.bandcamp.com/")); + assertEquals("3775652329", linkHandler.getId("https://npet.bandcamp.com/")); } @Test 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 f0502d579..1668445c8 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 @@ -9,18 +9,21 @@ import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; +import org.schabi.newpipe.extractor.services.BaseListExtractorTest; +import org.schabi.newpipe.extractor.services.DefaultTests; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor; import java.io.IOException; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampFeaturedExtractor} */ -public class BandcampFeaturedExtractorTest { +public class BandcampFeaturedExtractorTest implements BaseListExtractorTest { private static BandcampFeaturedExtractor extractor; @@ -43,4 +46,38 @@ public class BandcampFeaturedExtractorTest { assertTrue(list.get(0).getUrl().contains("https://")); } + @Override + public void testRelatedItems() throws Exception { + DefaultTests.defaultTestRelatedItems(extractor); + } + + @Override + public void testMoreRelatedItems() throws Exception { + // more items not implemented + } + + @Override + public void testServiceId() { + assertEquals(Bandcamp.getServiceId(), extractor.getServiceId()); + } + + @Override + public void testName() throws Exception { + assertEquals("Featured", extractor.getName()); + } + + @Override + public void testId() { + assertEquals("", extractor.getId()); + } + + @Override + public void testUrl() throws Exception { + assertEquals("", extractor.getUrl()); + } + + @Override + public void testOriginalUrl() throws Exception { + assertEquals("", extractor.getOriginalUrl()); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index 1b1039e6f..c360c23a7 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -10,6 +10,8 @@ import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.BasePlaylistExtractorTest; +import org.schabi.newpipe.extractor.services.DefaultTests; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -90,7 +92,7 @@ public class BandcampPlaylistExtractorTest { } - public static class ComingOfAge { + public static class ComingOfAge implements BasePlaylistExtractorTest { private static PlaylistExtractor extractor; @@ -102,48 +104,78 @@ public class BandcampPlaylistExtractorTest { } @Test - public void getThumbnailUrl() throws ParsingException { + public void testThumbnailUrl() throws ParsingException { assertTrue(extractor.getThumbnailUrl().contains("f4.bcbits.com/img")); } @Test - public void getBannerUrl() throws ParsingException { + public void testBannerUrl() throws ParsingException { assertEquals("", extractor.getBannerUrl()); } @Test - public void getUploaderUrl() throws ParsingException { + public void testUploaderUrl() throws ParsingException { assertTrue(extractor.getUploaderUrl().contains("macbenson.bandcamp.com")); } @Test - public void getUploaderName() throws ParsingException { + public void testUploaderName() throws ParsingException { assertEquals("mac benson", extractor.getUploaderName()); } @Test - public void getUploaderAvatarUrl() throws ParsingException { + public void testUploaderAvatarUrl() throws ParsingException { assertTrue(extractor.getUploaderAvatarUrl().contains("f4.bcbits.com/img")); } @Test - public void getStreamCount() throws ParsingException { + public void testStreamCount() throws ParsingException { assertEquals(5, extractor.getStreamCount()); } @Test - public void getInitialPage() throws IOException, ExtractionException { + public void testInitialPage() throws IOException, ExtractionException { assertNotNull(extractor.getInitialPage().getItems().get(0)); } @Test - public void getName() throws ParsingException { + public void testServiceId() { + assertEquals(Bandcamp.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws ParsingException { assertEquals("Coming of Age", extractor.getName()); } @Test - public void getNextPageUrl() throws IOException, ExtractionException { + public void testId() throws Exception { + assertEquals("https://macbenson.bandcamp.com/album/coming-of-age", extractor.getId()); + } + + @Test + public void testUrl() throws Exception { + assertEquals("https://macbenson.bandcamp.com/album/coming-of-age", extractor.getUrl()); + } + + @Test + public void testOriginalUrl() throws Exception { + assertEquals("https://macbenson.bandcamp.com/album/coming-of-age", extractor.getOriginalUrl()); + } + + @Test + public void testNextPageUrl() throws IOException, ExtractionException { assertNull(extractor.getPage(extractor.getInitialPage().getNextPage())); } + + @Test + public void testRelatedItems() throws Exception { + //DefaultTests.defaultTestRelatedItems(extractor); + // Would fail because BandcampPlaylistStreamInfoItemExtractor.getUploaderName() returns an empty String + } + + @Test + public void testMoreRelatedItems() throws Exception { + } } } 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 index c1f493c92..76f0559d0 100644 --- 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 @@ -8,18 +8,21 @@ 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.BaseListExtractorTest; +import org.schabi.newpipe.extractor.services.DefaultTests; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor; import java.io.IOException; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; /** * Tests for {@link BandcampRadioExtractor} */ -public class BandcampRadioExtractorTest { +public class BandcampRadioExtractorTest implements BaseListExtractorTest { private static BandcampRadioExtractor extractor; @@ -36,4 +39,40 @@ public class BandcampRadioExtractorTest { List list = Bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); assertTrue(list.size() > 300); } + + @Test + public void testRelatedItems() throws Exception { + //DefaultTests.defaultTestRelatedItems(extractor); + // Would fail because BandcampRadioInfoItemExtractor.getUploaderName() returns an empty String + } + + @Test + public void testMoreRelatedItems() throws Exception { + // All items are on one page + } + + @Test + public void testServiceId() { + assertEquals(Bandcamp.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + assertEquals("Radio", extractor.getName()); + } + + @Test + public void testId() { + assertEquals("Radio", extractor.getId()); + } + + @Test + public void testUrl() throws Exception { + assertEquals("https://bandcamp.com/api/bcweekly/1/list", extractor.getUrl()); + } + + @Test + public void testOriginalUrl() throws Exception { + assertEquals("https://bandcamp.com/api/bcweekly/1/list", extractor.getOriginalUrl()); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 7d7655190..786839995 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -107,7 +107,7 @@ public class BandcampSearchExtractorTest { public static class DefaultTest extends DefaultSearchExtractorTest { private static SearchExtractor extractor; - private static final String QUERY = "test"; + private static final String QUERY = "noise"; @BeforeClass public static void setUp() throws Exception { diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 423a08fd1..4c14bea5d 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -6,103 +6,161 @@ import org.junit.BeforeClass; import org.junit.Test; import org.schabi.newpipe.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.DefaultStreamExtractorTest; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.stream.StreamType; import java.io.IOException; import java.util.Calendar; +import java.util.Collections; +import java.util.List; import java.util.TimeZone; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; -public class BandcampStreamExtractorTest { +/** + * Tests for {@link BandcampStreamExtractor} + */ +public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { private static BandcampStreamExtractor extractor; @BeforeClass - public static void setUp() throws Exception { + public static void setUp() throws ExtractionException, IOException { NewPipe.init(DownloaderTestImpl.getInstance()); + // This test track was uploaded specifically for NewPipeExtractor tests + extractor = (BandcampStreamExtractor) Bandcamp - .getStreamExtractor("https://zachbenson.bandcamp.com/track/kitchen"); + .getStreamExtractor("https://npet.bandcamp.com/track/track-1"); extractor.fetchPage(); } - @Test - public void testServiceId() { - assertEquals(4, extractor.getServiceId()); + @Override + public StreamExtractor extractor() { + return extractor; + } + + @Override + public StreamingService expectedService() { + return Bandcamp; + } + + @Override + public String expectedName() { + return "Track #1"; + } + + @Override + public String expectedId() { + return "https://npet.bandcamp.com/track/track-1"; + } + + @Override + public String expectedUrlContains() { + return "https://npet.bandcamp.com/track/track-1"; + } + + @Override + public String expectedOriginalUrlContains() { + return "https://npet.bandcamp.com/track/track-1"; + } + + @Override + public StreamType expectedStreamType() { + return StreamType.AUDIO_STREAM; + } + + @Override + public String expectedUploaderName() { + return "NewPipeExtractorTest"; + } + + @Override + public String expectedUploaderUrl() { + return "https://npet.bandcamp.com/"; + } + + @Override + public List expectedDescriptionContains() { + return Collections.singletonList("This sample track was created using MuseScore."); + } + + @Override + public long expectedLength() { + return 0; + } + + @Override + public long expectedViewCountAtLeast() { + return Long.MIN_VALUE; + } + + @Override + public String expectedUploadDate() { + return "2020-03-17 18:37:44.000"; + } + + @Override + public String expectedTextualUploadDate() { + return "17 Mar 2020 18:37:44 GMT"; + } + + @Override + public long expectedLikeCountAtLeast() { + return Long.MIN_VALUE; + } + + @Override + public long expectedDislikeCountAtLeast() { + return Long.MIN_VALUE; + } + + @Override + public boolean expectedHasVideoStreams() { + return false; + } + + @Override + public boolean expectedHasRelatedStreams() { + return false; + } + + @Override + public boolean expectedHasSubtitles() { + return false; + } + + @Override + public boolean expectedHasFrames() { + return false; + } + + @Override + public String expectedLicence() { + return "CC BY 3.0"; + } + + @Override + public String expectedCategory() { + return "acoustic"; } @Test - public void testName() throws ParsingException { - assertEquals("kitchen", extractor.getName()); - } - - @Test - public void testUrl() throws ParsingException { - assertEquals("https://zachbenson.bandcamp.com/track/kitchen", extractor.getUrl()); - } - - @Test - public void testArtistUrl() throws ParsingException { - assertEquals("https://zachbenson.bandcamp.com/", extractor.getUploaderUrl()); - } - - @Test - public void testDescription() { - assertTrue(extractor.getDescription().getContent().contains("Boy, you've taken up my thoughts")); - } - - @Test - public void testArtistProfilePicture() { - String url = extractor.getUploaderAvatarUrl(); + public void testArtistProfilePicture() throws Exception { + String url = extractor().getUploaderAvatarUrl(); assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); } - @Test - public void testUploadDate() throws ParsingException { - final Calendar expectedCalendar = Calendar.getInstance(); - // 27 Sep 2019 21:49:14 GMT - expectedCalendar.setTimeZone(TimeZone.getTimeZone("GMT")); - expectedCalendar.set(2019, Calendar.SEPTEMBER, 27, 21, 49, 14); - expectedCalendar.set(Calendar.MILLISECOND, 0); - - assertEquals(expectedCalendar.getTimeInMillis(), extractor.getUploadDate().date().getTimeInMillis()); - } - - @Test - public void testNoArtistProfilePicture() throws ExtractionException { - assertEquals("", Bandcamp.getStreamExtractor("https://powertothequeerkids.bandcamp.com/track/human-nature").getUploaderAvatarUrl()); - } - - @Test - public void testAudioStream() { - assertTrue(extractor.getAudioStreams().get(0).getUrl().contains("bcbits.com/stream")); - assertEquals(1, extractor.getAudioStreams().size()); - } - - @Test - public void testCategory() throws ExtractionException, IOException { - StreamExtractor se = Bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); - se.fetchPage(); - assertEquals("acoustic", se.getCategory()); - } - - @Test - public void testLicense() throws ExtractionException, IOException { - StreamExtractor se = Bandcamp.getStreamExtractor("https://npet.bandcamp.com/track/track-1"); - se.fetchPage(); - assertEquals("CC BY 3.0", se.getLicence()); - } - @Test public void testTranslateIdsToUrl() throws ParsingException { - assertEquals("https://zachbenson.bandcamp.com/album/covers", BandcampExtractorHelper.getStreamUrlFromIds(2862267535L, 2063639444L, "album")); - // TODO write more test cases + assertEquals("https://npet.bandcamp.com/track/track-1", BandcampExtractorHelper.getStreamUrlFromIds(3775652329L, 4207805220L, "track")); } } From 8c369b0f79d3ea01bf97a7d8f71f49d9c31b056d Mon Sep 17 00:00:00 2001 From: fynngodau Date: Tue, 24 Nov 2020 14:01:31 +0100 Subject: [PATCH 69/91] Rephrase link in javadoc Co-authored-by: Tobias Groza --- .../services/bandcamp/extractors/BandcampExtractorHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a239c440a..c93db96d6 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 @@ -90,7 +90,7 @@ public class BandcampExtractorHelper { /** * Fetch artist details from mobile endpoint. * - * I once took a moment to note down how it works. + * More technical info. */ public static JsonObject getArtistDetails(String id) throws ParsingException { try { From 99e7ef013efa6b1da489262cba6f7d7e141e2d4e Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 24 Nov 2020 09:41:40 +0100 Subject: [PATCH 70/91] [Bandcamp] Apply small changes to code formatting and style Make variables final when possible Remove unused imports Improve code formatting --- .../services/bandcamp/BandcampService.java | 36 ++++++++----------- .../extractors/BandcampChannelExtractor.java | 32 +++++++++-------- .../BandcampChannelInfoItemExtractor.java | 8 +++-- .../extractors/BandcampExtractorHelper.java | 35 +++++++++--------- .../extractors/BandcampFeaturedExtractor.java | 13 +++---- .../extractors/BandcampPlaylistExtractor.java | 21 ++++++----- .../BandcampPlaylistInfoItemExtractor.java | 9 ++--- ...campPlaylistInfoItemFeaturedExtractor.java | 2 +- .../extractors/BandcampRadioExtractor.java | 18 +++++----- .../BandcampRadioInfoItemExtractor.java | 2 +- .../BandcampRadioStreamExtractor.java | 12 +++---- .../extractors/BandcampSearchExtractor.java | 23 ++++++------ .../extractors/BandcampStreamExtractor.java | 26 +++++++------- .../BandcampSuggestionExtractor.java | 18 +++++----- ...campDiscographStreamInfoItemExtractor.java | 2 +- ...ndcampPlaylistStreamInfoItemExtractor.java | 10 +++--- ...BandcampSearchStreamInfoItemExtractor.java | 12 ++++--- .../BandcampStreamInfoItemExtractor.java | 2 +- .../BandcampChannelLinkHandlerFactory.java | 15 ++++---- .../BandcampFeaturedLinkHandlerFactory.java | 27 ++++++++------ .../BandcampPlaylistLinkHandlerFactory.java | 7 ++-- .../BandcampSearchQueryHandlerFactory.java | 5 +-- .../BandcampStreamLinkHandlerFactory.java | 18 ++++++---- 23 files changed, 187 insertions(+), 166 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 a94638a3f..1d96684b2 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 @@ -6,7 +6,6 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.comments.CommentsExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; @@ -17,7 +16,6 @@ import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor; import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; -import java.io.IOException; import java.util.Collections; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO; @@ -28,7 +26,7 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampService extends StreamingService { - public BandcampService(int id) { + public BandcampService(final int id) { super(id, "Bandcamp", Collections.singletonList(AUDIO)); } @@ -63,7 +61,7 @@ public class BandcampService extends StreamingService { } @Override - public SearchExtractor getSearchExtractor(SearchQueryHandler queryHandler) { + public SearchExtractor getSearchExtractor(final SearchQueryHandler queryHandler) { return new BandcampSearchExtractor(this, queryHandler); } @@ -83,24 +81,20 @@ public class BandcampService extends StreamingService { 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((streamingService, url, kioskId) -> + 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.addKioskEntry((streamingService, url, kioskId) -> + new BandcampRadioExtractor(BandcampService.this, + new BandcampFeaturedLinkHandlerFactory().fromUrl(RADIO_API_URL), kioskId), + new BandcampFeaturedLinkHandlerFactory(), KIOSK_RADIO); kioskList.setDefaultKiosk(KIOSK_FEATURED); - } catch (Exception e) { + } catch (final Exception e) { throw new ExtractionException(e); } @@ -108,17 +102,17 @@ public class BandcampService extends StreamingService { } @Override - public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler) throws ExtractionException { + public ChannelExtractor getChannelExtractor(final ListLinkHandler linkHandler) { return new BandcampChannelExtractor(this, linkHandler); } @Override - public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) { + public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) { return new BandcampPlaylistExtractor(this, linkHandler); } @Override - public StreamExtractor getStreamExtractor(LinkHandler linkHandler) { + public StreamExtractor getStreamExtractor(final LinkHandler linkHandler) { if (linkHandler.getUrl().matches("https?://bandcamp\\.com/\\?show=\\d+")) return new BandcampRadioStreamExtractor(this, linkHandler); else diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 74fa8d152..035d87a65 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -2,7 +2,8 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import com.grack.nanojson.*; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; import org.jsoup.Jsoup; import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; @@ -23,7 +24,7 @@ public class BandcampChannelExtractor extends ChannelExtractor { private JsonObject channelInfo; - public BandcampChannelExtractor(StreamingService service, ListLinkHandler linkHandler) { + public BandcampChannelExtractor(final StreamingService service, final ListLinkHandler linkHandler) { super(service, linkHandler); } @@ -34,15 +35,16 @@ public class BandcampChannelExtractor extends ChannelExtractor { return BandcampExtractorHelper.getImageUrl(channelInfo.getLong("bio_image_id"), false); } - /** - * Why does the mobile endpoint not contain the header?? Or at least not the same one? - * Anyway we're back to querying websites - */ @Override public String getBannerUrl() throws ParsingException { + /* + * Why does the mobile endpoint not contain the header?? Or at least not the same one? + * Anyway we're back to querying websites + */ try { - String html = getDownloader().get(channelInfo.getString("bandcamp_url").replace("http://", "https://")) - .responseBody(); + final String html = getDownloader() + .get(channelInfo.getString("bandcamp_url").replace("http://", "https://")) + .responseBody(); return Jsoup.parse(html) .getElementById("customHeader") @@ -50,17 +52,17 @@ public class BandcampChannelExtractor extends ChannelExtractor { .first() .attr("src"); - } catch (IOException | ReCaptchaException e) { + } catch (final IOException | ReCaptchaException e) { throw new ParsingException("Could not download artist web site", e); - } catch (NullPointerException e) { + } catch (final NullPointerException e) { // No banner available return ""; } } /** - * I had to learn bandcamp stopped providing RSS feeds when appending /feed to any URL - * because too few people used it. Bummer! + * bandcamp stopped providing RSS feeds when appending /feed to any URL + * because too few people used it. */ @Override public String getFeedUrl() { @@ -96,13 +98,13 @@ public class BandcampChannelExtractor extends ChannelExtractor { @Override public InfoItemsPage getInitialPage() throws ParsingException { - StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); - JsonArray discography = channelInfo.getArray("discography"); + final JsonArray discography = channelInfo.getArray("discography"); for (int i = 0; i < discography.size(); i++) { // I define discograph as an item that can appear in a discography - JsonObject discograph = discography.getObject(i); + final JsonObject discograph = discography.getObject(i); if (!discograph.getString("item_type").equals("track")) continue; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java index 3baf45b3e..fb956791d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -10,7 +10,7 @@ public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtracto private final Element resultInfo, searchResult; - public BandcampChannelInfoItemExtractor(Element searchResult) { + public BandcampChannelInfoItemExtractor(final Element searchResult) { this.searchResult = searchResult; resultInfo = searchResult.getElementsByClass("result-info").first(); } @@ -27,11 +27,13 @@ public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtracto @Override public String getThumbnailUrl() throws ParsingException { - Element img = searchResult.getElementsByClass("art").first() + final Element img = searchResult.getElementsByClass("art").first() .getElementsByTag("img").first(); if (img != null) { return img.attr("src"); - } else return null; + } else { + return null; + } } @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 c93db96d6..5d0fb45f7 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 @@ -31,9 +31,10 @@ public class BandcampExtractorHelper { * @param variable Name of the variable * @return The JsonObject stored in the variable with this name */ - public static JsonObject getJsonData(String html, String variable) throws JsonParserException, ArrayIndexOutOfBoundsException, ParsingException { - Document document = Jsoup.parse(html); - String json = document.getElementsByAttribute(variable).attr(variable); + public static JsonObject getJsonData(final String html, final String variable) + throws JsonParserException, ArrayIndexOutOfBoundsException { + final Document document = Jsoup.parse(html); + final String json = document.getElementsByAttribute(variable).attr(variable); return JsonParser.object().from(json); } @@ -41,17 +42,18 @@ public class BandcampExtractorHelper { * Translate all these parameters together to the URL of the corresponding album or track * using the mobile api */ - public static String getStreamUrlFromIds(long bandId, long itemId, String itemType) throws ParsingException { + public static String getStreamUrlFromIds(final long bandId, final long itemId, final String itemType) + throws ParsingException { try { - String jsonString = NewPipe.getDownloader().get( + final String jsonString = NewPipe.getDownloader().get( "https://bandcamp.com/api/mobile/22/tralbum_details?band_id=" + bandId + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.substring(0, 1)) .responseBody(); return JsonParser.object().from(jsonString).getString("bandcamp_url").replace("http://", "https://"); - } catch (JsonParserException | ReCaptchaException | IOException e) { + } catch (final JsonParserException | ReCaptchaException | IOException e) { throw new ParsingException("Ids could not be translated to URL", e); } @@ -61,11 +63,11 @@ public class BandcampExtractorHelper { * Concatenate all non-null and non-empty strings together while separating them using * the comma parameter */ - public static String smartConcatenate(String[] strings, String comma) { - StringBuilder result = new StringBuilder(); + public static String smartConcatenate(final String[] strings, final String comma) { + final StringBuilder result = new StringBuilder(); // Remove empty strings - ArrayList list = new ArrayList<>(Arrays.asList(strings)); + final ArrayList list = new ArrayList<>(Arrays.asList(strings)); for (int i = list.size() - 1; i >= 0; i--) { if (Utils.isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { list.remove(i); @@ -74,8 +76,7 @@ public class BandcampExtractorHelper { // Append remaining strings to result for (int i = 0; i < list.size(); i++) { - String string = list.get(i); - result.append(string); + result.append(list.get(i)); if (i != list.size() - 1) { // This is not the last iteration yet @@ -107,7 +108,7 @@ public class BandcampExtractorHelper { .getBytes() ).responseBody() ); - } catch (IOException | ReCaptchaException | JsonParserException e) { + } catch (final IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("Could not download band details", e); } } @@ -118,17 +119,17 @@ public class BandcampExtractorHelper { * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 * but we don't want something as large as 3460x3460 here, do we?) */ - public static String getImageUrl(long id, boolean album) { + public static String getImageUrl(final long id, final boolean album) { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } - static DateWrapper parseDate(String textDate) throws ParsingException { + static DateWrapper parseDate(final String textDate) throws ParsingException { try { - Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(textDate); - Calendar calendar = Calendar.getInstance(); + final Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(textDate); + final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return new DateWrapper(calendar, false); - } catch (ParseException e) { + } catch (final ParseException e) { throw new ParsingException("Could not extract date", e); } } 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 53781f378..2019153a6 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 @@ -24,7 +24,8 @@ 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) { + public BandcampFeaturedExtractor(final StreamingService streamingService, final ListLinkHandler listLinkHandler, + final String kioskId) { super(streamingService, listLinkHandler, kioskId); } @@ -43,23 +44,23 @@ public class BandcampFeaturedExtractor extends KioskExtractor @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - PlaylistInfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); + final PlaylistInfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); try { - JsonObject json = JsonParser.object().from( + final JsonObject json = JsonParser.object().from( getDownloader().post( FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() ).responseBody() ); - JsonArray featuredStories = json.getObject("feed_content") + final JsonArray featuredStories = json.getObject("feed_content") .getObject("stories") .getArray("featured"); for (int i = 0; i < featuredStories.size(); i++) { - JsonObject featuredStory = featuredStories.getObject(i); + final JsonObject featuredStory = featuredStories.getObject(i); if (featuredStory.isNull("album_title")) { // Is not an album, ignore @@ -70,7 +71,7 @@ public class BandcampFeaturedExtractor extends KioskExtractor } return new InfoItemsPage<>(c, null); - } catch (JsonParserException e) { + } catch (final JsonParserException e) { e.printStackTrace(); throw new ParsingException("JSON error", e); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index b7e812695..8915938fc 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -38,22 +38,22 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { private JsonArray trackInfo; private String name; - public BandcampPlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) { + public BandcampPlaylistExtractor(final StreamingService service, final ListLinkHandler linkHandler) { super(service, linkHandler); } @Override - public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { - String html = downloader.get(getLinkHandler().getUrl()).responseBody(); + public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { + final String html = downloader.get(getLinkHandler().getUrl()).responseBody(); document = Jsoup.parse(html); albumJson = getAlbumInfoJson(html); trackInfo = albumJson.getArray("trackinfo"); try { name = getJsonData(html, "data-embed").getString("album_title"); - } catch (JsonParserException e) { + } catch (final JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); - } catch (ArrayIndexOutOfBoundsException e) { + } catch (final ArrayIndexOutOfBoundsException e) { throw new ParsingException("JSON does not exist", e); } @@ -67,8 +67,11 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { @Override public String getThumbnailUrl() throws ParsingException { - if (albumJson.isNull("art_id")) return ""; - else return getImageUrl(albumJson.getLong("art_id"), true); + if (albumJson.isNull("art_id")) { + return ""; + } else { + return getImageUrl(albumJson.getLong("art_id"), true); + } } @Override @@ -78,7 +81,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { @Override public String getUploaderUrl() throws ParsingException { - String[] parts = getUrl().split("/"); + final String[] parts = getUrl().split("/"); // https: (/) (/) * .bandcamp.com (/) and leave out the rest return "https://" + parts[2] + "/"; } @@ -124,7 +127,7 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { @Override public InfoItemsPage getInitialPage() throws ExtractionException { - StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); for (int i = 0; i < trackInfo.size(); i++) { JsonObject track = trackInfo.getObject(i); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java index b28d13d72..f6b393bfb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemExtractor.java @@ -1,13 +1,14 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors; -import com.grack.nanojson.JsonObject; import org.jsoup.nodes.Element; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; +import javax.annotation.Nonnull; + public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor { private final Element searchResult, resultInfo; - public BandcampPlaylistInfoItemExtractor(Element searchResult) { + public BandcampPlaylistInfoItemExtractor(@Nonnull Element searchResult) { this.searchResult = searchResult; resultInfo = searchResult.getElementsByClass("result-info").first(); } @@ -20,7 +21,7 @@ public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtrac @Override public long getStreamCount() { - String length = resultInfo.getElementsByClass("length").text(); + final String length = resultInfo.getElementsByClass("length").text(); return Integer.parseInt(length.split(" track")[0]); } @@ -36,7 +37,7 @@ public class BandcampPlaylistInfoItemExtractor implements PlaylistInfoItemExtrac @Override public String getThumbnailUrl() { - Element img = searchResult.getElementsByClass("art").first() + final Element img = searchResult.getElementsByClass("art").first() .getElementsByTag("img").first(); if (img != null) { return img.attr("src"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java index 968bff22a..65872aab3 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistInfoItemFeaturedExtractor.java @@ -9,7 +9,7 @@ public class BandcampPlaylistInfoItemFeaturedExtractor implements PlaylistInfoIt private final JsonObject featuredStory; - public BandcampPlaylistInfoItemFeaturedExtractor(JsonObject featuredStory) { + public BandcampPlaylistInfoItemFeaturedExtractor(final JsonObject featuredStory) { this.featuredStory = featuredStory; } 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 index 6e837d44f..61c9e7326 100644 --- 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 @@ -15,7 +15,6 @@ 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.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import javax.annotation.Nonnull; @@ -26,12 +25,13 @@ 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) { + public BandcampRadioExtractor(final StreamingService streamingService, final ListLinkHandler linkHandler, + final String kioskId) { super(streamingService, linkHandler, kioskId); } @Override - public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { } @@ -44,27 +44,27 @@ public class BandcampRadioExtractor extends KioskExtractor { @Nonnull @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - InfoItemsCollector c = new StreamInfoItemsCollector(getServiceId()); + final InfoItemsCollector c = new StreamInfoItemsCollector(getServiceId()); try { - JsonObject json = JsonParser.object().from( + final JsonObject json = JsonParser.object().from( getDownloader().get( RADIO_API_URL ).responseBody() ); - JsonArray radioShows = json.getArray("results"); + final JsonArray radioShows = json.getArray("results"); for (int i = 0; i < radioShows.size(); i++) { - JsonObject radioShow = radioShows.getObject(i); + final JsonObject radioShow = radioShows.getObject(i); c.commit( new BandcampRadioInfoItemExtractor(radioShow) ); } - } catch (JsonParserException e) { + } catch (final JsonParserException e) { e.printStackTrace(); } @@ -72,7 +72,7 @@ public class BandcampRadioExtractor extends KioskExtractor { } @Override - public InfoItemsPage getPage(Page page) { + public InfoItemsPage getPage(final Page page) { 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 index f478d985e..b2e2d3642 100644 --- 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 @@ -16,7 +16,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { private JsonObject show; - public BandcampRadioInfoItemExtractor(JsonObject radioShow) { + public BandcampRadioInfoItemExtractor(final JsonObject radioShow) { show = radioShow; } 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 index 3500b862f..57ca8b187 100644 --- 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 @@ -29,23 +29,23 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { private JsonObject showInfo; private LinkHandler linkHandler; - public BandcampRadioStreamExtractor(StreamingService service, LinkHandler linkHandler) { + public BandcampRadioStreamExtractor(final StreamingService service, final LinkHandler linkHandler) { super(service, linkHandler); this.linkHandler = linkHandler; } - static JsonObject query(int id) throws ParsingException { + static JsonObject query(final int id) throws ParsingException { try { return JsonParser.object().from( NewPipe.getDownloader().get("https://bandcamp.com/api/bcweekly/1/get?id=" + id).responseBody() ); - } catch (IOException | ReCaptchaException | JsonParserException e) { + } catch (final IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("could not get show data", e); } } @Override - public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { showInfo = query(Integer.parseInt(getId())); } @@ -105,8 +105,8 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Override public List getAudioStreams() { - ArrayList list = new ArrayList<>(); - JsonObject streams = showInfo.getObject("audio_stream"); + final ArrayList list = new ArrayList<>(); + final JsonObject streams = showInfo.getObject("audio_stream"); if (streams.has("opus-lo")) { list.add(new AudioStream( diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 9deb98c0e..23097171e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -37,21 +37,20 @@ public class BandcampSearchExtractor extends SearchExtractor { return false; } - public InfoItemsPage getPage(Page page) throws IOException, ExtractionException { + public InfoItemsPage getPage(final Page page) throws IOException, ExtractionException { // okay apparently this is where we DOWNLOAD the page and then COMMIT its ENTRIES to an INFOITEMPAGE - String html = getDownloader().get(page.getUrl()).responseBody(); + final String html = getDownloader().get(page.getUrl()).responseBody(); - InfoItemsSearchCollector collector = new InfoItemsSearchCollector(getServiceId()); + final InfoItemsSearchCollector collector = new InfoItemsSearchCollector(getServiceId()); - Document d = Jsoup.parse(html); + final Document d = Jsoup.parse(html); - Elements searchResultsElements = d.getElementsByClass("searchresult"); + final Elements searchResultsElements = d.getElementsByClass("searchresult"); - for (Element searchResult : - searchResultsElements) { + for (final Element searchResult : searchResultsElements) { - String type = searchResult.getElementsByClass("result-info").first() + final String type = searchResult.getElementsByClass("result-info").first() .getElementsByClass("itemtype").first().text(); switch (type) { @@ -77,16 +76,16 @@ public class BandcampSearchExtractor extends SearchExtractor { } // Count pages - Elements pageLists = d.getElementsByClass("pagelist"); + final Elements pageLists = d.getElementsByClass("pagelist"); if (pageLists.size() == 0) return new InfoItemsPage<>(collector, null); - Elements pages = pageLists.first().getElementsByTag("li"); + final Elements pages = pageLists.first().getElementsByTag("li"); // Find current page int currentPage = -1; for (int i = 0; i < pages.size(); i++) { - Element pageElement = pages.get(i); + final Element pageElement = pages.get(i); if (pageElement.getElementsByTag("span").size() > 0) { currentPage = i + 1; break; @@ -112,7 +111,7 @@ public class BandcampSearchExtractor extends SearchExtractor { } @Override - public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { } } 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 1561a98ab..1f37176bf 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 @@ -33,14 +33,14 @@ public class BandcampStreamExtractor extends StreamExtractor { private JsonObject current; private Document document; - public BandcampStreamExtractor(StreamingService service, LinkHandler linkHandler) { + public BandcampStreamExtractor(final StreamingService service, final LinkHandler linkHandler) { super(service, linkHandler); } @Override - public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { - String html = downloader.get(getLinkHandler().getUrl()).responseBody(); + public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { + final String html = downloader.get(getLinkHandler().getUrl()).responseBody(); document = Jsoup.parse(html); albumJson = getAlbumInfoJson(html); current = albumJson.getObject("current"); @@ -58,12 +58,12 @@ public class BandcampStreamExtractor extends StreamExtractor { * @return Album metadata JSON * @throws ParsingException In case of a faulty website */ - public static JsonObject getAlbumInfoJson(String html) throws ParsingException { + public static JsonObject getAlbumInfoJson(final String html) throws ParsingException { try { return BandcampExtractorHelper.getJsonData(html, "data-tralbum"); - } catch (JsonParserException e) { + } catch (final JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); - } catch (ArrayIndexOutOfBoundsException e) { + } catch (final ArrayIndexOutOfBoundsException e) { throw new ParsingException("JSON does not exist", e); } } @@ -77,7 +77,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getUploaderUrl() throws ParsingException { - String[] parts = getUrl().split("/"); + final String[] parts = getUrl().split("/"); // https: (/) (/) * .bandcamp.com (/) and leave out the rest return "https://" + parts[2] + "/"; } @@ -118,7 +118,7 @@ public class BandcampStreamExtractor extends StreamExtractor { public String getUploaderAvatarUrl() { try { return document.getElementsByClass("band-photo").first().attr("src"); - } catch (NullPointerException e) { + } catch (final NullPointerException e) { return ""; } } @@ -144,7 +144,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public Description getDescription() { - String s = BandcampExtractorHelper.smartConcatenate( + final String s = BandcampExtractorHelper.smartConcatenate( new String[]{ current.getString("about"), current.getString("lyrics"), @@ -198,7 +198,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public List getAudioStreams() { - List audioStreams = new ArrayList<>(); + final List audioStreams = new ArrayList<>(); audioStreams.add(new AudioStream( albumJson.getArray("trackinfo").getObject(0) @@ -303,11 +303,11 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public List getTags() { - Elements tagElements = document.getElementsByAttributeValue("itemprop", "keywords"); + final Elements tagElements = document.getElementsByAttributeValue("itemprop", "keywords"); - ArrayList tags = new ArrayList<>(); + final ArrayList tags = new ArrayList<>(); - for (Element e : tagElements) { + for (final Element e : tagElements) { tags.add(e.text()); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index 5ef4f3d56..bb1ababb2 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -20,32 +20,32 @@ import java.util.List; public class BandcampSuggestionExtractor extends SuggestionExtractor { private static final String AUTOCOMPLETE_URL = "https://bandcamp.com/api/fuzzysearch/1/autocomplete?q="; - public BandcampSuggestionExtractor(StreamingService service) { + public BandcampSuggestionExtractor(final StreamingService service) { super(service); } @Override - public List suggestionList(String query) throws IOException, ExtractionException { - Downloader downloader = NewPipe.getDownloader(); + public List suggestionList(final String query) throws IOException, ExtractionException { + final Downloader downloader = NewPipe.getDownloader(); try { - JsonObject fuzzyResults = JsonParser.object().from( + final JsonObject fuzzyResults = JsonParser.object().from( downloader.get(AUTOCOMPLETE_URL + URLEncoder.encode(query, "UTF-8")).responseBody() ); - JsonArray jsonArray = fuzzyResults.getObject("auto") + final JsonArray jsonArray = fuzzyResults.getObject("auto") .getArray("results"); - ArrayList suggestions = new ArrayList<>(); + final ArrayList suggestions = new ArrayList<>(); - for (Object fuzzyResult : jsonArray) { - String res = ((JsonObject) fuzzyResult).getString("name"); + for (final Object fuzzyResult : jsonArray) { + final String res = ((JsonObject) fuzzyResult).getString("name"); if (!suggestions.contains(res)) suggestions.add(res); } return suggestions; - } catch (JsonParserException e) { + } catch (final JsonParserException e) { e.printStackTrace(); return new ArrayList<>(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java index 4c76b404d..15b044981 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java @@ -7,7 +7,7 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtract public class BandcampDiscographStreamInfoItemExtractor extends BandcampStreamInfoItemExtractor { private final JsonObject discograph; - public BandcampDiscographStreamInfoItemExtractor(JsonObject discograph, String uploaderUrl) { + public BandcampDiscographStreamInfoItemExtractor(final JsonObject discograph, final String uploaderUrl) { super(uploaderUrl); this.discograph = discograph; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java index 15e5116e9..e90a12aa1 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java @@ -17,13 +17,15 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI private String substituteCoverUrl; private final StreamingService service; - public BandcampPlaylistStreamInfoItemExtractor(JsonObject track, String uploaderUrl, StreamingService service) { + public BandcampPlaylistStreamInfoItemExtractor(final JsonObject track, final String uploaderUrl, + final StreamingService service) { super(uploaderUrl); this.track = track; this.service = service; } - public BandcampPlaylistStreamInfoItemExtractor(JsonObject track, String uploaderUrl, String substituteCoverUrl) { + public BandcampPlaylistStreamInfoItemExtractor(final JsonObject track, final String uploaderUrl, + final String substituteCoverUrl) { this(track, uploaderUrl, (StreamingService) null); this.substituteCoverUrl = substituteCoverUrl; } @@ -61,10 +63,10 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI return substituteCoverUrl; } else { try { - StreamExtractor extractor = service.getStreamExtractor(getUrl()); + final StreamExtractor extractor = service.getStreamExtractor(getUrl()); extractor.fetchPage(); return extractor.getThumbnailUrl(); - } catch (ExtractionException | IOException e) { + } catch (final ExtractionException | IOException e) { throw new ParsingException("could not download cover art location", e); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java index 6d88edc1c..adeea0519 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java @@ -7,7 +7,7 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte private final Element resultInfo, searchResult; - public BandcampSearchStreamInfoItemExtractor(Element searchResult, String uploaderUrl) { + public BandcampSearchStreamInfoItemExtractor(final Element searchResult, final String uploaderUrl) { super(uploaderUrl); this.searchResult = searchResult; resultInfo = searchResult.getElementsByClass("result-info").first(); @@ -15,8 +15,8 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte @Override public String getUploaderName() { - String subhead = resultInfo.getElementsByClass("subhead").text(); - String[] splitBy = subhead.split("by "); + final String subhead = resultInfo.getElementsByClass("subhead").text(); + final String[] splitBy = subhead.split("by "); if (splitBy.length > 1) { return splitBy[1]; } else { @@ -36,11 +36,13 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte @Override public String getThumbnailUrl() throws ParsingException { - Element img = searchResult.getElementsByClass("art").first() + final Element img = searchResult.getElementsByClass("art").first() .getElementsByTag("img").first(); if (img != null) { return img.attr("src"); - } else return null; + } else { + return null; + } } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java index a8a3ceb46..485433f9d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java @@ -13,7 +13,7 @@ import javax.annotation.Nullable; public abstract class BandcampStreamInfoItemExtractor implements StreamInfoItemExtractor { private final String uploaderUrl; - public BandcampStreamInfoItemExtractor(String uploaderUrl) { + public BandcampStreamInfoItemExtractor(final String uploaderUrl) { this.uploaderUrl = uploaderUrl; } 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 825add10b..9fbc8ae8f 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 @@ -20,16 +20,16 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { @Override - public String getId(String url) throws ParsingException { + public String getId(final String url) throws ParsingException { try { - String response = NewPipe.getDownloader().get(url).responseBody(); + final String response = NewPipe.getDownloader().get(url).responseBody(); // This variable contains band data! - JsonObject bandData = BandcampExtractorHelper.getJsonData(response, "data-band"); + final JsonObject bandData = BandcampExtractorHelper.getJsonData(response, "data-band"); return String.valueOf(bandData.getLong("id")); - } catch (IOException | ReCaptchaException | ArrayIndexOutOfBoundsException | JsonParserException e) { + } catch (final IOException | ReCaptchaException | ArrayIndexOutOfBoundsException | JsonParserException e) { throw new ParsingException("Download failed", e); } } @@ -38,12 +38,13 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { * Uses the mobile endpoint as a "translator" from id to url */ @Override - public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { + public String getUrl(final String id, final List contentFilter, final String sortFilter) + throws ParsingException { try { return BandcampExtractorHelper.getArtistDetails(id) .getString("bandcamp_url") .replace("http://", "https://"); - } catch (NullPointerException e) { + } catch (final NullPointerException e) { throw new ParsingException("JSON does not contain URL (invalid id?) or is otherwise invalid", e); } @@ -54,7 +55,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { * where the profile is at * . * /releases */ @Override - public boolean onAcceptUrl(String url) { + public boolean onAcceptUrl(final String url) { // Is a subdomain of bandcamp.com? boolean isBandcampComArtistPage = url.matches("https?://.+\\.bandcamp\\.com/?"); 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 0c5cb5fe8..7aac3684b 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 @@ -14,23 +14,30 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { @Override - public String getUrl(String id, List contentFilter, String sortFilter) { - 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; + public String getUrl(final String id, final List contentFilter, final String sortFilter) { + 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) { - if (url.matches("https?://bandcamp\\.com/\\?show=\\d+") || url.equals(RADIO_API_URL)) + public String getId(final 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)) + } else if (url.equals(FEATURED_API_URL)) { return KIOSK_FEATURED; - else return null; + } else { + return null; + } } @Override - public boolean onAcceptUrl(String url) { - return url.equals(FEATURED_API_URL) || (url.equals(RADIO_API_URL) || url.matches("https?://bandcamp\\.com/\\?show=\\d+")); + public boolean onAcceptUrl(final String 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/BandcampPlaylistLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java index 9a736b30f..b030fcc5a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java @@ -12,17 +12,18 @@ import java.util.List; */ public class BandcampPlaylistLinkHandlerFactory extends ListLinkHandlerFactory { @Override - public String getId(String url) throws ParsingException { + public String getId(final String url) throws ParsingException { return getUrl(url); } @Override - public String getUrl(String url, List contentFilter, String sortFilter) throws ParsingException { + public String getUrl(final String url, final List contentFilter, final String sortFilter) + throws ParsingException { return url; } @Override - public boolean onAcceptUrl(String url) { + public boolean onAcceptUrl(final String url) { return url.toLowerCase().matches("https?://.+\\..+/album/.+"); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java index 4a90c6c0e..518170b07 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java @@ -13,14 +13,15 @@ public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory @Override - public String getUrl(String query, List contentFilter, String sortFilter) throws ParsingException { + public String getUrl(final String query, final List contentFilter, final String sortFilter) + throws ParsingException { try { return "https://bandcamp.com/search?q=" + URLEncoder.encode(query, "UTF-8") + "&page=1"; - } catch (UnsupportedEncodingException e) { + } catch (final UnsupportedEncodingException e) { throw new ParsingException("query \"" + query + "\" could not be encoded", e); } } 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 176c2e2ba..5de345e15 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 @@ -18,11 +18,12 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { * @see BandcampStreamLinkHandlerFactory */ @Override - public String getId(String url) throws ParsingException { + public String getId(final String url) throws ParsingException { if (url.matches("https?://bandcamp\\.com/\\?show=\\d+")) { return url.split("bandcamp.com/\\?show=")[1]; - } else + } else { return getUrl(url); + } } /** @@ -30,10 +31,12 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { * @see BandcampStreamLinkHandlerFactory */ @Override - public String getUrl(String input) { - if (input.matches("\\d+")) + public String getUrl(final String input) { + if (input.matches("\\d+")) { return "https://bandcamp.com/?show=" + input; - else return input; + } else { + return input; + } } /** @@ -45,7 +48,8 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { * https:// * . * /track/ * */ @Override - public boolean onAcceptUrl(String url) { - return url.toLowerCase().matches("https?://.+\\..+/track/.+") || url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); + public boolean onAcceptUrl(final String url) { + return url.toLowerCase().matches("https?://.+\\..+/track/.+") + || url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); } } From c91e21b37c9e17e0fc7f01d0aab45074a677df86 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 24 Nov 2020 09:55:41 +0100 Subject: [PATCH 71/91] [Bandcamp] Tests - Add finals and improve code formatting --- .../BandcampFeaturedExtractorTest.java | 4 ++-- .../BandcampPlaylistExtractorTest.java | 16 ++++++++-------- .../bandcamp/BandcampRadioExtractorTest.java | 4 ++-- .../BandcampRadioStreamExtractorTest.java | 6 ++++-- .../bandcamp/BandcampSearchExtractorTest.java | 18 +++++++++--------- .../bandcamp/BandcampStreamExtractorTest.java | 2 +- .../BandcampSuggestionExtractorTest.java | 2 +- 7 files changed, 27 insertions(+), 25 deletions(-) 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 1668445c8..50d992a16 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 @@ -36,13 +36,13 @@ public class BandcampFeaturedExtractorTest implements BaseListExtractorTest { @Test public void testFeaturedCount() throws ExtractionException, IOException { - List list = extractor.getInitialPage().getItems(); + final List list = extractor.getInitialPage().getItems(); assertTrue(list.size() > 1); } @Test public void testHttps() throws ExtractionException, IOException { - List list = extractor.getInitialPage().getItems(); + final List list = extractor.getInitialPage().getItems(); assertTrue(list.get(0).getUrl().contains("https://")); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index c360c23a7..b695236d9 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -36,7 +36,7 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testCount() throws ExtractionException, IOException { - PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); + final PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://macbenson.bandcamp.com/album/coming-of-age"); extractor.fetchPage(); assertEquals(5, extractor.getStreamCount()); @@ -47,10 +47,10 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testDifferentTrackCovers() throws ExtractionException, IOException { - PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachbensonarchive.bandcamp.com/album/results-of-boredom"); + final PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachbensonarchive.bandcamp.com/album/results-of-boredom"); extractor.fetchPage(); - List l = extractor.getInitialPage().getItems(); + final List l = extractor.getInitialPage().getItems(); assertEquals(extractor.getThumbnailUrl(), l.get(0).getThumbnailUrl()); assertNotEquals(extractor.getThumbnailUrl(), l.get(5).getThumbnailUrl()); } @@ -60,13 +60,13 @@ public class BandcampPlaylistExtractorTest { */ @Test(timeout = 10000L) public void testDifferentTrackCoversDuration() throws ExtractionException, IOException { - PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://infiniteammo.bandcamp.com/album/night-in-the-woods-vol-1-at-the-end-of-everything"); + final PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://infiniteammo.bandcamp.com/album/night-in-the-woods-vol-1-at-the-end-of-everything"); extractor.fetchPage(); /* All tracks in this album have the same cover art, but I don't know any albums with more than 10 tracks * that has at least one track with a cover art different from the rest. */ - List l = extractor.getInitialPage().getItems(); + final List l = extractor.getInitialPage().getItems(); assertEquals(extractor.getThumbnailUrl(), l.get(0).getThumbnailUrl()); assertEquals(extractor.getThumbnailUrl(), l.get(5).getThumbnailUrl()); } @@ -76,7 +76,7 @@ public class BandcampPlaylistExtractorTest { */ @Test(expected = ContentNotAvailableException.class) public void testLockedContent() throws ExtractionException, IOException { - PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); + final PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://billwurtz.bandcamp.com/album/high-enough"); extractor.fetchPage(); } @@ -85,7 +85,7 @@ public class BandcampPlaylistExtractorTest { */ @Test public void testSingleStreamPlaylist() throws ExtractionException, IOException { - PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachjohnson1.bandcamp.com/album/endless"); + final PlaylistExtractor extractor = Bandcamp.getPlaylistExtractor("https://zachjohnson1.bandcamp.com/album/endless"); extractor.fetchPage(); assertEquals(1, extractor.getStreamCount()); @@ -170,7 +170,7 @@ public class BandcampPlaylistExtractorTest { @Test public void testRelatedItems() throws Exception { - //DefaultTests.defaultTestRelatedItems(extractor); + // DefaultTests.defaultTestRelatedItems(extractor); // Would fail because BandcampPlaylistStreamInfoItemExtractor.getUploaderName() returns an empty String } 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 index 76f0559d0..c7b4e3579 100644 --- 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 @@ -36,13 +36,13 @@ public class BandcampRadioExtractorTest implements BaseListExtractorTest { @Test public void testRadioCount() throws ExtractionException, IOException { - List list = Bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); + final List list = Bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); assertTrue(list.size() > 300); } @Test public void testRelatedItems() throws Exception { - //DefaultTests.defaultTestRelatedItems(extractor); + // DefaultTests.defaultTestRelatedItems(extractor); // Would fail because BandcampRadioInfoItemExtractor.getUploaderName() returns an empty String } 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 index ecbed677c..b4f9382c7 100644 --- 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 @@ -33,7 +33,8 @@ public class BandcampRadioStreamExtractorTest { @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); + assertFalse(Bandcamp.getStreamExtractor("https://zachbenson.bandcamp.com/track/deflated") + instanceof BandcampRadioStreamExtractor); } @Test @@ -86,7 +87,8 @@ public class BandcampRadioStreamExtractorTest { @Test public void testGetDescription() throws ParsingException { - assertEquals("Featuring special guests Nick Hakim and Elbows, plus fresh cuts from Eddie Palmieri, KRS One, Ladi6, and Moonchild.", e.getDescription().getContent()); + assertEquals("Featuring special guests Nick Hakim and Elbows, plus fresh cuts from Eddie Palmieri, KRS One, Ladi6, and Moonchild.", + e.getDescription().getContent()); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index 786839995..f74fb9256 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -40,10 +40,10 @@ public class BandcampSearchExtractorTest { */ @Test public void testStreamSearch() throws ExtractionException, IOException { - SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement"); + final SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement"); - ListExtractor.InfoItemsPage page = extractor.getInitialPage(); - StreamInfoItem bestFriendsBasement = (StreamInfoItem) page.getItems().get(0); + final ListExtractor.InfoItemsPage page = extractor.getInitialPage(); + final StreamInfoItem bestFriendsBasement = (StreamInfoItem) page.getItems().get(0); // The track by Zach Benson should be the first result, no? assertEquals("Best Friend's Basement", bestFriendsBasement.getName()); @@ -58,8 +58,8 @@ public class BandcampSearchExtractorTest { */ @Test public void testChannelSearch() throws ExtractionException, IOException { - SearchExtractor extractor = Bandcamp.getSearchExtractor("C418"); - InfoItem c418 = extractor.getInitialPage() + final SearchExtractor extractor = Bandcamp.getSearchExtractor("C418"); + final InfoItem c418 = extractor.getInitialPage() .getItems().get(0); // C418's artist profile should be the first result, no? @@ -75,7 +75,7 @@ public class BandcampSearchExtractorTest { */ @Test public void testAlbumSearch() throws ExtractionException, IOException { - SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha"); + final SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha"); InfoItem minecraft = extractor.getInitialPage() .getItems().get(0); @@ -96,12 +96,12 @@ public class BandcampSearchExtractorTest { @Test public void testMultiplePages() throws ExtractionException, IOException { // A query practically guaranteed to have the maximum amount of pages - SearchExtractor extractor = Bandcamp.getSearchExtractor("e"); + final SearchExtractor extractor = Bandcamp.getSearchExtractor("e"); - Page page2 = extractor.getInitialPage().getNextPage(); + final Page page2 = extractor.getInitialPage().getNextPage(); assertEquals("https://bandcamp.com/search?q=e&page=2", page2.getUrl()); - Page page3 = extractor.getPage(page2).getNextPage(); + final Page page3 = extractor.getPage(page2).getNextPage(); assertEquals("https://bandcamp.com/search?q=e&page=3", page3.getUrl()); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index 4c14bea5d..f61018820 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -154,7 +154,7 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Test public void testArtistProfilePicture() throws Exception { - String url = extractor().getUploaderAvatarUrl(); + final String url = extractor().getUploaderAvatarUrl(); assertTrue(url.contains("://f4.bcbits.com/img/") && url.endsWith(".jpg")); } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java index 393ca01c6..9764d995a 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java @@ -30,7 +30,7 @@ public class BandcampSuggestionExtractorTest { @Test public void testSearchExample() throws IOException, ExtractionException { - List c418 = extractor.suggestionList("c418"); + final List c418 = extractor.suggestionList("c418"); assertTrue(c418.contains("C418")); From be562b84365a9b74ce0708cae53972aade36bfaf Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Fri, 27 Nov 2020 16:48:06 +0100 Subject: [PATCH 72/91] Change tests --- .../BandcampChannelExtractorTest.java | 20 ++++++------- .../bandcamp/BandcampStreamExtractorTest.java | 29 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index a5ccabf9d..327dc6b9a 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -22,31 +22,29 @@ public class BandcampChannelExtractorTest implements BaseChannelExtractorTest { @BeforeClass public static void setUp() throws Exception { NewPipe.init(DownloaderTestImpl.getInstance()); - extractor = Bandcamp.getChannelExtractor("https://npet.bandcamp.com/releases"); + extractor = Bandcamp.getChannelExtractor("https://toupie.bandcamp.com/releases"); extractor.fetchPage(); } @Test public void testLength() throws ExtractionException, IOException { - assertTrue(extractor.getInitialPage().getItems().size() >= 1); + assertTrue(extractor.getInitialPage().getItems().size() >= 0); } @Override @Test public void testDescription() throws Exception { - assertEquals("This string will be tested for in NewPipeExtractor tests.", extractor.getDescription()); + assertEquals("making music:)", extractor.getDescription()); } @Override public void testAvatarUrl() throws Exception { - // Has no avatar - assertEquals("", extractor.getAvatarUrl()); + assertTrue("unexpected avatar URL", extractor.getAvatarUrl().contains("://f4.bcbits.com/")); } @Override public void testBannerUrl() throws Exception { - // Has no banner - assertEquals("", extractor.getBannerUrl()); + assertTrue("unexpected banner URL", extractor.getBannerUrl().contains("://f4.bcbits.com/")); } @Override @@ -76,21 +74,21 @@ public class BandcampChannelExtractorTest implements BaseChannelExtractorTest { @Override public void testName() throws Exception { - assertEquals("NewPipeExtractorTest", extractor.getName()); + assertEquals("toupie", extractor.getName()); } @Override public void testId() throws Exception { - assertEquals("https://npet.bandcamp.com/", extractor.getId()); + assertEquals("https://toupie.bandcamp.com/", extractor.getId()); } @Override public void testUrl() throws Exception { - assertEquals("https://npet.bandcamp.com/releases", extractor.getUrl()); + assertEquals("https://toupie.bandcamp.com", extractor.getUrl()); } @Override public void testOriginalUrl() throws Exception { - assertEquals("https://npet.bandcamp.com/releases", extractor.getUrl()); + assertEquals("https://toupie.bandcamp.com", extractor.getUrl()); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index f61018820..dd979d554 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -35,10 +35,9 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @BeforeClass public static void setUp() throws ExtractionException, IOException { NewPipe.init(DownloaderTestImpl.getInstance()); - // This test track was uploaded specifically for NewPipeExtractor tests extractor = (BandcampStreamExtractor) Bandcamp - .getStreamExtractor("https://npet.bandcamp.com/track/track-1"); + .getStreamExtractor("https://teaganbear.bandcamp.com/track/just-for-the-halibut-creative-commons-attribution"); extractor.fetchPage(); } @@ -54,22 +53,22 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Override public String expectedName() { - return "Track #1"; + return "Just for the Halibut [Creative Commons: Attribution]"; } @Override public String expectedId() { - return "https://npet.bandcamp.com/track/track-1"; + return "https://teaganbear.bandcamp.com/track/just-for-the-halibut-creative-commons-attribution"; } @Override public String expectedUrlContains() { - return "https://npet.bandcamp.com/track/track-1"; + return "https://teaganbear.bandcamp.com/track/just-for-the-halibut-creative-commons-attribution"; } @Override public String expectedOriginalUrlContains() { - return "https://npet.bandcamp.com/track/track-1"; + return "https://teaganbear.bandcamp.com/track/just-for-the-halibut-creative-commons-attribution"; } @Override @@ -79,17 +78,17 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Override public String expectedUploaderName() { - return "NewPipeExtractorTest"; + return "Teaganbear"; } @Override public String expectedUploaderUrl() { - return "https://npet.bandcamp.com/"; + return "https://teaganbear.bandcamp.com/"; } @Override public List expectedDescriptionContains() { - return Collections.singletonList("This sample track was created using MuseScore."); + return Collections.singletonList("it's Creative Commons so feel free to use it in whatever"); } @Override @@ -104,12 +103,12 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Override public String expectedUploadDate() { - return "2020-03-17 18:37:44.000"; + return "2019-03-10 23:00:42.000"; } @Override public String expectedTextualUploadDate() { - return "17 Mar 2020 18:37:44 GMT"; + return "10 Mar 2019 23:00:42 GMT"; } @Override @@ -149,7 +148,7 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Override public String expectedCategory() { - return "acoustic"; + return "dance"; } @Test @@ -160,7 +159,11 @@ public class BandcampStreamExtractorTest extends DefaultStreamExtractorTest { @Test public void testTranslateIdsToUrl() throws ParsingException { - assertEquals("https://npet.bandcamp.com/track/track-1", BandcampExtractorHelper.getStreamUrlFromIds(3775652329L, 4207805220L, "track")); + // To add tests: look at website's source, search for `band_id` and `item_id` + assertEquals( + "https://teaganbear.bandcamp.com/track/just-for-the-halibut-creative-commons-attribution", + BandcampExtractorHelper.getStreamUrlFromIds(3877364987L, 3486455278L, "track") + ); } } From 04dd3d4d3266d3b2cf2d8afca8518209431c17aa Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Sat, 5 Dec 2020 15:08:26 +0100 Subject: [PATCH 73/91] Rework link handlers to correctly accept external websites --- .../extractors/BandcampExtractorHelper.java | 22 +++++++++++++++++++ .../BandcampChannelLinkHandlerFactory.java | 16 ++++++-------- .../BandcampPlaylistLinkHandlerFactory.java | 13 +++++++++-- .../BandcampStreamLinkHandlerFactory.java | 22 +++++++++++-------- ...BandcampChannelLinkHandlerFactoryTest.java | 10 +++++++-- ...andcampPlaylistLinkHandlerFactoryTest.java | 1 + .../BandcampStreamLinkHandlerFactoryTest.java | 1 + 7 files changed, 63 insertions(+), 22 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 5d0fb45f7..6508de10d 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 @@ -123,6 +123,28 @@ public class BandcampExtractorHelper { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } + /** + * @return true if the given url looks like it comes from a bandcamp custom domain + * or if it comes from bandcamp.com itself + */ + public static boolean isSupportedDomain(final String url) throws ParsingException { + + // Accept all bandcamp.com URLs + if (url.toLowerCase().matches("https?://.+\\.bandcamp\\.com(/.*)?")) return true; + + try { + // Accept all other URLs if they contain a tag that says they are generated by bandcamp + return Jsoup.parse( + NewPipe.getDownloader().get(url).responseBody() + ) + .getElementsByAttributeValue("name", "generator") + .attr("content").equals("Bandcamp"); + } catch (IOException | ReCaptchaException e) { + throw new ParsingException("Could not determine whether URL is custom domain " + + "(not available? network error?)"); + } + } + static DateWrapper parseDate(final String textDate) throws ParsingException { try { final Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(textDate); 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 9fbc8ae8f..762c5d9b3 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 @@ -24,7 +24,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { try { final String response = NewPipe.getDownloader().get(url).responseBody(); - // This variable contains band data! + // Use band data embedded in website to extract ID final JsonObject bandData = BandcampExtractorHelper.getJsonData(response, "data-band"); return String.valueOf(bandData.getLong("id")); @@ -51,17 +51,15 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { } /** - * Matches * .bandcamp.com as well as custom domains - * where the profile is at * . * /releases + * Accepts only pages that do not lead to an album or track. Supports external pages. */ @Override - public boolean onAcceptUrl(final String url) { + public boolean onAcceptUrl(final String url) throws ParsingException { - // Is a subdomain of bandcamp.com? - boolean isBandcampComArtistPage = url.matches("https?://.+\\.bandcamp\\.com/?"); + // Exclude URLs that lead to a track or album + if (url.matches(".*/(album|track)/.*")) return false; - boolean isCustomDomainReleases = url.matches("https?://.+\\..+/releases/?(?!.)"); - - return isBandcampComArtistPage || isCustomDomainReleases; + // Test whether domain is supported + return BandcampExtractorHelper.isSupportedDomain(url); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java index b030fcc5a..b0fd2d50a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampPlaylistLinkHandlerFactory.java @@ -4,6 +4,7 @@ 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.services.bandcamp.extractors.BandcampExtractorHelper; import java.util.List; @@ -22,8 +23,16 @@ public class BandcampPlaylistLinkHandlerFactory extends ListLinkHandlerFactory { return url; } + /** + * Accepts all bandcamp URLs that contain /album/ behind their domain name. + */ @Override - public boolean onAcceptUrl(final String url) { - return url.toLowerCase().matches("https?://.+\\..+/album/.+"); + public boolean onAcceptUrl(final String url) throws ParsingException { + + // Exclude URLs which do not lead to an album + if (!url.toLowerCase().matches("https?://.+\\..+/album/.+")) return false; + + // Test whether domain is supported + return BandcampExtractorHelper.isSupportedDomain(url); } } 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 5de345e15..fa0435daa 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 @@ -4,6 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; /** *

Tracks don't have standalone ids, they are always in combination with the band id. @@ -40,16 +41,19 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { } /** - * Sometimes, the root page of an artist is also an album or track - * page. In that case, it is assumed that one actually wants to open - * the profile and not the track it has set as the default one. - *

Urls are expected to be in this format to account for - * custom domains:

- * https:// * . * /track/ * + * Accepts URLs that point to a bandcamp radio show or that are a bandcamp + * domain and point to a track. */ @Override - public boolean onAcceptUrl(final String url) { - return url.toLowerCase().matches("https?://.+\\..+/track/.+") - || url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); + public boolean onAcceptUrl(final String url) throws ParsingException { + + // Accept Bandcamp radio + if (url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+")) return true; + + // Don't accept URLs that don't point to a track + if (!url.toLowerCase().matches("https?://.+\\..+/track/.+")) return false; + + // Test whether domain is supported + return BandcampExtractorHelper.isSupportedDomain(url); } } 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 e07daf7d1..8886f649f 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 @@ -26,13 +26,19 @@ public class BandcampChannelLinkHandlerFactoryTest { @Test public void testAcceptUrl() throws ParsingException { - assertTrue(linkHandler.acceptUrl("http://interovgm.com/releases/")); - assertTrue(linkHandler.acceptUrl("https://interovgm.com/releases")); + // Bandcamp URLs assertTrue(linkHandler.acceptUrl("http://zachbenson.bandcamp.com")); assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); + assertTrue(linkHandler.acceptUrl("https://billwurtz.bandcamp.com/releases")); assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); + + // External URLs + assertTrue(linkHandler.acceptUrl("http://interovgm.com/releases/")); + assertTrue(linkHandler.acceptUrl("https://interovgm.com/releases")); + + assertFalse(linkHandler.acceptUrl("https://example.com/releases")); } @Test diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java index 11fe3acd7..561d8f7b6 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java @@ -35,6 +35,7 @@ public class BandcampPlaylistLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); assertFalse(linkHandler.acceptUrl("https://interovgm.com/track/title")); + assertFalse(linkHandler.acceptUrl("https://example.com/album/samplealbum")); assertTrue(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/album/prom")); 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 69a7c2bf1..a65b09567 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 @@ -43,6 +43,7 @@ public class BandcampStreamLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); assertFalse(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids")); + assertFalse(linkHandler.acceptUrl("https://example.com/track/sampletrack")); assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); assertTrue(linkHandler.acceptUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/")); From df16a8646fb971242a6cbc8b2aaae3baba36b415 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 18 Dec 2020 23:15:54 +0100 Subject: [PATCH 74/91] [Bandcamp] Improve radio stream extractor test --- .../BandcampRadioStreamExtractorTest.java | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) 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 index b4f9382c7..c216f9f23 100644 --- 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 @@ -4,30 +4,32 @@ import org.junit.BeforeClass; import org.junit.Test; import org.schabi.newpipe.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.DefaultStreamExtractorTest; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioStreamExtractor; import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.stream.StreamType; import java.io.IOException; -import java.util.Calendar; -import java.util.TimeZone; +import java.util.*; import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; -public class BandcampRadioStreamExtractorTest { +public class BandcampRadioStreamExtractorTest extends DefaultStreamExtractorTest { - private static StreamExtractor e; + private static StreamExtractor extractor; - private static final String SHOW_URL = "https://bandcamp.com/?show=230"; + private static final String URL = "https://bandcamp.com/?show=230"; @BeforeClass public static void setUp() throws IOException, ExtractionException { NewPipe.init(DownloaderTestImpl.getInstance()); - e = Bandcamp.getStreamExtractor(SHOW_URL); - e.fetchPage(); + extractor = Bandcamp.getStreamExtractor(URL); + extractor.fetchPage(); } @Test @@ -37,31 +39,43 @@ public class BandcampRadioStreamExtractorTest { instanceof BandcampRadioStreamExtractor); } - @Test - public void testGetName() throws ParsingException { - assertEquals("Sound Movements", e.getName()); - } + @Override public StreamExtractor extractor() { return extractor; } + @Override public String expectedName() throws Exception { return "Sound Movements"; } + @Override public String expectedId() throws Exception { return "230"; } + @Override public String expectedUrlContains() throws Exception { return URL; } + @Override public String expectedOriginalUrlContains() throws Exception { return URL; } + @Override public boolean expectedHasVideoStreams() { return false; } + @Override public boolean expectedHasSubtitles() { return false; } + @Override public boolean expectedHasFrames() { return false; } + @Override public boolean expectedHasRelatedStreams() { return false; } + @Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; } + @Override public StreamingService expectedService() { return Bandcamp; } + @Override public String expectedUploaderName() { return "Andrew Jervis"; } @Test(expected = ContentNotSupportedException.class) public void testGetUploaderUrl() throws ParsingException { - e.getUploaderUrl(); + extractor.getUploaderUrl(); } - @Test - public void testGetUrl() throws ParsingException { - assertEquals(SHOW_URL, e.getUrl()); + @Test(expected = ContentNotSupportedException.class) + @Override + public void testUploaderUrl() throws Exception { + super.testUploaderUrl(); + } + @Override public String expectedUploaderUrl() { return null; } + + @Override + public List expectedDescriptionContains() { + return Collections.singletonList("Featuring special guests Nick Hakim and Elbows, plus fresh cuts from Eddie Palmieri, KRS One, Ladi6, and Moonchild."); } - @Test - public void testGetUploaderName() throws ParsingException { - assertEquals("Andrew Jervis", e.getUploaderName()); - } - - @Test - public void testGetTextualUploadDate() throws ParsingException { - assertEquals("16 May 2017 00:00:00 GMT", e.getTextualUploadDate()); - } + @Override public long expectedLength() { return 5619; } + @Override public long expectedViewCountAtLeast() { return -1; } + @Override public long expectedLikeCountAtLeast() { return -1; } + @Override public long expectedDislikeCountAtLeast() { return -1; } + @Override public String expectedUploadDate() { return "16 May 2017 00:00:00 GMT"; } + @Override public String expectedTextualUploadDate() { return "16 May 2017 00:00:00 GMT"; } @Test public void testUploadDate() throws ParsingException { final Calendar expectedCalendar = Calendar.getInstance(); @@ -71,34 +85,20 @@ public class BandcampRadioStreamExtractorTest { expectedCalendar.setTimeInMillis(0); expectedCalendar.set(2017, Calendar.MAY, 16); - assertEquals(expectedCalendar.getTimeInMillis(), e.getUploadDate().date().getTimeInMillis()); + assertEquals(expectedCalendar.getTimeInMillis(), extractor.getUploadDate().offsetDateTime().toInstant().toEpochMilli()); } @Test public void testGetThumbnailUrl() throws ParsingException { - assertTrue(e.getThumbnailUrl().contains("bcbits.com/img")); + assertTrue(extractor.getThumbnailUrl().contains("bcbits.com/img")); } @Test public void testGetUploaderAvatarUrl() throws ParsingException { - assertTrue(e.getUploaderAvatarUrl().contains("bandcamp-button")); - + assertTrue(extractor.getUploaderAvatarUrl().contains("bandcamp-button")); } - @Test - public void testGetDescription() throws ParsingException { - assertEquals("Featuring special guests Nick Hakim and Elbows, plus fresh cuts from Eddie Palmieri, KRS One, Ladi6, and Moonchild.", - e.getDescription().getContent()); - - } - - @Test - public void testGetLength() throws ParsingException { - assertEquals(5619, e.getLength()); - } - - @Test - public void testGetAudioStreams() throws ExtractionException, IOException { - assertEquals(2, e.getAudioStreams().size()); + @Test public void testGetAudioStreams() throws ExtractionException, IOException { + assertEquals(2, extractor.getAudioStreams().size()); } } From 74b46fed2d36da002b612fb8952cdd22f19ba8aa Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 19 Dec 2020 10:40:21 +0100 Subject: [PATCH 75/91] [Bandcamp] Fix deprecation in parseDate helper function --- .../extractors/BandcampExtractorHelper.java | 21 +++++++++++-------- .../BandcampRadioStreamExtractorTest.java | 5 ++++- 2 files changed, 16 insertions(+), 10 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 6508de10d..1d76c4612 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 @@ -15,9 +15,12 @@ import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.utils.Utils; import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; +import java.time.DateTimeException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; public class BandcampExtractorHelper { @@ -147,12 +150,12 @@ public class BandcampExtractorHelper { static DateWrapper parseDate(final String textDate) throws ParsingException { try { - final Date date = new SimpleDateFormat("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH).parse(textDate); - final Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - return new DateWrapper(calendar, false); - } catch (final ParseException e) { - throw new ParsingException("Could not extract date", e); + final ZonedDateTime zonedDateTime = ZonedDateTime.parse( + textDate, DateTimeFormatter.ofPattern("dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH)); + return new DateWrapper(zonedDateTime.toOffsetDateTime(), false); + } catch (final DateTimeException e) { + throw new ParsingException("Could not parse date '" + textDate + "'", e); } + } } 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 index c216f9f23..e024fefa7 100644 --- 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 @@ -14,7 +14,10 @@ import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.stream.StreamType; import java.io.IOException; -import java.util.*; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; +import java.util.TimeZone; import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.Bandcamp; From 50903730b13e1b60e297f11047cfbd3dc13fd9c7 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 22 Dec 2020 08:53:10 +0100 Subject: [PATCH 76/91] [Bandcamp] Fix accepting HTTP URLs --- .../BandcampFeaturedLinkHandlerFactory.java | 11 +++++++---- .../BandcampChannelLinkHandlerFactoryTest.java | 3 +++ .../BandcampFeaturedLinkHandlerFactoryTest.java | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) 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 7aac3684b..6286e31da 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 @@ -3,6 +3,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.utils.Utils; import java.util.List; @@ -25,8 +26,9 @@ public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { } @Override - public String getId(final String url) { - if (url.matches("https?://bandcamp\\.com/\\?show=\\d+") || url.equals(RADIO_API_URL)) { + public String getId(String url) { + url = Utils.replaceHttpWithHttps(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; @@ -36,8 +38,9 @@ public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { } @Override - public boolean onAcceptUrl(final String url) { + public boolean onAcceptUrl(String url) { + url = Utils.replaceHttpWithHttps(url); return url.equals(FEATURED_API_URL) || (url.equals(RADIO_API_URL) - || url.matches("https?://bandcamp\\.com/\\?show=\\d+")); + || url.matches("https://bandcamp\\.com/\\?show=\\d+")); } } 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 8886f649f..499704b99 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 @@ -31,6 +31,8 @@ public class BandcampChannelLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/")); assertTrue(linkHandler.acceptUrl("https://billwurtz.bandcamp.com/releases")); + assertTrue(linkHandler.acceptUrl("http://zachbenson.bandcamp.com/")); + assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); @@ -44,6 +46,7 @@ public class BandcampChannelLinkHandlerFactoryTest { @Test public void testGetId() throws ParsingException { assertEquals("1196681540", linkHandler.getId("https://macbenson.bandcamp.com/")); + assertEquals("1196681540", linkHandler.getId("http://macbenson.bandcamp.com/")); assertEquals("1581461772", linkHandler.getId("https://interovgm.com/releases")); assertEquals("3321800855", linkHandler.getId("https://infiniteammo.bandcamp.com/")); assertEquals("3775652329", linkHandler.getId("https://npet.bandcamp.com/")); 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 index 38559782b..b337ded7d 100644 --- 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 @@ -24,6 +24,7 @@ public class BandcampFeaturedLinkHandlerFactoryTest { @Test public void testAcceptUrl() throws ParsingException { + assertTrue(linkHandler.acceptUrl("http://bandcamp.com/?show=1")); 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")); @@ -42,6 +43,7 @@ public class BandcampFeaturedLinkHandlerFactoryTest { @Test public void testGetId() { + assertEquals("Featured", linkHandler.getId("http://bandcamp.com/api/mobile/24/bootstrap_data")); 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")); From c9e9953bb085a1231817b9d29675587d10d92470 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Tue, 22 Dec 2020 20:02:53 +0100 Subject: [PATCH 77/91] [Bandcamp] Fix channel link handler factory --- .../BandcampChannelLinkHandlerFactory.java | 26 +++++++++++++++---- ...BandcampChannelLinkHandlerFactoryTest.java | 2 ++ 2 files changed, 23 insertions(+), 5 deletions(-) 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 762c5d9b3..2cf956cc9 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 @@ -51,15 +51,31 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { } /** - * Accepts only pages that do not lead to an album or track. Supports external pages. + * Accepts only pages that lead to the root of an artist profile. Supports external pages. */ @Override public boolean onAcceptUrl(final String url) throws ParsingException { - // Exclude URLs that lead to a track or album - if (url.matches(".*/(album|track)/.*")) return false; + // https: | | artist.bandcamp.com | releases + // 0 1 2 3 + String[] splitUrl = url.split("/"); - // Test whether domain is supported - return BandcampExtractorHelper.isSupportedDomain(url); + // URL is too short + if (splitUrl.length < 3) return false; + + // Must have "releases" as segment after url or none at all + if (splitUrl.length > 3 && !splitUrl[3].equals("releases")) { + + return false; + + } else { + if (splitUrl[2].equals("daily.bandcamp.com")) { + // Refuse links to daily.bandcamp.com as that is not an artist + return false; + } + + // Test whether domain is supported + return BandcampExtractorHelper.isSupportedDomain(url); + } } } 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 499704b99..6052a2549 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 @@ -35,6 +35,8 @@ public class BandcampChannelLinkHandlerFactoryTest { assertFalse(linkHandler.acceptUrl("https://bandcamp.com")); assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen")); + assertFalse(linkHandler.acceptUrl("https://daily.bandcamp.com/")); + assertFalse(linkHandler.acceptUrl("https://daily.bandcamp.com/best-of-2020/bandcamp-daily-staffers-on-their-favorite-albums-of-2020")); // External URLs assertTrue(linkHandler.acceptUrl("http://interovgm.com/releases/")); From 07570554b6a6ecdfc395901a9c827a583a00d1d5 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 15 Jan 2021 21:55:40 +0100 Subject: [PATCH 78/91] Fix build and optimize imports --- .../extractors/BandcampSearchExtractor.java | 10 ++++++++++ .../extractors/BandcampStreamExtractor.java | 13 +++++++++++++ .../bandcamp/BandcampChannelExtractorTest.java | 2 +- .../BandcampChannelLinkHandlerFactoryTest.java | 2 +- .../bandcamp/BandcampFeaturedExtractorTest.java | 3 +-- .../bandcamp/BandcampPlaylistExtractorTest.java | 3 +-- .../BandcampPlaylistLinkHandlerFactoryTest.java | 3 +-- .../bandcamp/BandcampRadioExtractorTest.java | 3 +-- .../bandcamp/BandcampRadioStreamExtractorTest.java | 2 +- .../bandcamp/BandcampSearchExtractorTest.java | 7 ++----- .../BandcampSearchQueryHandlerFactoryTest.java | 2 +- .../bandcamp/BandcampStreamExtractorTest.java | 4 +--- .../BandcampStreamLinkHandlerFactoryTest.java | 2 +- .../bandcamp/BandcampSuggestionExtractorTest.java | 2 +- 14 files changed, 36 insertions(+), 22 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java index 23097171e..6888d6932 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSearchExtractor.java @@ -8,10 +8,12 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.Page; 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.linkhandler.SearchQueryHandler; import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; import org.schabi.newpipe.extractor.search.SearchExtractor; @@ -19,6 +21,8 @@ import org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem. import javax.annotation.Nonnull; import java.io.IOException; +import java.util.Collections; +import java.util.List; public class BandcampSearchExtractor extends SearchExtractor { @@ -37,6 +41,12 @@ public class BandcampSearchExtractor extends SearchExtractor { return false; } + @Nonnull + @Override + public List getMetaInfo() throws ParsingException { + return Collections.emptyList(); + } + public InfoItemsPage getPage(final Page page) throws IOException, ExtractionException { // okay apparently this is where we DOWNLOAD the page and then COMMIT its ENTRIES to an INFOITEMPAGE final String html = getDownloader().get(page.getUrl()).responseBody(); 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 1f37176bf..3409a4cd2 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 @@ -9,6 +9,7 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.MetaInfo; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -319,4 +320,16 @@ public class BandcampStreamExtractor extends StreamExtractor { public String getSupportInfo() { return ""; } + + @Nonnull + @Override + public List getStreamSegments() throws ParsingException { + return Collections.emptyList(); + } + + @Nonnull + @Override + public List getMetaInfo() throws ParsingException { + return Collections.emptyList(); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index 327dc6b9a..b67be1832 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; 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 6052a2549..89c81fb9e 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 @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; 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 50d992a16..8a9756f91 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 @@ -4,8 +4,7 @@ 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.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index b695236d9..ce6a54cf0 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -4,14 +4,13 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.services.BasePlaylistExtractorTest; -import org.schabi.newpipe.extractor.services.DefaultTests; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java index 561d8f7b6..e1b7949f8 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistLinkHandlerFactoryTest.java @@ -4,11 +4,10 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampPlaylistLinkHandlerFactory; -import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; 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 index c7b4e3579..064521d9b 100644 --- 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 @@ -4,12 +4,11 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.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.BaseListExtractorTest; -import org.schabi.newpipe.extractor.services.DefaultTests; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor; import java.io.IOException; 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 index e024fefa7..8773c5564 100644 --- 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 @@ -2,7 +2,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java index f74fb9256..124265168 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchExtractorTest.java @@ -4,20 +4,17 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.*; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.DefaultSearchExtractorTest; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampChannelInfoItemExtractor; -import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampPlaylistInfoItemExtractor; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSearchExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import java.io.IOException; - import javax.annotation.Nullable; +import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java index 4271bc97c..c39115247 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSearchQueryHandlerFactoryTest.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampSearchQueryHandlerFactory; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java index dd979d554..a080de674 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampStreamExtractorTest.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; @@ -16,10 +16,8 @@ import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.stream.StreamType; import java.io.IOException; -import java.util.Calendar; import java.util.Collections; import java.util.List; -import java.util.TimeZone; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; 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 a65b09567..17d983cec 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 @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java index 9764d995a..95f7de3a9 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampSuggestionExtractorTest.java @@ -4,7 +4,7 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; -import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.downloader.DownloaderTestImpl; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampSuggestionExtractor; From 5bf9fddba930fb0555b5ec77221bf6faa00d79e6 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 15 Feb 2021 22:45:02 +0100 Subject: [PATCH 79/91] Code improvements --- .../bandcamp/extractors/BandcampRadioStreamExtractor.java | 4 +--- .../bandcamp/BandcampChannelLinkHandlerFactoryTest.java | 1 - .../bandcamp/BandcampStreamLinkHandlerFactoryTest.java | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) 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 index 57ca8b187..a0c109810 100644 --- 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 @@ -27,11 +27,9 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { private JsonObject showInfo; - private LinkHandler linkHandler; public BandcampRadioStreamExtractor(final StreamingService service, final LinkHandler linkHandler) { super(service, linkHandler); - this.linkHandler = linkHandler; } static JsonObject query(final int id) throws ParsingException { @@ -64,7 +62,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nonnull @Override public String getUrl() throws ParsingException { - return linkHandler.getUrl(); + return getLinkHandler().getUrl(); } @Nonnull 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 89c81fb9e..aa7a93d8a 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 @@ -10,7 +10,6 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampChannelLinkHandlerFactory; import static org.junit.Assert.*; -import static org.junit.Assert.assertTrue; /** * Test for {@link BandcampChannelLinkHandlerFactory} 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 17d983cec..85094827e 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 @@ -10,7 +10,6 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory; import static org.junit.Assert.*; -import static org.junit.Assert.assertFalse; /** * Test for {@link BandcampStreamLinkHandlerFactory} From 16973126a0b2c68f5cfbfad2618f8248ff11e654 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 16 Feb 2021 20:25:48 +0100 Subject: [PATCH 80/91] Use Collections.emptyList() instead of Collections.EMPTY_LIST or new ArrayList() --- .../extractor/linkhandler/ListLinkHandlerFactory.java | 3 ++- .../bandcamp/extractors/BandcampRadioStreamExtractor.java | 3 ++- .../bandcamp/extractors/BandcampStreamExtractor.java | 8 ++++---- .../bandcamp/extractors/BandcampSuggestionExtractor.java | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/linkhandler/ListLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/linkhandler/ListLinkHandlerFactory.java index 86991c4df..11b94c7a5 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/linkhandler/ListLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/linkhandler/ListLinkHandlerFactory.java @@ -4,6 +4,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.utils.Utils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public abstract class ListLinkHandlerFactory extends LinkHandlerFactory { @@ -13,7 +14,7 @@ public abstract class ListLinkHandlerFactory extends LinkHandlerFactory { /////////////////////////////////// public List getContentFilter(String url) throws ParsingException { - return new ArrayList<>(0); + return Collections.emptyList(); } public String getSortFilter(String url) throws ParsingException { 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 index a0c109810..01ed5ad5a 100644 --- 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 @@ -20,6 +20,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; @@ -137,6 +138,6 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nonnull @Override public List getTags() { - return new ArrayList<>(); + return Collections.emptyList(); } } 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 3409a4cd2..856ad54ba 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 @@ -211,24 +211,24 @@ public class BandcampStreamExtractor extends StreamExtractor { @Override public List getVideoStreams() { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } @Override public List getVideoOnlyStreams() { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } @Nonnull @Override public List getSubtitlesDefault() { - return new ArrayList<>(); + return Collections.emptyList(); } @Nonnull @Override public List getSubtitles(MediaFormat format) { - return new ArrayList<>(); + return Collections.emptyList(); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index bb1ababb2..cc7d384f3 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -15,6 +15,7 @@ import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class BandcampSuggestionExtractor extends SuggestionExtractor { @@ -48,7 +49,7 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { } catch (final JsonParserException e) { e.printStackTrace(); - return new ArrayList<>(); + return Collections.emptyList(); } From 54b8e54f8007df6e6820a5f9d42f4bd6e141c9c2 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 16 Feb 2021 20:59:13 +0100 Subject: [PATCH 81/91] Fix potential NPE --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 856ad54ba..d8e6fdede 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 @@ -194,7 +194,7 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public String getHlsUrl() { - return null; + return ""; } @Override From 54aa5b3042b1f4cc53a06d78ef9aac4be6996a4a Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 16 Feb 2021 21:09:35 +0100 Subject: [PATCH 82/91] Use propper structure in KioskExtractors Made BandCampRadioExtractor a Kiosk which holds StreamInfoItems and not InfoItems. --- .../extractors/BandcampFeaturedExtractor.java | 48 +++++++++---------- .../extractors/BandcampRadioExtractor.java | 45 +++++++---------- .../BandcampFeaturedExtractorTest.java | 1 + .../bandcamp/BandcampRadioExtractorTest.java | 5 +- 4 files changed, 45 insertions(+), 54 deletions(-) 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 2019153a6..12214601a 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 @@ -24,6 +24,8 @@ 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"; + private JsonObject json; + public BandcampFeaturedExtractor(final StreamingService streamingService, final ListLinkHandler listLinkHandler, final String kioskId) { super(streamingService, listLinkHandler, kioskId); @@ -31,7 +33,15 @@ public class BandcampFeaturedExtractor extends KioskExtractor @Override public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { - + try { + json = JsonParser.object().from( + getDownloader().post( + FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() + ).responseBody() + ); + } catch (final JsonParserException e) { + throw new ParsingException("Could not parse Bandcamp featured API response", e); + } } @Nonnull @@ -46,35 +56,23 @@ public class BandcampFeaturedExtractor extends KioskExtractor final PlaylistInfoItemsCollector c = new PlaylistInfoItemsCollector(getServiceId()); - try { + final JsonArray featuredStories = json.getObject("feed_content") + .getObject("stories") + .getArray("featured"); + for (int i = 0; i < featuredStories.size(); i++) { + final JsonObject featuredStory = featuredStories.getObject(i); - final JsonObject json = JsonParser.object().from( - getDownloader().post( - FEATURED_API_URL, null, "{\"platform\":\"\",\"version\":0}".getBytes() - ).responseBody() - ); - - final JsonArray featuredStories = json.getObject("feed_content") - .getObject("stories") - .getArray("featured"); - - for (int i = 0; i < featuredStories.size(); i++) { - final JsonObject featuredStory = featuredStories.getObject(i); - - if (featuredStory.isNull("album_title")) { - // Is not an album, ignore - continue; - } - - c.commit(new BandcampPlaylistInfoItemFeaturedExtractor(featuredStory)); + if (featuredStory.isNull("album_title")) { + // Is not an album, ignore + continue; } - return new InfoItemsPage<>(c, null); - } catch (final JsonParserException e) { - e.printStackTrace(); - throw new ParsingException("JSON error", e); + c.commit(new BandcampPlaylistInfoItemFeaturedExtractor(featuredStory)); } + + return new InfoItemsPage<>(c, null); + } @Override 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 index 61c9e7326..8c3a7baf3 100644 --- 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 @@ -6,8 +6,6 @@ import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.InfoItemsCollector; import org.schabi.newpipe.extractor.Page; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; @@ -15,16 +13,19 @@ 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.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; -public class BandcampRadioExtractor extends KioskExtractor { +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"; + private JsonObject json = null; + public BandcampRadioExtractor(final StreamingService streamingService, final ListLinkHandler linkHandler, final String kioskId) { super(streamingService, linkHandler, kioskId); @@ -32,7 +33,12 @@ public class BandcampRadioExtractor extends KioskExtractor { @Override public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { - + try { + json = JsonParser.object().from( + getDownloader().get(RADIO_API_URL).responseBody()); + } catch (final JsonParserException e) { + throw new ExtractionException("Could not parse Bandcamp Radio API response", e); + } } @Nonnull @@ -43,36 +49,21 @@ public class BandcampRadioExtractor extends KioskExtractor { @Nonnull @Override - public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - final InfoItemsCollector c = new StreamInfoItemsCollector(getServiceId()); + public InfoItemsPage getInitialPage() { + final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); - try { + final JsonArray radioShows = json.getArray("results"); - final JsonObject json = JsonParser.object().from( - getDownloader().get( - RADIO_API_URL - ).responseBody() - ); - - final JsonArray radioShows = json.getArray("results"); - - for (int i = 0; i < radioShows.size(); i++) { - final JsonObject radioShow = radioShows.getObject(i); - - c.commit( - new BandcampRadioInfoItemExtractor(radioShow) - ); - } - - } catch (final JsonParserException e) { - e.printStackTrace(); + for (int i = 0; i < radioShows.size(); i++) { + final JsonObject radioShow = radioShows.getObject(i); + collector.commit(new BandcampRadioInfoItemExtractor(radioShow)); } - return new InfoItemsPage(c, null); + return new InfoItemsPage<>(collector, null); } @Override - public InfoItemsPage getPage(final Page page) { + public InfoItemsPage getPage(final Page page) { return null; } } 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 8a9756f91..1be966dea 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,6 +31,7 @@ public class BandcampFeaturedExtractorTest implements BaseListExtractorTest { NewPipe.init(DownloaderTestImpl.getInstance()); extractor = (BandcampFeaturedExtractor) Bandcamp .getKioskList().getDefaultKioskExtractor(); + extractor.fetchPage(); } @Test 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 index 064521d9b..70838bd7e 100644 --- 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 @@ -5,11 +5,11 @@ package org.schabi.newpipe.extractor.services.bandcamp; import org.junit.BeforeClass; import org.junit.Test; import org.schabi.newpipe.downloader.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.BaseListExtractorTest; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampRadioExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import java.io.IOException; import java.util.List; @@ -31,11 +31,12 @@ public class BandcampRadioExtractorTest implements BaseListExtractorTest { extractor = (BandcampRadioExtractor) Bandcamp .getKioskList() .getExtractorById("Radio", null); + extractor.fetchPage(); } @Test public void testRadioCount() throws ExtractionException, IOException { - final List list = Bandcamp.getKioskList().getExtractorById("Radio", null).getInitialPage().getItems(); + final List list = extractor.getInitialPage().getItems(); assertTrue(list.size() > 300); } From 98268e351c06d30009965bd2698246cff6a2a405 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 19 Feb 2021 13:35:44 +0100 Subject: [PATCH 83/91] Move radio URL check into a function --- .../bandcamp/extractors/BandcampExtractorHelper.java | 9 +++++++++ .../linkHandler/BandcampFeaturedLinkHandlerFactory.java | 6 +++--- .../linkHandler/BandcampStreamLinkHandlerFactory.java | 4 ++-- 3 files changed, 14 insertions(+), 5 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 1d76c4612..b19c41dd1 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 @@ -148,6 +148,15 @@ public class BandcampExtractorHelper { } } + /** + * Whether the URL points to a radio kiosk. + * @param url the URL to check + * @return true if the URL is https://bandcamp.com/?show=SHOW_ID + */ + public static boolean isRadioUrl(final String url) { + return url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+"); + } + static DateWrapper parseDate(final String textDate) throws ParsingException { try { final ZonedDateTime zonedDateTime = ZonedDateTime.parse( 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 6286e31da..ea6254979 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 @@ -3,6 +3,7 @@ package org.schabi.newpipe.extractor.services.bandcamp.linkHandler; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; import org.schabi.newpipe.extractor.utils.Utils; import java.util.List; @@ -28,7 +29,7 @@ public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { @Override public String getId(String url) { url = Utils.replaceHttpWithHttps(url); - if (url.matches("https://bandcamp\\.com/\\?show=\\d+") || url.equals(RADIO_API_URL)) { + if (BandcampExtractorHelper.isRadioUrl(url) || url.equals(RADIO_API_URL)) { return KIOSK_RADIO; } else if (url.equals(FEATURED_API_URL)) { return KIOSK_FEATURED; @@ -40,7 +41,6 @@ public class BandcampFeaturedLinkHandlerFactory extends ListLinkHandlerFactory { @Override public boolean onAcceptUrl(String url) { url = Utils.replaceHttpWithHttps(url); - return url.equals(FEATURED_API_URL) || (url.equals(RADIO_API_URL) - || url.matches("https://bandcamp\\.com/\\?show=\\d+")); + return url.equals(FEATURED_API_URL) || (url.equals(RADIO_API_URL) || BandcampExtractorHelper.isRadioUrl(url)); } } 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 fa0435daa..37ff29c0c 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 @@ -20,7 +20,7 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { */ @Override public String getId(final String url) throws ParsingException { - if (url.matches("https?://bandcamp\\.com/\\?show=\\d+")) { + if (BandcampExtractorHelper.isRadioUrl(url)) { return url.split("bandcamp.com/\\?show=")[1]; } else { return getUrl(url); @@ -48,7 +48,7 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { public boolean onAcceptUrl(final String url) throws ParsingException { // Accept Bandcamp radio - if (url.toLowerCase().matches("https?://bandcamp\\.com/\\?show=\\d+")) return true; + if (BandcampExtractorHelper.isRadioUrl(url)) return true; // Don't accept URLs that don't point to a track if (!url.toLowerCase().matches("https?://.+\\..+/track/.+")) return false; From fa61b864f20e756156be96a4b073f871b3b1c785 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 19 Feb 2021 13:37:24 +0100 Subject: [PATCH 84/91] Code improvements --- .../bandcamp/extractors/BandcampExtractorHelper.java | 6 +++--- .../bandcamp/extractors/BandcampRadioInfoItemExtractor.java | 2 +- .../bandcamp/extractors/BandcampSuggestionExtractor.java | 3 +-- .../bandcamp/BandcampStreamLinkHandlerFactoryTest.java | 1 + 4 files changed, 6 insertions(+), 6 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 b19c41dd1..c9a82a075 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 @@ -43,7 +43,7 @@ public class BandcampExtractorHelper { /** * Translate all these parameters together to the URL of the corresponding album or track - * using the mobile api + * using the mobile API */ public static String getStreamUrlFromIds(final long bandId, final long itemId, final String itemType) throws ParsingException { @@ -51,7 +51,7 @@ public class BandcampExtractorHelper { try { final String jsonString = NewPipe.getDownloader().get( "https://bandcamp.com/api/mobile/22/tralbum_details?band_id=" + bandId - + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.substring(0, 1)) + + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.charAt(0)) .responseBody(); return JsonParser.object().from(jsonString).getString("bandcamp_url").replace("http://", "https://"); @@ -88,7 +88,7 @@ public class BandcampExtractorHelper { } - return String.valueOf(result); + return result.toString(); } /** 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 index b2e2d3642..c575a35fe 100644 --- 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 @@ -14,7 +14,7 @@ import static org.schabi.newpipe.extractor.services.bandcamp.extractors.Bandcamp public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { - private JsonObject show; + private final JsonObject show; public BandcampRadioInfoItemExtractor(final JsonObject radioShow) { show = radioShow; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index cc7d384f3..9196e7c75 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -37,7 +37,7 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { final JsonArray jsonArray = fuzzyResults.getObject("auto") .getArray("results"); - final ArrayList suggestions = new ArrayList<>(); + final List suggestions = new ArrayList<>(); for (final Object fuzzyResult : jsonArray) { final String res = ((JsonObject) fuzzyResult).getString("name"); @@ -52,6 +52,5 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { return Collections.emptyList(); } - } } 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 85094827e..bf99fa308 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 @@ -48,5 +48,6 @@ public class BandcampStreamLinkHandlerFactoryTest { 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")); + assertTrue(linkHandler.acceptUrl("https://goodgoodblood-tl.bandcamp.com/track/when-it-all-wakes-up")); } } From 02920fafa88b3cdba4f4f94ca11c4ebdee52554b Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 19 Feb 2021 15:51:02 +0100 Subject: [PATCH 85/91] Add isUploaderVerified() --- .../bandcamp/extractors/BandcampChannelExtractor.java | 5 +++++ .../extractors/BandcampChannelInfoItemExtractor.java | 5 +++++ .../bandcamp/extractors/BandcampPlaylistExtractor.java | 5 +++++ .../bandcamp/extractors/BandcampRadioInfoItemExtractor.java | 5 +++++ .../bandcamp/extractors/BandcampStreamExtractor.java | 5 +++++ .../BandcampDiscographStreamInfoItemExtractor.java | 5 +++++ .../BandcampPlaylistStreamInfoItemExtractor.java | 5 +++++ .../BandcampSearchStreamInfoItemExtractor.java | 5 +++++ .../services/bandcamp/BandcampChannelExtractorTest.java | 5 +++++ .../services/bandcamp/BandcampPlaylistExtractorTest.java | 5 +++++ 10 files changed, 50 insertions(+) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java index 035d87a65..ef2835d26 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelExtractor.java @@ -94,6 +94,11 @@ public class BandcampChannelExtractor extends ChannelExtractor { return null; } + @Override + public boolean isVerified() throws ParsingException { + return false; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws ParsingException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java index fb956791d..d25c82656 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampChannelInfoItemExtractor.java @@ -50,4 +50,9 @@ public class BandcampChannelInfoItemExtractor implements ChannelInfoItemExtracto public long getStreamCount() { return -1; } + + @Override + public boolean isVerified() throws ParsingException { + return false; + } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 8915938fc..58a701d90 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -100,6 +100,11 @@ public class BandcampPlaylistExtractor extends PlaylistExtractor { } } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Override public long getStreamCount() { return trackInfo.size(); 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 index c575a35fe..a684e7eb8 100644 --- 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 @@ -78,6 +78,11 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { return ""; } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Override public boolean isAd() { return false; 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 d8e6fdede..53e6d3970 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 @@ -95,6 +95,11 @@ public class BandcampStreamExtractor extends StreamExtractor { return albumJson.getString("artist"); } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Nullable @Override public String getTextualUploadDate() { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java index 15b044981..16b82d8c8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java @@ -18,6 +18,11 @@ public class BandcampDiscographStreamInfoItemExtractor extends BandcampStreamInf return discograph.getString("band_name"); } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Override public String getName() { return discograph.getString("title"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java index e90a12aa1..12bf6816c 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java @@ -53,6 +53,11 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI return ""; } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + /** * Each track can have its own cover art. Therefore, unless a substitute is provided, * the thumbnail is extracted using a stream extractor. diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java index adeea0519..d096d098e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java @@ -24,6 +24,11 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte } } + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Override public String getName() throws ParsingException { return resultInfo.getElementsByClass("heading").text(); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java index b67be1832..78b392558 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampChannelExtractorTest.java @@ -57,6 +57,11 @@ public class BandcampChannelExtractorTest implements BaseChannelExtractorTest { assertEquals(-1, extractor.getSubscriberCount()); } + @Override + public void testVerified() throws Exception { + assertFalse(extractor.isVerified()); + } + @Override public void testRelatedItems() throws Exception { // not implemented diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java index ce6a54cf0..31109951a 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampPlaylistExtractorTest.java @@ -132,6 +132,11 @@ public class BandcampPlaylistExtractorTest { assertEquals(5, extractor.getStreamCount()); } + @Override + public void testUploaderVerified() throws Exception { + assertFalse(extractor.isUploaderVerified()); + } + @Test public void testInitialPage() throws IOException, ExtractionException { assertNotNull(extractor.getInitialPage().getItems().get(0)); From ea120a463725bdddf22577888f85dd42c7d82db2 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 20 Feb 2021 00:23:32 +0100 Subject: [PATCH 86/91] remove print stacktrace use interface --- .../services/bandcamp/extractors/BandcampStreamExtractor.java | 2 +- .../bandcamp/extractors/BandcampSuggestionExtractor.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) 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 53e6d3970..005078a7a 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 @@ -311,7 +311,7 @@ public class BandcampStreamExtractor extends StreamExtractor { public List getTags() { final Elements tagElements = document.getElementsByAttributeValue("itemprop", "keywords"); - final ArrayList tags = new ArrayList<>(); + final List tags = new ArrayList<>(); for (final Element e : tagElements) { tags.add(e.text()); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index 9196e7c75..4eaa830cb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -47,8 +47,6 @@ public class BandcampSuggestionExtractor extends SuggestionExtractor { return suggestions; } catch (final JsonParserException e) { - e.printStackTrace(); - return Collections.emptyList(); } From adde4332d1f21220f18d5b0079210a733324f203 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 20 Feb 2021 23:58:49 +0100 Subject: [PATCH 87/91] Code improvements --- .../bandcamp/extractors/BandcampExtractorHelper.java | 10 +++++----- .../BandcampDiscographStreamInfoItemExtractor.java | 5 ----- .../BandcampPlaylistStreamInfoItemExtractor.java | 5 ----- .../BandcampSearchStreamInfoItemExtractor.java | 5 ----- .../BandcampStreamInfoItemExtractor.java | 9 ++++++--- 5 files changed, 11 insertions(+), 23 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 c9a82a075..c4011fff6 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 @@ -119,16 +119,16 @@ public class BandcampExtractorHelper { /** * @param id The image ID * @param album Whether this is the cover of an album - * @return Url of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 - * but we don't want something as large as 3460x3460 here, do we?) + * @return URL of image with this ID in size 10 which is 1200x1200 (we could also choose size 0 + * but we don't want something as large as 3460x3460 here) */ public static String getImageUrl(final long id, final boolean album) { return "https://f4.bcbits.com/img/" + (album ? 'a' : "") + id + "_10.jpg"; } /** - * @return true if the given url looks like it comes from a bandcamp custom domain - * or if it comes from bandcamp.com itself + * @return true if the given URL looks like it comes from a bandcamp custom domain + * or if it comes from bandcamp.com itself */ public static boolean isSupportedDomain(final String url) throws ParsingException { @@ -151,7 +151,7 @@ public class BandcampExtractorHelper { /** * Whether the URL points to a radio kiosk. * @param url the URL to check - * @return true if the URL is https://bandcamp.com/?show=SHOW_ID + * @return true if the URL matches 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/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java index 16b82d8c8..15b044981 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampDiscographStreamInfoItemExtractor.java @@ -18,11 +18,6 @@ public class BandcampDiscographStreamInfoItemExtractor extends BandcampStreamInf return discograph.getString("band_name"); } - @Override - public boolean isUploaderVerified() throws ParsingException { - return false; - } - @Override public String getName() { return discograph.getString("title"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java index 12bf6816c..e90a12aa1 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampPlaylistStreamInfoItemExtractor.java @@ -53,11 +53,6 @@ public class BandcampPlaylistStreamInfoItemExtractor extends BandcampStreamInfoI return ""; } - @Override - public boolean isUploaderVerified() throws ParsingException { - return false; - } - /** * Each track can have its own cover art. Therefore, unless a substitute is provided, * the thumbnail is extracted using a stream extractor. diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java index d096d098e..adeea0519 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampSearchStreamInfoItemExtractor.java @@ -24,11 +24,6 @@ public class BandcampSearchStreamInfoItemExtractor extends BandcampStreamInfoIte } } - @Override - public boolean isUploaderVerified() throws ParsingException { - return false; - } - @Override public String getName() throws ParsingException { return resultInfo.getElementsByClass("heading").text(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java index 485433f9d..5f792fdef 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/streaminfoitem/BandcampStreamInfoItemExtractor.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.extractor.services.bandcamp.extractors.streaminfoitem; +import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor; import org.schabi.newpipe.extractor.stream.StreamType; @@ -44,9 +45,11 @@ public abstract class BandcampStreamInfoItemExtractor implements StreamInfoItemE return null; } - /** - * There are no ads just like that, duh - */ + @Override + public boolean isUploaderVerified() throws ParsingException { + return false; + } + @Override public boolean isAd() { return false; From c07db80ef068f885ca10709551e4591bd385cdac Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 21 Feb 2021 12:15:45 +0100 Subject: [PATCH 88/91] Add BASE_URL and BASE_API_URL to BandcampExtractorHelper --- .../services/bandcamp/BandcampService.java | 5 +++-- .../extractors/BandcampExtractorHelper.java | 14 +++++++++----- .../extractors/BandcampFeaturedExtractor.java | 4 +++- .../extractors/BandcampRadioExtractor.java | 4 +++- .../extractors/BandcampRadioInfoItemExtractor.java | 3 ++- .../extractors/BandcampRadioStreamExtractor.java | 6 +++--- .../extractors/BandcampSuggestionExtractor.java | 4 +++- .../BandcampSearchQueryHandlerFactory.java | 4 +++- .../BandcampStreamLinkHandlerFactory.java | 4 +++- 9 files changed, 32 insertions(+), 16 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 1d96684b2..145693285 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 @@ -19,6 +19,7 @@ import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor; import java.util.Collections; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_URL; 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; @@ -32,7 +33,7 @@ public class BandcampService extends StreamingService { @Override public String getBaseUrl() { - return "https://bandcamp.com"; + return BASE_URL; } @Override @@ -113,7 +114,7 @@ public class BandcampService extends StreamingService { @Override public StreamExtractor getStreamExtractor(final LinkHandler linkHandler) { - if (linkHandler.getUrl().matches("https?://bandcamp\\.com/\\?show=\\d+")) + if (BandcampExtractorHelper.isRadioUrl(linkHandler.getUrl())) return new BandcampRadioStreamExtractor(this, linkHandler); else return new BandcampStreamExtractor(this, linkHandler); 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 c4011fff6..dad376d58 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 @@ -20,10 +20,14 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Locale; public class BandcampExtractorHelper { + public static final String BASE_URL = "https://bandcamp.com"; + public static final String BASE_API_URL = BASE_URL + "/api"; + /** *

Get an attribute of a web page as JSON * @@ -50,11 +54,12 @@ public class BandcampExtractorHelper { try { final String jsonString = NewPipe.getDownloader().get( - "https://bandcamp.com/api/mobile/22/tralbum_details?band_id=" + bandId + BASE_API_URL + "/mobile/22/tralbum_details?band_id=" + bandId + "&tralbum_id=" + itemId + "&tralbum_type=" + itemType.charAt(0)) .responseBody(); - return JsonParser.object().from(jsonString).getString("bandcamp_url").replace("http://", "https://"); + return JsonParser.object().from(jsonString) + .getString("bandcamp_url").replace("http://", "https://"); } catch (final JsonParserException | ReCaptchaException | IOException e) { throw new ParsingException("Ids could not be translated to URL", e); @@ -70,7 +75,7 @@ public class BandcampExtractorHelper { final StringBuilder result = new StringBuilder(); // Remove empty strings - final ArrayList list = new ArrayList<>(Arrays.asList(strings)); + final List list = new ArrayList<>(Arrays.asList(strings)); for (int i = list.size() - 1; i >= 0; i--) { if (Utils.isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { list.remove(i); @@ -101,7 +106,7 @@ public class BandcampExtractorHelper { return JsonParser.object().from( NewPipe.getDownloader().post( - "https://bandcamp.com/api/mobile/22/band_details", + BASE_API_URL + "/mobile/22/band_details", null, JsonWriter.string() .object() @@ -165,6 +170,5 @@ public class BandcampExtractorHelper { } catch (final DateTimeException e) { throw new ParsingException("Could not parse date '" + textDate + "'", e); } - } } 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 12214601a..93b1b0297 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 @@ -19,10 +19,12 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_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 static final String FEATURED_API_URL = BASE_API_URL + "/mobile/24/bootstrap_data"; private JsonObject json; 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 index 8c3a7baf3..da062ab04 100644 --- 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 @@ -19,10 +19,12 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import javax.annotation.Nonnull; import java.io.IOException; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_API_URL; + 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 static final String RADIO_API_URL = BASE_API_URL + "/bcweekly/1/list"; private JsonObject json = 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 index a684e7eb8..2331f258c 100644 --- 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 @@ -10,6 +10,7 @@ import org.schabi.newpipe.extractor.stream.StreamType; import javax.annotation.Nullable; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_URL; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @@ -49,7 +50,7 @@ public class BandcampRadioInfoItemExtractor implements StreamInfoItemExtractor { @Override public String getUrl() { - return "https://bandcamp.com/?show=" + show.getInt("id"); + return BASE_URL + "/?show=" + show.getInt("id"); } @Override 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 index 01ed5ad5a..7d2543c8a 100644 --- 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 @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.*; public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @@ -36,7 +36,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { static JsonObject query(final int id) throws ParsingException { try { return JsonParser.object().from( - NewPipe.getDownloader().get("https://bandcamp.com/api/bcweekly/1/get?id=" + id).responseBody() + NewPipe.getDownloader().get(BASE_API_URL + "/bcweekly/1/get?id=" + id).responseBody() ); } catch (final IOException | ReCaptchaException | JsonParserException e) { throw new ParsingException("could not get show data", e); @@ -88,7 +88,7 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor { @Nonnull @Override public String getUploaderAvatarUrl() { - return "https://bandcamp.com/img/buttons/bandcamp-button-circle-whitecolor-512.png"; + return BASE_URL + "/img/buttons/bandcamp-button-circle-whitecolor-512.png"; } @Nonnull diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java index 4eaa830cb..46283345b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampSuggestionExtractor.java @@ -18,9 +18,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_API_URL; + public class BandcampSuggestionExtractor extends SuggestionExtractor { - private static final String AUTOCOMPLETE_URL = "https://bandcamp.com/api/fuzzysearch/1/autocomplete?q="; + private static final String AUTOCOMPLETE_URL = BASE_API_URL + "/fuzzysearch/1/autocomplete?q="; public BandcampSuggestionExtractor(final StreamingService service) { super(service); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java index 518170b07..9e295d5de 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/linkHandler/BandcampSearchQueryHandlerFactory.java @@ -9,6 +9,8 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_URL; + public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory { @@ -17,7 +19,7 @@ public class BandcampSearchQueryHandlerFactory extends SearchQueryHandlerFactory throws ParsingException { try { - return "https://bandcamp.com/search?q=" + + return BASE_URL + "/search?q=" + URLEncoder.encode(query, "UTF-8") + "&page=1"; 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 37ff29c0c..96b9f9d8e 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 @@ -6,6 +6,8 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; +import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_URL; + /** *

Tracks don't have standalone ids, they are always in combination with the band id. * That's why id = url.

@@ -34,7 +36,7 @@ public class BandcampStreamLinkHandlerFactory extends LinkHandlerFactory { @Override public String getUrl(final String input) { if (input.matches("\\d+")) { - return "https://bandcamp.com/?show=" + input; + return BASE_URL + "/?show=" + input; } else { return input; } From b9e8ee8450c5222c80d42af59d1e9f197766be87 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 21 Feb 2021 12:35:14 +0100 Subject: [PATCH 89/91] Rename BandcampExtractorHelper.smartConcatenate(String[], String) to Utils.nonEmptyAndNullJoin(String, String[]) --- .../extractors/BandcampExtractorHelper.java | 29 ------------------- .../extractors/BandcampStreamExtractor.java | 6 ++-- .../schabi/newpipe/extractor/utils/Utils.java | 13 +++++++++ 3 files changed, 17 insertions(+), 31 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 dad376d58..34bd3c6a2 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 @@ -67,35 +67,6 @@ public class BandcampExtractorHelper { } - /** - * Concatenate all non-null and non-empty strings together while separating them using - * the comma parameter - */ - public static String smartConcatenate(final String[] strings, final String comma) { - final StringBuilder result = new StringBuilder(); - - // Remove empty strings - final List list = new ArrayList<>(Arrays.asList(strings)); - for (int i = list.size() - 1; i >= 0; i--) { - if (Utils.isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { - list.remove(i); - } - } - - // Append remaining strings to result - for (int i = 0; i < list.size(); i++) { - result.append(list.get(i)); - - if (i != list.size() - 1) { - // This is not the last iteration yet - result.append(comma); - } - - } - - return result.toString(); - } - /** * Fetch artist details from mobile endpoint. * 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 005078a7a..99a19cecd 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 @@ -17,6 +17,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.LinkHandler; import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.stream.*; +import org.schabi.newpipe.extractor.utils.Utils; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -150,12 +151,13 @@ public class BandcampStreamExtractor extends StreamExtractor { @Nonnull @Override public Description getDescription() { - final String s = BandcampExtractorHelper.smartConcatenate( + final String s = Utils.nonEmptyAndNullJoin( + "\n\n", new String[]{ current.getString("about"), current.getString("lyrics"), current.getString("credits") - }, "\n\n" + } ); return new Description(s, Description.PLAIN_TEXT); } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java index 721bc96c3..09574ab51 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java @@ -271,4 +271,17 @@ public class Utils { return join(delimiter, list); } + /** + * Concatenate all non-null, non-empty and strings which are not equal to "null". + */ + public static String nonEmptyAndNullJoin(final String delimiter, final String[] elements) { + final List list = Arrays.asList(elements); + for (int i = list.size() - 1; i >= 0; i--) { + if (isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { + list.remove(i); + } + } + + return join(delimiter, list); + } } From 70814dcfefbc6eaae9aa88a9190d3fa582b0376b Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 21 Feb 2021 12:51:47 +0100 Subject: [PATCH 90/91] Fix Utils.nonEmptyAndNullJoin When using the index here, it the index needs to be decremented once an element is removed. To cirecumvent this, the native Collections.removeIf() method is used. --- .../org/schabi/newpipe/extractor/utils/Utils.java | 11 +++-------- .../org/schabi/newpipe/extractor/utils/UtilsTest.java | 1 + 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java index 09574ab51..82ff58263 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java @@ -274,14 +274,9 @@ public class Utils { /** * Concatenate all non-null, non-empty and strings which are not equal to "null". */ - public static String nonEmptyAndNullJoin(final String delimiter, final String[] elements) { - final List list = Arrays.asList(elements); - for (int i = list.size() - 1; i >= 0; i--) { - if (isNullOrEmpty(list.get(i)) || list.get(i).equals("null")) { - list.remove(i); - } - } - + public static String nonEmptyAndNullJoin(final CharSequence delimiter, final String[] elements) { + final List list = new java.util.ArrayList<>(Arrays.asList(elements)); + list.removeIf(s -> isNullOrEmpty(s) || s.equals("null")); return join(delimiter, list); } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/utils/UtilsTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/utils/UtilsTest.java index e4a65505b..a81270de0 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/utils/UtilsTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/utils/UtilsTest.java @@ -20,6 +20,7 @@ public class UtilsTest { @Test public void testJoin() { assertEquals("some,random,stuff", Utils.join(",", Arrays.asList("some", "random", "stuff"))); + assertEquals("some,random,not-null,stuff", Utils.nonEmptyAndNullJoin(",", new String[]{"some", "null", "random", "", "not-null", null, "stuff"})); } @Test From a1688fe9534983b27899bbdf685f99ff6f25d4c9 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 21 Feb 2021 13:51:12 +0100 Subject: [PATCH 91/91] Move BandcampExtractorHelper.getJsonData(String, String) to JsonUtils --- .../extractors/BandcampExtractorHelper.java | 17 ---------- .../extractors/BandcampPlaylistExtractor.java | 2 +- .../extractors/BandcampStreamExtractor.java | 3 +- .../BandcampChannelLinkHandlerFactory.java | 3 +- .../newpipe/extractor/utils/JsonUtils.java | 34 +++++++++++++++++++ 5 files changed, 39 insertions(+), 20 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 34bd3c6a2..547a0356e 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 @@ -28,23 +28,6 @@ public class BandcampExtractorHelper { public static final String BASE_URL = "https://bandcamp.com"; public static final String BASE_API_URL = BASE_URL + "/api"; - /** - *

Get an attribute of a web page as JSON - * - *

Originally a part of bandcampDirect.

- * - * @param html The HTML where the JSON we're looking for is stored inside a - * variable inside some JavaScript block - * @param variable Name of the variable - * @return The JsonObject stored in the variable with this name - */ - public static JsonObject getJsonData(final String html, final String variable) - throws JsonParserException, ArrayIndexOutOfBoundsException { - final Document document = Jsoup.parse(html); - final String json = document.getElementsByAttribute(variable).attr(variable); - return JsonParser.object().from(json); - } - /** * Translate all these parameters together to the URL of the corresponding album or track * using the mobile API diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java index 58a701d90..8cc21a6e7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/extractors/BandcampPlaylistExtractor.java @@ -21,7 +21,7 @@ import javax.annotation.Nonnull; import java.io.IOException; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getImageUrl; -import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.getJsonData; +import static org.schabi.newpipe.extractor.utils.JsonUtils.getJsonData; import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampStreamExtractor.getAlbumInfoJson; public class BandcampPlaylistExtractor extends PlaylistExtractor { 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 99a19cecd..344663525 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 @@ -17,6 +17,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.LinkHandler; import org.schabi.newpipe.extractor.localization.DateWrapper; import org.schabi.newpipe.extractor.stream.*; +import org.schabi.newpipe.extractor.utils.JsonUtils; import org.schabi.newpipe.extractor.utils.Utils; import javax.annotation.Nonnull; @@ -62,7 +63,7 @@ public class BandcampStreamExtractor extends StreamExtractor { */ public static JsonObject getAlbumInfoJson(final String html) throws ParsingException { try { - return BandcampExtractorHelper.getJsonData(html, "data-tralbum"); + return JsonUtils.getJsonData(html, "data-tralbum"); } catch (final JsonParserException e) { throw new ParsingException("Faulty JSON; page likely does not contain album data", e); } catch (final ArrayIndexOutOfBoundsException e) { 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 2cf956cc9..727aec404 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 @@ -9,6 +9,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper; +import org.schabi.newpipe.extractor.utils.JsonUtils; import java.io.IOException; import java.util.List; @@ -25,7 +26,7 @@ public class BandcampChannelLinkHandlerFactory extends ListLinkHandlerFactory { final String response = NewPipe.getDownloader().get(url).responseBody(); // Use band data embedded in website to extract ID - final JsonObject bandData = BandcampExtractorHelper.getJsonData(response, "data-band"); + final JsonObject bandData = JsonUtils.getJsonData(response, "data-band"); return String.valueOf(bandData.getLong("id")); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/JsonUtils.java b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/JsonUtils.java index ad132b5ac..7a5bd6c42 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/utils/JsonUtils.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/utils/JsonUtils.java @@ -2,6 +2,10 @@ package org.schabi.newpipe.extractor.utils; import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; import org.schabi.newpipe.extractor.exceptions.ParsingException; import javax.annotation.Nonnull; @@ -99,4 +103,34 @@ public class JsonUtils { return result; } + /** + *

Get an attribute of a web page as JSON + * + *

Originally a part of bandcampDirect.

+ *

Example HTML:

+ *
+     * {@code
+     * 

This is Sparta!

+ * } + *
+ *

Calling this function to get the attribute data-town returns the JsonObject for

+ *
+     * {@code
+     *   {
+     *     "name": "Mycenae",
+     *     "country": "Greece"
+     *   }
+     * }
+     * 
+ * @param html The HTML where the JSON we're looking for is stored inside a + * variable inside some JavaScript block + * @param variable Name of the variable + * @return The JsonObject stored in the variable with this name + */ + public static JsonObject getJsonData(final String html, final String variable) + throws JsonParserException, ArrayIndexOutOfBoundsException { + final Document document = Jsoup.parse(html); + final String json = document.getElementsByAttribute(variable).attr(variable); + return JsonParser.object().from(json); + } }