Skip to main content
The SearchResult class represents the results from a search operation, containing tracks, playlists, and metadata about the search.

Properties

query
string
The original search query
queryType
SearchQueryType | QueryExtractorSearch
The query type/search engine used
extractor
BaseExtractor | null
The extractor that handled this search
playlist
Playlist | null
Playlist result (if query was a playlist URL)
tracks
Track[]
Array of track results
requestedBy
User | null
The user who requested this search
player
Player
The player instance

Methods

isEmpty()

Check if search returned no results:
const result = await player.search(query);

if (result.isEmpty()) {
  return interaction.reply('No results found!');
}
returns
boolean
True if no tracks were found

hasTracks()

Check if search returned tracks:
if (result.hasTracks()) {
  console.log(`Found ${result.tracks.length} tracks`);
}
returns
boolean
True if tracks were found

hasPlaylist()

Check if search returned a playlist:
if (result.hasPlaylist()) {
  console.log(`Found playlist: ${result.playlist.title}`);
}
returns
boolean
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
returns
SearchResult
The SearchResult instance (for chaining)

setRequestedBy()

Set the requesting user:
result.setRequestedBy(interaction.user);
user
User
required
The Discord user
returns
SearchResult
The SearchResult instance (for chaining)

setExtractor()

Set the extractor:
result.setExtractor(extractor);
extractor
BaseExtractor
required
The extractor instance
returns
SearchResult
The SearchResult instance (for chaining)

setTracks()

Set the tracks array:
result.setTracks(filteredTracks);
tracks
Track[]
required
Array of tracks
returns
SearchResult
The SearchResult instance (for chaining)

setQuery()

Set the search query:
result.setQuery('new search query');
query
string
required
The search query
returns
SearchResult
The SearchResult instance (for chaining)

setPlaylist()

Set the playlist:
result.setPlaylist(playlist);
playlist
Playlist
required
The playlist instance
returns
SearchResult
The SearchResult instance (for chaining)

execute()

Re-execute the search:
const newResult = await result.execute();
returns
Promise<SearchResult>
A new SearchResult with fresh results

toJSON()

Convert to JSON:
const json = result.toJSON();
console.log(json.tracks.length);
returns
object
JSON representation with query, queryType, playlist, tracks, extractor, and requestedBy

Example Usage

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!');
}

Track Selection Menu

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[];
}

Build docs developers (and LLMs) love