package org.schabi.newpipe.extractor.services.soundcloud.extractors; 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.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.localization.ContentCountry; import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper; 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.ServiceList.SoundCloud; import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.SOUNDCLOUD_API_V2_URL; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; public class SoundcloudChartsExtractor extends KioskExtractor { public SoundcloudChartsExtractor(final StreamingService service, final ListLinkHandler linkHandler, final String kioskId) { super(service, linkHandler, kioskId); } @Override public void onFetchPage(@Nonnull final Downloader downloader) { } @Nonnull @Override public String getName() { return getId(); } @Override public InfoItemsPage getPage(final Page page) throws IOException, ExtractionException { if (page == null || isNullOrEmpty(page.getUrl())) { throw new IllegalArgumentException("Page doesn't contain an URL"); } final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); final String nextPageUrl = SoundcloudParsingHelper.getStreamsFromApi(collector, page.getUrl(), true); return new InfoItemsPage<>(collector, new Page(nextPageUrl)); } @Nonnull @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); String apiUrl = SOUNDCLOUD_API_V2_URL + "charts" + "?genre=soundcloud:genres:all-music" + "&client_id=" + SoundcloudParsingHelper.clientId(); if (getId().equals("Top 50")) { apiUrl += "&kind=top"; } else { apiUrl += "&kind=trending"; } final ContentCountry contentCountry = SoundCloud.getContentCountry(); String apiUrlWithRegion = null; if (getService().getSupportedCountries().contains(contentCountry)) { apiUrlWithRegion = apiUrl + "®ion=soundcloud:regions:" + contentCountry.getCountryCode(); } String nextPageUrl; try { nextPageUrl = SoundcloudParsingHelper.getStreamsFromApi(collector, apiUrlWithRegion == null ? apiUrl : apiUrlWithRegion, true); } catch (final IOException e) { // Request to other region may be geo-restricted. // See https://github.com/TeamNewPipe/NewPipeExtractor/issues/537. // We retry without the specified region. nextPageUrl = SoundcloudParsingHelper.getStreamsFromApi(collector, apiUrl, true); } return new InfoItemsPage<>(collector, new Page(nextPageUrl)); } }