将音频文件从 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()
。
参考文献:
如果我误解了你的问题,这不是你想要的方向,我很抱歉。
所以我正在尝试建立一个我可以从我的 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()
。
参考文献:
如果我误解了你的问题,这不是你想要的方向,我很抱歉。