背景
Jellyfinで音楽を再生するとPCでは問題ないのですが、iPadだとスリープ状態になると再生が止まってしまうという問題がありました。
あと、いちいちブラウザを開くのもめんどくさかったのでどうせなら常に開きっぱなしのDiscord上で操作できればいいのにと思い、Discord Botを作成することにしました。
Claude Sonnet 4.5は相当に賢いので、Discord Botくらいであればやりたいことをプロンプトで与えるだけでほぼ全部書いてくれます。
いや、本当に最近全然コード書いてないですね。
使い方
Jellyfin Discord Botでソースコードは公開しています。
主な使い方はREADME.mdに書いている(ほぼLLMが書いてくれました)ので、困ることは少ないかと思います。
JellyfinのユーザーIDはuserId=6f43b45d48xxxxxみたいな長い文字列であることを間違えなければ詰まることはないと思います。というか、JellyfinのAPIキーは権限を設定するプロセスがなかったので作成するのはちょっと怖い気もしますが、実際にはユーザーの権限で上書きされるんでしょうか?
使い方も難しいところはなく、自分がVCにいる状態でコマンドを叩けばプレイリストの選択画面がでるのでそこから選ぶだけです。
今後の方針
プレイリストが25件を超えるとDiscordの制約上、全てのプレイリストを表示できないのでここはどうしようかなと思っています。ウェブから指定できてもいいかなと思ったんですが、それだとあんまりJellyfinで再生しているのと変わらないので…
あと、本当にランダムになっているか微妙です。
性能について
CPUでエンコードしているとはいえ、音楽のエンコードは最近のCPUであればスペックが足りないことはないと思います。Jellyfinと同一のサーバーで動かす前提なのでバッファをかなり大きく取っています(通常、64KBあれば十分と言われているところを4096KBとっています)が、うちの環境だと50msくらいで取得できるので、これも実用上困ることはないでしょう。
最初、これはJellyfinのファイルのサイズが大きいのでこうしていたのですが、実際にはJellyfinサーバーからトランスコードされたMP3が降ってくるみたいなので、こんなに大きく取ると全データがメモリに乗ってしまいました。
通常のDiscordのサーバーは64kbpsでしか再生できませんが、一人でもNitroに加入していてそのユーザーがサーバーをBoostしていれば128kbpsで再生できます。DiscordのVCのOpusはそれなりに性能がいいらしいので、128kbpsもあれば個人的には十分聴くことができました。
バッファで詰まることもないので、いい感じに再生できていると思います。
まとめ
同じような感じで動画も流せるかなと思ったのですが、動画はSelfbotが必要らしくて規約上アウトっぽいのでやめました。
記事は以上。