public async Task <IEnumerable <string> > Audios([FromBody] TextBody textBody)
        {
            var tokenizer = new TextTokenizer();
            var tokens    = tokenizer.GetWords(textBody.Input);
            var audios    = new List <string>();

            foreach (var token in tokens)
            {
                var composition = new Composition {
                    Return = new ContentSegment {
                        Url = $"https://forvo.com/word/{token.Value.RemoveAccents()}/#ru", Select = "span.play"
                    }
                };
                var elements = await composition.Return.DocumentElement();

                foreach (var element in elements)
                {
                    var onclick      = element.GetAttribute("onclick");
                    var onclickParts = onclick.Split(',');
                    if (onclickParts.Count() >= 5)
                    {
                        audios.Add(Encoding.UTF8.GetString(Convert.FromBase64String(onclickParts[4].Trim(new[] { '\'', '"' }))));
                    }

                    if (audios.Count >= 5)
                    {
                        break;
                    }
                }
            }
            return(audios);
        }
        public async Task <string> Detail([FromBody] TextBody textBody)
        {
            var composition = new Composition {
                Return = new ContentSegment {
                    Url = $"https://en.openrussian.org/ru/{textBody.Input}", Select = "div.page"
                }
            };
            var elements = await composition.Return.DocumentElement();


            return(elements.FirstOrDefault().OuterHtml);
        }
        public async Task <WordInfo> WordInfo([FromBody] TextBody textBody)
        {
            var info = new WordInfo();

            using (var client = new HttpClient())
            {
                var response = await client.GetAsync($"https://en.openrussian.org/suggestions?q={textBody.Input}");

                response.EnsureSuccessStatusCode();
                var json = await response.Content.ReadAsStringAsync();

                var term = JsonConvert.DeserializeObject <ORTerm>(json);

                if (term.Words.Length > 0 && textBody.Input.ToLower() == term.Words[0].Ru)
                {
                    var word = term.Words[0];
                    info.Word         = word.Ru;
                    info.AccentedWord = word.RuAccented == string.Empty ? word.Ru : word.RuAccented;

                    var translationString = "";
                    if (word.Translations.Length > 0)
                    {
                        foreach (var translation in word.Translations[0])
                        {
                            translationString += $" {translation}";
                        }
                    }
                    info.Translation = translationString;
                }
                if (term.Derivates.Length > 0)
                {
                    var derivate = term.Derivates[0];
                    info.Derivate = derivate.BaseBare;
                    if (info.Translation == string.Empty)
                    {
                        info.Translation = derivate.Translation;
                    }
                }

                if (info.Word == string.Empty)
                {
                    info.Word = textBody.Input;
                }

                return(info);
            }
        }
        public async Task <Translation> Translation([FromBody] TextBody textBody)
        {
            var translation = new Translation();

            using (var service = new TranslateService(new BaseClientService.Initializer
            {
                ApiKey = "AIzaSyBiPTuvLggID2YrmBshuHBZhij6HeFOxko",
                ApplicationName = "Project Name"
            }))
            {
                var input = textBody.Input;

                if (input.StartsWith("en:"))
                {
                    var russianResponse = await service.Translations.List(new string[] { input.Replace("en:", "") }, "ru").ExecuteAsync();

                    input = russianResponse.Translations[0].TranslatedText;
                }


                var tokenizer = new TextTokenizer();
                var blocks    = tokenizer.GetBlocks(input);

                var blockResponse = await service.Translations.List(blocks.Select(t => t.OriginalText).ToArray(), "en").ExecuteAsync();


                for (int i = 0; i < blockResponse.Translations.Count; i++)
                {
                    blocks[i].TranslatedText = blockResponse.Translations[i].TranslatedText;
                    var words        = tokenizer.GetWords(blocks[i].OriginalText);
                    var wordResponse = await service.Translations.List(words.Select(t => t.Value).ToArray(), "en").ExecuteAsync();

                    for (int j = 0; j < wordResponse.Translations.Count; j++)
                    {
                        words[j].Translation = wordResponse.Translations[j].TranslatedText;
                        blocks[i].Words.Add(words[j]);
                    }
                    translation.Blocks.Add(blocks[i]);
                }
                return(translation);
            }
        }