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.
This commit is contained in:
anthorob committed 2026-10-03 09:45:00 -04:00
1 parent d53cbbecd4
commit 0e68886eb2
2 files changed
+36 -3

No files matched your search

@@ -77,6 +77,18 @@ public class SourceFinder {
return AudioSourceType.DirectLinkMp3; 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://"))) { if (!(url.startsWith("http://") || url.startsWith("https://"))) {
return switch (searchEngine) { return switch (searchEngine) {
case YTMUSIC -> AudioSourceType.YTMSearch; case YTMUSIC -> AudioSourceType.YTMSearch;
@@ -102,9 +114,9 @@ public class SourceFinder {
identifier = switch (getSource(url, searchEngine)) { identifier = switch (getSource(url, searchEngine)) {
case Youtube, YTMusic, Soundcloud, DirectLinkMp3 -> url; case Youtube, YTMusic, Soundcloud, DirectLinkMp3 -> url;
case YTSearch -> "ytsearch:" + url; case YTSearch -> url.startsWith("ytsearch:") ? url : "ytsearch:" + url;
case YTMSearch -> "ytmsearch:" + url; case YTMSearch -> url.startsWith("ytmsearch:") ? url : "ytmsearch:" + url;
case SCSearch -> "scsearch:" + url; case SCSearch -> url.startsWith("scsearch:") ? url : "scsearch:" + url;
// Udio is not resolvable by the Lavalink node until the source is ported to a // Udio is not resolvable by the Lavalink node until the source is ported to a
// server-side plugin, see docs/reference/udio-lavalink-plugin. // server-side plugin, see docs/reference/udio-lavalink-plugin.
default -> null; default -> null;
@@ -48,4 +48,25 @@ public class SourceFinderTest {
assertEquals(SourceFinder.AudioSourceType.Soundcloud, SourceFinder.getSource(url, SourceFinder.SearchEngine.YTMUSIC)); assertEquals(SourceFinder.AudioSourceType.Soundcloud, SourceFinder.getSource(url, SourceFinder.SearchEngine.YTMUSIC));
assertEquals(url, SourceFinder.getIdentifier(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));
}
} }