Skip to content

Commit 8a4aab4

Browse files
committed
Add SoundcloudStreamExtractor tests for a small track ID and a track ID larger than 32 bits
1 parent fe9c57c commit 8a4aab4

18 files changed

Lines changed: 1235 additions & 0 deletions

File tree

extractor/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractorTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,80 @@ public void testAudioStreams() throws Exception {
217217
});
218218
}
219219
}
220+
221+
@Nested
222+
class SmallTrackId extends DefaultStreamExtractorTest {
223+
private static final String ID = "technicality";
224+
private static final String UPLOADER = SOUNDCLOUD + "garrett-cameron-1";
225+
private static final int TIMESTAMP = 34;
226+
private static final String URL = UPLOADER + "/" + ID + "#t=" + TIMESTAMP;
227+
228+
@Override
229+
protected StreamExtractor createExtractor() throws Exception {
230+
return SoundCloud.getStreamExtractor(URL);
231+
}
232+
233+
@Override public StreamingService expectedService() { return SoundCloud; }
234+
@Override public String expectedName() { return "Technicality"; }
235+
@Override public String expectedId() { return "135535700"; }
236+
@Override public String expectedUrlContains() { return UPLOADER + "/" + ID; }
237+
@Override public String expectedOriginalUrlContains() { return URL; }
238+
239+
@Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; }
240+
@Override public String expectedUploaderName() { return "Samuel Cameron (ZVW)"; }
241+
@Override public String expectedUploaderUrl() { return UPLOADER; }
242+
@Override public boolean expectedDescriptionIsEmpty() { return true; }
243+
@Override public List<String> expectedDescriptionContains() { return Collections.emptyList(); }
244+
@Override public long expectedLength() { return 182; }
245+
@Override public long expectedTimestamp() { return TIMESTAMP; }
246+
@Override public long expectedViewCountAtLeast() { return 16; }
247+
@Nullable @Override public String expectedUploadDate() { return "2014-02-18 21:25:01.000"; }
248+
@Nullable @Override public String expectedTextualUploadDate() { return "2014-02-18T21:25:01Z"; }
249+
@Override public long expectedLikeCountAtLeast() { return 1; }
250+
@Override public long expectedDislikeCountAtLeast() { return -1; }
251+
@Override public boolean expectedHasVideoStreams() { return false; }
252+
@Override public boolean expectedHasSubtitles() { return false; }
253+
@Override public boolean expectedHasFrames() { return false; }
254+
@Override public int expectedStreamSegmentsCount() { return 0; }
255+
@Override public String expectedLicence() { return "all-rights-reserved"; }
256+
@Override public String expectedCategory() { return "Electronic"; }
257+
}
258+
259+
@Nested
260+
class LongTrackId extends DefaultStreamExtractorTest {
261+
private static final String ID = "hard-to-break";
262+
private static final String UPLOADER = SOUNDCLOUD + "blakewhiten";
263+
private static final int TIMESTAMP = 130;
264+
private static final String URL = UPLOADER + "/" + ID + "#t=" + TIMESTAMP;
265+
266+
@Override
267+
protected StreamExtractor createExtractor() throws Exception {
268+
return SoundCloud.getStreamExtractor(URL);
269+
}
270+
271+
@Override public StreamingService expectedService() { return SoundCloud; }
272+
@Override public String expectedName() { return "Hard to Break"; }
273+
@Override public String expectedId() { return "2167944333"; }
274+
@Override public String expectedUrlContains() { return UPLOADER + "/" + ID; }
275+
@Override public String expectedOriginalUrlContains() { return URL; }
276+
277+
@Override public StreamType expectedStreamType() { return StreamType.AUDIO_STREAM; }
278+
@Override public String expectedUploaderName() { return "Blake Whiten"; }
279+
@Override public String expectedUploaderUrl() { return UPLOADER; }
280+
@Override public boolean expectedDescriptionIsEmpty() { return true; }
281+
@Override public List<String> expectedDescriptionContains() { return Collections.emptyList(); }
282+
@Override public long expectedLength() { return 201; }
283+
@Override public long expectedTimestamp() { return TIMESTAMP; }
284+
@Override public long expectedViewCountAtLeast() { return 120222; }
285+
@Nullable @Override public String expectedUploadDate() { return "2025-09-10 02:24:00.000"; }
286+
@Nullable @Override public String expectedTextualUploadDate() { return "2025-09-10T02:24:00Z"; }
287+
@Override public long expectedLikeCountAtLeast() { return 1970; }
288+
@Override public long expectedDislikeCountAtLeast() { return -1; }
289+
@Override public boolean expectedHasVideoStreams() { return false; }
290+
@Override public boolean expectedHasSubtitles() { return false; }
291+
@Override public boolean expectedHasFrames() { return false; }
292+
@Override public int expectedStreamSegmentsCount() { return 0; }
293+
@Override public String expectedLicence() { return "all-rights-reserved"; }
294+
@Override public String expectedCategory() { return "Country"; }
295+
}
220296
}

