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再生でした。