Skip to content

Commit b40ccb5

Browse files
authored
Merge pull request #307 from B0pol/playlists_peertube
[PeerTube] playlist support
2 parents 3a858e6 + 7cae95b commit b40ccb5

15 files changed

Lines changed: 266 additions & 198 deletions

extractor/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
77
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
88

9+
import javax.annotation.Nonnull;
10+
911
public abstract class PlaylistExtractor extends ListExtractor<StreamInfoItem> {
1012

1113
public PlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) {
@@ -20,4 +22,9 @@ public PlaylistExtractor(StreamingService service, ListLinkHandler linkHandler)
2022
public abstract String getUploaderAvatarUrl() throws ParsingException;
2123

2224
public abstract long getStreamCount() throws ParsingException;
25+
26+
@Nonnull public abstract String getSubChannelName() throws ParsingException;
27+
@Nonnull public abstract String getSubChannelUrl() throws ParsingException;
28+
@Nonnull public abstract String getSubChannelAvatarUrl() throws ParsingException;
29+
2330
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.jsoup.helper.StringUtil;
55
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
66
import org.schabi.newpipe.extractor.exceptions.ParsingException;
7+
import org.schabi.newpipe.extractor.utils.Parser;
78

89
import java.text.ParseException;
910
import java.text.SimpleDateFormat;
@@ -13,6 +14,11 @@
1314

1415
public class PeertubeParsingHelper {
1516

17+
public static final String START_KEY = "start";
18+
public static final String COUNT_KEY = "count";
19+
public static final int ITEMS_PER_PAGE = 12;
20+
public static final String START_PATTERN = "start=(\\d*)";
21+
1622
private PeertubeParsingHelper() {
1723
}
1824

@@ -38,4 +44,26 @@ public static Calendar parseDateFrom(String textualUploadDate) throws ParsingExc
3844
return uploadDate;
3945
}
4046

47+
public static String getNextPageUrl(String prevPageUrl, long total) {
48+
String prevStart;
49+
try {
50+
prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl);
51+
} catch (Parser.RegexException e) {
52+
return "";
53+
}
54+
if (StringUtil.isBlank(prevStart)) return "";
55+
long nextStart = 0;
56+
try {
57+
nextStart = Long.parseLong(prevStart) + ITEMS_PER_PAGE;
58+
} catch (NumberFormatException e) {
59+
return "";
60+
}
61+
62+
if (nextStart >= total) {
63+
return "";
64+
} else {
65+
return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + nextStart);
66+
}
67+
}
68+
4169
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ public ListLinkHandlerFactory getChannelLHFactory() {
4444

4545
@Override
4646
public ListLinkHandlerFactory getPlaylistLHFactory() {
47-
// TODO Auto-generated method stub
48-
return null;
47+
return PeertubePlaylistLinkHandlerFactory.getInstance();
4948
}
5049

5150
@Override
@@ -70,7 +69,6 @@ public SuggestionExtractor getSuggestionExtractor() {
7069

7170
@Override
7271
public SubscriptionExtractor getSubscriptionExtractor() {
73-
// TODO Auto-generated method stub
7472
return null;
7573
}
7674

@@ -88,8 +86,7 @@ public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler)
8886
@Override
8987
public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler)
9088
throws ExtractionException {
91-
// TODO Auto-generated method stub
92-
return null;
89+
return new PeertubePlaylistExtractor(this, linkHandler);
9390
}
9491

9592
@Override

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

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,12 @@
1616
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
1717
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
1818
import org.schabi.newpipe.extractor.utils.JsonUtils;
19-
import org.schabi.newpipe.extractor.utils.Parser;
20-
import org.schabi.newpipe.extractor.utils.Parser.RegexException;
2119

2220
import java.io.IOException;
2321

24-
public class PeertubeAccountExtractor extends ChannelExtractor {
22+
import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*;
2523

26-
private static final String START_KEY = "start";
27-
private static final String COUNT_KEY = "count";
28-
private static final int ITEMS_PER_PAGE = 12;
29-
private static final String START_PATTERN = "start=(\\d*)";
24+
public class PeertubeAccountExtractor extends ChannelExtractor {
3025

3126
private InfoItemsPage<StreamInfoItem> initPage;
3227
private long total;
@@ -135,36 +130,12 @@ public InfoItemsPage<StreamInfoItem> getPage(String pageUrl) throws IOException,
135130
StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
136131
if (json != null) {
137132
PeertubeParsingHelper.validate(json);
138-
Number number = JsonUtils.getNumber(json, "total");
139-
if (number != null) this.total = number.longValue();
133+
total = JsonUtils.getNumber(json, "total").longValue();
140134
collectStreamsFrom(collector, json, pageUrl);
141135
} else {
142136
throw new ExtractionException("Unable to get PeerTube kiosk info");
143137
}
144-
return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl));
145-
}
146-
147-
148-
private String getNextPageUrl(String prevPageUrl) {
149-
String prevStart;
150-
try {
151-
prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl);
152-
} catch (RegexException e) {
153-
return "";
154-
}
155-
if (StringUtil.isBlank(prevStart)) return "";
156-
long nextStart = 0;
157-
try {
158-
nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE;
159-
} catch (NumberFormatException e) {
160-
return "";
161-
}
162-
163-
if (nextStart >= total) {
164-
return "";
165-
} else {
166-
return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart));
167-
}
138+
return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total));
168139
}
169140

