From 9d7ff5e7e7fb0ded2dee713078b13aa44e882e33 Mon Sep 17 00:00:00 2001 From: aki Date: Thu, 24 Apr 2025 02:50:11 +0800 Subject: [PATCH] feat(play.js): add source option for track search and enhance search logic --- docker-compose.yml | 4 ++-- src/commands/play.js | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 90a91d9..132332a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,8 @@ services: # Removed LAVALINK_PLUGIN_URLS environment variable volumes: - ./application.yml:/opt/Lavalink/application.yml:ro,Z - # Mount local plugins directory into the container - - ./plugins:/plugins:ro + # Mount local plugins directory into the container with SELinux label + - ./plugins:/plugins:ro,Z # Add healthcheck to verify Lavalink is ready healthcheck: # Use CMD-SHELL to allow environment variable expansion for the password diff --git a/src/commands/play.js b/src/commands/play.js index 9293ea2..e4dd394 100644 --- a/src/commands/play.js +++ b/src/commands/play.js @@ -9,13 +9,23 @@ module.exports = { .addStringOption(option => option.setName('query') .setDescription('The URL or search term for the song/playlist') - .setRequired(true)), + .setRequired(true)) + .addStringOption(option => + option.setName('source') + .setDescription('Specify the search source (defaults to YouTube Music)') + .setRequired(false) + .addChoices( + { name: 'YouTube Music', value: 'youtubemusic' }, + { name: 'YouTube', value: 'youtube' }, + { name: 'SoundCloud', value: 'soundcloud' } + )), async execute(interaction, client) { await interaction.deferReply(); // Defer reply immediately const member = interaction.member; const voiceChannel = member?.voice?.channel; const query = interaction.options.getString('query'); + const source = interaction.options.getString('source'); // Get the source option // 1. Check if user is in a voice channel if (!voiceChannel) { @@ -67,9 +77,32 @@ module.exports = { logger.info(`Moved player to voice channel ${voiceChannel.name} (${voiceChannel.id}) for play command.`); } - // 4. Search for tracks + // 4. Determine search identifier based on query and source + let identifier; + const isUrl = query.startsWith('http://') || query.startsWith('https://'); + + if (isUrl) { + identifier = query; // Use URL directly + } else { + // Prepend search prefix based on source or default + switch (source) { + case 'youtube': + identifier = `ytsearch:${query}`; + break; + case 'soundcloud': + identifier = `scsearch:${query}`; + break; + case 'youtubemusic': + default: // Default to YouTube Music if source is 'youtubemusic' or not provided + identifier = `ytmsearch:${query}`; + break; + } + } + logger.debug(`Constructed identifier: ${identifier}`); + + // 5. Search for tracks using the constructed identifier const searchResults = await musicPlayer.search({ // Use the player instance from the client - query: query, + identifier: identifier, // Pass the constructed identifier requester: interaction.user }); @@ -81,9 +114,9 @@ module.exports = { return; } - // 5. Add track(s) to queue and create response embed + // 6. Add track(s) to queue and create response embed const responseEmbed = new EmbedBuilder().setColor('#0099ff'); - + // Add first track (or all tracks if it's a playlist) const firstTrack = searchResults[0];