/// <summary> /// Queues serached spotify songs to the player queue /// </summary> /// <param name="player">Instance of <see cref="LavaPlayer" /> for the guild</param> /// <param name="spotifyTracks"><see cref="List{T}"/> of spotifyTracks</param> /// <param name="requester">Requester of the song</param> /// <returns></returns> public async Task QueueSpotifyToPlayer(LavaPlayer player, List <string> spotifyTracks, IGuildUser requester = null) { _ = Task.Run(async() => { int startIdx = 0; await Program.BotConfig.BotEmbedMessage.ModifyAsync(x => { x.Content = string.Format(QueueMayHaveSongs, "Loading..."); }).ConfigureAwait(false); if (player.PlayerState is PlayerState.Connected or PlayerState.Stopped) { var node = await Node.SearchYouTubeAsync(spotifyTracks[0]); if (node.LoadStatus != LoadStatus.NoMatches || node.LoadStatus != LoadStatus.LoadFailed) { await player.PlayAsync(node.Tracks[0].CreateMuseTrack(requester)); } startIdx = 1; } if (spotifyTracks.Count - startIdx > 0) { var lavaTracks = spotifyTracks.Skip(startIdx).OrderedParallelAsync(async e => { int i = 0; int maxRetries = 3; Victoria.Responses.Rest.SearchResponse node; do { node = await Node.SearchYouTubeAsync(e); i++; } while (node.LoadStatus is LoadStatus.NoMatches or LoadStatus.LoadFailed && i <= maxRetries); LavaTrack first = null; foreach (var track in node.Tracks) { first = track; break; } return(node.LoadStatus is LoadStatus.NoMatches or LoadStatus.LoadFailed ? null : first?.CreateMuseTrack(requester)); }); SpinWait.SpinUntil(() => lavaTracks.Count() == spotifyTracks.Count - startIdx); foreach (var track in lavaTracks) { player.Queue.Enqueue(track); } } var newQueue = await GetNewEmbedQueueString(player).ConfigureAwait(false); var embed = await embedHelper.BuildMusicEmbed(player, Color.DarkGreen).ConfigureAwait(false); var content = newQueue switch { "" => NoSongsInQueue, _ => string.Format(QueueMayHaveSongs, newQueue) }; await Program.BotConfig.BotEmbedMessage.ModifyAsync(x => { x.Embed = embed; x.Content = content; }).ConfigureAwait(false); }); await Task.CompletedTask; }