[YouTube] Support stream urls in `vnd.youtube://ID` form
This commit is contained in:
parent
4086715a68
commit
a02bfbeae5
|
@ -13,6 +13,8 @@ import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 02.02.16.
|
* Created by Christian Schabesberger on 02.02.16.
|
||||||
*
|
*
|
||||||
|
@ -44,12 +46,16 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String assertIsID(String id) throws ParsingException {
|
private static boolean isId(@Nullable String id) {
|
||||||
if (id == null || !id.matches("[a-zA-Z0-9_-]{11}")) {
|
return id != null && id.matches("[a-zA-Z0-9_-]{11}");
|
||||||
throw new ParsingException("The given string is not a Youtube-Video-ID");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String assertIsId(@Nullable String id) throws ParsingException {
|
||||||
|
if (isId(id)) {
|
||||||
return id;
|
return id;
|
||||||
|
} else {
|
||||||
|
throw new ParsingException("The given string is not a Youtube-Video-ID");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,9 +81,14 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
if (scheme != null && (scheme.equals("vnd.youtube") || scheme.equals("vnd.youtube.launch"))) {
|
if (scheme != null && (scheme.equals("vnd.youtube") || scheme.equals("vnd.youtube.launch"))) {
|
||||||
String schemeSpecificPart = uri.getSchemeSpecificPart();
|
String schemeSpecificPart = uri.getSchemeSpecificPart();
|
||||||
if (schemeSpecificPart.startsWith("//")) {
|
if (schemeSpecificPart.startsWith("//")) {
|
||||||
|
final String possiblyId = schemeSpecificPart.substring(2);
|
||||||
|
if (isId(possiblyId)) {
|
||||||
|
return possiblyId;
|
||||||
|
}
|
||||||
|
|
||||||
urlString = "https:" + schemeSpecificPart;
|
urlString = "https:" + schemeSpecificPart;
|
||||||
} else {
|
} else {
|
||||||
return assertIsID(schemeSpecificPart);
|
return assertIsId(schemeSpecificPart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (URISyntaxException ignored) {
|
} catch (URISyntaxException ignored) {
|
||||||
|
@ -118,7 +129,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
if (path.startsWith("embed/")) {
|
if (path.startsWith("embed/")) {
|
||||||
String id = path.split("/")[1];
|
String id = path.split("/")[1];
|
||||||
|
|
||||||
return assertIsID(id);
|
return assertIsId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -139,38 +150,38 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
String viewQueryValue = Utils.getQueryValue(decodedURL, "v");
|
String viewQueryValue = Utils.getQueryValue(decodedURL, "v");
|
||||||
return assertIsID(viewQueryValue);
|
return assertIsId(viewQueryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path.startsWith("embed/")) {
|
if (path.startsWith("embed/")) {
|
||||||
String id = path.split("/")[1];
|
String id = path.split("/")[1];
|
||||||
|
|
||||||
return assertIsID(id);
|
return assertIsId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
String viewQueryValue = Utils.getQueryValue(url, "v");
|
String viewQueryValue = Utils.getQueryValue(url, "v");
|
||||||
return assertIsID(viewQueryValue);
|
return assertIsId(viewQueryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
case "YOUTU.BE": {
|
case "YOUTU.BE": {
|
||||||
String viewQueryValue = Utils.getQueryValue(url, "v");
|
String viewQueryValue = Utils.getQueryValue(url, "v");
|
||||||
if (viewQueryValue != null) {
|
if (viewQueryValue != null) {
|
||||||
return assertIsID(viewQueryValue);
|
return assertIsId(viewQueryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
return assertIsID(path);
|
return assertIsId(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
case "HOOKTUBE.COM": {
|
case "HOOKTUBE.COM": {
|
||||||
if (path.startsWith("v/")) {
|
if (path.startsWith("v/")) {
|
||||||
String id = path.substring("v/".length());
|
String id = path.substring("v/".length());
|
||||||
|
|
||||||
return assertIsID(id);
|
return assertIsId(id);
|
||||||
}
|
}
|
||||||
if (path.startsWith("watch/")) {
|
if (path.startsWith("watch/")) {
|
||||||
String id = path.substring("watch/".length());
|
String id = path.substring("watch/".length());
|
||||||
|
|
||||||
return assertIsID(id);
|
return assertIsId(id);
|
||||||
}
|
}
|
||||||
// there is no break-statement here on purpose so the next code-block gets also run for hooktube
|
// there is no break-statement here on purpose so the next code-block gets also run for hooktube
|
||||||
}
|
}
|
||||||
|
@ -193,21 +204,21 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory {
|
||||||
if (path.equals("watch")) {
|
if (path.equals("watch")) {
|
||||||
String viewQueryValue = Utils.getQueryValue(url, "v");
|
String viewQueryValue = Utils.getQueryValue(url, "v");
|
||||||
if (viewQueryValue != null) {
|
if (viewQueryValue != null) {
|
||||||
return assertIsID(viewQueryValue);
|
return assertIsId(viewQueryValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (path.startsWith("embed/")) {
|
if (path.startsWith("embed/")) {
|
||||||
String id = path.substring("embed/".length());
|
String id = path.substring("embed/".length());
|
||||||
|
|
||||||
return assertIsID(id);
|
return assertIsId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
String viewQueryValue = Utils.getQueryValue(url, "v");
|
String viewQueryValue = Utils.getQueryValue(url, "v");
|
||||||
if (viewQueryValue != null) {
|
if (viewQueryValue != null) {
|
||||||
return assertIsID(viewQueryValue);
|
return assertIsId(viewQueryValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
return assertIsID(path);
|
return assertIsId(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,7 @@ public class YoutubeStreamLinkHandlerFactoryTest {
|
||||||
assertEquals("EhxJLojIE_o", linkHandler.fromUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare").getId());
|
assertEquals("EhxJLojIE_o", linkHandler.fromUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare").getId());
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube:jZViOEv90dI").getId());
|
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube:jZViOEv90dI").getId());
|
||||||
|
assertEquals("n8X9_MgEdCg", linkHandler.fromUrl("vnd.youtube://n8X9_MgEdCg").getId());
|
||||||
assertEquals("O0EDx9WAelc", linkHandler.fromUrl("https://music.youtube.com/watch?v=O0EDx9WAelc").getId());
|
assertEquals("O0EDx9WAelc", linkHandler.fromUrl("https://music.youtube.com/watch?v=O0EDx9WAelc").getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue