package org.schabi.newpipe.extractor.services.soundcloud.extractors; 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.Page; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.comments.CommentsExtractor; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItemsCollector; import org.schabi.newpipe.extractor.downloader.Downloader; import org.schabi.newpipe.extractor.downloader.Response; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import java.io.IOException; import javax.annotation.Nonnull; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; public class SoundcloudCommentsExtractor extends CommentsExtractor { public SoundcloudCommentsExtractor(final StreamingService service, final ListLinkHandler uiHandler) { super(service, uiHandler); } @Nonnull @Override public InfoItemsPage getInitialPage() throws ExtractionException, IOException { final Downloader downloader = NewPipe.getDownloader(); final Response response = downloader.get(getUrl()); final JsonObject json; try { json = JsonParser.object().from(response.responseBody()); } catch (JsonParserException e) { throw new ParsingException("Could not parse json", e); } final CommentsInfoItemsCollector collector = new CommentsInfoItemsCollector(getServiceId()); collectStreamsFrom(collector, json.getArray("collection")); return new InfoItemsPage<>(collector, new Page(json.getString("next_href"))); } @Override public InfoItemsPage getPage(final Page page) throws ExtractionException, IOException { if (page == null || isNullOrEmpty(page.getUrl())) { throw new IllegalArgumentException("Page doesn't contain an URL"); } final Downloader downloader = NewPipe.getDownloader(); final Response response = downloader.get(page.getUrl()); final JsonObject json; try { json = JsonParser.object().from(response.responseBody()); } catch (JsonParserException e) { throw new ParsingException("Could not parse json", e); } final CommentsInfoItemsCollector collector = new CommentsInfoItemsCollector(getServiceId()); collectStreamsFrom(collector, json.getArray("collection")); return new InfoItemsPage<>(collector, new Page(json.getString("next_href"))); } @Override public void onFetchPage(@Nonnull final Downloader downloader) { } private void collectStreamsFrom(final CommentsInfoItemsCollector collector, final JsonArray entries) throws ParsingException { final String url = getUrl(); for (Object comment : entries) { collector.commit(new SoundcloudCommentsInfoItemExtractor((JsonObject) comment, url)); } } }