2020-04-09 13:51:47 +02:00
|
|
|
package org.schabi.newpipe.extractor.services.soundcloud;
|
|
|
|
|
|
|
|
import org.junit.BeforeClass;
|
2021-02-20 14:53:57 +01:00
|
|
|
import org.junit.Test;
|
2020-12-15 15:09:49 +01:00
|
|
|
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
2021-03-02 18:20:10 +01:00
|
|
|
import org.schabi.newpipe.extractor.MediaFormat;
|
2020-04-09 13:51:47 +02:00
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2021-02-20 14:53:57 +01:00
|
|
|
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException;
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException;
|
2020-04-09 13:51:47 +02:00
|
|
|
import org.schabi.newpipe.extractor.services.DefaultStreamExtractorTest;
|
2021-03-02 18:20:10 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.AudioStream;
|
2020-04-09 13:51:47 +02:00
|
|
|
import org.schabi.newpipe.extractor.stream.StreamExtractor;
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
|
|
|
|
|
|
|
import java.util.Arrays;
|
2021-02-21 19:18:27 +01:00
|
|
|
import java.util.Collections;
|
2020-04-09 13:51:47 +02:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
2021-03-02 18:20:10 +01:00
|
|
|
import static junit.framework.TestCase.assertEquals;
|
|
|
|
import static org.hamcrest.CoreMatchers.containsString;
|
|
|
|
import static org.hamcrest.MatcherAssert.assertThat;
|
2020-04-09 13:51:47 +02:00
|
|
|
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
|
|
|
|
|
|
|
|
public class SoundcloudStreamExtractorTest {
|
2021-02-20 14:53:57 +01:00
|
|
|
private static final String SOUNDCLOUD = "https://soundcloud.com/";
|
|
|
|
|
2021-02-21 19:18:27 +01:00
|
|
|
public static class SoundcloudGeoRestrictedTrack extends DefaultStreamExtractorTest {
|
|
|
|
private static final String ID = "one-touch";
|
|
|
|
private static final String UPLOADER = SOUNDCLOUD + "jessglynne";
|
|
|
|
private static final int TIMESTAMP = 0;
|
|
|
|
private static final String URL = UPLOADER + "/" + ID + "#t=" + TIMESTAMP;
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
2021-02-20 14:53:57 +01:00
|
|
|
@Test(expected = GeographicRestrictionException.class)
|
|
|
|
public void geoRestrictedContent() throws Exception {
|
2021-02-21 19:18:27 +01:00
|
|
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
|
|
|
extractor = SoundCloud.getStreamExtractor(URL);
|
2021-02-20 14:53:57 +01:00
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return SoundCloud; }
|
|
|
|
@Override public String expectedName() { return "Jess Glynne & Jax Jones - One Touch"; }
|
|
|
|
@Override public String expectedId() { return "621612588"; }
|
|
|
|
@Override public String expectedUrlContains() { return UPLOADER + "/" + ID; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; }
|
|
|
|
@Override public String expectedUploaderName() { return "Jess Glynne"; }
|
|
|
|
@Override public String expectedUploaderUrl() { return UPLOADER; }
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2021-02-21 21:19:54 +01:00
|
|
|
@Override public boolean expectedDescriptionIsEmpty() { return true; }
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public List<String> expectedDescriptionContains() { return Collections.emptyList(); }
|
|
|
|
@Override public long expectedLength() { return 197; }
|
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 43000; }
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2019-05-16 16:28:45.000"; }
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2019-05-16 16:28:45"; }
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return -1; }
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2021-03-13 15:49:59 +01:00
|
|
|
@Override public boolean expectedHasAudioStreams() { return false; }
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public boolean expectedHasVideoStreams() { return false; }
|
|
|
|
@Override public boolean expectedHasSubtitles() { return false; }
|
|
|
|
@Override public boolean expectedHasFrames() { return false; }
|
|
|
|
@Override public int expectedStreamSegmentsCount() { return 0; }
|
2021-02-21 21:19:54 +01:00
|
|
|
@Override public boolean expectedHasRelatedStreams() { return false; }
|
2021-02-21 19:18:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static class SoundcloudGoPlusTrack extends DefaultStreamExtractorTest {
|
|
|
|
private static final String ID = "places";
|
|
|
|
private static final String UPLOADER = SOUNDCLOUD + "martinsolveig";
|
|
|
|
private static final int TIMESTAMP = 0;
|
|
|
|
private static final String URL = UPLOADER + "/" + ID + "#t=" + TIMESTAMP;
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
2021-02-20 14:53:57 +01:00
|
|
|
@Test(expected = SoundCloudGoPlusContentException.class)
|
|
|
|
public void goPlusContent() throws Exception {
|
2021-02-21 19:18:27 +01:00
|
|
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
|
|
|
extractor = SoundCloud.getStreamExtractor(URL);
|
2021-02-20 14:53:57 +01:00
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
2021-02-21 19:18:27 +01:00
|
|
|
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return SoundCloud; }
|
|
|
|
@Override public String expectedName() { return "Places (feat. Ina Wroldsen)"; }
|
|
|
|
@Override public String expectedId() { return "292479564"; }
|
|
|
|
@Override public String expectedUrlContains() { return UPLOADER + "/" + ID; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; }
|
|
|
|
@Override public String expectedUploaderName() { return "martinsolveig"; }
|
|
|
|
@Override public String expectedUploaderUrl() { return UPLOADER; }
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2021-02-21 21:19:54 +01:00
|
|
|
@Override public boolean expectedDescriptionIsEmpty() { return true; }
|
|
|
|
@Override public List<String> expectedDescriptionContains() { return Collections.emptyList(); }
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public long expectedLength() { return 30; }
|
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 386000; }
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2016-11-11 01:16:37.000"; }
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2016-11-11 01:16:37"; }
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return -1; }
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2021-03-13 15:49:59 +01:00
|
|
|
@Override public boolean expectedHasAudioStreams() { return false; }
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public boolean expectedHasVideoStreams() { return false; }
|
2021-03-13 15:49:59 +01:00
|
|
|
@Override public boolean expectedHasRelatedStreams() { return false; }
|
2021-02-21 19:18:27 +01:00
|
|
|
@Override public boolean expectedHasSubtitles() { return false; }
|
|
|
|
@Override public boolean expectedHasFrames() { return false; }
|
|
|
|
@Override public int expectedStreamSegmentsCount() { return 0; }
|
2021-02-20 14:53:57 +01:00
|
|
|
}
|
2020-04-09 13:51:47 +02:00
|
|
|
|
2020-10-26 16:57:37 +01:00
|
|
|
public static class CreativeCommonsPlaysWellWithOthers extends DefaultStreamExtractorTest {
|
|
|
|
private static final String ID = "plays-well-with-others-ep-2-what-do-an-army-of-ants-and-an-online-encyclopedia-have-in-common";
|
2021-02-21 18:16:59 +01:00
|
|
|
private static final String UPLOADER = SOUNDCLOUD + "wearecc";
|
2020-04-09 13:51:47 +02:00
|
|
|
private static final int TIMESTAMP = 69;
|
2021-02-21 18:16:59 +01:00
|
|
|
private static final String URL = UPLOADER + "/" + ID + "#t=" + TIMESTAMP;
|
2020-04-09 13:51:47 +02:00
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
|
|
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
|
|
|
extractor = SoundCloud.getStreamExtractor(URL);
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return SoundCloud; }
|
2020-10-26 16:57:37 +01:00
|
|
|
@Override public String expectedName() { return "Plays Well with Others, Ep 2: What Do an Army of Ants and an Online Encyclopedia Have in Common?"; }
|
|
|
|
@Override public String expectedId() { return "597253485"; }
|
2020-04-09 13:51:47 +02:00
|
|
|
@Override public String expectedUrlContains() { return UPLOADER + "/" + ID; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; }
|
2020-10-26 16:57:37 +01:00
|
|
|
@Override public String expectedUploaderName() { return "Creative Commons"; }
|
2020-04-09 13:51:47 +02:00
|
|
|
@Override public String expectedUploaderUrl() { return UPLOADER; }
|
2020-10-26 16:57:37 +01:00
|
|
|
@Override public List<String> expectedDescriptionContains() { return Arrays.asList("Stigmergy is a mechanism of indirect coordination",
|
|
|
|
"All original content in Plays Well with Others is available under a Creative Commons BY license."); }
|
|
|
|
@Override public long expectedLength() { return 1400; }
|
2020-04-09 13:51:47 +02:00
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
2020-10-26 16:57:37 +01:00
|
|
|
@Override public long expectedViewCountAtLeast() { return 27000; }
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2019-03-28 13:36:18.000"; }
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2019-03-28 13:36:18"; }
|
2020-04-09 13:51:47 +02:00
|
|
|
@Override public long expectedLikeCountAtLeast() { return -1; }
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
|
|
|
@Override public boolean expectedHasVideoStreams() { return false; }
|
|
|
|
@Override public boolean expectedHasSubtitles() { return false; }
|
|
|
|
@Override public boolean expectedHasFrames() { return false; }
|
2020-12-12 10:24:55 +01:00
|
|
|
@Override public int expectedStreamSegmentsCount() { return 0; }
|
2020-04-09 13:51:47 +02:00
|
|
|
|
2021-03-02 18:20:10 +01:00
|
|
|
@Override
|
|
|
|
@Test
|
|
|
|
public void testAudioStreams() throws Exception {
|
|
|
|
super.testAudioStreams();
|
|
|
|
final List<AudioStream> audioStreams = extractor.getAudioStreams();
|
|
|
|
assertEquals(2, audioStreams.size());
|
|
|
|
for (final AudioStream audioStream : audioStreams) {
|
|
|
|
final String mediaUrl = audioStream.getUrl();
|
|
|
|
if (audioStream.getFormat() == MediaFormat.OPUS) {
|
|
|
|
// assert that it's an OPUS 64 kbps media URL with a single range which comes from an HLS SoundCloud CDN
|
|
|
|
assertThat(mediaUrl, containsString("-hls-opus-media.sndcdn.com"));
|
|
|
|
assertThat(mediaUrl, containsString(".64.opus"));
|
|
|
|
}
|
|
|
|
if (audioStream.getFormat() == MediaFormat.MP3) {
|
|
|
|
// assert that it's a MP3 128 kbps media URL which comes from a progressive SoundCloud CDN
|
|
|
|
assertThat(mediaUrl, containsString("-media.sndcdn.com/bKOA7Pwbut93.128.mp3"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-04-09 13:51:47 +02:00
|
|
|
}
|