huh4k ~/dev
Case Study

Discord Music Streamer & Audio Automation

Modern Discord audio bot written in Python using discord.py slash commands, streaming low-latency audio via yt-dlp and FFmpeg with local directory queuing.

Python discord.py yt-dlp FFmpeg Audio Streaming

Overview

A Discord audio bot built using modern discord.py app commands (slash commands) providing reliable, high-fidelity music streaming for community voice channels. It seamlessly bridges online YouTube audio extraction with local high-resolution MP3 libraries and automated playlist queue management.


Architectural Highlights

  • Slash Commands Architecture: Modern command interface leveraging discord.app_commands with autocomplete and typed input validation.
  • Audio Pipeline Integration: Combines yt-dlp for on-the-fly audio extraction with FFmpeg transcoding into PCM audio streams consumed by Discord voice gateways.
  • Local & Remote Hybrid Queueing: Supports playing ad-hoc YouTube queries as well as local MP3 directories and nested playlists with zero delay.
  • Robust State Handling: Sliding audio buffers, connection recovery handlers, and auto-disconnect timers when voice channels become idle.
# Slash command for playing tracks via yt-dlp stream extraction
@bot.tree.command(name="play", description="Search and stream audio in voice channel")
@app_commands.describe(query="Song title or YouTube URL")
async def play(interaction: discord.Interaction, query: str):
    await interaction.response.defer()
    voice_client = interaction.guild.voice_client
    
    if not voice_client:
        voice_client = await interaction.user.voice.channel.connect()

    audio_source = await AudioPlayer.create_source(query, loop=bot.loop)
    voice_client.play(audio_source, after=lambda e: print(f'Player error: {e}') if e else None)
    
    await interaction.followup.send(f"🎶 Now playing: **{audio_source.title}**")

Key Features

  1. Commands Suite: /play, /play_url, /play_mp3, /play_playlist, /skip, /nowplaying, /loop, /stop.
  2. Audio Metadata: Parses ID3 tags locally using eyed3 for track info and duration display.
  3. Environment Isolation: Configured with python-dotenv for secure secret credential management.