MusicBotで過去に再生した動画を自動的に再生する方法

Pocket

どうも。

以前に書いた「DiscordにMusicBotを追加しニコ動を再生させる」という記事の閲覧回数がなんと10000回を超えました。
読んでくださった多くの方々に感謝。

というわけで、それを記念してMusicBotに関する記事第二弾です。

この記事では、過去にMusicBotで!playコマンドで再生させた動画等を再生待ちのリストが空になった時に再生させる方法を紹介します。

どのようにして実現するか

MusicBotにはオートプレイリストという機能があり、config/autoplaylist.txtというファイルに動画URLを書き込むことで、再生待ちのリストが空になった時にその中からランダムで再生されます。

また、MusicBotで再生した動画は、そのデータがキャッシュとして残ります。

これらを利用して、キャッシュデータのファイル名から動画URLを生成してconfig/autoplaylist.txtに書き込むことで、「過去に再生した動画を再生待ちのリストが空になった時に再生させる」ということが実現できます。

以前から私はそれをシェルスクリプトでやっていましたが、今回この記事を書くにあたってPythonで書き直しました。

以前の記事に寄せられたコメントを見るとWindowsで動かしている方も少なくないようなのでPython 3系さえあれば環境に依存しないように書き直しました。

MusicBotと同じバージョン3.5で、標準ライブラリのみ使うようにしたので、既にMusicBotが動いている環境でそのまま動かせます。

生成できるURLはYouTubeとニコニコ動画とSoundCloudのものです。

プログラムの動かし方

  1. ここからプログラムをダウンロードする。
  2. ダウンロードしたプログラムをMusicBot直下(run.pyがある場所)に配置する
  3. ターミナル(Windowsの場合はコマンドプロンプトかPowerShell)で
    python update_autoplaylist.py

    を実行する

これらをした後、config/autoplaylist.txtが更新されているか確認してください。

あとはこれを定期的に動かすことで継続的に反映させることができます。

定期的に動かすにはLinuxやMacOSであればcron、Windowsであればタスクスケジューラを使えばできます。

それらの設定方法はググれば出てくるので、ここでは割愛させていただきます。

定期的に動かす間隔は1時間以上をおすすめします。
理由としては、

  • 常に最新である必要はない (追加した曲がその後あまり時間を空けずに自動再生されても「これさっき聞いた」となる)
  • SoundCloudは曲のIDから直接URLが生成できないためAPIにアクセスしていることで処理に時間がかかっている

などがあります。

再生待ちリストが空になったら必ずconfig/autoplaylist.txtを読み込むようにする

ファイルを定期的に更新しても、残念ながらMusicBotは起動時にしかconfig/autoplaylist.txtを読みに行かないので、連続運用している場合は更新が反映されません。

なので再生待ちリストが空になったら必ず読みに行くようにmusicbot/bot.pyを書き換えます。
(MusicBotの中のmusicbotの中のbot.pyです。大文字小文字の違う2階層になっているので気をつけてください。)

638行目のon_player_finished_playingというメソッドを書き換えますので探してください。
(記事執筆時点の最新版では638行目ですが、その後のアップデートで変わっている可能性もあるので、見つからない場合は上記メソッド名でファイル内検索してみてください。)

async def on_player_finished_playing(self, player, **_):
    if not player.playlist.entries and not player.current_entry and self.config.auto_playlist:

こうなっている部分を以下のように書き換えてください

async def on_player_finished_playing(self, player, **_):
    if not player.playlist.entries and not player.current_entry:
        self.autoplaylist = load_file(self.config.auto_playlist_file)

具体的にはand self.config.auto_playlistを消してself.autoplaylist = load_file(self.config.auto_playlist_file)を追記してください。

注意としては、追記する行の頭にはちゃんとスペース8つを入れてください。
入れないと思った通りに動きません。

以上のことで動いてくれると思います。

動かなかったり不具合を見つけた場合はこの下にあるコメントで教えてください。

長ったらしい記事にお付き合い頂きありがとうございました。

ではでは。

The following two tabs change content below.
みどりごけ

みどりごけ

スペシャルエグゼクティブアドバイザーほしい物リスト
どこぞのシェル芸大好き鯖管(自称ではない) / 基本情報技術者 / Linux (LPIC2保有) / C# / PHP / JavaScript / 食べ鉄 / Minecraft / ETS2 / GTAV / Ingress
みどりごけ

最新記事 by みどりごけ (全て見る)

1件のコメント

コメントを残す