79 lines
1.8 KiB
Python
79 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
jishaku.voice
|
|
~~~~~~~~~~~~~
|
|
|
|
Voice-related functions and classes.
|
|
|
|
:copyright: (c) 2019 Devon (Gorialis) R
|
|
:license: MIT, see LICENSE for more details.
|
|
|
|
"""
|
|
|
|
import discord.opus
|
|
import discord.voice_client
|
|
from discord.ext import commands
|
|
|
|
try:
|
|
import youtube_dl
|
|
except ImportError:
|
|
youtube_dl = None
|
|
|
|
|
|
async def vc_check(ctx: commands.Context): # pylint: disable=unused-argument
|
|
"""
|
|
Check for whether VC is available in this bot.
|
|
"""
|
|
|
|
if not discord.voice_client.has_nacl:
|
|
raise commands.CheckFailure("voice cannot be used because PyNaCl is not loaded")
|
|
|
|
if not discord.opus.is_loaded():
|
|
raise commands.CheckFailure("voice cannot be used because libopus is not loaded")
|
|
|
|
return True
|
|
|
|
|
|
async def connected_check(ctx: commands.Context):
|
|
"""
|
|
Check whether we are connected to VC in this guild.
|
|
"""
|
|
|
|
voice = ctx.guild.voice_client
|
|
|
|
if not voice or not voice.is_connected():
|
|
raise commands.CheckFailure("Not connected to VC in this guild")
|
|
|
|
return True
|
|
|
|
|
|
async def playing_check(ctx: commands.Context):
|
|
"""
|
|
Checks whether we are playing audio in VC in this guild.
|
|
|
|
This doubles up as a connection check.
|
|
"""
|
|
|
|
if await connected_check(ctx) and not ctx.guild.voice_client.is_playing():
|
|
raise commands.CheckFailure("The voice client in this guild is not playing anything.")
|
|
|
|
return True
|
|
|
|
|
|
BASIC_OPTS = {
|
|
'format': 'webm[abr>0]/bestaudio/best',
|
|
'prefer_ffmpeg': True,
|
|
'quiet': True
|
|
}
|
|
|
|
|
|
class BasicYouTubeDLSource(discord.FFmpegPCMAudio):
|
|
"""
|
|
Basic audio source for youtube_dl-compatible URLs.
|
|
"""
|
|
|
|
def __init__(self, url, download: bool = False):
|
|
ytdl = youtube_dl.YoutubeDL(BASIC_OPTS)
|
|
info = ytdl.extract_info(url, download=download)
|
|
super().__init__(info['url'])
|