diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java index 11b220288..1bba2e5ee 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSongOrVideoInfoItemExtractor.java @@ -174,4 +174,26 @@ public class YoutubeMusicSongOrVideoInfoItemExtractor implements StreamInfoItemE throw new ParsingException("Could not get thumbnails", e); } } + + @Override + public String getPlaylistId() throws ParsingException { + if (searchType.equals(MUSIC_SONGS)) { + for (final Object item : descriptionElements) { + final JsonObject browseEndpoint = ((JsonObject) item) + .getObject("navigationEndpoint") + .getObject("browseEndpoint"); + + final String type = browseEndpoint + .getObject("browseEndpointContextSupportedConfigs") + .getObject("browseEndpointContextMusicConfig") + .getString("pageType"); + + if (type != null && type.equals("MUSIC_PAGE_TYPE_ALBUM")) { + return browseEndpoint.getString("browseId"); + } + } + } + // handles singles, video, and others which may not belong in playlist + return ""; + } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java index 6996111ff..fb9774b98 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java @@ -37,6 +37,7 @@ public class StreamInfoItem extends InfoItem { private String uploaderName; private String shortDescription; private String textualUploadDate; + private String playlistId; @Nullable private DateWrapper uploadDate; private long viewCount = -1; @@ -118,6 +119,14 @@ public class StreamInfoItem extends InfoItem { this.textualUploadDate = textualUploadDate; } + public String getPlaylistId() { + return playlistId; + } + + public void setPlaylistId(final String playlistId) { + this.playlistId = playlistId; + } + @Nullable public DateWrapper getUploadDate() { return uploadDate; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java index c59b0aab3..6fb6f66be 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java @@ -147,4 +147,14 @@ public interface StreamInfoItemExtractor extends InfoItemExtractor { default boolean isShortFormContent() throws ParsingException { return false; } + + /** + * Gets the playlist id of the stream item. + * + * @return the playlist id of the stream item. + * @throws ParsingException if there is an error in the extraction + */ + default String getPlaylistId() throws ParsingException { + return ""; + } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemsCollector.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemsCollector.java index 19cd2baa8..bcf25f0d2 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemsCollector.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemsCollector.java @@ -103,6 +103,11 @@ public class StreamInfoItemsCollector } catch (final Exception e) { addError(e); } + try { + resultItem.setPlaylistId(extractor.getPlaylistId()); + } catch (final Exception e) { + addError(e); + } return resultItem; }