mirror of
https://github.com/TeamNewPipe/NewPipeExtractor.git
synced 2025-04-27 23:40:36 +05:30
[YouTube] Extract playlist type in playlist extractor
This commit is contained in:
parent
63ed06a710
commit
401082abe4
@ -339,6 +339,51 @@ public class YoutubeParsingHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param playlistId the playlist id to parse
|
||||||
|
* @return the {@link PlaylistInfo.PlaylistType} extracted from the playlistId (mix playlist
|
||||||
|
* types included)
|
||||||
|
* @throws ParsingException if the playlistId is null or empty
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
public static PlaylistInfo.PlaylistType extractPlaylistTypeFromPlaylistId(
|
||||||
|
final String playlistId) throws ParsingException {
|
||||||
|
if (isNullOrEmpty(playlistId)) {
|
||||||
|
throw new ParsingException("Could not extract playlist type from empty playlist id");
|
||||||
|
} else if (isYoutubeMusicMixId(playlistId)) {
|
||||||
|
return PlaylistInfo.PlaylistType.MIX_MUSIC;
|
||||||
|
} else if (isYoutubeChannelMixId(playlistId)) {
|
||||||
|
return PlaylistInfo.PlaylistType.MIX_CHANNEL;
|
||||||
|
} else if (isYoutubeGenreMixId(playlistId)) {
|
||||||
|
return PlaylistInfo.PlaylistType.MIX_GENRE;
|
||||||
|
} else if (isYoutubeMixId(playlistId)) { // normal mix
|
||||||
|
// Either a normal mix based on a stream, or a "my mix" (still based on a stream).
|
||||||
|
// NOTE: if YouTube introduces even more types of mixes that still start with RD,
|
||||||
|
// they will default to this, even though they might not be based on a stream.
|
||||||
|
return PlaylistInfo.PlaylistType.MIX_STREAM;
|
||||||
|
} else {
|
||||||
|
// not a known type of mix: just consider it a normal playlist
|
||||||
|
return PlaylistInfo.PlaylistType.NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param playlistUrl the playlist url to parse
|
||||||
|
* @return the {@link PlaylistInfo.PlaylistType} extracted from the playlistUrl's list param
|
||||||
|
* (mix playlist types included)
|
||||||
|
* @throws ParsingException if the playlistUrl is malformed, if has no list param or if the list
|
||||||
|
* param is empty
|
||||||
|
*/
|
||||||
|
public static PlaylistInfo.PlaylistType extractPlaylistTypeFromPlaylistUrl(
|
||||||
|
final String playlistUrl) throws ParsingException {
|
||||||
|
try {
|
||||||
|
return extractPlaylistTypeFromPlaylistId(
|
||||||
|
Utils.getQueryValue(Utils.stringToURL(playlistUrl), "list"));
|
||||||
|
} catch (final MalformedURLException e) {
|
||||||
|
throw new ParsingException("Could not extract playlist type from malformed url", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static JsonObject getInitialData(final String html) throws ParsingException {
|
public static JsonObject getInitialData(final String html) throws ParsingException {
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
|
@ -16,6 +16,7 @@ import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
|||||||
import org.schabi.newpipe.extractor.localization.Localization;
|
import org.schabi.newpipe.extractor.localization.Localization;
|
||||||
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
||||||
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
|
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
|
||||||
|
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
||||||
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
||||||
@ -241,4 +242,10 @@ public class YoutubeMixPlaylistExtractor extends PlaylistExtractor {
|
|||||||
private String getThumbnailUrlFromVideoId(final String videoId) {
|
private String getThumbnailUrlFromVideoId(final String videoId) {
|
||||||
return "https://i.ytimg.com/vi/" + videoId + "/hqdefault.jpg";
|
return "https://i.ytimg.com/vi/" + videoId + "/hqdefault.jpg";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public PlaylistInfo.PlaylistType getPlaylistType() throws ParsingException {
|
||||||
|
return extractPlaylistTypeFromPlaylistId(playlistData.getString("playlistId"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package org.schabi.newpipe.extractor.services.youtube.extractors;
|
package org.schabi.newpipe.extractor.services.youtube.extractors;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.extractPlaylistTypeFromPlaylistUrl;
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject;
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject;
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getThumbnailUrlFromInfoItem;
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getThumbnailUrlFromInfoItem;
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isYoutubeChannelMixId;
|
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isYoutubeGenreMixId;
|
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isYoutubeMusicMixId;
|
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||||
|
|
||||||
import com.grack.nanojson.JsonObject;
|
import com.grack.nanojson.JsonObject;
|
||||||
@ -13,9 +11,6 @@ import org.schabi.newpipe.extractor.ListExtractor;
|
|||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
||||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
|
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
|
||||||
import org.schabi.newpipe.extractor.utils.Utils;
|
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
@ -64,26 +59,6 @@ public class YoutubeMixPlaylistInfoItemExtractor implements PlaylistInfoItemExtr
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public PlaylistInfo.PlaylistType getPlaylistType() throws ParsingException {
|
public PlaylistInfo.PlaylistType getPlaylistType() throws ParsingException {
|
||||||
try {
|
return extractPlaylistTypeFromPlaylistUrl(getUrl());
|
||||||
final String url = getUrl();
|
|
||||||
final String mixPlaylistId = Utils.getQueryValue(Utils.stringToURL(url), "list");
|
|
||||||
if (isNullOrEmpty(mixPlaylistId)) {
|
|
||||||
throw new ParsingException("Mix playlist id was null or empty for url " + url);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isYoutubeMusicMixId(mixPlaylistId)) {
|
|
||||||
return PlaylistInfo.PlaylistType.MIX_MUSIC;
|
|
||||||
} else if (isYoutubeChannelMixId(mixPlaylistId)) {
|
|
||||||
return PlaylistInfo.PlaylistType.MIX_CHANNEL;
|
|
||||||
} else if (isYoutubeGenreMixId(mixPlaylistId)) {
|
|
||||||
return PlaylistInfo.PlaylistType.MIX_GENRE;
|
|
||||||
} else {
|
|
||||||
// either a normal mix based on a stream, or a "my mix" (still based on a stream)
|
|
||||||
// note: if YouTube introduces even more types of mixes, they will default to this
|
|
||||||
return PlaylistInfo.PlaylistType.MIX_STREAM;
|
|
||||||
}
|
|
||||||
} catch (final MalformedURLException e) {
|
|
||||||
throw new ParsingException("Could not obtain mix playlist id", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
|||||||
import org.schabi.newpipe.extractor.localization.Localization;
|
import org.schabi.newpipe.extractor.localization.Localization;
|
||||||
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
||||||
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
|
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
|
||||||
|
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
|
||||||
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
|
||||||
@ -329,4 +330,10 @@ public class YoutubePlaylistExtractor extends PlaylistExtractor {
|
|||||||
})
|
})
|
||||||
.forEachOrdered(collector::commit);
|
.forEachOrdered(collector::commit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public PlaylistInfo.PlaylistType getPlaylistType() throws ParsingException {
|
||||||
|
return extractPlaylistTypeFromPlaylistUrl(getUrl());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user