title: Discord Music Bot - Queue (discord.py)
body: <p>I am a beginner programmer (or so it seems to me) and I need help implementing a queue in a music bot.</p>
  <p>At the moment, the queue works fine only when there is one song in it. If there are more songs, then the &quot;recursion&quot; starts (after = await serverQueue (voice, message) from def play and await play (queue.pop (0), voice, message) from queue), and all songs just skipped.</p>
  <pre><code>import discord
  import nacl
  import ffmpeg
  from discord import FFmpegPCMAudio
  from discord.utils import get
  from youtube_dl import YoutubeDL
  
  client = discord.Client()
  
  async def join(message):
      ##Connect to channel
      connection = message.author.guild.voice_client
      idUserChannel = message.author.voice.channel.id
      idBotChannel = 0
      if connection:
          idBotChannel = client.voice_clients[0].channel.id
      if (connection) and (idBotChannel != idUserChannel) :
          await message.channel.send('**Moving to** ' + str(message.author.voice.channel))
          await connection.move_to(message.author.voice.channel)
      elif (idBotChannel != idUserChannel):
          await message.channel.send('**Connect to** ' + str(message.author.voice.channel))
          await message.author.voice.channel.connect()
          
  async def play(video_link, voice, message):
      ##Playing songs
      ydl_opts = {'format': 'bestaudio', 'noplaylist':'True'}
      FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
      with YoutubeDL(ydl_opts) as ydl:
          info = ydl.extract_info(video_link, download = False)
      print(info.get('title'))
      URL = info['formats'][0]['url']
      print(URL)
      voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS), after = await serverQueue(voice, message))
      voice.is_playing()
      await message.channel.send('**Now playing** - ' + info.get('title'))
  
  async def skip(voice, message):
      ##Skip
      voice.stop()
      await serverQueue(voice, message)
      await message.channel.send('**Successfully skiped** - ' + info.get('title'))
      
  ##Queue
  queue = []
  async def serverQueue(voice, message):
      if queue != [] and not voice.is_playing():
          await play(queue.pop(0), voice, message)
          print('queue - ' + str(queue))
  
  @client.event
  async def on_message(message):
      if message.author == client.user:
          return
          
      if message.content.startswith('&amp;' + 'join'):
          await join(message)
          
      ##Connect and play
      if message.content.startswith('&amp;' + 'play'):
          await join(message)
          voice = get(client.voice_clients, guild = message.channel.guild)
          msg = message.content[1:].split()
          video_link = msg[1]
          if not voice.is_playing():
              await play(video_link, voice, message)
          else:
              await message.channel.send('Added to queue successfully')
              queue.append(video_link)
  
      ##Skip
      if message.content.startswith('&amp;' + 'skip'):
          voice = get(client.voice_clients, guild = message.channel.guild)
          await skip(voice, message)
  </code></pre>
  <p>I tried to work around this in different ways, for example, introduced a second variable, but this did not lead to success. I would be grateful for any help.</p>