public async Task PlayAsync(Uri uri) { await _music.AddSongAsync(Context, uri); }
public async Task AddCmd([Summary("The URL to add from YouTube, or search term."), Remainder] string urlOrTerm) { try { Song s; var key = _db.GetApiKey("youtube"); urlOrTerm = urlOrTerm.Trim('<', '>'); if (Uri.TryCreate(urlOrTerm, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)) { using (WebClient client = new WebClient()) { Regex regex = new Regex("youtu(?:.be|be.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)"); var id = regex.Match(urlOrTerm).Groups[1].Value; var json = await client.DownloadStringTaskAsync($"https://www.googleapis.com/youtube/v3/videos?id={id}&key={key}&part=snippet,contentDetails,statistics,status"); JObject obj = JsonConvert.DeserializeObject <JObject>(json); if (obj.SelectToken("pageInfo").SelectToken("totalResults").Value <int>() == 0) { return; } var songUrl = $"https://www.youtube.com/watch?v={id}"; var pleasewait = await ReplyAsync($"Searching for your track... <a:search:588920003374350356>"); var streaminfo = await _audio.GetStreamInfo(id); s = new Song { URL = songUrl, AudioURL = streaminfo.Url, Bitrate = streaminfo.Bitrate, QueuerId = Context.User.Id, ChannelId = Context.Channel.Id, GuildId = Context.Guild.Id, Author = obj.SelectToken("items").First.SelectToken("snippet.channelTitle").Value <string>(), Name = obj.SelectToken("items").First.SelectToken("snippet.title").Value <string>(), Length = System.Xml.XmlConvert.ToTimeSpan(obj.SelectToken("items").First.SelectToken("contentDetails.duration").Value <string>()), Thumbnail = obj.SelectToken("items").First.SelectToken("snippet.thumbnails.high.url").Value <string>() }; await pleasewait.DeleteAsync(); await _ms.AddSongAsync(Context, s); } } else { YouTubeService y = new YouTubeService(new BaseClientService.Initializer() { ApiKey = key }); var request = y.Search.List("snippet"); request.Q = urlOrTerm; request.Type = "video"; request.MaxResults = 10; var response = await request.ExecuteAsync(); List <string> titles = new List <string>(); int counter = 1; foreach (var result in response.Items) { titles.Add($"{counter}. {result.Snippet.Title} *by {result.Snippet.ChannelTitle}*"); counter++; } EmbedBuilder embed = new EmbedBuilder() .WithColor(_misc.RandomColor()) .WithTitle("Respond with the number that you want to add.") .WithCurrentTimestamp() .WithDescription($"**{string.Join("**\n**", titles)}**"); var message = await ReplyAsync(embed : embed.Build()); var nextMsg = await NextMessageAsync(timeout : TimeSpan.FromSeconds(30)); if (!int.TryParse(nextMsg.Content, out int number)) { await message.DeleteAsync(); return; } if (number > 10 || number < 1) { await message.DeleteAsync(); return; } var id = response.Items[number - 1].Id.VideoId; using (WebClient client = new WebClient()) { var json = await client.DownloadStringTaskAsync($"https://www.googleapis.com/youtube/v3/videos?id={id}&key={key}&part=snippet,contentDetails,statistics,status"); JObject obj = JsonConvert.DeserializeObject <JObject>(json); var songUrl = $"https://www.youtube.com/watch?v={id}"; var pleasewait = await ReplyAsync($"Searching for your track... <a:search:588920003374350356>"); var streaminfo = await _audio.GetStreamInfo(id); s = new Song { URL = songUrl, AudioURL = streaminfo.Url, Bitrate = streaminfo.Bitrate, QueuerId = Context.User.Id, ChannelId = Context.Channel.Id, GuildId = Context.Guild.Id, Author = obj.SelectToken("items").First.SelectToken("snippet.channelTitle").Value <string>(), Name = obj.SelectToken("items").First.SelectToken("snippet.title").Value <string>(), Length = System.Xml.XmlConvert.ToTimeSpan(obj.SelectToken("items").First.SelectToken("contentDetails.duration").Value <string>()), Thumbnail = obj.SelectToken("items").First.SelectToken("snippet.thumbnails.high.url").Value <string>() }; if (obj.SelectToken("items").First.SelectToken("snippet.title").Value <string>() == null) { return; } await pleasewait.DeleteAsync(); await message.DeleteAsync(); await _ms.AddSongAsync(Context, s); } } await _ms.PlayAsync(Context, s); } catch (System.Net.Http.HttpRequestException) { await ReplyAsync($"The bot has not connected to Lavalink yet. Please wait a few moments..."); } catch (Exception e) { await ReplyAsync(embed : (await _misc.GenerateErrorMessage(e)).Build()); } }