Skip to content

Commit 84380e4

Browse files
authored
Merge pull request #536 from B0pol/watchendpoints
support /watch/, /v/ and /w/ subpaths
2 parents a9594f5 + 41f689b commit 84380e4

2 files changed

Lines changed: 34 additions & 27 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.net.URI;
1212
import java.net.URISyntaxException;
1313
import java.net.URL;
14+
import java.util.Arrays;
15+
import java.util.List;
1416
import java.util.regex.Matcher;
1517
import java.util.regex.Pattern;
1618

@@ -38,6 +40,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
3840

3941
private static final Pattern YOUTUBE_VIDEO_ID_REGEX_PATTERN = Pattern.compile("^([a-zA-Z0-9_-]{11})");
4042
private static final YoutubeStreamLinkHandlerFactory instance = new YoutubeStreamLinkHandlerFactory();
43+
private static final List<String> SUBPATHS = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/");
4144

4245
private YoutubeStreamLinkHandlerFactory() {
4346
}
@@ -124,7 +127,7 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
124127
switch (host.toUpperCase()) {
125128
case "WWW.YOUTUBE-NOCOOKIE.COM": {
126129
if (path.startsWith("embed/")) {
127-
String id = path.split("/")[1];
130+
String id = path.substring(6); // embed/
128131

129132
return assertIsId(id);
130133
}
@@ -150,11 +153,8 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
150153
return assertIsId(viewQueryValue);
151154
}
152155

153-
if (path.startsWith("embed/") || path.startsWith("shorts/")) {
154-
String id = path.split("/")[1];
155-
156-
return assertIsId(id);
157-
}
156+
String maybeId = getIdFromSubpathsInPath(path);
157+
if (maybeId != null) return maybeId;
158158

159159
String viewQueryValue = Utils.getQueryValue(url, "v");
160160
return assertIsId(viewQueryValue);
@@ -169,20 +169,7 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
169169
return assertIsId(path);
170170
}
171171

172-
case "HOOKTUBE.COM": {
173-
if (path.startsWith("v/")) {
174-
String id = path.substring("v/".length());
175-
176-
return assertIsId(id);
177-
}
178-
if (path.startsWith("watch/")) {
179-
String id = path.substring("watch/".length());
180-
181-
return assertIsId(id);
182-
}
183-
// there is no break-statement here on purpose so the next code-block gets also run for hooktube
184-
}
185-
172+
case "HOOKTUBE.COM":
186173
case "INVIDIO.US":
187174
case "DEV.INVIDIO.US":
188175
case "WWW.INVIDIO.US":
@@ -208,11 +195,8 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
208195
return assertIsId(viewQueryValue);
209196
}
210197
}
211-
if (path.startsWith("embed/")) {
212-
String id = path.substring("embed/".length());
213-
214-
return assertIsId(id);
215-
}
198+
String maybeId = getIdFromSubpathsInPath(path);
199+
if (maybeId != null) return maybeId;
216200

217201
String viewQueryValue = Utils.getQueryValue(url, "v");
218202
if (viewQueryValue != null) {
@@ -237,4 +221,14 @@ public boolean onAcceptUrl(final String url) throws FoundAdException {
237221
return false;
238222
}
239223
}
224+
225+
private String getIdFromSubpathsInPath(String path) throws ParsingException {
226+
for (final String subpath : SUBPATHS) {
227+
if (path.startsWith(subpath)) {
228+
String id = path.substring(subpath.length());
229+
return assertIsId(id);
230+
}
231+
}
232+
return null;
233+
}
240234
}

extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ public void getIdfromYt() throws Exception {
9292
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("HTTPS://youtu.be/-cdveCh1kQk)").getId());
9393
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("https://www.youtube.com/shorts/IOS2fqxwYbAhi").getId());
9494
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/shorts/IOS2fqxwYbA").getId());
95+
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/v/IOS2fqxwYbA").getId());
96+
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/w/IOS2fqxwYbA").getId());
97+
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/watch/IOS2fqxwYbA").getId());
9598
}
9699

97100
@Test
@@ -113,6 +116,9 @@ public void testAcceptYtUrl() throws ParsingException {
113116
assertTrue(linkHandler.acceptUrl("vnd.youtube.launch:jZViOEv90dI"));
114117
assertTrue(linkHandler.acceptUrl("https://music.youtube.com/watch?v=O0EDx9WAelc"));
115118
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/shorts/IOS2fqxwYbA"));
119+
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/v/IOS2fqxwYbA"));
120+
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/w/IOS2fqxwYbA"));
121+
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch/IOS2fqxwYbA"));
116122
}
117123

118124
@Test
@@ -134,26 +140,33 @@ public void testGetHookIdfromUrl() throws ParsingException {
134140
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
135141
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch/3msbfr6pBNE").getId());
136142
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/v/3msbfr6pBNE").getId());
143+
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/w/3msbfr6pBNE").getId());
137144
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/embed/3msbfr6pBNE").getId());
138145
}
139146

140147
@Test
141-
public void testAcceptInvidioUrl() throws ParsingException {
148+
public void testAcceptInvidiousUrl() throws ParsingException {
142149
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=TglNG-yjabU"));
143150
assertTrue(linkHandler.acceptUrl("http://www.invidio.us/watch?v=TglNG-yjabU"));
144151
assertTrue(linkHandler.acceptUrl("http://invidio.us/watch?v=TglNG-yjabU"));
145152
assertTrue(linkHandler.acceptUrl("invidio.us/watch?v=3msbfr6pBNE"));
146153
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2"));
147154
assertTrue(linkHandler.acceptUrl("invidio.us/embed/3msbfr6pBNE"));
155+
assertTrue(linkHandler.acceptUrl("invidio.us/watch/3msbfr6pBNE"));
156+
assertTrue(linkHandler.acceptUrl("invidio.us/v/3msbfr6pBNE"));
157+
assertTrue(linkHandler.acceptUrl("invidio.us/w/3msbfr6pBNE"));
148158
}
149159

150160
@Test
151-
public void testGetInvidioIdfromUrl() throws ParsingException {
161+
public void testGetInvidiousIdfromUrl() throws ParsingException {
152162
assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://invidio.us/watch?v=TglNG-yjabU").getId());
153163
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://www.invidio.us/watch?v=TglNG-yjabU").getId());
154164
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://invidio.us/watch?v=TglNG-yjabU").getId());
155165
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch?v=3msbfr6pBNE").getId());
156166
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
157167
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/embed/3msbfr6pBNE").getId());
168+
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/v/3msbfr6pBNE").getId());
169+
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/w/3msbfr6pBNE").getId());
170+
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch/3msbfr6pBNE").getId());
158171
}
159172
}

0 commit comments

Comments
 (0)