async def enqueue(self, query, queue_index=None, stop_current=False, shuffle=False):
        """
        Queues songs based on either a YouTube search or a link

        Args:
            query (str): Either a search term or a link
            queue_index (str): The queue index to enqueue at (None for end)
            stop_current (bool): Whether to stop the current song after the songs are queued
            shuffle (bool): Whether to shuffle the added songs
        """

        if query is None or query == "":
            return

        self.statuslog.info("Parsing {}".format(query))
        self.logger.debug("Enqueueing from query")

        indexnum = None
        if queue_index is not None:
            try:
                indexnum = int(queue_index) - 1
            except TypeError:
                self.statuslog.error("Play index argument must be a number")
                return
            except ValueError:
                self.statuslog.error("Play index argument must be a number")
                return

        if not self.vready:
            self.parse_query(query, indexnum, stop_current, shuffle)
        else:
            parse_thread = threading.Thread(
                target=self.parse_query,
                args=[query, indexnum, stop_current, shuffle])
            # Run threads
            parse_thread.start()
Queues songs based on either a YouTube search or a link

        Args:
            query (str): Either a search term or a link
            queue_index (str): The queue index to enqueue at (None for end)
            stop_current (bool): Whether to stop the current song after the songs are queued
            shuffle (bool): Whether to shuffle the added songs