private async Task <Song> LoadSong(string searchText, ISocketMessageChannel feedbackChannel = null) { searchText = searchText.Replace('`', '\''); if (YoutubeClient.TryParseVideoId(searchText, out var videoId)) { // video id parsed successfully, nothing to do } else { if (feedbackChannel != null) { await feedbackChannel.SendMessageAsync($"**Searching** :mag_right: `{searchText}`"); } videoId = await SearchYoutube(searchText); if (videoId == null) { if (feedbackChannel != null) { await feedbackChannel.SendMessageAsync("Couldn't find anything for your search..."); } return(null); } } try { var detailRequest = youtubeService.Videos.List("contentDetails,snippet"); detailRequest.Id = videoId; var detailResponse = await detailRequest.ExecuteAsync(); if (detailResponse.Items.Count < 1) { throw new VideoUnavailableException(videoId, 0, ""); } if (detailResponse.Items[0].Snippet.LiveBroadcastContent != "none") { throw new VideoIsLivestreamException(); } // using XmlConvert because that supports the ISO8601 format used in the response var duration = System.Xml.XmlConvert.ToTimeSpan(detailResponse.Items[0].ContentDetails.Duration); if (duration > config.Music.MaximumSongLengthTimeSpan) { throw new VideoTooLongException(config.Music.MaximumSongLengthTimeSpan); } if (feedbackChannel != null) { var embed = new EmbedBuilder() .WithAuthor("Added to queue") .WithTitle(detailResponse.Items[0].Snippet.Title) .WithUrl($"https://www.youtube.com/watch?v={videoId}") .AddField("Channel", detailResponse.Items[0].Snippet.ChannelTitle, true) .AddField("Length", duration.ToString(), true) .WithThumbnailUrl(detailResponse.Items[0].Snippet.Thumbnails.Default__.Url) .Build(); await feedbackChannel.SendMessageAsync("", false, embed); } return(await musicService.DownloadFromYoutube(videoId)); } catch (VideoUnavailableException) { if (feedbackChannel != null) { await feedbackChannel.SendMessageAsync("I can't access that video..."); } } catch (VideoTooLongException ex) { if (feedbackChannel != null) { await feedbackChannel.SendMessageAsync($"This video is too long. Please use only videos shorter than {ex.MaxLength:m\\:ss} minutes"); } } catch (VideoIsLivestreamException) { if (feedbackChannel != null) { await feedbackChannel.SendMessageAsync("I can't use live streams"); } } return(null); }