170141
@Override

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

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,9 @@
2121

2222
import java.io.IOException;
2323

24-
public class PeertubeChannelExtractor extends ChannelExtractor {
24+
import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*;
2525

26-
private static final String START_KEY = "start";
27-
private static final String COUNT_KEY = "count";
28-
private static final int ITEMS_PER_PAGE = 12;
29-
private static final String START_PATTERN = "start=(\\d*)";
26+
public class PeertubeChannelExtractor extends ChannelExtractor {
3027

3128
private InfoItemsPage<StreamInfoItem> initPage;
3229
private long total;
@@ -141,36 +138,12 @@ public InfoItemsPage<StreamInfoItem> getPage(String pageUrl) throws IOException,
141138
StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
142139
if (json != null) {
143140
PeertubeParsingHelper.validate(json);
144-
Number number = JsonUtils.getNumber(json, "total");
145-
if (number != null) this.total = number.longValue();
141+
this.total = JsonUtils.getNumber(json, "total").longValue();
146142
collectStreamsFrom(collector, json, pageUrl);
147143
} else {
148144
throw new ExtractionException("Unable to get PeerTube kiosk info");
149145
}
150-
return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl));
151-
}
152-
153-
154-
private String getNextPageUrl(String prevPageUrl) {
155-
String prevStart;
156-
try {
157-
prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl);
158-
} catch (RegexException e) {
159-
return "";
160-
}
161-
if (StringUtil.isBlank(prevStart)) return "";
162-
long nextStart = 0;
163-
try {
164-
nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE;
165-
} catch (NumberFormatException e) {
166-
return "";
167-
}
168-
169-
if (nextStart >= total) {
170-
return "";
171-
} else {
172-
return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart));
173-
}
146+
return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total));
174147
}
175148

176149
@Override
@@ -182,8 +155,7 @@ public void onFetchPage(Downloader downloader) throws IOException, ExtractionExc
182155
throw new ExtractionException("Unable to extract PeerTube channel data");
183156
}
184157

185-
String pageUrl = getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE;
186-
this.initPage = getPage(pageUrl);
158+
this.initPage = getPage(getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE);
187159
}
188160

189161
private void setInitialData(String responseBody) throws ExtractionException {

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

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,16 @@
1313
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
1414
import org.schabi.newpipe.extractor.exceptions.ParsingException;
1515
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
16+
import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper;
1617
import org.schabi.newpipe.extractor.utils.JsonUtils;
1718
import org.schabi.newpipe.extractor.utils.Parser;
1819
import org.schabi.newpipe.extractor.utils.Parser.RegexException;
1920

2021
import java.io.IOException;
2122

22-
public class PeertubeCommentsExtractor extends CommentsExtractor {
23+
import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*;
2324

24-
private static final String START_KEY = "start";
25-
private static final String COUNT_KEY = "count";
26-
private static final int ITEMS_PER_PAGE = 12;
27-
private static final String START_PATTERN = "start=(\\d*)";
25+
public class PeertubeCommentsExtractor extends CommentsExtractor {
2826

2927
private InfoItemsPage<CommentsInfoItem> initPage;
3028
private long total;
@@ -83,35 +81,12 @@ public InfoItemsPage<CommentsInfoItem> getPage(String pageUrl) throws IOExceptio
8381
} else {
8482
throw new ExtractionException("Unable to get peertube comments info");
8583
}
86-
return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl));
84+
return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total));
8785
}
8886

8987
@Override
9088
public void onFetchPage(Downloader downloader) throws IOException, ExtractionException {
91-
String pageUrl = getUrl() + "?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE;
92-
this.initPage = getPage(pageUrl);
93-
}
94-
95-
private String getNextPageUrl(String prevPageUrl) {
96-
String prevStart;
97-
try {
98-
prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl);
99-
} catch (RegexException e) {
100-
return "";
101-
}
102-
if (StringUtil.isBlank(prevStart)) return "";
103-
long nextStart = 0;
104-
try {
105-
nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE;
106-
} catch (NumberFormatException e) {
107-
return "";
108-
}
109-
110-
if (nextStart >= total) {
111-
return "";
112-
} else {
113-
return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart));
114-
}
89+
this.initPage = getPage(getUrl() + "?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE);
11590
}
11691

11792
}

0 commit comments

Comments
 (0)