Skip to content

Commit f3913e2

Browse files
authored
Merge pull request #324 from Stypox/music-detector-url
[YouTube] Support stream urls in `vnd.youtube://ID` form
2 parents 3ddd6e4 + a02bfbe commit f3913e2

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
@@ -14,6 +14,8 @@
1414
import java.net.URISyntaxException;
1515
import java.net.URL;
1616

17+
import javax.annotation.Nullable;
18+
1719
/*
1820
* Created by Christian Schabesberger on 02.02.16.
1921
*
@@ -45,12 +47,16 @@ public static YoutubeStreamLinkHandlerFactory getInstance() {
4547
return instance;
4648
}
4749

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

5662
@Override
@@ -76,9 +82,14 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
7682
if (scheme != null && (scheme.equals("vnd.youtube") || scheme.equals("vnd.youtube.launch"))) {
7783
String schemeSpecificPart = uri.getSchemeSpecificPart();
7884
if (schemeSpecificPart.startsWith("//")) {
85+
final String possiblyId = schemeSpecificPart.substring(2);
86+
if (isId(possiblyId)) {
87+
return possiblyId;
88+
}
89+
7990
urlString = "https:" + schemeSpecificPart;
8091
} else {
81-
return assertIsID(schemeSpecificPart);
92+
return assertIsId(schemeSpecificPart);
8293
}
8394
}
8495
} catch (URISyntaxException ignored) {
@@ -119,7 +130,7 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
119130
if (path.startsWith("embed/")) {
120131
String id = path.split("/")[1];
121132

122-
return assertIsID(id);
133+
return assertIsId(id);
123134
}
124135

125136
break;
@@ -140,38 +151,38 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
140151
}
141152

142153
String viewQueryValue = Utils.getQueryValue(decodedURL, "v");
143-
return assertIsID(viewQueryValue);
154+
return assertIsId(viewQueryValue);
144155
}
145156

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

149-
return assertIsID(id);
160+
return assertIsId(id);
150161
}
151162

152163
String viewQueryValue = Utils.getQueryValue(url, "v");
153-
return assertIsID(viewQueryValue);
164+
return assertIsId(viewQueryValue);
154165
}
155166

156167
case "YOUTU.BE": {
157168
String viewQueryValue = Utils.getQueryValue(url, "v");
158169
if (viewQueryValue != null) {
159-
return assertIsID(viewQueryValue);
170+
return assertIsId(viewQueryValue);
160171
}
161172

162-
return assertIsID(path);
173+
return assertIsId(path);
163174
}
164175

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

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

174-
return assertIsID(id);
185+
return assertIsId(id);
175186
}
176187
// there is no break-statement here on purpose so the next code-block gets also run for hooktube
177188
}
@@ -194,21 +205,21 @@ public String getId(String urlString) throws ParsingException, IllegalArgumentEx
194205
if (path.equals("watch")) {
195206
String viewQueryValue = Utils.getQueryValue(url, "v");
196207
if (viewQueryValue != null) {
197-
return assertIsID(viewQueryValue);
208+
return assertIsId(viewQueryValue);
198209
}
199210
}
200211
if (path.startsWith("embed/")) {
201212
String id = path.substring("embed/".length());
202213

203-
return assertIsID(id);
214+
return assertIsId(id);
204215
}
205216

206217
String viewQueryValue = Utils.getQueryValue(url, "v");
207218
if (viewQueryValue != null) {
208-
return assertIsID(viewQueryValue);
219+
return assertIsId(viewQueryValue);
209220
}
210221

211-
return assertIsID(path);
222+
return assertIsId(path);
212223
}
213224
}
214225

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)