81 lines
3.2 KiB
Java
81 lines
3.2 KiB
Java
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
|
|
|
|
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
|
|
import org.schabi.newpipe.extractor.channel.ChannelInfoItemsCollector;
|
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
|
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
|
|
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudService;
|
|
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
|
|
import org.schabi.newpipe.extractor.subscription.SubscriptionItem;
|
|
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.SOUNDCLOUD_API_V2_URL;
|
|
import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
|
|
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
|
|
|
|
/**
|
|
* Extract the "followings" from a user in SoundCloud.
|
|
*/
|
|
public class SoundcloudSubscriptionExtractor extends SubscriptionExtractor {
|
|
|
|
public SoundcloudSubscriptionExtractor(final SoundcloudService service) {
|
|
super(service, Collections.singletonList(ContentSource.CHANNEL_URL));
|
|
}
|
|
|
|
@Override
|
|
public String getRelatedUrl() {
|
|
return "https://soundcloud.com/you";
|
|
}
|
|
|
|
@Override
|
|
public List<SubscriptionItem> fromChannelUrl(final String channelUrl) throws IOException,
|
|
ExtractionException {
|
|
if (channelUrl == null) {
|
|
throw new InvalidSourceException("Channel url is null");
|
|
}
|
|
|
|
final String id;
|
|
try {
|
|
id = service.getChannelLHFactory().fromUrl(getUrlFrom(channelUrl)).getId();
|
|
} catch (final ExtractionException e) {
|
|
throw new InvalidSourceException(e);
|
|
}
|
|
|
|
final String apiUrl = SOUNDCLOUD_API_V2_URL + "users/" + id + "/followings" + "?client_id="
|
|
+ SoundcloudParsingHelper.clientId() + "&limit=200";
|
|
final ChannelInfoItemsCollector collector = new ChannelInfoItemsCollector(service
|
|
.getServiceId());
|
|
// ± 2000 is the limit of followings on SoundCloud, so this minimum should be enough
|
|
SoundcloudParsingHelper.getUsersFromApiMinItems(2500, collector, apiUrl);
|
|
|
|
return toSubscriptionItems(collector.getItems());
|
|
}
|
|
|
|
private String getUrlFrom(final String channelUrl) {
|
|
final String fixedUrl = replaceHttpWithHttps(channelUrl);
|
|
if (fixedUrl.startsWith(HTTPS)) {
|
|
return channelUrl;
|
|
} else if (!fixedUrl.contains("soundcloud.com/")) {
|
|
return "https://soundcloud.com/" + fixedUrl;
|
|
} else {
|
|
return HTTPS + fixedUrl;
|
|
}
|
|
}
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
// Utils
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
private List<SubscriptionItem> toSubscriptionItems(final List<ChannelInfoItem> items) {
|
|
final List<SubscriptionItem> result = new ArrayList<>(items.size());
|
|
for (final ChannelInfoItem item : items) {
|
|
result.add(new SubscriptionItem(item.getServiceId(), item.getUrl(), item.getName()));
|
|
}
|
|
return result;
|
|
}
|
|
}
|