discord.pyでローカルの.mp3を再生させる
ローカルでしか動かしていないです。Herokuにffmpegをビルドするのがめんどそうで腰が重く、必要なときだけローカルで動かすだけでいいやと思ってます。
Botはこいつ
完了チェック
✅ !!play <引数>でローカルの/mp3フォルダに入っている<引数>.mp3を再生する。
✅ 引数には.mp3を入力しないことを想定しているが、入れてしまった場合は.mp3を削って元の引数に代入する。
✅ 引数のmp3が/mp3フォルダにない場合はエラーを返す。
✅ コマンドを打った人がVCに入っていない場合はエラーを返す。
✅ !!byeコマンドでVCから抜ける。
✅ VC内の最後の一人が抜けたらBOTも一緒に抜ける。
❌ 指定の.mp3を再生し終わったら抜ける
❌ ループ再生
❌ ある.mp3を再生中に!!play <別の引数>で別の曲にスキップ
cogsのコード全体
不要なライブラリもimportしてますがかんべんしてください。一応動いてるみたい。
cogで機能をつなぎ合わせている場合はこのままコピペでOKのはず...
code:python
import discord
from discord import message
from discord.ext import commands
from datetime import datetime, timedelta, timezone
import ffmpeg
import os
class Play(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.command()
async def play(self, ctx, mp3name):
if '.mp3'in mp3name:
namewomp3 = mp3name.rstrip('.mp3')
mp3name = namewomp3
else:
pass
mp3path = f'./mp3/{mp3name}.mp3'
if(os.path.isfile(mp3path)):
if ctx.author.voice and ctx.author.voice.channel:
finished = False
vc = ctx.author.voice.channel
await vc.connect()
# 続いて引数名のmp3をvolume 0.1で再生する
source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio(f"mp3/{mp3name}.mp3"), volume=0.1)
ctx.guild.voice_client.play(source)
else:
await ctx.send("VCに入ってからコマンドを使用してください。")
else:
await ctx.send("そのmp3はなさそうです...")
return
@commands.command()
async def bye(self, ctx):
await ctx.guild.voice_client.disconnect()
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
voice_state = member.guild.voice_client
if voice_state is None:
return
if len(voice_state.channel.members) == 1:
await voice_state.disconnect()
def setup(bot):
bot.add_cog(Play(bot))