diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java index 0f4cbbc24..2c1e0dac1 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItem.java @@ -22,12 +22,15 @@ public class CommentsInfoItem extends InfoItem { private boolean heartedByUploader; private boolean pinned; private int streamPosition; + private int replyCount; @Nullable private Page replies; public static final int NO_LIKE_COUNT = -1; public static final int NO_STREAM_POSITION = -1; + public static final int UNKNOWN_REPLY_COUNT = -1; + public CommentsInfoItem(final int serviceId, final String url, final String name) { super(InfoType.COMMENT, serviceId, url, name); } @@ -91,7 +94,7 @@ public class CommentsInfoItem extends InfoItem { /** * @return the comment's like count - * or {@link CommentsInfoItem#NO_LIKE_COUNT} if it is unavailable + * or {@link CommentsInfoItem#NO_LIKE_COUNT} if it is unavailable */ public int getLikeCount() { return likeCount; @@ -140,12 +143,21 @@ public class CommentsInfoItem extends InfoItem { /** * Get the playback position of the stream to which this comment belongs. * This is not supported by all services. + * * @return the playback position in seconds or {@link #NO_STREAM_POSITION} if not available */ public int getStreamPosition() { return streamPosition; } + public void setReplyCount(final int replyCount) { + this.replyCount = replyCount; + } + + public int getReplyCount() { + return replyCount; + } + public void setReplies(@Nullable final Page replies) { this.replies = replies; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java index 900167cf7..128235fc1 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemExtractor.java @@ -16,14 +16,14 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor { * or {@link CommentsInfoItem#NO_LIKE_COUNT} if it is unavailable. * *
- * + *

* NOTE: Currently only implemented for YT {@link * YoutubeCommentsInfoItemExtractor#getLikeCount()} * with limitations (only approximate like count is returned) * - * @see StreamExtractor#getLikeCount() * @return the comment's like count * or {@link CommentsInfoItem#NO_LIKE_COUNT} if it is unavailable + * @see StreamExtractor#getLikeCount() */ default int getLikeCount() throws ParsingException { return CommentsInfoItem.NO_LIKE_COUNT; @@ -103,14 +103,26 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor { /** * The playback position of the stream to which this comment belongs. + * * @see CommentsInfoItem#getStreamPosition() */ default int getStreamPosition() throws ParsingException { return CommentsInfoItem.NO_STREAM_POSITION; } + /** + * The count of comment replies. + * + * @return the count of the replies + * or {@link CommentsInfoItem#UNKNOWN_REPLY_COUNT} if replies are not supported + */ + default int getReplyCount() throws ParsingException { + return CommentsInfoItem.UNKNOWN_REPLY_COUNT; + } + /** * The continuation page which is used to get comment replies from. + * * @return the continuation Page for the replies, or null if replies are not supported */ @Nullable diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemsCollector.java b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemsCollector.java index 0a5388d0f..3afeb0455 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemsCollector.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/comments/CommentsInfoItemsCollector.java @@ -89,6 +89,12 @@ public final class CommentsInfoItemsCollector addError(e); } + try { + resultItem.setReplyCount(extractor.getReplyCount()); + } catch (final Exception e) { + addError(e); + } + try { resultItem.setReplies(extractor.getReplies()); } catch (final Exception e) { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java index 5f8415ec1..d24ef5bd9 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeCommentsInfoItemExtractor.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.extractor.services.youtube.extractors; +import static org.schabi.newpipe.extractor.comments.CommentsInfoItem.UNKNOWN_REPLY_COUNT; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject; import com.grack.nanojson.JsonArray; @@ -248,6 +249,15 @@ public class YoutubeCommentsInfoItemExtractor implements CommentsInfoItemExtract } } + @Override + public int getReplyCount() throws ParsingException { + final JsonObject commentRenderer = getCommentRenderer(); + if (commentRenderer.has("replyCount")) { + return commentRenderer.getInt("replyCount"); + } + return UNKNOWN_REPLY_COUNT; + } + @Override public Page getReplies() throws ParsingException { try { diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeCommentsExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeCommentsExtractorTest.java index b0bb64474..24c34b1d6 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeCommentsExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeCommentsExtractorTest.java @@ -2,9 +2,12 @@ package org.schabi.newpipe.extractor.services.youtube; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertGreater; import static org.schabi.newpipe.extractor.ServiceList.YouTube; +import static org.schabi.newpipe.extractor.comments.CommentsInfoItem.UNKNOWN_REPLY_COUNT; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -328,5 +331,17 @@ public class YoutubeCommentsExtractorTest { assertEquals("First", replies.getItems().get(0).getCommentText(), "First reply comment did not match"); } + + @Test + public void testGetCommentsReplyCount() throws IOException, ExtractionException { + final InfoItemsPage comments = extractor.getInitialPage(); + + DefaultTests.defaultTestListOfItems(YouTube, comments.getItems(), comments.getErrors()); + + final CommentsInfoItem firstComment = comments.getItems().get(0); + + assertNotEquals(UNKNOWN_REPLY_COUNT, firstComment.getReplyCount(), "Could not get the reply count of the first comment"); + assertGreater(300, firstComment.getReplyCount()); + } } }