Skip to content

Commit dea6d8c

Browse files
committed
[PeerTube] Support searching for playlists
1 parent 95cc6ae commit dea6d8c

6 files changed

Lines changed: 101 additions & 8 deletions

File tree

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import com.grack.nanojson.JsonArray;
44
import com.grack.nanojson.JsonObject;
5+
6+
import org.schabi.newpipe.extractor.InfoItemExtractor;
57
import org.schabi.newpipe.extractor.InfoItemsCollector;
68
import org.schabi.newpipe.extractor.Page;
79
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
810
import org.schabi.newpipe.extractor.exceptions.ParsingException;
11+
import org.schabi.newpipe.extractor.services.peertube.extractors.PeertubePlaylistInfoItemExtractor;
912
import org.schabi.newpipe.extractor.services.peertube.extractors.PeertubeSepiaStreamInfoItemExtractor;
1013
import org.schabi.newpipe.extractor.services.peertube.extractors.PeertubeStreamInfoItemExtractor;
1114
import org.schabi.newpipe.extractor.utils.JsonUtils;
@@ -101,12 +104,18 @@ public static void collectStreamsFrom(final InfoItemsCollector collector,
101104
if (item.has("video")) {
102105
item = item.getObject("video");
103106
}
107+
final boolean isPlaylistInfoItem = item.has("videosLength");
104108

105-
final PeertubeStreamInfoItemExtractor extractor;
109+
final InfoItemExtractor extractor;
106110
if (sepia) {
107111
extractor = new PeertubeSepiaStreamInfoItemExtractor(item, baseUrl);
108112
} else {
109-
extractor = new PeertubeStreamInfoItemExtractor(item, baseUrl);
113+
if (isPlaylistInfoItem) {
114+
extractor = new PeertubePlaylistInfoItemExtractor(item, baseUrl);
115+
} else {
116+
extractor = new PeertubeStreamInfoItemExtractor(item, baseUrl);
117+
118+
}
110119
}
111120
collector.commit(extractor);
112121
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.schabi.newpipe.extractor.services.peertube.extractors;
2+
3+
import com.grack.nanojson.JsonObject;
4+
5+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
6+
import org.schabi.newpipe.extractor.playlist.PlaylistInfoItemExtractor;
7+
8+
import javax.annotation.Nonnull;
9+
10+
public class PeertubePlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
11+
12+
final JsonObject item;
13+
final JsonObject uploader;
14+
final String baseUrl;
15+
16+
public PeertubePlaylistInfoItemExtractor(@Nonnull final JsonObject item,
17+
@Nonnull final String baseUrl) {
18+
this.item = item;
19+
this.uploader = item.getObject("uploader");
20+
this.baseUrl = baseUrl;
21+
}
22+
23+
@Override
24+
public String getName() throws ParsingException {
25+
return item.getString("displayName");
26+
}
27+
28+
@Override
29+
public String getUrl() throws ParsingException {
30+
return item.getString("url");
31+
}
32+
33+
@Override
34+
public String getThumbnailUrl() throws ParsingException {
35+
return baseUrl + item.getString("thumbnailPath");
36+
}
37+
38+
@Override
39+
public String getUploaderName() throws ParsingException {
40+
return uploader.getString("displayName");
41+
}
42+
43+
@Override
44+
public String getUploaderUrl() throws ParsingException {
45+
return uploader.getString("url");
46+
}
47+
48+
@Override
49+
public boolean isUploaderVerified() throws ParsingException {
50+
return false;
51+
}
52+
53+
@Override
54+
public long getStreamCount() throws ParsingException {
55+
return item.getInt("videosLength");
56+
}
57+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ public String getSupportInfo() {
329329
@Nonnull
330330
private String getRelatedItemsUrl(@Nonnull final List<String> tags)
331331
throws UnsupportedEncodingException {
332-
final String url = baseUrl + PeertubeSearchQueryHandlerFactory.SEARCH_ENDPOINT;
332+
final String url = baseUrl + PeertubeSearchQueryHandlerFactory.SEARCH_ENDPOINT_VIDEOS;
333333
final StringBuilder params = new StringBuilder();
334334
params.append("start=0&count=8&sort=-createdAt");
335335
for (final String tag : tags) {

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubePlaylistLinkHandlerFactory.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public final class PeertubePlaylistLinkHandlerFactory extends ListLinkHandlerFac
1313
private static final PeertubePlaylistLinkHandlerFactory INSTANCE
1414
= new PeertubePlaylistLinkHandlerFactory();
1515
private static final String ID_PATTERN = "(/videos/watch/playlist/|/w/p/)([^/?&#]*)";
16+
private static final String API_ID_PATTERN = "/video-playlists/([^/?&#]*)";
1617

1718
private PeertubePlaylistLinkHandlerFactory() {
1819
}
@@ -38,7 +39,12 @@ public String getUrl(final String id,
3839

3940
@Override
4041
public String getId(final String url) throws ParsingException {
41-
return Parser.matchGroup(ID_PATTERN, url, 2);
42+
try {
43+
return Parser.matchGroup(ID_PATTERN, url, 2);
44+
} catch (final ParsingException ignored) {
45+
// might also be an API url, no reason to throw an exception here
46+
}
47+
return Parser.matchGroup1(API_ID_PATTERN, url);
4248
}
4349

4450
@Override

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeSearchQueryHandlerFactory.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ public final class PeertubeSearchQueryHandlerFactory extends SearchQueryHandlerF
1212

1313
public static final String VIDEOS = "videos";
1414
public static final String SEPIA_VIDEOS = "sepia_videos"; // sepia is the global index
15+
public static final String PLAYLISTS = "playlists";
1516
public static final String SEPIA_BASE_URL = "https://sepiasearch.org";
16-
public static final String SEARCH_ENDPOINT = "/api/v1/search/videos";
17+
public static final String SEARCH_ENDPOINT_PLAYLISTS = "/api/v1/search/video-playlists";
18+
public static final String SEARCH_ENDPOINT_VIDEOS = "/api/v1/search/videos";
1719

1820
private PeertubeSearchQueryHandlerFactory() {
1921
}
@@ -41,7 +43,15 @@ public String getUrl(final String searchString,
4143
final String sortFilter,
4244
final String baseUrl) throws ParsingException {
4345
try {
44-
return baseUrl + SEARCH_ENDPOINT + "?search=" + Utils.encodeUrlUtf8(searchString);
46+
final String endpoint;
47+
if (contentFilters.isEmpty()
48+
|| contentFilters.get(0).equals(VIDEOS)
49+
|| contentFilters.get(0).equals(SEPIA_VIDEOS)) {
50+
endpoint = SEARCH_ENDPOINT_VIDEOS;
51+
} else {
52+
endpoint = SEARCH_ENDPOINT_PLAYLISTS;
53+
}
54+
return baseUrl + endpoint + "?search=" + Utils.encodeUrlUtf8(searchString);
4555
} catch (final UnsupportedEncodingException e) {
4656
throw new ParsingException("Could not encode query", e);
4757
}
@@ -51,7 +61,8 @@ public String getUrl(final String searchString,
5161
public String[] getAvailableContentFilter() {
5262
return new String[]{
5363
VIDEOS,
54-
SEPIA_VIDEOS
64+
PLAYLISTS,
65+
SEPIA_VIDEOS,
5566
};
5667
}
5768
}

extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/search/PeertubeSearchQHTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,23 @@ public static void setUpClass() throws Exception {
1818
}
1919

2020
@Test
21-
public void testRegularValues() throws Exception {
21+
void testVideoSearch() throws Exception {
2222
assertEquals("https://peertube.mastodon.host/api/v1/search/videos?search=asdf", PeerTube.getSearchQHFactory().fromQuery("asdf").getUrl());
2323
assertEquals("https://peertube.mastodon.host/api/v1/search/videos?search=hans", PeerTube.getSearchQHFactory().fromQuery("hans").getUrl());
2424
assertEquals("https://peertube.mastodon.host/api/v1/search/videos?search=Poifj%26jaijf", PeerTube.getSearchQHFactory().fromQuery("Poifj&jaijf").getUrl());
2525
assertEquals("https://peertube.mastodon.host/api/v1/search/videos?search=G%C3%BCl%C3%BCm", PeerTube.getSearchQHFactory().fromQuery("Gülüm").getUrl());
2626
assertEquals("https://peertube.mastodon.host/api/v1/search/videos?search=%3Fj%24%29H%C2%A7B", PeerTube.getSearchQHFactory().fromQuery("?j$)H§B").getUrl());
27+
}
28+
29+
@Test
30+
void testSepiaVideoSearch() throws Exception {
2731
assertEquals("https://sepiasearch.org/api/v1/search/videos?search=%3Fj%24%29H%C2%A7B", PeerTube.getSearchQHFactory().fromQuery("?j$)H§B", singletonList(PeertubeSearchQueryHandlerFactory.SEPIA_VIDEOS), "").getUrl());
2832
assertEquals("https://anotherpeertubeindex.com/api/v1/search/videos?search=%3Fj%24%29H%C2%A7B", PeerTube.getSearchQHFactory().fromQuery("?j$)H§B", singletonList(PeertubeSearchQueryHandlerFactory.SEPIA_VIDEOS), "", "https://anotherpeertubeindex.com").getUrl());
2933
}
34+
35+
@Test
36+
void testPlaylistSearch() throws Exception {
37+
assertEquals("https://peertube.mastodon.host/api/v1/search/video-playlists?search=asdf", PeerTube.getSearchQHFactory().fromQuery("asdf", singletonList(PeertubeSearchQueryHandlerFactory.PLAYLISTS), "").getUrl());
38+
assertEquals("https://peertube.mastodon.host/api/v1/search/video-playlists?search=hans", PeerTube.getSearchQHFactory().fromQuery("hans", singletonList(PeertubeSearchQueryHandlerFactory.PLAYLISTS), "").getUrl());
39+
}
3040
}

0 commit comments

Comments
 (0)