Skip to content

Commit 7e7b78f

Browse files
authored
Merge pull request #743 from B0pol/peertube-shortlinks
PeerTube short links support
2 parents 4f60225 + 396aece commit 7e7b78f

8 files changed

Lines changed: 133 additions & 46 deletions

File tree

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

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
public class PeertubeChannelLinkHandlerFactory extends ListLinkHandlerFactory {
1111

1212
private static final PeertubeChannelLinkHandlerFactory instance = new PeertubeChannelLinkHandlerFactory();
13-
private static final String ID_PATTERN = "(accounts|video-channels)/([^/?&#]*)";
13+
private static final String ID_PATTERN = "((accounts|a)|(video-channels|c))/([^/?&#]*)";
1414
public static final String API_ENDPOINT = "/api/v1/";
1515

1616
public static PeertubeChannelLinkHandlerFactory getInstance() {
@@ -19,7 +19,7 @@ public static PeertubeChannelLinkHandlerFactory getInstance() {
1919

2020
@Override
2121
public String getId(String url) throws ParsingException {
22-
return Parser.matchGroup(ID_PATTERN, url, 0);
22+
return fixId(Parser.matchGroup(ID_PATTERN, url, 0));
2323
}
2424

2525
@Override
@@ -31,7 +31,7 @@ public String getUrl(String id, List<String> contentFilters, String searchFilter
3131
public String getUrl(String id, List<String> contentFilter, String sortFilter, String baseUrl)
3232
throws ParsingException {
3333
if (id.matches(ID_PATTERN)) {
34-
return baseUrl + "/" + id;
34+
return baseUrl + "/" + fixId(id);
3535
} else {
3636
// This is needed for compatibility with older versions were we didn't support video channels yet
3737
return baseUrl + "/accounts/" + id;
@@ -40,6 +40,28 @@ public String getUrl(String id, List<String> contentFilter, String sortFilter, S
4040

4141
@Override
4242
public boolean onAcceptUrl(String url) {
43-
return url.contains("/accounts/") || url.contains("/video-channels/");
43+
return url.contains("/accounts/") || url.contains("/a/")
44+
|| url.contains("/video-channels/") || url.contains("/c/");
45+
}
46+
47+
/**
48+
* Fix id
49+
*
50+
* <p>
51+
* a/:accountName and c/:channelName ids are supported
52+
* by the PeerTube web client (>= v3.3.0)
53+
* but not by the API.
54+
* </p>
55+
*
56+
* @param id the id to fix
57+
* @return the fixed id
58+
*/
59+
private String fixId(String id) {
60+
if (id.startsWith("a/")) {
61+
id = "accounts" + id.substring(1);
62+
} else if (id.startsWith("c/")) {
63+
id = "video-channels" + id.substring(1);
64+
}
65+
return id;
4466
}
4567
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
public class PeertubeCommentsLinkHandlerFactory extends ListLinkHandlerFactory {
1212

1313
private static final PeertubeCommentsLinkHandlerFactory instance = new PeertubeCommentsLinkHandlerFactory();
14-
private static final String ID_PATTERN = "/videos/(watch/)?([^/?&#]*)";
1514
private static final String COMMENTS_ENDPOINT = "/api/v1/videos/%s/comment-threads";
1615

1716
public static PeertubeCommentsLinkHandlerFactory getInstance() {
@@ -20,12 +19,12 @@ public static PeertubeCommentsLinkHandlerFactory getInstance() {
2019

2120
@Override
2221
public String getId(String url) throws ParsingException, IllegalArgumentException {
23-
return Parser.matchGroup(ID_PATTERN, url, 2);
22+
return PeertubeStreamLinkHandlerFactory.getInstance().getId(url); // the same id is needed
2423
}
2524

2625
@Override
2726
public boolean onAcceptUrl(final String url) throws FoundAdException {
28-
return url.contains("/videos/");
27+
return url.contains("/videos/") || url.contains("/w/");
2928
}
3029

3130
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public class PeertubePlaylistLinkHandlerFactory extends ListLinkHandlerFactory {
1212

1313
private static final PeertubePlaylistLinkHandlerFactory instance = new PeertubePlaylistLinkHandlerFactory();
14-
private static final String ID_PATTERN = "/videos/watch/playlist/([^/?&#]*)";
14+
private static final String ID_PATTERN = "(/videos/watch/playlist/|/w/p/)([^/?&#]*)";
1515

1616
public static PeertubePlaylistLinkHandlerFactory getInstance() {
1717
return instance;
@@ -30,7 +30,7 @@ public String getUrl(String id, List<String> contentFilters, String sortFilter,
3030

3131
@Override
3232
public String getId(String url) throws ParsingException {
33-
return Parser.matchGroup1(ID_PATTERN, url);
33+
return Parser.matchGroup(ID_PATTERN, url, 2);
3434
}
3535

3636
@Override

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99
public class PeertubeStreamLinkHandlerFactory extends LinkHandlerFactory {
1010

1111
private static final PeertubeStreamLinkHandlerFactory instance = new PeertubeStreamLinkHandlerFactory();
12-
private static final String ID_PATTERN = "/videos/(watch/|embed/)?([^/?&#]*)";
12+
private static final String ID_PATTERN = "(/w/|(/videos/(watch/|embed/)?))(?!p/)([^/?&#]*)";
13+
// we exclude p/ because /w/p/ is playlist, not video
1314
public static final String VIDEO_API_ENDPOINT = "/api/v1/videos/";
15+
16+
// From PeerTube 3.3.0, the default path is /w/.
17+
// We still use /videos/watch/ for compatibility reasons:
18+
// /videos/watch/ is still accepted by >=3.3.0 but /w/ isn't by <3.3.0
1419
private static final String VIDEO_PATH = "/videos/watch/";
1520

1621
private PeertubeStreamLinkHandlerFactory() {
@@ -32,7 +37,7 @@ public String getUrl(String id, String baseUrl) {
3237

3338
@Override
3439
public String getId(String url) throws ParsingException, IllegalArgumentException {
35-
return Parser.matchGroup(ID_PATTERN, url, 2);
40+
return Parser.matchGroup(ID_PATTERN, url, 4);
3641
}
3742

3843
@Override

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

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,44 +20,55 @@ public class PeertubeChannelLinkHandlerFactoryTest {
2020

2121
@BeforeClass
2222
public static void setUp() {
23-
PeerTube.setInstance(new PeertubeInstance("https://peertube.mastodon.host", "PeerTube on Mastodon.host"));
23+
PeerTube.setInstance(new PeertubeInstance("https://peertube.stream", "PeerTube on peertube.stream"));
2424
linkHandler = PeertubeChannelLinkHandlerFactory.getInstance();
2525
NewPipe.init(DownloaderTestImpl.getInstance());
2626
}
2727

2828
@Test
2929
public void acceptUrlTest() throws ParsingException {
30-
assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/accounts/kranti@videos.squat.net"));
31-
assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa/videos"));
32-
assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/api/v1/accounts/kranti@videos.squat.net/videos"));
33-
assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/api/v1/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa"));
30+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/accounts/kranti@videos.squat.net"));
31+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/a/kranti@videos.squat.net"));
32+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/api/v1/accounts/kranti@videos.squat.net/videos"));
33+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/video-channels/kranti_channel@videos.squat.net/videos"));
34+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/c/kranti_channel@videos.squat.net/videos"));
35+
assertTrue(linkHandler.acceptUrl("https://peertube.stream/api/v1/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa"));
3436
}
3537

3638
@Test
3739
public void getId() throws ParsingException {
3840
assertEquals("accounts/kranti@videos.squat.net",
39-
linkHandler.fromUrl("https://peertube.mastodon.host/accounts/kranti@videos.squat.net").getId());
41+
linkHandler.fromUrl("https://peertube.stream/accounts/kranti@videos.squat.net").getId());
4042
assertEquals("accounts/kranti@videos.squat.net",
41-
linkHandler.fromUrl("https://peertube.mastodon.host/accounts/kranti@videos.squat.net/videos").getId());
42-
assertEquals("video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa",
43-
linkHandler.fromUrl("https://peertube.mastodon.host/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa/videos").getId());
43+
linkHandler.fromUrl("https://peertube.stream/a/kranti@videos.squat.net").getId());
4444
assertEquals("accounts/kranti@videos.squat.net",
45-
linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/accounts/kranti@videos.squat.net").getId());
45+
linkHandler.fromUrl("https://peertube.stream/accounts/kranti@videos.squat.net/videos").getId());
4646
assertEquals("accounts/kranti@videos.squat.net",
47-
linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/accounts/kranti@videos.squat.net/videos").getId());
48-
assertEquals("video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa",
49-
linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa").getId());
47+
linkHandler.fromUrl("https://peertube.stream/a/kranti@videos.squat.net/videos").getId());
48+
assertEquals("accounts/kranti@videos.squat.net",
49+
linkHandler.fromUrl("https://peertube.stream/api/v1/accounts/kranti@videos.squat.net").getId());
50+
assertEquals("accounts/kranti@videos.squat.net",
51+
linkHandler.fromUrl("https://peertube.stream/api/v1/accounts/kranti@videos.squat.net/videos").getId());
52+
53+
assertEquals("video-channels/kranti_channel@videos.squat.net",
54+
linkHandler.fromUrl("https://peertube.stream/video-channels/kranti_channel@videos.squat.net/videos").getId());
55+
assertEquals("video-channels/kranti_channel@videos.squat.net",
56+
linkHandler.fromUrl("https://peertube.stream/c/kranti_channel@videos.squat.net/videos").getId());
57+
assertEquals("video-channels/kranti_channel@videos.squat.net",
58+
linkHandler.fromUrl("https://peertube.stream/c/kranti_channel@videos.squat.net/video-playlists").getId());
59+
assertEquals("video-channels/kranti_channel@videos.squat.net",
60+
linkHandler.fromUrl("https://peertube.stream/api/v1/video-channels/kranti_channel@videos.squat.net").getId());
5061
}
5162

5263
@Test
5364
public void getUrl() throws ParsingException {
54-
assertEquals("https://peertube.mastodon.host/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa",
55-
linkHandler.fromId("video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa").getUrl());
56-
assertEquals("https://peertube.mastodon.host/accounts/kranti@videos.squat.net",
65+
assertEquals("https://peertube.stream/video-channels/kranti_channel@videos.squat.net",
66+
linkHandler.fromId("video-channels/kranti_channel@videos.squat.net").getUrl());
67+
assertEquals("https://peertube.stream/accounts/kranti@videos.squat.net",
5768
linkHandler.fromId("accounts/kranti@videos.squat.net").getUrl());
58-
assertEquals("https://peertube.mastodon.host/accounts/kranti@videos.squat.net",
69+
assertEquals("https://peertube.stream/accounts/kranti@videos.squat.net",
5970
linkHandler.fromId("kranti@videos.squat.net").getUrl());
60-
assertEquals("https://peertube.mastodon.host/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa",
61-
linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/video-channels/7682d9f2-07be-4622-862e-93ec812e2ffa").getUrl());
71+
assertEquals("https://peertube.stream/video-channels/kranti_channel@videos.squat.net",
72+
linkHandler.fromUrl("https://peertube.stream/api/v1/video-channels/kranti_channel@videos.squat.net").getUrl());
6273
}
6374
}

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,32 @@ public static void setUp() {
2525

2626
@Test
2727
public void acceptUrlTest() throws ParsingException {
28-
assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/api/v1/videos/19319/comment-threads?start=0&count=10&sort=-createdAt"));
28+
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/kkGMgK9ZtnKfYAgnEtQxbv"));
29+
assertTrue(linkHandler.acceptUrl("https://framatube.org/w/kkGMgK9ZtnKfYAgnEtQxbv"));
30+
assertTrue(linkHandler.acceptUrl("https://framatube.org/api/v1/videos/kkGMgK9ZtnKfYAgnEtQxbv/comment-threads?start=0&count=10&sort=-createdAt"));
31+
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d"));
32+
assertTrue(linkHandler.acceptUrl("https://framatube.org/w/9c9de5e8-0a1e-484a-b099-e80766180a6d"));
33+
assertTrue(linkHandler.acceptUrl("https://framatube.org/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180a6d/comment-threads?start=0&count=10&sort=-createdAt"));
2934
}
3035

3136
@Test
3237
public void getIdFromUrl() throws ParsingException {
33-
assertEquals("19319", linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/videos/19319/comment-threads").getId());
34-
assertEquals("19319", linkHandler.fromUrl("https://peertube.mastodon.host/api/v1/videos/19319/comment-threads?start=0&count=10&sort=-createdAt").getId());
38+
assertEquals("kkGMgK9ZtnKfYAgnEtQxbv",
39+
linkHandler.fromUrl("https://framatube.org/w/kkGMgK9ZtnKfYAgnEtQxbv").getId());
40+
assertEquals("kkGMgK9ZtnKfYAgnEtQxbv",
41+
linkHandler.fromUrl("https://framatube.org/videos/watch/kkGMgK9ZtnKfYAgnEtQxbv").getId());
42+
assertEquals("kkGMgK9ZtnKfYAgnEtQxbv",
43+
linkHandler.fromUrl("https://framatube.org/api/v1/videos/kkGMgK9ZtnKfYAgnEtQxbv/comment-threads").getId());
44+
assertEquals("kkGMgK9ZtnKfYAgnEtQxbv",
45+
linkHandler.fromUrl("https://framatube.org/api/v1/videos/kkGMgK9ZtnKfYAgnEtQxbv/comment-threads?start=0&count=10&sort=-createdAt").getId());
46+
47+
assertEquals("9c9de5e8-0a1e-484a-b099-e80766180a6d",
48+
linkHandler.fromUrl("https://framatube.org/w/9c9de5e8-0a1e-484a-b099-e80766180a6d").getId());
49+
assertEquals("9c9de5e8-0a1e-484a-b099-e80766180a6d",
50+
linkHandler.fromUrl("https://framatube.org/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d").getId());
51+
assertEquals("9c9de5e8-0a1e-484a-b099-e80766180a6d",
52+
linkHandler.fromUrl("https://framatube.org/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180a6d/comment-threads").getId());
53+
assertEquals("9c9de5e8-0a1e-484a-b099-e80766180a6d",
54+
linkHandler.fromUrl("https://framatube.org/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180a6d/comment-threads?start=0&count=10&sort=-createdAt").getId());
3555
}
3656
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,30 @@ public static void setUp() {
2626
@Test
2727
public void acceptUrlTest() throws ParsingException {
2828
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909"));
29+
assertTrue(linkHandler.acceptUrl("https://framatube.org/w/p/d8ca79f9-e4c7-4269-8183-d78ed269c909"));
2930
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909/videos"));
3031
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/dacdc4ef-5160-4846-9b70-a655880da667"));
32+
assertTrue(linkHandler.acceptUrl("https://framatube.org/w/p/dacdc4ef-5160-4846-9b70-a655880da667"));
3133
assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7"));
34+
assertTrue(linkHandler.acceptUrl("https://framatube.org/w/p/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7"));
3235
}
3336

3437
@Test
3538
public void getIdFromUrl() throws ParsingException {
3639
assertEquals("d8ca79f9-e4c7-4269-8183-d78ed269c909", linkHandler.getId("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909"));
40+
assertEquals("d8ca79f9-e4c7-4269-8183-d78ed269c909", linkHandler.getId("https://framatube.org/w/p/d8ca79f9-e4c7-4269-8183-d78ed269c909"));
3741
assertEquals("dacdc4ef-5160-4846-9b70-a655880da667", linkHandler.getId("https://framatube.org/videos/watch/playlist/dacdc4ef-5160-4846-9b70-a655880da667"));
42+
assertEquals("dacdc4ef-5160-4846-9b70-a655880da667", linkHandler.getId("https://framatube.org/w/p/dacdc4ef-5160-4846-9b70-a655880da667"));
3843
assertEquals("bfc145f5-1be7-48a6-9b9e-4f1967199dad", linkHandler.getId("https://framatube.org/videos/watch/playlist/bfc145f5-1be7-48a6-9b9e-4f1967199dad"));
44+
assertEquals("bfc145f5-1be7-48a6-9b9e-4f1967199dad", linkHandler.getId("https://framatube.org/w/p/bfc145f5-1be7-48a6-9b9e-4f1967199dad"));
3945
assertEquals("96b0ee2b-a5a7-4794-8769-58d8ccb79ab7", linkHandler.getId("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7"));
46+
assertEquals("96b0ee2b-a5a7-4794-8769-58d8ccb79ab7", linkHandler.getId("https://framatube.org/w/p/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7"));
47+
}
48+
49+
@Test
50+
public void getUrl() throws ParsingException {
51+
System.out.println(linkHandler.fromUrl("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909").getUrl());;
52+
System.out.println(linkHandler.fromUrl("https://framatube.org/w/p/d8ca79f9-e4c7-4269-8183-d78ed269c909").getUrl());;
53+
System.out.println(linkHandler.fromUrl("https://framatube.org/w/p/sLFbqXsw7sPR3AfvqQSBZB").getUrl());;
4054
}
4155
}

0 commit comments

Comments
 (0)