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 06ce84c447..965a55753a 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 @@ -17,6 +17,7 @@ public class CommentsInfoItem extends InfoItem { private DateWrapper uploadDate; private int likeCount; private boolean heartedByUploader; + private boolean pinned; public CommentsInfoItem(int serviceId, String url, String name) { super(InfoType.COMMENT, serviceId, url, name); @@ -94,4 +95,12 @@ public void setHeartedByUploader(boolean isHeartedByUploader) { public boolean getHeartedByUploader() { return this.heartedByUploader; } + + public boolean getPinned() { + return pinned; + } + + public void setPinned(boolean pinned) { + this.pinned = pinned; + } } 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 ff56204f28..ae93ac8927 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 @@ -11,6 +11,7 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor { /** * Return the like count of the comment, or -1 if it's unavailable + * * @see StreamExtractor#getLikeCount() */ int getLikeCount() throws ParsingException; @@ -22,12 +23,14 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor { /** * The upload date given by the service, unmodified + * * @see StreamExtractor#getTextualUploadDate() */ String getTextualUploadDate() throws ParsingException; /** * The upload date wrapped with DateWrapper class + * * @see StreamExtractor#getUploadDate() */ @Nullable @@ -45,4 +48,9 @@ public interface CommentsInfoItemExtractor extends InfoItemExtractor { * Whether the comment has been hearted by the uploader */ boolean getHeartedByUploader() throws ParsingException; + + /** + * Whether the comment is pinned + */ + boolean getPinned() throws ParsingException; } 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 3323f00b8c..c84c2fa7f1 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 @@ -76,6 +76,12 @@ public CommentsInfoItem extract(CommentsInfoItemExtractor extractor) throws Pars addError(e); } + try { + resultItem.setPinned(extractor.getPinned()); + } catch (Exception e) { + addError(e); + } + return resultItem; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsInfoItemExtractor.java index 95b304dc45..d73aeaf829 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsInfoItemExtractor.java @@ -93,6 +93,11 @@ public boolean getHeartedByUploader() throws ParsingException { return false; } + @Override + public boolean getPinned() throws ParsingException { + return false; + } + @Override public String getUploaderName() throws ParsingException { return JsonUtils.getString(item, "account.name") + "@" + JsonUtils.getString(item, "account.host"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java index b164ca45af..bbeb078f0f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudCommentsInfoItemExtractor.java @@ -44,6 +44,11 @@ public boolean getHeartedByUploader() throws ParsingException { return false; } + @Override + public boolean getPinned() throws ParsingException { + return false; + } + @Override public String getUploaderUrl() { return json.getObject("user").getString("permalink_url"); 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 74791e4ba6..1849f52ab6 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 @@ -120,6 +120,11 @@ public boolean getHeartedByUploader() throws ParsingException { return json.has("creatorHeart"); } + @Override + public boolean getPinned() { + return json.has("pinnedCommentBadge"); + } + @Override public String getUploaderName() 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 3ad16c5cfa..48c6840254 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 @@ -189,4 +189,40 @@ public void testGetCommentsAllData() throws IOException, ExtractionException { } } + + public static class Pinned { + private final static String url = "https://www.youtube.com/watch?v=bjFtFMilb34"; + private static YoutubeCommentsExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (YoutubeCommentsExtractor) YouTube + .getCommentsExtractor(url); + extractor.fetchPage(); + } + + @Test + public void testGetCommentsAllData() throws IOException, ExtractionException { + final InfoItemsPage comments = extractor.getInitialPage(); + + DefaultTests.defaultTestListOfItems(YouTube, comments.getItems(), comments.getErrors()); + + for (CommentsInfoItem c : comments.getItems()) { + assertFalse(Utils.isBlank(c.getUploaderUrl())); + assertFalse(Utils.isBlank(c.getUploaderName())); + assertFalse(Utils.isBlank(c.getUploaderAvatarUrl())); + assertFalse(Utils.isBlank(c.getCommentId())); + assertFalse(Utils.isBlank(c.getName())); + assertFalse(Utils.isBlank(c.getTextualUploadDate())); + assertNotNull(c.getUploadDate()); + assertFalse(Utils.isBlank(c.getThumbnailUrl())); + assertFalse(Utils.isBlank(c.getUrl())); + assertFalse(c.getLikeCount() < 0); + assertFalse(Utils.isBlank(c.getCommentText())); + } + + assertTrue("First comment isn't pinned", comments.getItems().get(0).getPinned()); + } + } }