Add a source picker to search and use the full window width

Search now queries YouTube and SoundCloud together by default and
interleaves the two result lists so neither buries the other; a picker
left of the input narrows it to one source (plus the local library when
configured), and a prefix typed into the query still outranks it.

The panel was capped at 1180px, which left most of a wide screen empty —
it now scales to 1680px and gives the search column the extra room.

A dead link also reported "could not parse yt-dlp's response", which
described our parser rather than the problem; it now shows yt-dlp's own
error line, or says the link did not open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-09-09 00:11:29 +03:00
co-authored by Claude Opus 5
parent f84489e27e
commit 971fd65b1f
8 changed files with 96 additions and 21 deletions
+8 -3
View File
@@ -1,7 +1,7 @@
import { EventEmitter } from "node:events";
import { config } from "../config.js";
import { logger } from "../logger.js";
import { NOTHING_FOUND, resolveQuery, searchTracks } from "../sources/index.js";
import { NOTHING_FOUND, resolveQuery, searchTracks, type SearchSource } from "../sources/index.js";
import {
UserFacingError,
type LoopMode,
@@ -223,8 +223,13 @@ export class MusicManager extends EventEmitter<ManagerEvents> {
};
}
search(query: string, requester: Requester, limit?: number): Promise<Track[]> {
return searchTracks(query, requester, limit);
search(
query: string,
requester: Requester,
limit?: number,
source: SearchSource = "all",
): Promise<Track[]> {
return searchTracks(query, requester, limit, source);
}
private async require(serverId: string, userId: string): Promise<GuildPlayer> {