我正在将 ytdl-core 用于音乐机器人,它一直输出未定义播放

Posted

技术标签:

【中文标题】我正在将 ytdl-core 用于音乐机器人,它一直输出未定义播放【英文标题】:I'm using ytdl-core for a music bot, and it keeps outputting that play is not defined 【发布时间】:2019-08-25 17:40:25 【问题描述】:

我正在使用 ytdl-core 和 node-opus 为我的机器人添加音乐功能。我也在关注一个教程。在我开始添加排队功能之前,该机器人运行良好。当我整合排队时,机器人仍然可以加入和离开语音频道,但不能播放音乐。它输出(node:22116) UnhandledPromiseRejectionWarning: ReferenceError: play is not defined

根据视频中的 cmets,我尝试将 play 切换为 playstream。这最初有效,但没有帮助,只输出它未定义。

命令如下:

      if (!message.member.voiceChannel) return message.channel.send("You must be connected to a voice channel.");
      if (!args[0]) return message.channel.send("You must supply a __valid__ URL.");
      let validate = await ytdl.validateURL(args[0]);
      if (!validate) return message.channel.send("You must supply a __valid__ URL.");
      let info = await ytdl.getInfo(args[0]);
      let data = active.get(message.guild.id) || ;
      if (!data.connection) data.connection = await message.member.voiceChannel.join();
      if (!data.queue) data.queue = [];
      data.guildID = message.guild.id; 
      data.queue.push (
        songTitle: info.title,
        requester: message.author.tag,
        url: args[0],
        announceChannel: message.channel.id
      );
      if (!data.dispatcher) play();
      else 
        message.channel.send(`Added song to queue: $info.title || Requested by: $message.author.id`);
        active.set(message.guild.id, data);

我希望仍然能够按照教程来完全集成排队。

【问题讨论】:

【参考方案1】:

你之前的代码中没有定义play()函数,所以你也不能使用它。

下面是一个示例,说明您的play() 函数的外观

const queue = msg.client.queue;
const ytdl = require('ytdl-core');

async function play(guild, song) 
    const serverQueue = await queue.get(guild.id);

    if (!song) 
        await serverQueue.voiceChannel.leave();
        await queue.delete(guild.id);
        return;
    

    const stream = await ytdl(song.url, 
        filter: 'audioonly'
    );
    const dispatcher = await serverQueue.connection.playStream(stream)
        .on('end', async reason => 
            if (reason === 'Stream is not generating quickly enough.');
            serverQueue.songs.shift('Stream is not generating quickly enough');
            await play(guild, serverQueue.songs[0]);
        )
        .on('error', error => console.error(error));
    dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);

我的队列构造如下:

const queueConstruct = 
                    textChannel: msg.channel,
                    voiceChannel: voiceChannel,
                    connection: null,
                    songs: [],
                    volume: 2,
                    playing: true
                ;

可能是您必须更改一些代码行,以便它适用于您的机器人!

【讨论】:

以上是关于我正在将 ytdl-core 用于音乐机器人,它一直输出未定义播放的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 音乐机器人:TypeError:this.inputMedia.pipe 不是函数

我在 ytdl-core 包上收到 404 错误

Node.js - 我不断收到以下错误:错误:ffmpeg 流:写入 EPIPE

ytdl-core - 将视频标题存储在变量中

Discord bot 无法使用 ytdl-core 播放歌曲

请求中使用了 Cookie 标头,但无法找到 YouTube 身份令牌