Voice API

This page assumes you’ve completed Creating a Simple Hello World Module. If not, check the previous pages.

If you want play some nice beats on your voice channels, you can use the voice API.

Connecting To A Channel

To connect to a channel, create a new VoiceManager instance and call connect:

vm = VoiceManager(self.client, message.author.voice_channel)
vm.connect()

Playing Audio

There are two functions that deal with actually sending audio to Discord: play_file and play_url:

await vm.play_file("test.mp3")
await vm.play_url("https://www.youtube.com/watch?v=63qtYi1nwcs")

Music Queues & YouTube Playlists

Warning

The playlist parts of the voice API (Especially with YouTube interaction) can be inconsistent, slow and unreliable. Proceed with caution.

To support both music queues and YouTube playlists, the PlaylistManager wrapper must be used:

pm = PlaylistManager(vm)

Adding Music To Playlist

To add music to the playlist simply use the add function:

pm.add(PlaylistType.URL, "https://www.youtube.com/watch?v=dQw4w9WgXcQ")

Importing Playlists From YouTube

To import a playlist from YouTube, use import_from:

await pm.import_from("https://www.youtube.com/playlist?list=PLOy0j9AvlVZPto6IkjKfpu0Scx--7PGTC")

Warning

Importing a playlist from YouTube can take a long time depending on the video count and your internet speed as all videos metadata need to be downloaded before import.

YouTube Searches

To add a video from a YouTube search, use search_and_add:

await pm.search_and_add("streets agent 112")

Warning

Searching on YouTube can take a some time depending on your internet speed as the search must happen and metadata need to be downloaded before import.

Music Control

When using PlaylistManager, there are some music control functions that need to be ran from the PlaylistManager instead of the VoiceManager. These are play, stop and skip:

await pm.play()
pm.skip()
pm.stop()

Doing Something When A Playlist Item Starts Playing

To do something when a playlist item starts playing, use the callback argument:

def on_play(self, m: discord.Message):
    async def actual_on_play():
        pm: PlaylistManager = get_pm_from_somewhere(m.server.id)

        if not pm.voice.is_player_ytdl:
            # Non-YTDL players don't have as much information. This is a discord.py
            # Thing.
            await self.client.send_message(m.channel, embed=success_embed(
                title="Started playing!"
            ))

        e = discord.Embed(
            title=pm.voice.player.title,
            url=pm.voice.player.url,
            description=pm.voice.player.description
        )

        await self.client.send_message(m.channel, embed=e)

    return actual_on_play

await pm.play(callback=self.on_play(message))