From b100b9873ff1e6177ad53510ad4b39dd92a78ff7 Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Thu, 19 Mar 2020 11:18:29 +0100 Subject: [PATCH] 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); }