Потоковое аудио-файл из Google Drive в голосовой канал Discord - PullRequest
2 голосов
/ 22 декабря 2019

Итак, я пытаюсь настроить музыкальную библиотеку, к которой я могу получить доступ через мой бот discord.js. В идеале я хочу передать плейлист / конкретную песню, все песни одного и того же жанра будут в одной папке, поэтому моя идея - сказать !play electronic, и бот будет воспроизводить все файлы в определенной папке. Прежде чем перейти ко всей папке, я пытался получить один файл для потоковой передачи, и вот где я застрял. Я также не нашел способа для потоковой передачи самого аудиофайла, но я скорее загружаю его и сохраняю во временном mp3-файле. Я бы принял любые предложения о том, как передавать файл в потоковом режиме, а не загружать его, если это дает большие преимущества / его значительно проще кодировать, в противном случае, как его скачать и временно сохранить во время воспроизведения (имейте в виду, что хостинг-сервисЯ использую ограниченное доступное хранилище, поэтому загрузка всей папки не вариант), а также о том, как эффективнее подходить к загрузке / предварительной загрузке и организации очередей списка воспроизведения (всей музыкальной папки) для бота. ручей. Вот соответствующая часть моего кода, следуя документам API Google Диска о загрузках файлов :

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 Диска, и, если возможно, чтобудет лучшим подходом для системы очередей / списков воспроизведения.

Любой совет приветствуется, заранее спасибо.

1 Ответ

1 голос
/ 23 декабря 2019
  • Вы хотите воспроизвести файл MP3 на голосовом канале Discord.
  • Вы уже можете воспроизвести файл MP3 на голосовом канале.
  • Вы ужеудалось использовать Drive 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().

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

...