[SoundCloud] Apply changes in InfoItemExtractors and return track user avatars as uploader avatars in SoundcloudStreamInfoItemExtractor

This commit is contained in:
AudricV 2022-07-25 18:58:20 +02:00
parent 7f818217d2
commit a3a74cd566
No known key found for this signature in database
GPG Key ID: DA92EC7905614198
4 changed files with 67 additions and 49 deletions

View File

@ -1,11 +1,15 @@
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor;
import javax.annotation.Nonnull;
import java.util.List;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
public class SoundcloudChannelInfoItemExtractor implements ChannelInfoItemExtractor {
private final JsonObject itemObject;
@ -23,10 +27,10 @@ public class SoundcloudChannelInfoItemExtractor implements ChannelInfoItemExtrac
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
}
@Nonnull
@Override
public String getThumbnailUrl() {
// An avatar URL with a better resolution
return itemObject.getString("avatar_url", "").replace("large.jpg", "crop.jpg");
public List<Image> getThumbnails() {
return getAllImagesFromArtworkOrAvatarUrl(itemObject.getString("avatar_url"));
}
@Override

View File

@ -1,15 +1,20 @@
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.comments.CommentsInfoItemExtractor;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
import org.schabi.newpipe.extractor.stream.Description;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Objects;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.parseDateFrom;
public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtractor {
private final JsonObject json;
private final String url;
@ -34,9 +39,10 @@ public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtr
return json.getObject("user").getString("username");
}
@Nonnull
@Override
public String getUploaderAvatarUrl() {
return json.getObject("user").getString("avatar_url");
public List<Image> getUploaderAvatars() {
return getAllImagesFromArtworkOrAvatarUrl(json.getObject("user").getString("avatar_url"));
}
@Override
@ -45,7 +51,7 @@ public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtr
}
@Override
public int getStreamPosition() throws ParsingException {
public int getStreamPosition() {
return json.getInt("timestamp") / 1000; // convert milliseconds to seconds
}
@ -62,7 +68,7 @@ public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtr
@Nullable
@Override
public DateWrapper getUploadDate() throws ParsingException {
return new DateWrapper(SoundcloudParsingHelper.parseDateFrom(getTextualUploadDate()));
return new DateWrapper(parseDateFrom(getTextualUploadDate()));
}
@Override
@ -75,8 +81,9 @@ public class SoundcloudCommentsInfoItemExtractor implements CommentsInfoItemExtr
return url;
}
@Nonnull
@Override
public String getThumbnailUrl() {
return json.getObject("user").getString("avatar_url");
public List<Image> getThumbnails() {
return getAllImagesFromArtworkOrAvatarUrl(json.getObject("user").getString("avatar_url"));
}
}

View File

@ -1,12 +1,17 @@
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
import javax.annotation.Nonnull;
import java.util.List;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
private static final String USER_KEY = "user";
private static final String AVATAR_URL_KEY = "avatar_url";
@ -28,36 +33,35 @@ public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtr
return replaceHttpWithHttps(itemObject.getString("permalink_url"));
}
@Nonnull
@Override
public String getThumbnailUrl() throws ParsingException {
public List<Image> getThumbnails() throws ParsingException {
// Over-engineering at its finest
if (itemObject.isString(ARTWORK_URL_KEY)) {
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY, "");
if (!artworkUrl.isEmpty()) {
// An artwork URL with a better resolution
return artworkUrl.replace("large.jpg", "crop.jpg");
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY);
if (!isNullOrEmpty(artworkUrl)) {
return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
}
}
try {
// Look for artwork url inside the track list
// Look for artwork URL inside the track list
for (final Object track : itemObject.getArray("tracks")) {
final JsonObject trackObject = (JsonObject) track;
// First look for track artwork url
// First look for track artwork URL
if (trackObject.isString(ARTWORK_URL_KEY)) {
final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY, "");
if (!artworkUrl.isEmpty()) {
// An artwork URL with a better resolution
return artworkUrl.replace("large.jpg", "crop.jpg");
final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY);
if (!isNullOrEmpty(artworkUrl)) {
return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
}
}
// Then look for track creator avatar url
// Then look for track creator avatar URL
final JsonObject creator = trackObject.getObject(USER_KEY);
final String creatorAvatar = creator.getString(AVATAR_URL_KEY, "");
if (!creatorAvatar.isEmpty()) {
return creatorAvatar;
final String creatorAvatar = creator.getString(AVATAR_URL_KEY);
if (!isNullOrEmpty(creatorAvatar)) {
return getAllImagesFromArtworkOrAvatarUrl(creatorAvatar);
}
}
} catch (final Exception ignored) {
@ -65,10 +69,11 @@ public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtr
}
try {
// Last resort, use user avatar url. If still not found, then throw exception.
return itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY, "");
// Last resort, use user avatar URL. If still not found, then throw an exception.
return getAllImagesFromArtworkOrAvatarUrl(
itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY));
} catch (final Exception e) {
throw new ParsingException("Failed to extract playlist thumbnail url", e);
throw new ParsingException("Failed to extract playlist thumbnails", e);
}
}

View File

@ -1,20 +1,24 @@
package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.localization.DateWrapper;
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
import org.schabi.newpipe.extractor.stream.StreamType;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import java.util.List;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromArtworkOrAvatarUrl;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.getAllImagesFromTrackObject;
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.parseDateFrom;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtractor {
protected final JsonObject itemObject;
private final JsonObject itemObject;
public SoundcloudStreamInfoItemExtractor(final JsonObject itemObject) {
this.itemObject = itemObject;
@ -45,10 +49,11 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
return replaceHttpWithHttps(itemObject.getObject("user").getString("permalink_url"));
}
@Nullable
@Nonnull
@Override
public String getUploaderAvatarUrl() {
return null;
public List<Image> getUploaderAvatars() {
return getAllImagesFromArtworkOrAvatarUrl(
itemObject.getObject("user").getString("avatar_url"));
}
@Override
@ -63,7 +68,7 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
@Override
public DateWrapper getUploadDate() throws ParsingException {
return new DateWrapper(SoundcloudParsingHelper.parseDateFrom(getTextualUploadDate()));
return new DateWrapper(parseDateFrom(getTextualUploadDate()));
}
@Override
@ -71,13 +76,10 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
return itemObject.getLong("playback_count");
}
@Nonnull
@Override
public String getThumbnailUrl() {
String artworkUrl = itemObject.getString("artwork_url", "");
if (artworkUrl.isEmpty()) {
artworkUrl = itemObject.getObject("user").getString("avatar_url");
}
return artworkUrl.replace("large.jpg", "crop.jpg");
public List<Image> getThumbnails() throws ParsingException {
return getAllImagesFromTrackObject(itemObject);
}
@Override