From a3a74cd5663dddb3f034469d84d3736cbc153f26 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Mon, 25 Jul 2022 18:58:20 +0200 Subject: [PATCH] [SoundCloud] Apply changes in InfoItemExtractors and return track user avatars as uploader avatars in SoundcloudStreamInfoItemExtractor --- .../SoundcloudChannelInfoItemExtractor.java | 16 ++++--- .../SoundcloudCommentsInfoItemExtractor.java | 21 ++++++--- .../SoundcloudPlaylistInfoItemExtractor.java | 47 ++++++++++--------- .../SoundcloudStreamInfoItemExtractor.java | 32 +++++++------ 4 files changed, 67 insertions(+), 49 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelInfoItemExtractor.java index 86b3d48ff..45241f090 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelInfoItemExtractor.java @@ -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 getThumbnails() { + return getAllImagesFromArtworkOrAvatarUrl(itemObject.getString("avatar_url")); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java index ec3f353e6..46194a3b6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java @@ -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 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 getThumbnails() { + return getAllImagesFromArtworkOrAvatarUrl(json.getObject("user").getString("avatar_url")); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistInfoItemExtractor.java index 3f3f3b675..9201b436b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistInfoItemExtractor.java @@ -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 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); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamInfoItemExtractor.java index 3d265e4e4..6fd6232e9 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamInfoItemExtractor.java @@ -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 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 getThumbnails() throws ParsingException { + return getAllImagesFromTrackObject(itemObject); } @Override