The SearchResult class represents the results from a search operation, containing tracks, playlists, and metadata about the search.
Properties
The original search query
queryType
SearchQueryType | QueryExtractorSearch
The query type/search engine used
The extractor that handled this search
Playlist result (if query was a playlist URL)
The user who requested this search
Methods
isEmpty()
Check if search returned no results:
const result = await player.search(query);
if (result.isEmpty()) {
return interaction.reply('No results found!');
}
True if no tracks were found
hasTracks()
Check if search returned tracks:
if (result.hasTracks()) {
console.log(`Found ${result.tracks.length} tracks`);
}
True if tracks were found
hasPlaylist()
Check if search returned a playlist:
if (result.hasPlaylist()) {
console.log(`Found playlist: ${result.playlist.title}`);
}
True if a playlist was found
setQueryType()
Set the query type:
import { QueryType } from 'discord-player';
result.setQueryType(QueryType.YOUTUBE_SEARCH);
type
SearchQueryType | QueryExtractorSearch
required
The query type to set
The SearchResult instance (for chaining)
setRequestedBy()
Set the requesting user:
result.setRequestedBy(interaction.user);
The SearchResult instance (for chaining)
Set the extractor:
result.setExtractor(extractor);
The SearchResult instance (for chaining)
setTracks()
Set the tracks array:
result.setTracks(filteredTracks);
The SearchResult instance (for chaining)
setQuery()
Set the search query:
result.setQuery('new search query');
The SearchResult instance (for chaining)
setPlaylist()
Set the playlist:
result.setPlaylist(playlist);
The SearchResult instance (for chaining)
execute()
Re-execute the search:
const newResult = await result.execute();
A new SearchResult with fresh results
toJSON()
Convert to JSON:
const json = result.toJSON();
console.log(json.tracks.length);
JSON representation with query, queryType, playlist, tracks, extractor, and requestedBy
Example Usage
Basic Search
import { useMainPlayer } from 'discord-player';
const player = useMainPlayer();
const result = await player.search('despacito', {
requestedBy: interaction.user
});
if (result.isEmpty()) {
return interaction.reply('❌ No results found!');
}
const track = result.tracks[0];
await interaction.reply(`Found: **${track.title}** by ${track.author}`);
Handle Playlist and Tracks
const result = await player.search(query, {
requestedBy: interaction.user
});
if (result.hasPlaylist()) {
// Play entire playlist
await result.playlist.play(voiceChannel, {
nodeOptions: { metadata: interaction }
});
await interaction.reply(
`🎵 Playing playlist: **${result.playlist.title}** (${result.playlist.tracks.length} tracks)`
);
} else if (result.hasTracks()) {
// Play first track
const track = result.tracks[0];
await player.play(voiceChannel, track, {
nodeOptions: { metadata: interaction }
});
await interaction.reply(`🎵 Playing: **${track.cleanTitle}**`);
} else {
await interaction.reply('❌ No results found!');
}
import { StringSelectMenuBuilder, ActionRowBuilder } from 'discord.js';
const result = await player.search(query, {
requestedBy: interaction.user
});
if (result.isEmpty()) {
return interaction.reply('No results found!');
}
const tracks = result.tracks.slice(0, 10);
const selectMenu = new StringSelectMenuBuilder()
.setCustomId('track-select')
.setPlaceholder('Choose a track')
.addOptions(
tracks.map((track, i) => ({
label: track.title.slice(0, 100),
description: `${track.author} • ${track.duration}`.slice(0, 100),
value: i.toString()
}))
);
const row = new ActionRowBuilder().addComponents(selectMenu);
await interaction.reply({
content: `Found ${tracks.length} results:`,
components: [row]
});
// In your interaction collector
const selected = result.tracks[parseInt(i.values[0])];
await player.play(voiceChannel, selected, {
nodeOptions: { metadata: interaction }
});
Modify Search Results
const result = await player.search(query, {
requestedBy: interaction.user
});
// Filter out short tracks
const longTracks = result.tracks.filter(track => track.durationMS > 180000);
result.setTracks(longTracks);
// Update metadata
result.setRequestedBy(interaction.user)
.setQueryType(QueryType.YOUTUBE_SEARCH);
// Re-execute search with same params
const freshResult = await result.execute();
Search with Different Engines
import { QueryType } from 'discord-player';
// YouTube search
const ytResult = await player.search('song name', {
searchEngine: QueryType.YOUTUBE_SEARCH,
requestedBy: interaction.user
});
// SoundCloud search
const scResult = await player.search('song name', {
searchEngine: QueryType.SOUNDCLOUD_SEARCH,
requestedBy: interaction.user
});
// Spotify search
const spotifyResult = await player.search('song name', {
searchEngine: QueryType.SPOTIFY_SEARCH,
requestedBy: interaction.user
});
// Target specific extractor
const extResult = await player.search('song name', {
searchEngine: 'ext:MyCustomExtractor',
requestedBy: interaction.user
});
Search Result Info
const result = await player.search(query);
console.log('Query:', result.query);
console.log('Query Type:', result.queryType);
console.log('Extractor:', result.extractor?.identifier);
console.log('Has Playlist:', result.hasPlaylist());
console.log('Track Count:', result.tracks.length);
console.log('Requested By:', result.requestedBy?.tag);
if (result.hasPlaylist()) {
console.log('Playlist Title:', result.playlist.title);
console.log('Playlist Tracks:', result.playlist.tracks.length);
}
TypeScript Types
interface SearchResultData {
query: string;
queryType?: SearchQueryType | QueryExtractorSearch | null;
extractor?: BaseExtractor | null;
playlist?: Playlist | null;
tracks?: Track[];
requestedBy?: User | null;
}
type QueryExtractorSearch = `ext:${string}`;
interface PlayerSearchResult {
playlist: Playlist | null;
tracks: Track[];
}