Skip to content

Commit d4f83a1

Browse files
authored
Merge pull request #575 from TiA4f8R/fix-peertube-test
Fix Peertube account subscribers extraction
2 parents 12835bf + ae28331 commit d4f83a1

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeAccountExtractor.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.schabi.newpipe.extractor.services.peertube.extractors;
22

3+
import com.grack.nanojson.JsonArray;
34
import com.grack.nanojson.JsonObject;
45
import com.grack.nanojson.JsonParser;
56
import com.grack.nanojson.JsonParserException;
@@ -10,6 +11,7 @@
1011
import org.schabi.newpipe.extractor.downloader.Response;
1112
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
1213
import org.schabi.newpipe.extractor.exceptions.ParsingException;
14+
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
1315
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
1416
import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper;
1517
import org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeChannelLinkHandlerFactory;
@@ -27,6 +29,7 @@
2729
public class PeertubeAccountExtractor extends ChannelExtractor {
2830
private JsonObject json;
2931
private final String baseUrl;
32+
private static final String ACCOUNTS = "accounts/";
3033

3134
public PeertubeAccountExtractor(final StreamingService service, final ListLinkHandler linkHandler) throws ParsingException {
3235
super(service, linkHandler);
@@ -55,8 +58,31 @@ public String getFeedUrl() throws ParsingException {
5558
}
5659

5760
@Override
58-
public long getSubscriberCount() {
59-
return json.getLong("followersCount");
61+
public long getSubscriberCount() throws ParsingException {
62+
// The subscriber count cannot be retrieved directly. It needs to be calculated.
63+
// An accounts subscriber count is the number of the channel owner's subscriptions
64+
// plus the sum of all sub channels subscriptions.
65+
long subscribersCount = json.getLong("followersCount");
66+
String accountVideoChannelUrl = baseUrl + PeertubeChannelLinkHandlerFactory.API_ENDPOINT;
67+
if (getId().contains(ACCOUNTS)) {
68+
accountVideoChannelUrl += getId();
69+
} else {
70+
accountVideoChannelUrl += ACCOUNTS + getId();
71+
}
72+
accountVideoChannelUrl += "/video-channels";
73+
74+
try {
75+
final String responseBody = getDownloader().get(accountVideoChannelUrl).responseBody();
76+
final JsonObject jsonResponse = JsonParser.object().from(responseBody);
77+
final JsonArray videoChannels = jsonResponse.getArray("data");
78+
for (final Object videoChannel : videoChannels) {
79+
final JsonObject videoChannelJsonObject = (JsonObject) videoChannel;
80+
subscribersCount += videoChannelJsonObject.getInt("followersCount");
81+
}
82+
} catch (final IOException | JsonParserException | ReCaptchaException ignored) {
83+
// something went wrong during video channels extraction, only return subscribers of ownerAccount
84+
}
85+
return subscribersCount;
6086
}
6187

6288
@Override
@@ -130,10 +156,10 @@ public InfoItemsPage<StreamInfoItem> getPage(final Page page)
130156
public void onFetchPage(@Nonnull final Downloader downloader)
131157
throws IOException, ExtractionException {
132158
String accountUrl = baseUrl + PeertubeChannelLinkHandlerFactory.API_ENDPOINT;
133-
if (getId().contains("accounts/")) {
159+
if (getId().contains(ACCOUNTS)) {
134160
accountUrl += getId();
135161
} else {
136-
accountUrl += "accounts/" + getId();
162+
accountUrl += ACCOUNTS + getId();
137163
}
138164

139165
final Response response = downloader.get(accountUrl);

extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeAccountExtractorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void testFeedUrl() throws ParsingException {
102102

103103
@Test
104104
public void testSubscriberCount() throws ParsingException {
105-
assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 500);
105+
assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 750);
106106
}
107107

108108
@Override

0 commit comments

Comments
 (0)