mirror of
https://github.com/TeamNewPipe/NewPipeExtractor.git
synced 2025-04-28 16:00:33 +05:30
[SoundCloud] Apply changes in InfoItemExtractors and return track user avatars as uploader avatars in SoundcloudStreamInfoItemExtractor
This commit is contained in:
parent
7f818217d2
commit
a3a74cd566
@ -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
|
||||||
|
@ -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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user