Exemplo n.º 1
0
        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);
        }