From ece968d7947f1b49149f029d78d17544eb99c13c Mon Sep 17 00:00:00 2001 From: G-flat <63449095+G-flat@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:13:52 +1100 Subject: [PATCH 1/4] Support more YouTube channels --- .../linkHandler/YoutubeChannelLinkHandlerFactory.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java index 9770f061be..779a42571b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java @@ -101,13 +101,10 @@ public String getId(final String url) throws ParsingException, UnsupportedOperat String[] splitPath = path.split("/"); - if (isHandle(splitPath)) { - // Handle YouTube handle URLs like youtube.com/@yourhandle + if (isHandle(splitPath) || isCustomShortChannelUrl(splitPath)) { + // Handle YouTube handle URLs like youtube.com/@yourhandle and + // custom short channel URLs like youtube.com/yourcustomname return splitPath[0]; - } else if (isCustomShortChannelUrl(splitPath)) { - // Handle custom short channel URLs like youtube.com/yourcustomname - path = "c/" + path; - splitPath = path.split("/"); } if (!path.startsWith("user/") && !path.startsWith("channel/") From 345c7f4ec6d6b35c315a927eba548be453017e9d Mon Sep 17 00:00:00 2001 From: G-flat <63449095+G-flat@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:57:05 +1100 Subject: [PATCH 2/4] Fix checkstyle issue --- .../youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java index 779a42571b..8374628242 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java @@ -99,7 +99,7 @@ public String getId(final String url) throws ParsingException, UnsupportedOperat // Remove leading "/" path = path.substring(1); - String[] splitPath = path.split("/"); + final String[] splitPath = path.split("/"); if (isHandle(splitPath) || isCustomShortChannelUrl(splitPath)) { // Handle YouTube handle URLs like youtube.com/@yourhandle and From 75a4ccbd78e2d1ed36ab5f0104ace052e4abca37 Mon Sep 17 00:00:00 2001 From: G-flat <63449095+G-flat@users.noreply.github.com> Date: Sat, 31 Jan 2026 01:00:59 +1100 Subject: [PATCH 3/4] Add tests for newly supported channel URLs and fix regression --- .../youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java | 3 ++- .../services/youtube/YoutubeChannelLinkHandlerFactoryTest.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java index 8374628242..aff1fbd93b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java @@ -71,7 +71,8 @@ public String getUrl(final String id, * @return whether the value conform to short channel URLs */ private boolean isCustomShortChannelUrl(@Nonnull final String[] splitPath) { - return splitPath.length == 1 && !EXCLUDED_SEGMENTS.matcher(splitPath[0]).matches(); + return splitPath.length == 1 && !splitPath[0].isEmpty() + && !EXCLUDED_SEGMENTS.matcher(splitPath[0]).matches(); } /** diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java index 62d7881c14..3b49882c1b 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java @@ -88,5 +88,8 @@ void getIdFromUrl() throws ParsingException { assertEquals("@Gronkh", linkHandler.fromUrl("https://www.youtube.com/@Gronkh?ucbcb=1").getId()); assertEquals("@YouTubeCreators", linkHandler.fromUrl("https://www.youtube.com/@YouTubeCreators/shorts").getId()); + + assertEquals("PewDiePie", linkHandler.fromUrl("https://www.youtube.com/PewDiePie").getId()); + assertEquals("DreamTraps", linkHandler.fromUrl("https://www.youtube.com/DreamTraps").getId()); } } From 9831bcc5c52740ae8e2469a41f17075a1e69cf00 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 30 Jan 2026 15:46:01 +0100 Subject: [PATCH 4/4] Add more tests for invalid channel URL patterns --- .../youtube/YoutubeChannelLinkHandlerFactoryTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java index 3b49882c1b..690ecd87c6 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelLinkHandlerFactoryTest.java @@ -53,12 +53,18 @@ void acceptUrlTest() throws ParsingException { // do not accept URLs which are not channels assertFalse(linkHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI&t=100")); + assertFalse(linkHandler.acceptUrl("https://www.youtube.com/watch")); assertFalse(linkHandler.acceptUrl("http://www.youtube.com/watch_popup?v=uEJuoEs1UxY")); + assertFalse(linkHandler.acceptUrl("http://www.youtube.com/watch_popup")); assertFalse(linkHandler.acceptUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare")); + assertFalse(linkHandler.acceptUrl("http://www.youtube.com/attribution_link")); assertFalse(linkHandler.acceptUrl("https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1d")); + assertFalse(linkHandler.acceptUrl("https://www.youtube.com/playlist")); assertFalse(linkHandler.acceptUrl("https://www.youtube.com/embed/jZViOEv90dI")); + assertFalse(linkHandler.acceptUrl("https://www.youtube.com/embed")); assertFalse(linkHandler.acceptUrl("https://www.youtube.com/feed/subscriptions?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV")); - assertFalse(linkHandler.acceptUrl("https://www.youtube.com/?app=desktop&persist_app=1")); + assertFalse(linkHandler.acceptUrl("https://www.youtube.com/feed")); + assertFalse(linkHandler.acceptUrl("https://www.youtube.com")); assertFalse(linkHandler.acceptUrl("https://m.youtube.com/select_site")); }