Skip to content

Commit a3a74cd

Browse files
committed
[SoundCloud] Apply changes in InfoItemExtractors and return track user avatars as uploader avatars in SoundcloudStreamInfoItemExtractor
1 parent 7f81821 commit a3a74cd

4 files changed

Lines changed: 67 additions & 49 deletions

File tree

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

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

3-
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
4-
53
import com.grack.nanojson.JsonObject;
6-
4+
import org.schabi.newpipe.extractor.Image;
75
import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor;
86

7+
import javax.annotation.Nonnull;
8+
import java.util.List;
9+
10+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
11+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
12+
913
public class SoundcloudChannelInfoItemExtractor implements ChannelInfoItemExtractor {
1014
private final JsonObject itemObject;
1115

@@ -23,10 +27,10 @@ public String getUrl() {
2327
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
2428
}
2529

30+
@Nonnull
2631
@Override
27-
public String getThumbnailUrl() {
28-
// An avatar URL with a better resolution
29-
return itemObject.getString("avatar_url", "").replace("large.jpg", "crop.jpg");
32+
public List<Image> getThumbnails() {
33+
return getAllImagesFromArtworkOrAvatarUrl(itemObject.getString("avatar_url"));
3034
}
3135

3236
@Override

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java

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

33
import com.grack.nanojson.JsonObject;
4+
import org.schabi.newpipe.extractor.Image;
45
import org.schabi.newpipe.extractor.comments.CommentsInfoItemExtractor;
56
import org.schabi.newpipe.extractor.exceptions.ParsingException;
67
import org.schabi.newpipe.extractor.localization.DateWrapper;
7-
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
88
import org.schabi.newpipe.extractor.stream.Description;
99

10+
import javax.annotation.Nonnull;
1011
import javax.annotation.Nullable;
12+
import java.util.List;
1113
import java.util.Objects;
1214

15+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
16+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.parseDateFrom;
17+
1318
public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtractor {
1419
private final JsonObject json;
1520
private final String url;
@@ -34,9 +39,10 @@ public String getUploaderName() {
3439
return json.getObject("user").getString("username");
3540
}
3641

42+
@Nonnull
3743
@Override
38-
public String getUploaderAvatarUrl() {
39-
return json.getObject("user").getString("avatar_url");
44+
public List<Image> getUploaderAvatars() {
45+
return getAllImagesFromArtworkOrAvatarUrl(json.getObject("user").getString("avatar_url"));
4046
}
4147

4248
@Override
@@ -45,7 +51,7 @@ public boolean isUploaderVerified() throws ParsingException {
4551
}
4652

4753
@Override
48-
public int getStreamPosition() throws ParsingException {
54+
public int getStreamPosition() {
4955
return json.getInt("timestamp") / 1000; // convert milliseconds to seconds
5056
}
5157

@@ -62,7 +68,7 @@ public String getTextualUploadDate() {
6268
@Nullable
6369
@Override
6470
public DateWrapper getUploadDate() throws ParsingException {
65-
return new DateWrapper(SoundcloudParsingHelper.parseDateFrom(getTextualUploadDate()));
71+
return new DateWrapper(parseDateFrom(getTextualUploadDate()));
6672
}
6773

6874
@Override
@@ -75,8 +81,9 @@ public String getUrl() {
7581
return url;
7682
}
7783

84+
@Nonnull
7885
@Override
79-
public String getThumbnailUrl() {
80-
return json.getObject("user").getString("avatar_url");
86+
public List<Image> getThumbnails() {
87+
return getAllImagesFromArtworkOrAvatarUrl(json.getObject("user").getString("avatar_url"));
8188
}
8289
}

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

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
22

3-
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
4-
53
import com.grack.nanojson.JsonObject;
6-
4+
import org.schabi.newpipe.extractor.Image;
75
import org.schabi.newpipe.extractor.exceptions.ParsingException;
86
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
97

8+
import javax.annotation.Nonnull;
9+
import java.util.List;
10+
11+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
12+
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
13+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
14+
1015
public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
1116
private static final String USER_KEY = "user";
1217
private static final String AVATAR_URL_KEY = "avatar_url";
@@ -28,47 +33,47 @@ public String getUrl() {
2833
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
2934
}
3035

36+
@Nonnull
3137
@Override
32-
public String getThumbnailUrl() throws ParsingException {
38+
public List<Image> getThumbnails() throws ParsingException {
3339
// Over-engineering at its finest
3440
if (itemObject.isString(ARTWORK_URL_KEY)) {
35-
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY, "");
36-
if (!artworkUrl.isEmpty()) {
37-
// An artwork URL with a better resolution
38-
return artworkUrl.replace("large.jpg", "crop.jpg");
41+
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY);
42+
if (!isNullOrEmpty(artworkUrl)) {
43+
return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
3944
}
4045
}
4146

4247
try {
43-
// Look for artwork url inside the track list
48+
// Look for artwork URL inside the track list
4449
for (final Object track : itemObject.getArray("tracks")) {
4550
final JsonObject trackObject = (JsonObject) track;
4651

47-
// First look for track artwork url
52+
// First look for track artwork URL
4853
if (trackObject.isString(ARTWORK_URL_KEY)) {
49-
final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY, "");
50-
if (!artworkUrl.isEmpty()) {
51-
// An artwork URL with a better resolution
52-
return artworkUrl.replace("large.jpg", "crop.jpg");
54+
final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY);
55+
if (!isNullOrEmpty(artworkUrl)) {
56+
return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
5357
}
5458
}
5559

56-
// Then look for track creator avatar url
60+
// Then look for track creator avatar URL
5761
final JsonObject creator = trackObject.getObject(USER_KEY);
58-
final String creatorAvatar = creator.getString(AVATAR_URL_KEY, "");
59-
if (!creatorAvatar.isEmpty()) {
60-
return creatorAvatar;
62+
final String creatorAvatar = creator.getString(AVATAR_URL_KEY);
63+
if (!isNullOrEmpty(creatorAvatar)) {
64+
return getAllImagesFromArtworkOrAvatarUrl(creatorAvatar);
6165
}
6266
}
6367
} catch (final Exception ignored) {
6468
// Try other method
6569
}
6670

6771
try {
68-
// Last resort, use user avatar url. If still not found, then throw exception.
69-
return itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY, "");
72+
// Last resort, use user avatar URL. If still not found, then throw an exception.
73+
return getAllImagesFromArtworkOrAvatarUrl(
74+
itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY));
7075
} catch (final Exception e) {
71-
throw new ParsingException("Failed to extract playlist thumbnail url", e);
76+
throw new ParsingException("Failed to extract playlist thumbnails", e);
7277
}
7378
}
7479

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
22

3-
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
4-
53
import com.grack.nanojson.JsonObject;
64

5+
import org.schabi.newpipe.extractor.Image;
76
import org.schabi.newpipe.extractor.exceptions.ParsingException;
87
import org.schabi.newpipe.extractor.localization.DateWrapper;
9-
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
108
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
119
import org.schabi.newpipe.extractor.stream.StreamType;
1210

13-
import javax.annotation.Nullable;
11+
import javax.annotation.Nonnull;
12+
import java.util.List;
13+
14+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
15+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromTrackObject;
16+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.parseDateFrom;
17+
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
1418

1519
public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtractor {
1620

17-
protected final JsonObject itemObject;
21+
private final JsonObject itemObject;
1822

1923
public SoundcloudStreamInfoItemExtractor(final JsonObject itemObject) {
2024
this.itemObject = itemObject;
@@ -45,10 +49,11 @@ public String getUploaderUrl() {
4549
return replaceHttpWithHttps(itemObject.getObject("user").getString("permalink_url"));
4650
}
4751

48-
@Nullable
52+
@Nonnull
4953
@Override
50-
public String getUploaderAvatarUrl() {
51-
return null;
54+
public List<Image> getUploaderAvatars() {
55+
return getAllImagesFromArtworkOrAvatarUrl(
56+
itemObject.getObject("user").getString("avatar_url"));
5257
}
5358

5459
@Override
@@ -63,21 +68,18 @@ public String getTextualUploadDate() {
6368

6469
@Override
6570
public DateWrapper getUploadDate() throws ParsingException {
66-
return new DateWrapper(SoundcloudParsingHelper.parseDateFrom(getTextualUploadDate()));
71+
return new DateWrapper(parseDateFrom(getTextualUploadDate()));
6772
}
6873

6974
@Override
7075
public long getViewCount() {
7176
return itemObject.getLong("playback_count");
7277
}
7378

79+
@Nonnull
7480
@Override
75-
public String getThumbnailUrl() {
76-
String artworkUrl = itemObject.getString("artwork_url", "");
77-
if (artworkUrl.isEmpty()) {
78-
artworkUrl = itemObject.getObject("user").getString("avatar_url");
79-
}
80-
return artworkUrl.replace("large.jpg", "crop.jpg");
81+
public List<Image> getThumbnails() throws ParsingException {
82+
return getAllImagesFromTrackObject(itemObject);
8183
}
8284

8385
@Override

0 commit comments

Comments
 (0)