Пишу бота на discord.js. При попытке проиграть песню бот вылетает из голосового канала с ошибкой ffmpeg stream: write EPIPE. С чем это может быть связано? play(guild, song) { return new Promise(async (resolve, reject) => { const serverQueue = await this.queue.get(guild.id); if (!song) { if (!serverQueue.songs) return; serverQueue.voiceChannel.leave(); return this.queue.delete(guild.id); } const dispatcher = serverQueue.connection .play(ytdl(serverQueue.songs[0].url, { quality: 'highestaudio', filter: 'audioonly', highWaterMark: 1 << 25 })) .on("finish", () => { if (serverQueue.songs.length < 1) return this.emit('queueEnded', serverQueue); if (serverQueue.loop) { this.play(guild, serverQueue.songs[0]); resolve(this.emit('playingSong', serverQueue)); } else if (serverQueue.queueLoop) { let lastsong = serverQueue.songs.shift(); serverQueue.songs.push(lastsong); this.play(guild, serverQueue.songs[0]); resolve(this.emit('playingSong', serverQueue)); } else { serverQueue.songs.shift(); this.play(guild, serverQueue.songs[0]); if (serverQueue.songs.length < 1) { serverQueue.voiceChannel.leave(); this.queue.delete(guild.id); resolve(this.emit('queueEnded', serverQueue)); } else { resolve(this.emit('playingSong', serverQueue)); } } }) .on("error", error => { serverQueue.voiceChannel.leave(); this.queue.delete(guild.id); resolve(this.emit('playerError', error)); }); dispatcher.setVolumeLogarithmic(serverQueue.volume); }) } Code play(guild, song) { return new Promise(async (resolve, reject) => { const serverQueue = await this.queue.get(guild.id); if (!song) { if (!serverQueue.songs) return; serverQueue.voiceChannel.leave(); return this.queue.delete(guild.id); } const dispatcher = serverQueue.connection .play(ytdl(serverQueue.songs[0].url, { quality: 'highestaudio', filter: 'audioonly', highWaterMark: 1 << 25 })) .on("finish", () => { if (serverQueue.songs.length < 1) return this.emit('queueEnded', serverQueue); if (serverQueue.loop) { this.play(guild, serverQueue.songs[0]); resolve(this.emit('playingSong', serverQueue)); } else if (serverQueue.queueLoop) { let lastsong = serverQueue.songs.shift(); serverQueue.songs.push(lastsong); this.play(guild, serverQueue.songs[0]); resolve(this.emit('playingSong', serverQueue)); } else { serverQueue.songs.shift(); this.play(guild, serverQueue.songs[0]); if (serverQueue.songs.length < 1) { serverQueue.voiceChannel.leave(); this.queue.delete(guild.id); resolve(this.emit('queueEnded', serverQueue)); } else { resolve(this.emit('playingSong', serverQueue)); } } }) .on("error", error => { serverQueue.voiceChannel.leave(); this.queue.delete(guild.id); resolve(this.emit('playerError', error)); }); dispatcher.setVolumeLogarithmic(serverQueue.volume); }) }
xyligan00, async play() // this is my function for playing music on the bot { if (this.queue.length === 0) return; if (!this.guild.me.voice || !this.guild.me.voice.channel) return; let connection = this.guild.me.voice.connection; if (!connection) return; if (connection.dispatcher) return; let track = this.queue[0]; let channel = this.guild.channels.cache.get(track.channelID); switch (track.type) { //case "soundcloud" omitted case "youtube": { const video = ytdl(track.url, { highWaterMark: 5242880 }); video.on("error", (err) => console.log(err)); channel.send(`playing: **${track.name}** // requester: **${track.requester.tag}**`); let dispatcher = connection.play(video); // dispatcher will begin dispatcher.setVolume(this.volume); dispatcher.on("finish", () => this.finish()); // almost immediately the following will be called // fyi: there isn't anything special in the function called, just some code to shift the queue break; } } } Code async play() // this is my function for playing music on the bot { if (this.queue.length === 0) return; if (!this.guild.me.voice || !this.guild.me.voice.channel) return; let connection = this.guild.me.voice.connection; if (!connection) return; if (connection.dispatcher) return; let track = this.queue[0]; let channel = this.guild.channels.cache.get(track.channelID); switch (track.type) { //case "soundcloud" omitted case "youtube": { const video = ytdl(track.url, { highWaterMark: 5242880 }); video.on("error", (err) => console.log(err)); channel.send(`playing: **${track.name}** // requester: **${track.requester.tag}**`); let dispatcher = connection.play(video); // dispatcher will begin dispatcher.setVolume(this.volume); dispatcher.on("finish", () => this.finish()); // almost immediately the following will be called // fyi: there isn't anything special in the function called, just some code to shift the queue break; } } }