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
記錄已點的歌曲資訊
並隨著播放情況或使用者操作更新
接下來沒有簡報
姑且參考我的機器人: