javascript - Typescript DiscordJS-bot lyd slutter å fungere etter noen sekunder med avspilling
Jeg står for øyeblikket overfor et problem med å spille av lyd gjennom en bot jeg laget for Discord. Botten laster ned en sang fra YouTube ved bruk av ytdl-core og spiller den deretter, men sangen stopper etter noen sekunder med avspilling.
Her er min "play.ts"-fil, som inkluderer play-kommandoen: (beklager for det rotete koden, jeg prøver bare å sette sammen noe her.)
import { CommandInteraction, SlashCommandBuilder } from "discord.js";
import { getVoiceConnection, createAudioPlayer, createAudioResource, NoSubscriberBehavior } from '@discordjs/voice';
import { join } from "path";
import ytdl from 'ytdl-core';
import fs from 'fs';
export const data = new SlashCommandBuilder()
.addStringOption(option =>
option.setName("link")
.setDescription("Link to the audio source to be played.")
.setRequired(true)
)
.setName("play")
.setDescription("Plays audio from given URL.");
export async function execute(interaction: CommandInteraction) {
if (!interaction.guildId) {
return interaction.reply("Something went really, really wrong.");
}
const url = interaction.options.getString("link");
const connection = getVoiceConnection(interaction.guildId);
if (!connection) {
return interaction.reply("Bot is not currently in a voice channel. Join one before using this command.");
}
const audioplayer = createAudioPlayer({
behaviors: {
noSubscriber: NoSubscriberBehavior.Pause,
},
});
const download = ytdl(url, { filter: 'audioonly' });
const writestream = fs.createWriteStream('audio.mp4');
const pathtoresource = join('audio.mp4');
// console.log(pathtoresource);
download.pipe(writestream);
const resource = createAudioResource(pathtoresource, {
inlineVolume: true,
metadata: {
title: "SONG",
},
});
audioplayer.play(resource);
connection.subscribe(audioplayer);
return interaction.reply(`Playing from: ${url}`);
}
Det bør spille av lydfilen etter å ha lastet ned sangen, men noen ganger spiller det noen sekunder av sangen, andre ganger ingenting i det hele tatt. (kanskje fordi nedlastingen ikke er ferdig i tide til å spille, men jeg vet ikke hvordan jeg får det til å vente på ytdl-nedlastingen.)
All hjelp settes stor pris på! (nok en gang, beklager for rotete kode, jeg lærer fortsatt)
REDIGER: Dette er intensjonene:
const client = new Client({
intents: ["Guilds", "GuildMessages", "DirectMessages", "GuildVoiceStates" ],
});
Svar #1
Det du opplever er ikke et problem med Discord-intents. ytdl-core var ikke laget med tanke på å holde HTTP-tilkoblinger åpne over lengre tid. Dette skjer når man streamer media til noe som bruker dataene langsommere enn den hastigheten de blir sendt inn med.
En annen npm-pakke kjent som play-dl løser dette problemet (og legger til støtte for andre strømmetjenester, noe som virkelig er prikken over i-en). Sjekk ut eksempelet på Discord-bot-koden her for å se hvordan den brukes.
I mine gamle Discord-bot-prosjekter brukte jeg play-dl etter å ha opplevd det samme problemet med ytdl-core, og ting gikk problemfritt. Hvis du trenger mer hjelp, spør meg i en kommentar på dette innlegget.