Skip to content

Commit 29afd0c

Browse files
committed
Fix some bugs discovered by the new tests
1 parent d9cf1fd commit 29afd0c

12 files changed

Lines changed: 95 additions & 51 deletions

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.schabi.newpipe.extractor.services.soundcloud;
22

3+
import com.grack.nanojson.JsonArray;
34
import com.grack.nanojson.JsonObject;
45
import com.grack.nanojson.JsonParser;
56
import com.grack.nanojson.JsonParserException;
@@ -14,6 +15,8 @@
1415
import javax.annotation.Nonnull;
1516
import java.io.IOException;
1617

18+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
19+
1720
@SuppressWarnings("WeakerAccess")
1821
public class SoundcloudChannelExtractor extends ChannelExtractor {
1922
private String userId;
@@ -30,7 +33,7 @@ public SoundcloudChannelExtractor(StreamingService service, String url) {
3033
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
3134

3235
userId = getUrlIdHandler().getId(getOriginalUrl());
33-
String apiUrl = "https://api.soundcloud.com/users/" + userId +
36+
String apiUrl = "https://api-v2.soundcloud.com/users/" + userId +
3437
"?client_id=" + SoundcloudParsingHelper.clientId();
3538

3639
String response = downloader.download(apiUrl);
@@ -44,7 +47,7 @@ public void onFetchPage(@Nonnull Downloader downloader) throws IOException, Extr
4447
@Nonnull
4548
@Override
4649
public String getCleanUrl() {
47-
return user.isString("permalink_url") ? user.getString("permalink_url") : getOriginalUrl();
50+
return user.isString("permalink_url") ? replaceHttpWithHttps(user.getString("permalink_url")) : getOriginalUrl();
4851
}
4952

5053
@Nonnull
@@ -66,11 +69,10 @@ public String getAvatarUrl() {
6669

6770
@Override
6871
public String getBannerUrl() {
69-
try {
70-
return user.getObject("visuals").getArray("visuals").getObject(0).getString("visual_url", "");
71-
} catch (NullPointerException e) {
72-
return null;
73-
}
72+
return user.getObject("visuals", new JsonObject())
73+
.getArray("visuals", new JsonArray())
74+
.getObject(0, new JsonObject())
75+
.getString("visual_url");
7476
}
7577

7678
@Override

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelInfoItemExtractor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.grack.nanojson.JsonObject;
44
import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor;
55

6+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
7+
68
public class SoundcloudChannelInfoItemExtractor implements ChannelInfoItemExtractor {
79
private final JsonObject itemObject;
810

@@ -17,7 +19,7 @@ public String getName() {
1719

1820
@Override
1921
public String getUrl() {
20-
return itemObject.getString("permalink_url");
22+
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
2123
}
2224

2325
@Override

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelUrlIdHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.schabi.newpipe.extractor.utils.Parser;
99
import org.schabi.newpipe.extractor.utils.Utils;
1010

11+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
12+
1113
public class SoundcloudChannelUrlIdHandler implements UrlIdHandler {
1214
private static final SoundcloudChannelUrlIdHandler instance = new SoundcloudChannelUrlIdHandler();
1315
private final String URL_PATTERN = "^https?://(www\\.|m\\.)?soundcloud.com/[0-9a-z_-]+" +
@@ -45,7 +47,7 @@ public String cleanUrl(String complexUrl) throws ParsingException {
4547
Element ogElement = Jsoup.parse(NewPipe.getDownloader().download(complexUrl))
4648
.select("meta[property=og:url]").first();
4749

48-
return ogElement.attr("content");
50+
return replaceHttpWithHttps(ogElement.attr("content"));
4951
} catch (Exception e) {
5052
throw new ParsingException(e.getMessage(), e);
5153
}

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudParsingHelper.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import java.text.SimpleDateFormat;
2424
import java.util.Date;
2525

26+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
27+
2628
public class SoundcloudParsingHelper {
2729
private static String clientId;
28-
29-
private static final String HTTP = "http://";
30-
private static final String HTTPS = "https://";
3130

3231
private SoundcloudParsingHelper() {
3332
}
@@ -215,13 +214,6 @@ public static String getStreamsFromApi(StreamInfoItemsCollector collector, Strin
215214
return getStreamsFromApi(collector, apiUrl, false);
216215
}
217216

218-
private static String replaceHttpWithHttps(final String url) {
219-
if(!url.isEmpty() && url.startsWith(HTTP)) {
220-
return HTTPS + url.substring(HTTP.length());
221-
}
222-
return url;
223-
}
224-
225217
@Nonnull
226218
static String getUploaderUrl(JsonObject object) {
227219
String url = object.getObject("user").getString("permalink_url", "");

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import javax.annotation.Nonnull;
1515
import java.io.IOException;
1616

17+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
18+
1719
@SuppressWarnings("WeakerAccess")
1820
public class SoundcloudPlaylistExtractor extends PlaylistExtractor {
1921
private String playlistId;
@@ -45,7 +47,7 @@ public void onFetchPage(@Nonnull Downloader downloader) throws IOException, Extr
4547
@Nonnull
4648
@Override
4749
public String getCleanUrl() {
48-
return playlist.isString("permalink_url") ? playlist.getString("permalink_url") : getOriginalUrl();
50+
return playlist.isString("permalink_url") ? replaceHttpWithHttps(playlist.getString("permalink_url")) : getOriginalUrl();
4951
}
5052

5153
@Nonnull
@@ -62,7 +64,26 @@ public String getName() {
6264

6365
@Override
6466
public String getThumbnailUrl() {
65-
return playlist.getString("artwork_url");
67+
String artworkUrl = playlist.getString("artwork_url");
68+
69+
if (artworkUrl == null) {
70+
// If the thumbnail is null, traverse the items list and get a valid one,
71+
// if it also fails, return null
72+
try {
73+
final StreamInfoItemsCollector infoItems = getInfoItems();
74+
if (infoItems.getItemList().isEmpty()) return null;
75+
76+
for (StreamInfoItem item : infoItems.getItemList()) {
77+
final String thumbnailUrl = item.getThumbnailUrl();
78+
if (thumbnailUrl == null || thumbnailUrl.isEmpty()) continue;
79+
80+
return thumbnailUrl;
81+
}
82+
} catch (Exception ignored) {
83+
}
84+
}
85+
86+
return artworkUrl;
6687
}
6788

6889
@Override

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistInfoItemExtractor.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,40 @@
44
import org.schabi.newpipe.extractor.exceptions.ParsingException;
55
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
66

7+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
8+
79
public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
810
private static final String USER_KEY = "user";
911
private static final String AVATAR_URL_KEY = "avatar_url";
1012
private static final String ARTWORK_URL_KEY = "artwork_url";
1113

12-
private final JsonObject searchResult;
14+
private final JsonObject itemObject;
1315

14-
public SoundcloudPlaylistInfoItemExtractor(JsonObject searchResult) {
15-
this.searchResult = searchResult;
16+
public SoundcloudPlaylistInfoItemExtractor(JsonObject itemObject) {
17+
this.itemObject = itemObject;
1618
}
1719

1820
@Override
19-
public String getName() throws ParsingException {
20-
return searchResult.getString("title");
21+
public String getName() {
22+
return itemObject.getString("title");
2123
}
2224

2325
@Override
24-
public String getUrl() throws ParsingException {
25-
return searchResult.getString("permalink_url");
26+
public String getUrl() {
27+
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
2628
}
2729

2830
@Override
2931
public String getThumbnailUrl() throws ParsingException {
3032
// Over-engineering at its finest
31-
if (searchResult.isString(ARTWORK_URL_KEY)) {
32-
final String artworkUrl = searchResult.getString(ARTWORK_URL_KEY, "");
33+
if (itemObject.isString(ARTWORK_URL_KEY)) {
34+
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY, "");
3335
if (!artworkUrl.isEmpty()) return artworkUrl;
3436
}
3537

3638
try {
3739
// Look for artwork url inside the track list
38-
for (Object track : searchResult.getArray("tracks")) {
40+
for (Object track : itemObject.getArray("tracks")) {
3941
final JsonObject trackObject = (JsonObject) track;
4042

4143
// First look for track artwork url
@@ -55,7 +57,7 @@ public String getThumbnailUrl() throws ParsingException {
5557

5658
try {
5759
// Last resort, use user avatar url. If still not found, then throw exception.
58-
return searchResult.getObject(USER_KEY).getString(AVATAR_URL_KEY, "");
60+
return itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY, "");
5961
} catch (Exception e) {
6062
throw new ParsingException("Failed to extract playlist thumbnail url", e);
6163
}
@@ -64,14 +66,14 @@ public String getThumbnailUrl() throws ParsingException {
6466
@Override
6567
public String getUploaderName() throws ParsingException {
6668
try {
67-
return searchResult.getObject(USER_KEY).getString("username");
69+
return itemObject.getObject(USER_KEY).getString("username");
6870
} catch (Exception e) {
6971
throw new ParsingException("Failed to extract playlist uploader", e);
7072
}
7173
}
7274

7375
@Override
74-
public long getStreamCount() throws ParsingException {
75-
return searchResult.getNumber("track_count", 0).longValue();
76+
public long getStreamCount() {
77+
return itemObject.getNumber("track_count", 0).longValue();
7678
}
7779
}

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistUrlIdHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.schabi.newpipe.extractor.utils.Parser;
99
import org.schabi.newpipe.extractor.utils.Utils;
1010

11+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
12+
1113
public class SoundcloudPlaylistUrlIdHandler implements UrlIdHandler {
1214
private static final SoundcloudPlaylistUrlIdHandler instance = new SoundcloudPlaylistUrlIdHandler();
1315
private final String URL_PATTERN = "^https?://(www\\.|m\\.)?soundcloud.com/[0-9a-z_-]+" +
@@ -45,7 +47,7 @@ public String cleanUrl(String complexUrl) throws ParsingException {
4547
Element ogElement = Jsoup.parse(NewPipe.getDownloader().download(complexUrl))
4648
.select("meta[property=og:url]").first();
4749

48-
return ogElement.attr("content");
50+
return replaceHttpWithHttps(ogElement.attr("content"));
4951
} catch (Exception e) {
5052
throw new ParsingException(e.getMessage(), e);
5153
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
import java.io.IOException;
1414
import java.io.UnsupportedEncodingException;
1515
import java.net.URLEncoder;
16-
import java.util.*;
16+
import java.util.ArrayList;
17+
import java.util.Collections;
18+
import java.util.List;
19+
20+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
1721

1822
public class SoundcloudStreamExtractor extends StreamExtractor {
1923
private JsonObject track;
@@ -35,7 +39,7 @@ public void onFetchPage(@Nonnull Downloader downloader) throws IOException, Extr
3539
@Nonnull
3640
@Override
3741
public String getCleanUrl() {
38-
return track.isString("permalink_url") ? track.getString("permalink_url") : getOriginalUrl();
42+
return track.isString("permalink_url") ? replaceHttpWithHttps(track.getString("permalink_url")) : getOriginalUrl();
3943
}
4044

4145
@Nonnull

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,54 @@
55
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
66
import org.schabi.newpipe.extractor.stream.StreamType;
77

8+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
9+
810
public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtractor {
911

10-
protected final JsonObject searchResult;
12+
protected final JsonObject itemObject;
1113

12-
public SoundcloudStreamInfoItemExtractor(JsonObject searchResult) {
13-
this.searchResult = searchResult;
14+
public SoundcloudStreamInfoItemExtractor(JsonObject itemObject) {
15+
this.itemObject = itemObject;
1416
}
1517

1618
@Override
1719
public String getUrl() {
18-
return searchResult.getString("permalink_url");
20+
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
1921
}
2022

2123
@Override
2224
public String getName() {
23-
return searchResult.getString("title");
25+
return itemObject.getString("title");
2426
}
2527

2628
@Override
2729
public long getDuration() {
28-
return searchResult.getNumber("duration", 0).longValue() / 1000L;
30+
return itemObject.getNumber("duration", 0).longValue() / 1000L;
2931
}
3032

3133
@Override
3234
public String getUploaderName() {
33-
return searchResult.getObject("user").getString("username");
35+
return itemObject.getObject("user").getString("username");
3436
}
3537

3638
@Override
3739
public String getUploaderUrl() {
38-
return searchResult.getObject("user").getString("permalink_url");
40+
return replaceHttpWithHttps(itemObject.getObject("user").getString("permalink_url"));
3941
}
4042

4143
@Override
4244
public String getUploadDate() throws ParsingException {
43-
return SoundcloudParsingHelper.toDateString(searchResult.getString("created_at"));
45+
return SoundcloudParsingHelper.toDateString(itemObject.getString("created_at"));
4446
}
4547

4648
@Override
4749
public long getViewCount() {
48-
return searchResult.getNumber("playback_count", 0).longValue();
50+
return itemObject.getNumber("playback_count", 0).longValue();
4951
}
5052

5153
@Override
5254
public String getThumbnailUrl() {
53-
return searchResult.getString("artwork_url");
55+
return itemObject.getString("artwork_url");
5456
}
5557

5658
@Override

src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamUrlIdHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.schabi.newpipe.extractor.utils.Parser;
99
import org.schabi.newpipe.extractor.utils.Utils;
1010

11+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
12+
1113
public class SoundcloudStreamUrlIdHandler implements UrlIdHandler {
1214
private static final SoundcloudStreamUrlIdHandler instance = new SoundcloudStreamUrlIdHandler();
1315
private final String URL_PATTERN = "^https?://(www\\.|m\\.)?soundcloud.com/[0-9a-z_-]+" +
@@ -48,7 +50,7 @@ public String cleanUrl(String complexUrl) throws ParsingException {
4850
Element ogElement = Jsoup.parse(NewPipe.getDownloader().download(complexUrl))
4951
.select("meta[property=og:url]").first();
5052

51-
return ogElement.attr("content");
53+
return replaceHttpWithHttps(ogElement.attr("content"));
5254
} catch (Exception e) {
5355
throw new ParsingException(e.getMessage(), e);
5456
}

0 commit comments

Comments
 (0)