From 0e68886eb2b9315974a19ef0d6a245a1ba505bb6 Mon Sep 17 00:00:00 2001 From: anthorob Date: Sat, 3 Oct 2026 09:45:00 -0400 Subject: [PATCH] Honor explicit search prefixes in SourceFinder Updated `SourceFinder` to respect explicit `ytsearch:`, `ytmsearch:`, and `scsearch:` prefixes regardless of the configured search engine. Added unit tests to ensure correct behavior and consistent identifier resolution when explicit prefixes are provided. --- .../netneutrality/music/SourceFinder.java | 18 +++++++++++++--- .../netneutrality/music/SourceFinderTest.java | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/bobert/netneutrality/music/SourceFinder.java b/src/main/java/me/bobert/netneutrality/music/SourceFinder.java index 0015997..905073d 100644 --- a/src/main/java/me/bobert/netneutrality/music/SourceFinder.java +++ b/src/main/java/me/bobert/netneutrality/music/SourceFinder.java @@ -77,6 +77,18 @@ public class SourceFinder { return AudioSourceType.DirectLinkMp3; } + if (url.startsWith("ytsearch:")) { + return AudioSourceType.YTSearch; + } + + if (url.startsWith("ytmsearch:")) { + return AudioSourceType.YTMSearch; + } + + if (url.startsWith("scsearch:")) { + return AudioSourceType.SCSearch; + } + if (!(url.startsWith("http://") || url.startsWith("https://"))) { return switch (searchEngine) { case YTMUSIC -> AudioSourceType.YTMSearch; @@ -102,9 +114,9 @@ public class SourceFinder { identifier = switch (getSource(url, searchEngine)) { case Youtube, YTMusic, Soundcloud, DirectLinkMp3 -> url; - case YTSearch -> "ytsearch:" + url; - case YTMSearch -> "ytmsearch:" + url; - case SCSearch -> "scsearch:" + url; + case YTSearch -> url.startsWith("ytsearch:") ? url : "ytsearch:" + url; + case YTMSearch -> url.startsWith("ytmsearch:") ? url : "ytmsearch:" + url; + case SCSearch -> url.startsWith("scsearch:") ? url : "scsearch:" + url; // Udio is not resolvable by the Lavalink node until the source is ported to a // server-side plugin, see docs/reference/udio-lavalink-plugin. default -> null; diff --git a/src/test/java/me/bobert/netneutrality/music/SourceFinderTest.java b/src/test/java/me/bobert/netneutrality/music/SourceFinderTest.java index 855c3b0..1ed40b4 100644 --- a/src/test/java/me/bobert/netneutrality/music/SourceFinderTest.java +++ b/src/test/java/me/bobert/netneutrality/music/SourceFinderTest.java @@ -48,4 +48,25 @@ public class SourceFinderTest { assertEquals(SourceFinder.AudioSourceType.Soundcloud, SourceFinder.getSource(url, SourceFinder.SearchEngine.YTMUSIC)); assertEquals(url, SourceFinder.getIdentifier(url, SourceFinder.SearchEngine.YTMUSIC)); } + + @Test + public void explicitScsearchPrefixIsHonoredRegardlessOfSearchEngine() { + String query = "scsearch:never gonna give you up"; + assertEquals(SourceFinder.AudioSourceType.SCSearch, SourceFinder.getSource(query, SourceFinder.SearchEngine.YOUTUBE)); + assertEquals(query, SourceFinder.getIdentifier(query, SourceFinder.SearchEngine.YOUTUBE)); + } + + @Test + public void explicitYtsearchPrefixIsHonoredRegardlessOfSearchEngine() { + String query = "ytsearch:never gonna give you up"; + assertEquals(SourceFinder.AudioSourceType.YTSearch, SourceFinder.getSource(query, SourceFinder.SearchEngine.SOUNDCLOUD)); + assertEquals(query, SourceFinder.getIdentifier(query, SourceFinder.SearchEngine.SOUNDCLOUD)); + } + + @Test + public void explicitYtmsearchPrefixIsHonoredRegardlessOfSearchEngine() { + String query = "ytmsearch:never gonna give you up"; + assertEquals(SourceFinder.AudioSourceType.YTMSearch, SourceFinder.getSource(query, SourceFinder.SearchEngine.SOUNDCLOUD)); + assertEquals(query, SourceFinder.getIdentifier(query, SourceFinder.SearchEngine.SOUNDCLOUD)); + } }