Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -374,22 +374,47 @@ private Page getNextPageFrom(final JsonArray contents)

final JsonObject lastElement = contents.getObject(contents.size() - 1);
if (lastElement.has("continuationItemRenderer")) {
final String continuation = lastElement
final JsonObject continuationEndpoint = lastElement
.getObject("continuationItemRenderer")
.getObject("continuationEndpoint")
.getObject("continuationCommand")
.getObject("continuationEndpoint");

final JsonObject continuationObject;
if (continuationEndpoint.has("commandExecutorCommand")) {
// This structure is only used at the time this code is written in initial playlist
// responses. continuationItemRenderer objects return multiple commands: one
// containing the continuation we need and one a playlistVotingRefreshPopupCommand
continuationObject = continuationEndpoint.getObject("commandExecutorCommand")
.getArray("commands")
.stream()
.filter(JsonObject.class::isInstance)
.map(JsonObject.class::cast)
.filter(command -> command.has("continuationCommand"))
.findFirst()
.orElse(new JsonObject());
} else {
// At the time this code is written, this "classic" continuation structure is only
// returned in browse responses of continuation requests
continuationObject = continuationEndpoint;
}

final String continuation = continuationObject.getObject("continuationCommand")
.getString("token");

if (isNullOrEmpty(continuation)) {
// Invalid continuation or no continuation found
return null;
}

final byte[] body = JsonWriter.string(prepareDesktopJsonBuilder(
getExtractorLocalization(), getExtractorContentCountry())
.value("continuation", continuation)
.done())
.getBytes(StandardCharsets.UTF_8);

return new Page(YOUTUBEI_V1_URL + "browse?" + DISABLE_PRETTY_PRINT_PARAMETER, body);
} else {
return null;
}

return null;
}

private void collectStreamsFrom(@Nonnull final StreamInfoItemsCollector collector,
Expand Down
Loading