Skip to content

Commit a02bfbe

Browse files
committed
[YouTube] Support stream urls in vnd.youtube://ID form
1 parent 4086715 commit a02bfbe

2 files changed

Lines changed: 29 additions & 17 deletions

File tree

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

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import java.net.URISyntaxException;
1414
import java.net.URL;
1515

16+
import javax.annotation.Nullable;
17+
1618
/*
1719
* Created by Christian Schabesberger on 02.02.16.
1820
*
@@ -44,12 +46,16 @@ public static YoutubeStreamLinkHandlerFactory getInstance() {
4446
return instance;
4547
}
4648

47-
private static String assertIsID(String id) throws ParsingException {
48-
if (id == null || !id.matches("[a-zA-Z0-9_-]{11}")) {
49+
private static boolean isId(@Nullable String id) {
50+
return id != null && id.matches("[a-zA-Z0-9_-]{11}");
51+
}
52+
53+
private static String assertIsId(@Nullable String id) throws ParsingException {
54+
if (isId(id)) {
55+
return id;
56+
} else {
4957
throw new ParsingException("The given string is not a Youtube-Video-ID");
5058
}
51-
52-
return id;
5359
}
5460

5561
@Override
@@ -75,9 +81,14 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
7581
if (scheme != null && (scheme.equals("vnd.youtube") || scheme.equals("vnd.youtube.launch"))) {
7682
String schemeSpecificPart = uri.getSchemeSpecificPart();
7783
if (schemeSpecificPart.startsWith("//")) {
84+
final String possiblyId = schemeSpecificPart.substring(2);
85+
if (isId(possiblyId)) {
86+
return possiblyId;
87+
}
88+
7889
urlString = "https:" + schemeSpecificPart;
7990
} else {
80-
return assertIsID(schemeSpecificPart);
91+
return assertIsId(schemeSpecificPart);
8192
}
8293
}
8394
} catch (URISyntaxException ignored) {
@@ -118,7 +129,7 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
118129
if (path.startsWith("embed/")) {
119130
String id = path.split("/")[1];
120131

121-
return assertIsID(id);
132+
return assertIsId(id);
122133
}
123134

124135
break;
@@ -139,38 +150,38 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
139150
}
140151

141152
String viewQueryValue = Utils.getQueryValue(decodedURL, "v");
142-
return assertIsID(viewQueryValue);
153+
return assertIsId(viewQueryValue);
143154
}
144155

145156
if (path.startsWith("embed/")) {
146157
String id = path.split("/")[1];
147158

148-
return assertIsID(id);
159+
return assertIsId(id);
149160
}
150161

151162
String viewQueryValue = Utils.getQueryValue(url, "v");
152-
return assertIsID(viewQueryValue);
163+
return assertIsId(viewQueryValue);
153164
}
154165

155166
case "YOUTU.BE": {
156167
String viewQueryValue = Utils.getQueryValue(url, "v");
157168
if (viewQueryValue != null) {
158-
return assertIsID(viewQueryValue);
169+
return assertIsId(viewQueryValue);
159170
}
160171

161-
return assertIsID(path);
172+
return assertIsId(path);
162173
}
163174

164175
case "HOOKTUBE.COM": {
165176
if (path.startsWith("v/")) {
166177
String id = path.substring("v/".length());
167178

168-
return assertIsID(id);
179+
return assertIsId(id);
169180
}
170181
if (path.startsWith("watch/")) {
171182
String id = path.substring("watch/".length());
172183

173-
return assertIsID(id);
184+
return assertIsId(id);
174185
}
175186
// there is no break-statement here on purpose so the next code-block gets also run for hooktube
176187
}
@@ -193,21 +204,21 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
193204
if (path.equals("watch")) {
194205
String viewQueryValue = Utils.getQueryValue(url, "v");
195206
if (viewQueryValue != null) {
196-
return assertIsID(viewQueryValue);
207+
return assertIsId(viewQueryValue);
197208
}
198209
}
199210
if (path.startsWith("embed/")) {
200211
String id = path.substring("embed/".length());
201212

202-
return assertIsID(id);
213+
return assertIsId(id);
203214
}
204215

205216
String viewQueryValue = Utils.getQueryValue(url, "v");
206217
if (viewQueryValue != null) {
207-
return assertIsID(viewQueryValue);
218+
return assertIsId(viewQueryValue);
208219
}
209220

210-
return assertIsID(path);
221+
return assertIsId(path);
211222
}
212223
}
213224

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public void getIdfromYt() throws Exception {
7979
assertEquals("EhxJLojIE_o", linkHandler.fromUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare").getId());
8080
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI").getId());
8181
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube:jZViOEv90dI").getId());
82+
assertEquals("n8X9_MgEdCg", linkHandler.fromUrl("vnd.youtube://n8X9_MgEdCg").getId());
8283
assertEquals("O0EDx9WAelc", linkHandler.fromUrl("https://music.youtube.com/watch?v=O0EDx9WAelc").getId());
8384
}
8485

0 commit comments

Comments
 (0)