2018.04.03
discordrbでYouTube再生
youtube-dl を使って、ストリーミング再生ができるようにしてみます。
事前準備
この記事 を参考に音声機能を使えるようにしておく。
youtube-dlのダウンロード
youtube-dlの最新版をダウンロードをしてPATHを通しておく。
使い方
youtube-dl -f bestaudio -g 動画のID
で音声のみのURLが取得できるので、
これをBotに組み込めばOK。
実装
::RBNACL_LIBSODIUM_GEM_LIB_PATH = 'libsodium.dll'
# 証明書のフルパスを指定
ENV["SSL_CERT_FILE"] = 'E:/Ruby23/cacert.pem'
require 'discordrb'
TOKEN = 'TOKEN'
CLIENT_ID = 'CLIENT_ID'
bot = Discordrb::Commands::CommandBot.new token: TOKEN,
client_id: CLIENT_ID, prefix: '!'
# 再生コマンド
bot.command(:play) do |event, id|
# ボイスチャンネルに接続
bot.voice_connect(event.user.voice_channel)
event.respond 'ボイスチャンネルに接続しました'
# youtube-dlで音声ファイルのURLを取得
url = `youtube-dl -f bestaudio -g #{id}`.strip
# 再生
event.respond '再生開始'
event.voice.play_io(open(url))
# 実行されない?
event.respond '再生停止'
end
bot.run
SSL_connect
エラーが出る場合は、
証明書のパスを指定してあげると解決できました。
Windows上のRubyでSSL接続時にcertificate verify failedが出る場合の対処
strip
を入れないと一部の動画でbad URI
エラーが出るみたいです。
[Ruby] URI#split, URI#parseでエラー?
play_io()
で再生すると、
再生終了後の処理が行われない不具合があるっぽい?playing?
を確認してみると、
再生終了後も何故かtrue
のままでした。
とりあえずstopコマンドを実装して誤魔化します。
bot.command(:stop) do |event|
event.voice.stop_playing
event.respond '再生停止'
end
以上、
discordrbでYouTube再生でした。