因此,我试图建立一个音乐库,我可以从discord.js机器人中访问它。理想情况下,我希望流式播放播放列表/特定歌曲,来自同一流派的所有歌曲都将位于同一文件夹中,所以我的想法是说!play electronic
,并且该漫游器将播放特定文件夹中的所有文件。在进入整个文件夹之前,我一直在尝试流式传输单个文件,而这就是我要坚持的地方。我还没有找到一种方法来流式传输音频文件本身,但是我想下载它并将其存储在一个临时mp3文件中。我会接受有关如何流式传输文件(而不是下载文件)的任何类型的建议(如果这样做有很大的好处/很容易编写代码),否则将如何下载文件并在播放时临时存储文件(请记住托管服务)我正在使用的存储空间有限,因此不能选择下载整个文件夹),以及如何以一种有效的方式让机器人进行加载/预加载和播放列表(整个音乐文件夹)的排队流。这是我的代码的相关部分,在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()
函数,并且仅在.pipe(temp)
之后仅保留.get()
,但出现了相同的错误:
An error occurred while running the command: TypeError: drive.files.get(...).pipe is not a function.
为澄清起见,我已经知道如何使漫游器加入Discord语音通道并使其播放音频文件,我只需要知道如何从Google云端硬盘中获取所需的文件,如果可能的话,该怎么办?对于队列/播放列表系统来说,这是最好的方法。
欢迎您提出任何建议,谢谢。
如果我的理解是正确的,那么这个答案怎么样?请认为这只是几个可能的答案之一。
修改脚本后,将如下所示。
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));
}
);
}
process.exit()
退出。如果我误解了你的问题,而这不是你想要的方向,我深表歉意。