NewPipeExtractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java

208 lines
5.8 KiB
Java
Raw Normal View History

package org.schabi.newpipe.extractor.services.soundcloud;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonParser;
import com.grack.nanojson.JsonParserException;
import org.schabi.newpipe.extractor.*;
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.stream.*;
2017-08-06 22:20:15 +02:00
import javax.annotation.Nonnull;
2017-11-25 02:20:16 +01:00
import javax.annotation.Nullable;
2017-08-06 22:20:15 +02:00
import java.io.IOException;
2017-11-25 02:20:16 +01:00
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;
public class SoundcloudStreamExtractor extends StreamExtractor {
private JsonObject track;
2017-08-06 22:20:15 +02:00
public SoundcloudStreamExtractor(StreamingService service, String url) throws IOException, ExtractionException {
super(service, url);
}
2017-08-06 22:20:15 +02:00
@Override
2017-11-28 13:37:01 +01:00
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
track = SoundcloudParsingHelper.resolveFor(downloader, getOriginalUrl());
String policy = track.getString("policy", "");
if (!policy.equals("ALLOW") && !policy.equals("MONETIZE")) {
throw new ContentNotAvailableException("Content not available: policy " + policy);
}
}
@Nonnull
2017-08-06 22:20:15 +02:00
@Override
public String getCleanUrl() {
return track.isString("permalink_url") ? track.getString("permalink_url") : getOriginalUrl();
2017-08-06 22:20:15 +02:00
}
@Nonnull
@Override
public String getId() {
2017-08-06 22:20:15 +02:00
return track.getInt("id") + "";
}
@Nonnull
@Override
2017-08-11 03:23:09 +02:00
public String getName() {
return track.getString("title");
}
@Nonnull
@Override
public String getUploadDate() throws ParsingException {
return SoundcloudParsingHelper.toDateString(track.getString("created_at"));
}
@Nonnull
@Override
2017-08-11 03:23:09 +02:00
public String getThumbnailUrl() {
return track.getString("artwork_url", "");
}
@Nonnull
@Override
2017-08-11 03:23:09 +02:00
public String getDescription() {
return track.getString("description");
}
@Override
2017-08-11 03:23:09 +02:00
public int getAgeLimit() {
2017-11-25 02:03:30 +01:00
return NO_AGE_LIMIT;
}
@Override
2017-08-11 03:23:09 +02:00
public long getLength() {
return track.getNumber("duration", 0).longValue() / 1000L;
}
@Override
2017-08-11 03:23:09 +02:00
public long getTimeStamp() throws ParsingException {
2017-11-22 18:45:49 +01:00
return getTimestampSeconds("(#t=\\d{0,3}h?\\d{0,3}m?\\d{1,3}s?)");
}
@Override
2017-08-11 03:23:09 +02:00
public long getViewCount() {
return track.getNumber("playback_count", 0).longValue();
}
@Override
public long getLikeCount() {
2017-09-16 11:08:08 +02:00
return track.getNumber("favoritings_count", -1).longValue();
}
@Override
public long getDislikeCount() {
return -1;
}
@Nonnull
2017-08-11 03:23:09 +02:00
@Override
public String getUploaderUrl() {
2018-01-04 17:21:03 +01:00
return SoundcloudExtractorHelper.getUploaderUrl(track);
2017-08-11 03:23:09 +02:00
}
@Nonnull
2017-08-11 03:23:09 +02:00
@Override
public String getUploaderName() {
2018-01-04 17:21:03 +01:00
return SoundcloudExtractorHelper.getUploaderName(track);
2017-08-11 03:23:09 +02:00
}
@Nonnull
2017-08-11 03:23:09 +02:00
@Override
public String getUploaderAvatarUrl() {
2018-01-04 17:21:03 +01:00
return SoundcloudExtractorHelper.getAvatarUrl(track);
2017-08-11 03:23:09 +02:00
}
@Override
public String getDashMpdUrl() {
return null;
}
@Override
public List<AudioStream> getAudioStreams() throws IOException, ExtractionException {
List<AudioStream> audioStreams = new ArrayList<>();
Downloader dl = NewPipe.getDownloader();
2017-11-25 02:20:16 +01:00
String apiUrl = "https://api.soundcloud.com/i1/tracks/" + urlEncode(getId()) + "/streams"
+ "?client_id=" + urlEncode(SoundcloudParsingHelper.clientId());
2017-08-11 03:23:09 +02:00
String response = dl.download(apiUrl);
JsonObject responseObject;
try {
responseObject = JsonParser.object().from(response);
} catch (JsonParserException e) {
throw new ParsingException("Could not parse json response", e);
}
2017-08-11 03:23:09 +02:00
String mp3Url = responseObject.getString("http_mp3_128_url");
if (mp3Url != null && !mp3Url.isEmpty()) {
audioStreams.add(new AudioStream(mp3Url, MediaFormat.MP3, 128));
} else {
throw new ExtractionException("Could not get SoundCloud's track audio url");
}
2017-08-11 03:23:09 +02:00
return audioStreams;
}
2017-11-25 02:20:16 +01:00
private static String urlEncode(String value) {
try {
return URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException(e);
}
}
2017-08-11 03:23:09 +02:00
@Override
public List<VideoStream> getVideoStreams() throws IOException, ExtractionException {
return null;
}
@Override
public List<VideoStream> getVideoOnlyStreams() throws IOException, ExtractionException {
return null;
}
@Override
@Nonnull
2017-11-24 13:57:54 +01:00
public List<Subtitles> getSubtitlesDefault() throws IOException, ExtractionException {
return Collections.emptyList();
}
@Override
@Nonnull
2017-11-24 13:57:54 +01:00
public List<Subtitles> getSubtitles(SubtitlesFormat format) throws IOException, ExtractionException {
return Collections.emptyList();
}
2017-08-11 03:23:09 +02:00
@Override
public StreamType getStreamType() {
return StreamType.AUDIO_STREAM;
}
@Override
public StreamInfoItem getNextVideo() throws IOException, ExtractionException {
return null;
}
@Override
2017-08-06 22:20:15 +02:00
public StreamInfoItemCollector getRelatedVideos() throws IOException, ExtractionException {
StreamInfoItemCollector collector = new StreamInfoItemCollector(getServiceId());
2017-11-25 02:20:16 +01:00
String apiUrl = "https://api-v2.soundcloud.com/tracks/" + urlEncode(getId()) + "/related"
+ "?client_id=" + urlEncode(SoundcloudParsingHelper.clientId());
SoundcloudParsingHelper.getStreamsFromApi(collector, apiUrl);
return collector;
}
@Override
public String getErrorMessage() {
return null;
}
}