音樂機器人

Discord 機器人[2]

   講師:乘一   

代課講師:溫室蔡

音樂機器人的原理

進入語音頻道

使用者指定曲目

從 YouTube 下載音訊到伺服器

在語音頻道中播放下載的音訊

音樂機器人的原理

進入語音頻道

使用者指定曲目

從 YouTube 下載音訊

在語音頻道中播放音訊

如何從 YouTube 下載音訊

YouTube Premium?

可疑的線上工具?

使用開源的 youtube-dl!

$ pip install yt-dlp

youtube-dl

是一個用來下載 YouTube 影片的開源專案

它在 GitHub 上擁有 120k 顆星星

以 Python 模組的形式使用

也有終端機指令介面

但它被 YouTube 抓到而被限流

所以建議用它的分支專案 yt-dlp 替代

指令範例

# 下載影片
$ yt-dlp [網址]

# 下載影片到指定路徑
$ yt-dlp [網址] -P [路徑]

# 指定影片格式
$ yt-dlp [網址] -f mp4

# 下載音訊
$ yt-dlp [網址] -x

# 指定音訊格式
$ yt-dlp [網址] -x --audio-format mp3

Python API 範例

from yt_dlp import YoutubeDL

# 設定選項
# 所有可用的選項列表:
# https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/YoutubeDL.py#L128-L278
ydl_opts = {
    'format': 'bestaudio'
    'outtmpl': './music/test.webm'
}

# 實際下載
with YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=dQw4w9WgXcQ'])

加入/離開語音頻道

從 ctx 去抓訊息作者所在的語音頻道

然後用 connect() 加入

disconnect() 離開

@bot.command()
async def join(ctx):
    await ctx.author.voice.channel.connect()

@bot.command()
async def leave(ctx):
    vc = ctx.voice_client
    await vc.disconnect()

播放音訊

假設本機已經有音訊檔案

@bot.command()
async def play(ctx):
    vc = ctx.voice_client
    vc.play(discord.FFmpegPCMAudio(檔案名稱))

可以把檔案轉成 FFmpegPCMAudio

然後在 voice_client 給它 play()

暫停/繼續/停止播放

voice_client 都有專門的 method 處理:

@bot.command()
async def pause(ctx):
    vc = ctx.voice_client
    vc.pause()

@bot.command()
async def resume(ctx):
    vc = ctx.voice_client
    vc.resume()

@bot.command()
async def stop(ctx):
    vc = ctx.voice_client
    vc.stop()

狀態判定

is_connected() 判定是否在語音頻道裡

if not vc.is_connected():
    print('The bot is not in the voice channel.')
    
if vc.is_playing():
    print('The bot is already playing something else.')

is_playing() 判定是否正在播放音訊

取得影片名稱

可以使用 extract_info():

from yt_dlp import YoutubeDL

info = YoutubeDL({}).extract_info('https://www.youtube.com/watch?v=dQw4w9WgXcQ', download=False)

print(info['title'])

佇列系統

想辦法讓使用者可以預點好幾首歌曲

然後一個接一個播放

為此需要儲存一個 queue

記錄已點的歌曲資訊

並隨著播放情況或使用者操作更新

接下來沒有簡報

姑且參考我的機器人:

Music Bot

By ck1100762蔡政廷

Music Bot

  • 191