From f15c0fcfed6335ce5962d60813b06293a3c200d2 Mon Sep 17 00:00:00 2001 From: bopol Date: Wed, 10 Feb 2021 17:06:51 +0100 Subject: [PATCH 1/5] support /watch/ and /v/ folders --- .../YoutubeStreamLinkHandlerFactory.java | 42 ++++++++----------- .../YoutubeStreamLinkHandlerFactoryTest.java | 12 +++++- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java index 6ff6175bd..f1f99d838 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java @@ -11,6 +11,8 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.util.Arrays; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -38,6 +40,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { private static final Pattern YOUTUBE_VIDEO_ID_REGEX_PATTERN = Pattern.compile("^([a-zA-Z0-9_-]{11})"); private static final YoutubeStreamLinkHandlerFactory instance = new YoutubeStreamLinkHandlerFactory(); + private static final List folders = Arrays.asList("embed/", "shorts/", "watch/", "v/"); private YoutubeStreamLinkHandlerFactory() { } @@ -150,11 +153,8 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return assertIsId(viewQueryValue); } - if (path.startsWith("embed/") || path.startsWith("shorts/")) { - String id = path.split("/")[1]; - - return assertIsId(id); - } + String maybeId = getIdFromFoldersInPath(path); + if (maybeId != null) return maybeId; String viewQueryValue = Utils.getQueryValue(url, "v"); return assertIsId(viewQueryValue); @@ -169,20 +169,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return assertIsId(path); } - case "HOOKTUBE.COM": { - if (path.startsWith("v/")) { - String id = path.substring("v/".length()); - - return assertIsId(id); - } - if (path.startsWith("watch/")) { - String id = path.substring("watch/".length()); - - return assertIsId(id); - } - // there is no break-statement here on purpose so the next code-block gets also run for hooktube - } - + case "HOOKTUBE.COM": case "INVIDIO.US": case "DEV.INVIDIO.US": case "WWW.INVIDIO.US": @@ -208,11 +195,8 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return assertIsId(viewQueryValue); } } - if (path.startsWith("embed/")) { - String id = path.substring("embed/".length()); - - return assertIsId(id); - } + String maybeId = getIdFromFoldersInPath(path); + if (maybeId != null) return maybeId; String viewQueryValue = Utils.getQueryValue(url, "v"); if (viewQueryValue != null) { @@ -237,4 +221,14 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return false; } } + + private String getIdFromFoldersInPath(String path) throws ParsingException { + for (final String folder : folders) { + if (path.startsWith(folder)) { + String id = path.split("/")[1]; + return assertIsId(id); + } + } + return null; + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java index b156e70ce..9b2ac739b 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java @@ -92,6 +92,8 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertEquals("-cdveCh1kQk", linkHandler.fromUrl("HTTPS://youtu.be/-cdveCh1kQk)").getId()); assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("https://www.youtube.com/shorts/IOS2fqxwYbAhi").getId()); assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/shorts/IOS2fqxwYbA").getId()); + assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/v/IOS2fqxwYbA").getId()); + assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/watch/IOS2fqxwYbA").getId()); } @Test @@ -113,6 +115,8 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("vnd.youtube.launch:jZViOEv90dI")); assertTrue(linkHandler.acceptUrl("https://music.youtube.com/watch?v=O0EDx9WAelc")); assertTrue(linkHandler.acceptUrl("https://www.youtube.com/shorts/IOS2fqxwYbA")); + assertTrue(linkHandler.acceptUrl("https://www.youtube.com/v/IOS2fqxwYbA")); + assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch/IOS2fqxwYbA")); } @Test @@ -138,22 +142,26 @@ public class YoutubeStreamLinkHandlerFactoryTest { } @Test - public void testAcceptInvidioUrl() throws ParsingException { + public void testAcceptInvidiousUrl() throws ParsingException { assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=TglNG-yjabU")); assertTrue(linkHandler.acceptUrl("http://www.invidio.us/watch?v=TglNG-yjabU")); assertTrue(linkHandler.acceptUrl("http://invidio.us/watch?v=TglNG-yjabU")); assertTrue(linkHandler.acceptUrl("invidio.us/watch?v=3msbfr6pBNE")); assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2")); assertTrue(linkHandler.acceptUrl("invidio.us/embed/3msbfr6pBNE")); + assertTrue(linkHandler.acceptUrl("invidio.us/watch/3msbfr6pBNE")); + assertTrue(linkHandler.acceptUrl("invidio.us/v/3msbfr6pBNE")); } @Test - public void testGetInvidioIdfromUrl() throws ParsingException { + public void testGetInvidiousIdfromUrl() throws ParsingException { assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://invidio.us/watch?v=TglNG-yjabU").getId()); assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://www.invidio.us/watch?v=TglNG-yjabU").getId()); assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://invidio.us/watch?v=TglNG-yjabU").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch?v=3msbfr6pBNE").getId()); assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/embed/3msbfr6pBNE").getId()); + assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/v/3msbfr6pBNE").getId()); + assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch/3msbfr6pBNE").getId()); } } \ No newline at end of file From 81317cf6bc85e4e230e773f9e5ddfca92749d8c3 Mon Sep 17 00:00:00 2001 From: bopol Date: Sat, 13 Feb 2021 11:20:23 +0100 Subject: [PATCH 2/5] youtube: support /w/ folder --- .../youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java | 2 +- .../youtube/YoutubeStreamLinkHandlerFactoryTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java index f1f99d838..45d446e99 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java @@ -40,7 +40,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { private static final Pattern YOUTUBE_VIDEO_ID_REGEX_PATTERN = Pattern.compile("^([a-zA-Z0-9_-]{11})"); private static final YoutubeStreamLinkHandlerFactory instance = new YoutubeStreamLinkHandlerFactory(); - private static final List folders = Arrays.asList("embed/", "shorts/", "watch/", "v/"); + private static final List folders = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/"); private YoutubeStreamLinkHandlerFactory() { } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java index 9b2ac739b..37266bd44 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamLinkHandlerFactoryTest.java @@ -93,6 +93,7 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("https://www.youtube.com/shorts/IOS2fqxwYbAhi").getId()); assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/shorts/IOS2fqxwYbA").getId()); assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/v/IOS2fqxwYbA").getId()); + assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/w/IOS2fqxwYbA").getId()); assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/watch/IOS2fqxwYbA").getId()); } @@ -116,6 +117,7 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("https://music.youtube.com/watch?v=O0EDx9WAelc")); assertTrue(linkHandler.acceptUrl("https://www.youtube.com/shorts/IOS2fqxwYbA")); assertTrue(linkHandler.acceptUrl("https://www.youtube.com/v/IOS2fqxwYbA")); + assertTrue(linkHandler.acceptUrl("https://www.youtube.com/w/IOS2fqxwYbA")); assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch/IOS2fqxwYbA")); } @@ -138,6 +140,7 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch/3msbfr6pBNE").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/v/3msbfr6pBNE").getId()); + assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/w/3msbfr6pBNE").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/embed/3msbfr6pBNE").getId()); } @@ -151,6 +154,7 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertTrue(linkHandler.acceptUrl("invidio.us/embed/3msbfr6pBNE")); assertTrue(linkHandler.acceptUrl("invidio.us/watch/3msbfr6pBNE")); assertTrue(linkHandler.acceptUrl("invidio.us/v/3msbfr6pBNE")); + assertTrue(linkHandler.acceptUrl("invidio.us/w/3msbfr6pBNE")); } @Test @@ -162,6 +166,7 @@ public class YoutubeStreamLinkHandlerFactoryTest { assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/embed/3msbfr6pBNE").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/v/3msbfr6pBNE").getId()); + assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/w/3msbfr6pBNE").getId()); assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch/3msbfr6pBNE").getId()); } } \ No newline at end of file From 8db40db4de98fff7e4b502682ef5507eb45e3079 Mon Sep 17 00:00:00 2001 From: bopol Date: Sat, 13 Feb 2021 22:19:49 +0100 Subject: [PATCH 3/5] use substring instead of split --- .../youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java index 45d446e99..08de217b8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java @@ -127,7 +127,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { switch (host.toUpperCase()) { case "WWW.YOUTUBE-NOCOOKIE.COM": { if (path.startsWith("embed/")) { - String id = path.split("/")[1]; + String id = path.substring(6); // embed/ return assertIsId(id); } @@ -225,7 +225,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { private String getIdFromFoldersInPath(String path) throws ParsingException { for (final String folder : folders) { if (path.startsWith(folder)) { - String id = path.split("/")[1]; + String id = path.substring(folder.length()); return assertIsId(id); } } From ee2012c9489187da1ab106849687d011a3477227 Mon Sep 17 00:00:00 2001 From: bopol Date: Sat, 13 Feb 2021 22:22:50 +0100 Subject: [PATCH 4/5] rename folder to subpath --- .../YoutubeStreamLinkHandlerFactory.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java index 08de217b8..d17f5ec9e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java @@ -40,7 +40,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { private static final Pattern YOUTUBE_VIDEO_ID_REGEX_PATTERN = Pattern.compile("^([a-zA-Z0-9_-]{11})"); private static final YoutubeStreamLinkHandlerFactory instance = new YoutubeStreamLinkHandlerFactory(); - private static final List folders = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/"); + private static final List subpaths = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/"); private YoutubeStreamLinkHandlerFactory() { } @@ -153,7 +153,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return assertIsId(viewQueryValue); } - String maybeId = getIdFromFoldersInPath(path); + String maybeId = getIdFromSubpathsInPath(path); if (maybeId != null) return maybeId; String viewQueryValue = Utils.getQueryValue(url, "v"); @@ -195,7 +195,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { return assertIsId(viewQueryValue); } } - String maybeId = getIdFromFoldersInPath(path); + String maybeId = getIdFromSubpathsInPath(path); if (maybeId != null) return maybeId; String viewQueryValue = Utils.getQueryValue(url, "v"); @@ -222,10 +222,10 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { } } - private String getIdFromFoldersInPath(String path) throws ParsingException { - for (final String folder : folders) { - if (path.startsWith(folder)) { - String id = path.substring(folder.length()); + private String getIdFromSubpathsInPath(String path) throws ParsingException { + for (final String subpath : subpaths) { + if (path.startsWith(subpath)) { + String id = path.substring(subpath.length()); return assertIsId(id); } } From 41f689b099347bf0b63ca444eafc5b55bbede18c Mon Sep 17 00:00:00 2001 From: bopol Date: Tue, 16 Feb 2021 19:07:24 +0100 Subject: [PATCH 5/5] Update extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java Co-authored-by: Stypox --- .../youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java index d17f5ec9e..bff9d8277 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeStreamLinkHandlerFactory.java @@ -40,7 +40,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { private static final Pattern YOUTUBE_VIDEO_ID_REGEX_PATTERN = Pattern.compile("^([a-zA-Z0-9_-]{11})"); private static final YoutubeStreamLinkHandlerFactory instance = new YoutubeStreamLinkHandlerFactory(); - private static final List subpaths = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/"); + private static final List SUBPATHS = Arrays.asList("embed/", "shorts/", "watch/", "v/", "w/"); private YoutubeStreamLinkHandlerFactory() { } @@ -223,7 +223,7 @@ public class YoutubeStreamLinkHandlerFactory extends LinkHandlerFactory { } private String getIdFromSubpathsInPath(String path) throws ParsingException { - for (final String subpath : subpaths) { + for (final String subpath : SUBPATHS) { if (path.startsWith(subpath)) { String id = path.substring(subpath.length()); return assertIsId(id);