将音频文件从 Google 驱动器流式传输到 Discord 语音频道

Stream an audio file from Google Drive into a Discord voice channel

所以我正在尝试建立一个我可以从我的 discord.js 机器人访问的音乐库。理想情况下,我想播放一首 playlist/specific 歌曲,同一流派的所有歌曲都将在同一个文件夹中,所以我的想法是说 !play electronic 并且机器人将播放特定文件夹中的所有文件.在进入整个文件夹之前,我一直在尝试让一个文件流式传输,这就是我遇到的问题。我也没有找到一种方法来流式传输音频文件本身,但我宁愿下载它并将其存储在一个临时的 mp3 文件中。我会接受任何关于如何流式传输文件而不是下载文件的建议,如果它提供任何大 benefits/is 明显更容易编码,否则如何下载它并在播放时临时存储它(请记住我正在使用的托管服务的可用存储空间有限,因此无法下载整个文件夹),以及如何以有效的方式处理 loading/pre-loading 和播放列表(整个音乐文件夹)排队机器人流。这是我的代码的相关部分,在 Google Drive API docs about file downloads:

之后
if (message.member.voiceChannel) {
    var temp = fs.createWriteStream('./tmpsong.mp3');
    drive.files.get({
        fileId: '1JTJ7W9C6NBBtjcLhD6P4G9YeXvPQxaBP',
        alt: 'media'
    }).on('end', function () {
        console.log('Done');
    }).on('error', function (err) {
        console.log('Error during download', err);
    }).pipe(temp).then(() => {
        message.member.voiceChannel.join().then(connection => {
            const dispatcher = connection.playFile('./tmpsong.mp3');
            dispatcher.on("end", end => { message.member.voiceChannel.leave(); });
        });
    }).catch(err => console.log(err));
}

这是我遇到的错误:

An error occurred while running the command: TypeError: drive.files.get(...).on is not a function.

我尝试删除两个 .on() 函数并在 .get() 之后仅保留 .pipe(temp),但我得到了同样的错误:

An error occurred while running the command: TypeError: drive.files.get(...).pipe is not a function.

为了澄清,我已经知道如何让机器人加入 Discord 语音频道并让它播放音频文件,我只需要知道如何从 Google 获取我需要的文件驱动器,如果可能的话,什么是 queue/playlist 系统的最佳方法。

欢迎任何建议,提前致谢。

  • 您想在 Discord 的语音频道播放 MP3 文件。
  • 您已经可以在语音通道播放MP3文件了
  • 您已经可以使用云端硬盘 API。
  • 您想了解下载MP3文件并使用下载的文件播放的方法。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

修改点:

  • 在您的脚本中,您下载了 MP3 文件并将其保存为临时文件,然后尝试使用临时文件播放 MP3 文件。
    • 在这种情况下,我认为可以在不使用流创建临时文件的情况下播放 MP3 文件。

修改后的脚本:

当你的脚本修改后,变成如下。

if (message.member.voiceChannel) {
  drive.files.get(
    {
      fileId: '1JTJ7W9C6NBBtjcLhD6P4G9YeXvPQxaBP',
      alt: "media"
    },
    { responseType: "stream" },
    (err, { data }) => {
      message.member.voiceChannel
        .join()
        .then(connection => {
          const dispatcher = connection.playStream(data);
          dispatcher.on("end", end => {
            message.member.voiceChannel.leave();
            process.exit();
          });
        })
        .catch(err => console.log(err));
    }
  );
}
  • 在这种情况下,当MP3播放结束后,脚本退出process.exit()

参考文献:

如果我误解了你的问题,这不是你想要的方向,我很抱歉。