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

View File

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

View File

@ -1,12 +1,17 @@
package org.schabi.newpipe.extractor.services.soundcloud.extractors; package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor; 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 { public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
private static final String USER_KEY = "user"; private static final String USER_KEY = "user";
private static final String AVATAR_URL_KEY = "avatar_url"; private static final String AVATAR_URL_KEY = "avatar_url";
@ -28,36 +33,35 @@ public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtr
return replaceHttpWithHttps(itemObject.getString("permalink_url")); return replaceHttpWithHttps(itemObject.getString("permalink_url"));
} }
@Nonnull
@Override @Override
public String getThumbnailUrl() throws ParsingException { public List<Image> getThumbnails() throws ParsingException {
// Over-engineering at its finest // Over-engineering at its finest
if (itemObject.isString(ARTWORK_URL_KEY)) { if (itemObject.isString(ARTWORK_URL_KEY)) {
final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY, ""); final String artworkUrl = itemObject.getString(ARTWORK_URL_KEY);
if (!artworkUrl.isEmpty()) { if (!isNullOrEmpty(artworkUrl)) {
// An artwork URL with a better resolution return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
return artworkUrl.replace("large.jpg", "crop.jpg");
} }
} }
try { try {
// Look for artwork url inside the track list // Look for artwork URL inside the track list
for (final Object track : itemObject.getArray("tracks")) { for (final Object track : itemObject.getArray("tracks")) {
final JsonObject trackObject = (JsonObject) track; final JsonObject trackObject = (JsonObject) track;
// First look for track artwork url // First look for track artwork URL
if (trackObject.isString(ARTWORK_URL_KEY)) { if (trackObject.isString(ARTWORK_URL_KEY)) {
final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY, ""); final String artworkUrl = trackObject.getString(ARTWORK_URL_KEY);
if (!artworkUrl.isEmpty()) { if (!isNullOrEmpty(artworkUrl)) {
// An artwork URL with a better resolution return getAllImagesFromArtworkOrAvatarUrl(artworkUrl);
return artworkUrl.replace("large.jpg", "crop.jpg");
} }
} }
// Then look for track creator avatar url // Then look for track creator avatar URL
final JsonObject creator = trackObject.getObject(USER_KEY); final JsonObject creator = trackObject.getObject(USER_KEY);
final String creatorAvatar = creator.getString(AVATAR_URL_KEY, ""); final String creatorAvatar = creator.getString(AVATAR_URL_KEY);
if (!creatorAvatar.isEmpty()) { if (!isNullOrEmpty(creatorAvatar)) {
return creatorAvatar; return getAllImagesFromArtworkOrAvatarUrl(creatorAvatar);
} }
} }
} catch (final Exception ignored) { } catch (final Exception ignored) {
@ -65,10 +69,11 @@ public class SoundcloudPlaylistInfoItemExtractor implements PlaylistInfoItemExtr
} }
try { try {
// Last resort, use user avatar url. If still not found, then throw exception. // Last resort, use user avatar URL. If still not found, then throw an exception.
return itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY, ""); return getAllImagesFromArtworkOrAvatarUrl(
itemObject.getObject(USER_KEY).getString(AVATAR_URL_KEY));
} catch (final Exception e) { } 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; package org.schabi.newpipe.extractor.services.soundcloud.extractors;
import static org.schabi.newpipe.extractor.utils.Utils.replaceHttpWithHttps;
import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.localization.DateWrapper; 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.StreamInfoItemExtractor;
import org.schabi.newpipe.extractor.stream.StreamType; 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 { public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtractor {
protected final JsonObject itemObject; private final JsonObject itemObject;
public SoundcloudStreamInfoItemExtractor(final JsonObject itemObject) { public SoundcloudStreamInfoItemExtractor(final JsonObject itemObject) {
this.itemObject = itemObject; this.itemObject = itemObject;
@ -45,10 +49,11 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
return replaceHttpWithHttps(itemObject.getObject("user").getString("permalink_url")); return replaceHttpWithHttps(itemObject.getObject("user").getString("permalink_url"));
} }
@Nullable @Nonnull
@Override @Override
public String getUploaderAvatarUrl() { public List<Image> getUploaderAvatars() {
return null; return getAllImagesFromArtworkOrAvatarUrl(
itemObject.getObject("user").getString("avatar_url"));
} }
@Override @Override
@ -63,7 +68,7 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
@Override @Override
public DateWrapper getUploadDate() throws ParsingException { public DateWrapper getUploadDate() throws ParsingException {
return new DateWrapper(SoundcloudParsingHelper.parseDateFrom(getTextualUploadDate())); return new DateWrapper(parseDateFrom(getTextualUploadDate()));
} }
@Override @Override
@ -71,13 +76,10 @@ public class SoundcloudStreamInfoItemExtractor implements StreamInfoItemExtracto
return itemObject.getLong("playback_count"); return itemObject.getLong("playback_count");
} }
@Nonnull
@Override @Override
public String getThumbnailUrl() { public List<Image> getThumbnails() throws ParsingException {
String artworkUrl = itemObject.getString("artwork_url", ""); return getAllImagesFromTrackObject(itemObject);
if (artworkUrl.isEmpty()) {
artworkUrl = itemObject.getObject("user").getString("avatar_url");
}
return artworkUrl.replace("large.jpg", "crop.jpg");
} }
@Override @Override