extractor/src/test/resources/mocks/v1/org/schabi/newpipe/extractor/services/soundcloud/soundcloudstreamextractor/longtrackid/generated_mock_0.json

Lines changed: 68 additions & 0 deletions
Large diffs are not rendered by default.

extractor/src/test/resources/mocks/v1/org/schabi/newpipe/extractor/services/soundcloud/soundcloudstreamextractor/longtrackid/generated_mock_1.json

Lines changed: 83 additions & 0 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"request": {
3+
"httpMethod": "GET",
4+
"url": "https://api-widget.soundcloud.com/resolve?url\u003dhttps%3A%2F%2Fsoundcloud.com%2Fblakewhiten%2Fhard-to-break%23t%3D130\u0026format\u003djson\u0026client_id\u003d9jZvetLfDs6An08euQgJ0lYlHkKdGFzV",
5+
"headers": {
6+
"Accept-Language": [
7+
"en-GB, en;q\u003d0.9"
8+
]
9+
},
10+
"localization": {
11+
"languageCode": "en",
12+
"countryCode": "GB"
13+
}
14+
},
15+
"response": {
16+
"responseCode": 200,
17+
"responseMessage": "OK",
18+
"responseHeaders": {
19+
"cache-control": [
20+
"private, max-age\u003d0"
21+
],
22+
"connection": [
23+
"keep-alive"
24+
],
25+
"content-type": [
26+
"application/json; charset\u003dutf-8"
27+
],
28+
"date": [
29+
"Sat, 31 Jan 2026 13:53:12 GMT"
30+
],
31+
"referrer-policy": [
32+
"no-referrer"
33+
],
34+
"server": [
35+
"am/2"
36+
],
37+
"strict-transport-security": [
38+
"max-age\u003d63072000"
39+
],
40+
"vary": [
41+
"Origin"
42+
],
43+
"via": [
44+
"1.1 facf66c6f980528383aac71471ad6416.cloudfront.net (CloudFront)"
45+
],
46+
"x-amz-cf-id": [
47+
"5PF518y9czdsM3IR9w4E8rhEzGWOe0Wl5CJfkv0KRfdXo25Uq52nag\u003d\u003d"
48+
],
49+
"x-amz-cf-pop": [
50+
"MEL52-P2"
51+
],
52+
"x-cache": [
53+
"Miss from cloudfront"
54+
],
55+
"x-content-type-options": [
56+
"nosniff"
57+
],
58+
"x-frame-options": [
59+
"DENY"
60+
],
61+
"x-robots-tag": [
62+
"noindex"
63+
]
64+
},
65+
"responseBody": "{\"artwork_url\":\"https://i1.sndcdn.com/artworks-4avLIZcwwxeq-0-large.jpg\",\"caption\":null,\"commentable\":true,\"comment_count\":17,\"created_at\":\"2025-09-10T02:24:00Z\",\"description\":null,\"downloadable\":false,\"download_count\":0,\"duration\":201865,\"full_duration\":201848,\"embeddable_by\":\"all\",\"genre\":\"Country\",\"has_downloads_left\":false,\"id\":2167944333,\"kind\":\"track\",\"label_name\":\"Enchntmnt/Warner Records\",\"last_modified\":\"2025-09-24T04:57:18Z\",\"license\":\"all-rights-reserved\",\"likes_count\":1971,\"permalink\":\"hard-to-break\",\"permalink_url\":\"https://soundcloud.com/blakewhiten/hard-to-break\",\"playback_count\":120241,\"public\":true,\"publisher_metadata\":{\"id\":2167944333,\"urn\":\"soundcloud:tracks:2167944333\",\"artist\":\"Blake Whiten\",\"album_title\":\"Hard to Break\",\"contains_music\":true,\"upc_or_ean\":\"054391226457\",\"isrc\":\"USWB12503619\",\"explicit\":false,\"p_line\":\"Enchntmnt / Warner Records, ℗ 2025 Warner Records Inc., under exclusive license from Enchntmnt LLC.\",\"p_line_for_display\":\"℗ Enchntmnt / Warner Records, ℗ 2025 Warner Records Inc., under exclusive license from Enchntmnt LLC.\",\"c_line\":\"Enchntmnt / Warner Records, © 2025 Warner Records Inc., under exclusive license from Enchntmnt LLC.\",\"c_line_for_display\":\"© Enchntmnt / Warner Records, © 2025 Warner Records Inc., under exclusive license from Enchntmnt LLC.\",\"release_title\":\"Hard to Break\"},\"purchase_title\":null,\"purchase_url\":null,\"release_date\":\"2025-09-26T00:00:00Z\",\"reposts_count\":12,\"secret_token\":null,\"sharing\":\"public\",\"state\":\"finished\",\"streamable\":true,\"tag_list\":\"\",\"title\":\"Hard to Break\",\"uri\":\"https://api.soundcloud.com/tracks/soundcloud%3Atracks%3A2167944333\",\"urn\":\"soundcloud:tracks:2167944333\",\"user_id\":1440582758,\"visuals\":null,\"waveform_url\":\"https://wave.sndcdn.com/Cs8zhDOA53fb_m.json\",\"display_date\":\"2025-09-26T00:00:00Z\",\"media\":{\"transcodings\":[{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/7687ae7f-9ace-4c39-a05e-ac27f04876b9/stream/ctr-encrypted-hls\",\"preset\":\"aac_160k\",\"duration\":201865,\"snipped\":false,\"format\":{\"protocol\":\"ctr-encrypted-hls\",\"mime_type\":\"audio/mp4; codecs\u003d\\\"mp4a.40.2\\\"\"},\"quality\":\"sq\",\"is_legacy_transcoding\":false},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/7687ae7f-9ace-4c39-a05e-ac27f04876b9/stream/cbc-encrypted-hls\",\"preset\":\"aac_160k\",\"duration\":201865,\"snipped\":false,\"format\":{\"protocol\":\"cbc-encrypted-hls\",\"mime_type\":\"audio/mp4; codecs\u003d\\\"mp4a.40.2\\\"\"},\"quality\":\"sq\",\"is_legacy_transcoding\":false},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/9b7f4942-bb20-463f-b01f-b84fcc5ad868/stream/ctr-encrypted-hls\",\"preset\":\"abr_sq\",\"duration\":201865,\"snipped\":false,\"format\":{\"protocol\":\"ctr-encrypted-hls\",\"mime_type\":\"audio/mpegurl\"},\"quality\":\"sq\",\"is_legacy_transcoding\":false},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/9b7f4942-bb20-463f-b01f-b84fcc5ad868/stream/cbc-encrypted-hls\",\"preset\":\"abr_sq\",\"duration\":201865,\"snipped\":false,\"format\":{\"protocol\":\"cbc-encrypted-hls\",\"mime_type\":\"audio/mpegurl\"},\"quality\":\"sq\",\"is_legacy_transcoding\":false},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/d999571e-4114-45c9-8bd0-0542ab7b5690/stream/hls\",\"preset\":\"mp3_1_0\",\"duration\":201848,\"snipped\":false,\"format\":{\"protocol\":\"hls\",\"mime_type\":\"audio/mpeg\"},\"quality\":\"sq\",\"is_legacy_transcoding\":true},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/d999571e-4114-45c9-8bd0-0542ab7b5690/stream/progressive\",\"preset\":\"mp3_1_0\",\"duration\":201848,\"snipped\":false,\"format\":{\"protocol\":\"progressive\",\"mime_type\":\"audio/mpeg\"},\"quality\":\"sq\",\"is_legacy_transcoding\":true},{\"url\":\"https://api-widget.soundcloud.com/media/soundcloud:tracks:2167944333/85861ce1-ef04-4651-9687-3b9054ed4d71/stream/hls\",\"preset\":\"opus_0_0\",\"duration\":201826,\"snipped\":false,\"format\":{\"protocol\":\"hls\",\"mime_type\":\"audio/ogg; codecs\u003d\\\"opus\\\"\"},\"quality\":\"sq\",\"is_legacy_transcoding\":true}]},\"station_urn\":\"soundcloud:system-playlists:track-stations:2167944333\",\"station_permalink\":\"track-stations:2167944333\",\"track_authorization\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJnZW8iOiJBVSIsInN1YiI6IiIsInJpZCI6ImI0ZWZjMjBmLTY2MGQtNDhjMS1iMzNlLWZhZTBmYWIwODA3OCIsImlhdCI6MTc2OTg2NzU5M30.vlT29sTTsS-I8YS2s0s1VdBkHRP5PPu-zWmLV8O5BwM\",\"monetization_model\":\"AD_SUPPORTED\",\"policy\":\"MONETIZE\",\"user\":{\"avatar_url\":\"https://i1.sndcdn.com/avatars-HR9ExmKgfe5cnDIB-ItXaxQ-large.jpg\",\"city\":null,\"comments_count\":0,\"country_code\":null,\"created_at\":\"2024-09-17T11:08:51Z\",\"creator_subscriptions\":[{\"product\":{\"id\":\"creator-pro-unlimited\"}}],\"creator_subscription\":{\"product\":{\"id\":\"creator-pro-unlimited\"}},\"description\":\"South Carolina 📍\",\"followers_count\":2746,\"followings_count\":0,\"first_name\":\"\",\"full_name\":\"\",\"groups_count\":0,\"id\":1440582758,\"kind\":\"user\",\"last_modified\":\"2025-04-11T13:46:26Z\",\"last_name\":\"\",\"likes_count\":0,\"playlist_likes_count\":0,\"permalink\":\"blakewhiten\",\"permalink_url\":\"https://soundcloud.com/blakewhiten\",\"playlist_count\":3,\"reposts_count\":null,\"track_count\":13,\"uri\":\"https://api.soundcloud.com/users/soundcloud%3Ausers%3A1440582758\",\"urn\":\"soundcloud:users:1440582758\",\"username\":\"Blake Whiten\",\"verified\":false,\"visuals\":{\"urn\":\"soundcloud:users:1440582758\",\"enabled\":true,\"visuals\":[{\"urn\":\"soundcloud:visuals:239052627\",\"entry_time\":0,\"visual_url\":\"https://i1.sndcdn.com/visuals-001440582758-01TmAY-original.jpg\"}],\"tracking\":null},\"badges\":{\"pro\":false,\"creator_mid_tier\":false,\"pro_unlimited\":true,\"verified\":false},\"station_urn\":\"soundcloud:system-playlists:artist-stations:1440582758\",\"station_permalink\":\"artist-stations:1440582758\",\"date_of_birth\":null}}",
66+
"latestUrl": "https://api-widget.soundcloud.com/resolve?url\u003dhttps%3A%2F%2Fsoundcloud.com%2Fblakewhiten%2Fhard-to-break%23t%3D130\u0026format\u003djson\u0026client_id\u003d9jZvetLfDs6An08euQgJ0lYlHkKdGFzV"
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"request": {
3+
"httpMethod": "GET",
4+
"url": "https://w.soundcloud.com/player/?url\u003dhttps%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F2167944333",
5+
"headers": {
6+
"Accept-Language": [
7+
"en-GB, en;q\u003d0.9"
8+
]
9+
},
10+
"localization": {
11+
"languageCode": "en",
12+
"countryCode": "GB"
13+
}
14+
},
15+
"response": {
16+
"responseCode": 200,
17+
"responseMessage": "",
18+
"responseHeaders": {
19+
"age": [
20+
"53"
21+
],
22+
"cache-control": [
23+
"public, max-age\u003d300"
24+
],
25+
"content-type": [
26+
"text/html"
27+
],
28+
"date": [
29+
"Sat, 31 Jan 2026 13:52:20 GMT"
30+
],
31+
"server": [
32+
"am/2"
33+
],
34+
"strict-transport-security": [
35+
"max-age\u003d63072000"
36+
],
37+
"vary": [
38+
"Accept-Encoding"
39+
],
40+
"via": [
41+
"sssr, 1.1 1cdb4c3696044834c00f70dc99b79876.cloudfront.net (CloudFront)"
42+
],
43+
"x-amz-cf-id": [
44+
"ykkMn0EJjxMOsdxMG5N2GcdKPEydew2-Ii_X76WqdP2VqJE8THbc-g\u003d\u003d"
45+
],
46+
"x-amz-cf-pop": [
47+
"MEL52-P2"
48+
],
49+
"x-cache": [
50+
"Hit from cloudfront"
51+
]
52+
},
53+
"responseBody": "\u003c!DOCTYPE html\u003e\n\u003chtml lang\u003d\"en\"\u003e\n\u003chead\u003e\n \u003cmeta charset\u003d\"UTF-8\"\u003e\n\n \n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//api-widget.soundcloud.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//sb.scorecardresearch.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//api.soundcloud.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//va.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//i1.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//i2.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//i3.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//i4.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//w1.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//wis.sndcdn.com\"\u003e\n \u003clink rel\u003d\"dns-prefetch\" href\u003d\"//style.sndcdn.com\"\u003e\n \n \u003cmeta name\u003d\"robots\" content\u003d\"noindex, follow\"\u003e\n \u003cmeta http-equiv\u003d\"X-UA-Compatible\" content\u003d\"IE\u003dedge,chrome\u003d1\"\u003e\n \u003cmeta name\u003d\"viewport\" content\u003d\"width\u003ddevice-width,minimum-scale\u003d1,maximum-scale\u003d1,user-scalable\u003dno\"\u003e\n \u003clink rel\u003d\"canonical\" href\u003d\"https://soundcloud.com/blakewhiten/hard-to-break\"\u003e\n\n \u003ctitle\u003eSoundCloud Widget\u003c/title\u003e\n\n \n \u003cscript\u003e\n (function () {\n window.ddjskey \u003d \u00277FC6D561817844F25B65CDD97F28A1\u0027;\n // https://docs.datadome.co/docs/how-to-configure-the-javascript-tag\n window.ddoptions \u003d {\n ajaxListenerPath: [{\"host\":\"api-widget.soundcloud.com\",\"path\":\"/me\",\"strict\":true},{\"host\":\"api-widget.soundcloud.com\",\"path\":\"/users/*/track_likes/*\",\"strict\":true},{\"host\":\"api-widget.soundcloud.com\",\"path\":\"/me/followings/*\",\"strict\":true},{\"host\":\"api-widget.soundcloud.com\",\"path\":\"/users/*/tracks\",\"strict\":true}],\n overrideAbortFetch: true,\n sessionByHeader: true,\n cookieName: \u0027datadome\u0027,\n endpoint: \u0027https://dwt.soundcloud.com/js/\u0027,\n disableAutoRefreshOnCaptchaPassed: true,\n enableTagEvents: true,\n abortAsyncOnCaptchaDisplay: false,\n };\n })();\n\u003c/script\u003e\n\u003cscript src\u003d\"https://dwt.soundcloud.com/tags.js\" async\u003e\u003c/script\u003e\n\n\n \n \u003cbase target\u003d\"_blank\"\u003e\n \n\u003c/head\u003e\n\u003cbody style\u003d\"margin:0\"\u003e\n \u003cdiv id\u003d\"widget\" class\u003d\"widget g-background-default g-shadow-inset\" style\u003d\"height:100%\"\u003e\u003c/div\u003e\n \u003cscript src\u003d\"https://widget.sndcdn.com/widget-5-cd8b86ff1046.js\" crossorigin\u003e\u003c/script\u003e\n \n \u003cscript crossorigin src\u003d\"https://widget.sndcdn.com/widget-8-262da2457ccc.js\"\u003e\u003c/script\u003e\n \n \u003cscript crossorigin src\u003d\"https://widget.sndcdn.com/widget-9-284db6c233bb.js\"\u003e\u003c/script\u003e\n \n \n \u003cscript\u003ewindow.innerHeight\u003c\u003d20\u0026\u0026document.body.classList.add(\"mini-player\")\u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n",
54+
"latestUrl": "https://w.soundcloud.com/player/?url\u003dhttps%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F2167944333"
55+
}
56+
}

0 commit comments

Comments
 (0)