Skip to content

Commit 3a3ade2

Browse files
authored
Merge pull request #620 from TeamNewPipe/bandcamp-comments
Add Bandcamp comments (first page)
2 parents 284362f + 85a4270 commit 3a3ade2

6 files changed

Lines changed: 280 additions & 3 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
1717
import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor;
1818

19+
import java.util.Arrays;
1920
import java.util.Collections;
2021

2122
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO;
23+
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS;
2224
import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper.BASE_URL;
2325
import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.FEATURED_API_URL;
2426
import static org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampFeaturedExtractor.KIOSK_FEATURED;
@@ -28,7 +30,7 @@
2830
public class BandcampService extends StreamingService {
2931

3032
public BandcampService(final int id) {
31-
super(id, "Bandcamp", Collections.singletonList(AUDIO));
33+
super(id, "Bandcamp", Arrays.asList(AUDIO, COMMENTS));
3234
}
3335

3436
@Override
@@ -58,7 +60,7 @@ public SearchQueryHandlerFactory getSearchQHFactory() {
5860

5961
@Override
6062
public ListLinkHandlerFactory getCommentsLHFactory() {
61-
return null;
63+
return new BandcampCommentsLinkHandlerFactory();
6264
}
6365

6466
@Override
@@ -122,6 +124,6 @@ public StreamExtractor getStreamExtractor(final LinkHandler linkHandler) {
122124

123125
@Override
124126
public CommentsExtractor getCommentsExtractor(ListLinkHandler linkHandler) {
125-
return null;
127+
return new BandcampCommentsExtractor(this, linkHandler);
126128
}
127129
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.schabi.newpipe.extractor.services.bandcamp.extractors;
2+
3+
import org.jsoup.Jsoup;
4+
import org.jsoup.nodes.Document;
5+
import org.jsoup.nodes.Element;
6+
import org.jsoup.select.Elements;
7+
import org.schabi.newpipe.extractor.Page;
8+
import org.schabi.newpipe.extractor.StreamingService;
9+
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
10+
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
11+
import org.schabi.newpipe.extractor.comments.CommentsInfoItemsCollector;
12+
import org.schabi.newpipe.extractor.downloader.Downloader;
13+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
14+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
15+
16+
import javax.annotation.Nonnull;
17+
import java.io.IOException;
18+
19+
public class BandcampCommentsExtractor extends CommentsExtractor {
20+
21+
private Document document;
22+
23+
24+
public BandcampCommentsExtractor(StreamingService service, ListLinkHandler linkHandler) {
25+
super(service, linkHandler);
26+
}
27+
28+
@Override
29+
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
30+
String html = downloader.get(getLinkHandler().getUrl()).responseBody();
31+
document = Jsoup.parse(html);
32+
}
33+
34+
@Nonnull
35+
@Override
36+
public InfoItemsPage<CommentsInfoItem> getInitialPage() throws IOException, ExtractionException {
37+
38+
CommentsInfoItemsCollector collector = new CommentsInfoItemsCollector(getServiceId());
39+
40+
Elements writings = document.getElementsByClass("writing");
41+
42+
for (Element writing : writings) {
43+
collector.commit(new BandcampCommentsInfoItemExtractor(writing, getUrl()));
44+
}
45+
46+
return new InfoItemsPage<>(collector, null);
47+
}
48+
49+
@Override
50+
public InfoItemsPage<CommentsInfoItem> getPage(Page page) throws IOException, ExtractionException {
51+
return null;
52+
}
53+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package org.schabi.newpipe.extractor.services.bandcamp.extractors;
2+
3+
import org.jsoup.nodes.Element;
4+
import org.schabi.newpipe.extractor.comments.CommentsInfoItemExtractor;
5+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
6+
import org.schabi.newpipe.extractor.localization.DateWrapper;
7+
8+
import javax.annotation.Nullable;
9+
10+
public class BandcampCommentsInfoItemExtractor implements CommentsInfoItemExtractor {
11+
12+
private final Element writing;
13+
private final String url;
14+
15+
public BandcampCommentsInfoItemExtractor(Element writing, String url) {
16+
this.writing = writing;
17+
this.url = url;
18+
}
19+
20+
@Override
21+
public String getName() throws ParsingException {
22+
return writing.getElementsByClass("text").first().ownText();
23+
}
24+
25+
@Override
26+
public String getUrl() {
27+
return url;
28+
}
29+
30+
@Override
31+
public String getThumbnailUrl() throws ParsingException {
32+
return writing.getElementsByClass("thumb").attr("src");
33+
}
34+
35+
@Override
36+
public int getLikeCount() {
37+
return -1;
38+
}
39+
40+
@Override
41+
public String getCommentText() {
42+
return writing.getElementsByClass("text").first().ownText();
43+
}
44+
45+
@Override
46+
public String getTextualUploadDate() {
47+
return "";
48+
}
49+
50+
@Nullable
51+
@Override
52+
public DateWrapper getUploadDate() {
53+
return null;
54+
}
55+
56+
@Override
57+
public String getCommentId() {
58+
return "";
59+
}
60+
61+
@Override
62+
public String getUploaderUrl() {
63+
//return writing.getElementsByClass("name").attr("href");
64+
// Fan links cannot be opened
65+
return "";
66+
}
67+
68+
@Override
69+
public String getUploaderName() throws ParsingException {
70+
return writing.getElementsByClass("name").first().text();
71+
}
72+
73+
@Override
74+
public String getUploaderAvatarUrl() {
75+
return writing.getElementsByClass("thumb").attr("src");
76+
}
77+
78+
@Override
79+
public boolean isHeartedByUploader() {
80+
return false;
81+
}
82+
83+
@Override
84+
public boolean isPinned() {
85+
return false;
86+
}
87+
88+
@Override
89+
public boolean isUploaderVerified() throws ParsingException {
90+
return false;
91+
}
92+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.schabi.newpipe.extractor.services.bandcamp.linkHandler;
2+
3+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
4+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
5+
import org.schabi.newpipe.extractor.services.bandcamp.extractors.BandcampExtractorHelper;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Like in {@link BandcampStreamLinkHandlerFactory}, tracks have no meaningful IDs except for
11+
* their URLs
12+
*/
13+
public class BandcampCommentsLinkHandlerFactory extends ListLinkHandlerFactory {
14+
15+
@Override
16+
public String getId(String url) throws ParsingException {
17+
return url;
18+
}
19+
20+
@Override
21+
public boolean onAcceptUrl(String url) throws ParsingException {
22+
// Don't accept URLs that don't point to a track
23+
if (!url.toLowerCase().matches("https?://.+\\..+/(track|album)/.+")) return false;
24+
25+
// Test whether domain is supported
26+
return BandcampExtractorHelper.isSupportedDomain(url);
27+
}
28+
29+
@Override
30+
public String getUrl(String id, List<String> contentFilter, String sortFilter) throws ParsingException {
31+
return id;
32+
}
33+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.schabi.newpipe.extractor.services.bandcamp;
2+
3+
import org.junit.BeforeClass;
4+
import org.junit.Test;
5+
import org.schabi.newpipe.downloader.DownloaderTestImpl;
6+
import org.schabi.newpipe.extractor.ListExtractor;
7+
import org.schabi.newpipe.extractor.NewPipe;
8+
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
9+
import org.schabi.newpipe.extractor.comments.CommentsInfoItem;
10+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
11+
import org.schabi.newpipe.extractor.services.DefaultTests;
12+
import org.schabi.newpipe.extractor.utils.Utils;
13+
14+
import java.io.IOException;
15+
16+
import static org.junit.Assert.*;
17+
import static org.junit.Assert.assertFalse;
18+
import static org.schabi.newpipe.extractor.ServiceList.Bandcamp;
19+
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
20+
21+
public class BandcampCommentsExtractorTest {
22+
23+
private static CommentsExtractor extractor;
24+
25+
@BeforeClass
26+
public static void setUp() throws ExtractionException, IOException {
27+
NewPipe.init(DownloaderTestImpl.getInstance());
28+
extractor = Bandcamp.getCommentsExtractor("https://floatingpoints.bandcamp.com/album/promises");
29+
extractor.fetchPage();
30+
}
31+
32+
@Test
33+
public void hasComments() throws IOException, ExtractionException {
34+
assertTrue(extractor.getInitialPage().getItems().size() >= 3);
35+
}
36+
37+
@Test
38+
public void testGetCommentsAllData() throws IOException, ExtractionException {
39+
ListExtractor.InfoItemsPage<CommentsInfoItem> comments = extractor.getInitialPage();
40+
41+
DefaultTests.defaultTestListOfItems(Bandcamp, comments.getItems(), comments.getErrors());
42+
for (CommentsInfoItem c : comments.getItems()) {
43+
assertFalse(Utils.isBlank(c.getUploaderName()));
44+
assertFalse(Utils.isBlank(c.getUploaderAvatarUrl()));
45+
assertFalse(Utils.isBlank(c.getCommentText()));
46+
assertFalse(Utils.isBlank(c.getName()));
47+
assertFalse(Utils.isBlank(c.getThumbnailUrl()));
48+
assertFalse(Utils.isBlank(c.getUrl()));
49+
assertEquals(-1, c.getLikeCount());
50+
}
51+
}
52+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Created by Fynn Godau 2019, licensed GNU GPL version 3 or later
2+
3+
package org.schabi.newpipe.extractor.services.bandcamp;
4+
5+
import org.junit.BeforeClass;
6+
import org.junit.Test;
7+
import org.schabi.newpipe.downloader.DownloaderTestImpl;
8+
import org.schabi.newpipe.extractor.NewPipe;
9+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
10+
import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampCommentsLinkHandlerFactory;
11+
import org.schabi.newpipe.extractor.services.bandcamp.linkHandler.BandcampStreamLinkHandlerFactory;
12+
13+
import static org.junit.Assert.*;
14+
15+
/**
16+
* Test for {@link BandcampCommentsLinkHandlerFactory}
17+
*/
18+
public class BandcampCommentsLinkHandlerFactoryTest {
19+
20+
private static BandcampCommentsLinkHandlerFactory linkHandler;
21+
22+
@BeforeClass
23+
public static void setUp() {
24+
linkHandler = new BandcampCommentsLinkHandlerFactory();
25+
NewPipe.init(DownloaderTestImpl.getInstance());
26+
}
27+
28+
@Test
29+
public void testAcceptUrl() throws ParsingException {
30+
assertFalse(linkHandler.acceptUrl("http://interovgm.com/releases/"));
31+
assertFalse(linkHandler.acceptUrl("https://interovgm.com/releases"));
32+
assertFalse(linkHandler.acceptUrl("http://zachbenson.bandcamp.com"));
33+
assertFalse(linkHandler.acceptUrl("https://bandcamp.com"));
34+
assertFalse(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/"));
35+
assertFalse(linkHandler.acceptUrl("https://example.com/track/sampletrack"));
36+
assertFalse(linkHandler.acceptUrl("http://bandcamP.com/?show=38"));
37+
38+
assertTrue(linkHandler.acceptUrl("https://powertothequeerkids.bandcamp.com/album/power-to-the-queer-kids"));
39+
assertTrue(linkHandler.acceptUrl("https://zachbenson.bandcamp.com/track/kitchen"));
40+
assertTrue(linkHandler.acceptUrl("http://ZachBenson.Bandcamp.COM/Track/U-I-Tonite/"));
41+
assertTrue(linkHandler.acceptUrl("https://interovgm.bandcamp.com/track/title"));
42+
assertTrue(linkHandler.acceptUrl("https://goodgoodblood-tl.bandcamp.com/track/when-it-all-wakes-up"));
43+
assertTrue(linkHandler.acceptUrl("https://lobstertheremin.com/track/unfinished"));
44+
}
45+
}

0 commit comments

Comments
 (0)