docs: def download_next_song(self, song):
          """Downloads the next song and starts playing it"""
  
          dl_ydl_opts = dict(ydl_opts)
          dl_ydl_opts["progress_hooks"] = [self.ytdl_progress_hook]
          dl_ydl_opts["outtmpl"] = self.output_format
  
          # Move the songs from the next cache to the current cache
          self.move_next_cache()
  
          self.state = 'ready'
          self.play_empty()
          # Download the file and create the stream
          with youtube_dl.YoutubeDL(dl_ydl_opts) as ydl:
              try:
                  ydl.download([song])
              except DownloadStreamException:
                  # This is a livestream, use the appropriate player
                  future = asyncio.run_coroutine_threadsafe(self.create_stream_player(song, dl_ydl_opts), client.loop)
                  try:
                      future.result()
                  except Exception as e:
                      logger.exception(e)
                      self.vafter_ts()
                      return
              except PermissionError:
                  # File is still in use, it'll get cleared next time
                  pass
              except youtube_dl.utils.DownloadError as e:
                  self.logger.exception(e)
                  self.statuslog.error(e)
                  self.vafter_ts()
                  return
              except Exception as e:
                  self.logger.exception(e)
                  self.vafter_ts()
                  return