public async Task <HashTagData[]> Get(SectionMedia medias)
        {
            log.LogDebug("Get tags from [{0}] posts", medias.Medias.Count);
            var table = new Dictionary <string, HashTagData>(StringComparer.OrdinalIgnoreCase);

            foreach (InstaMedia media in medias.Medias)
            {
                var text = media.Caption?.Text;
                if (string.IsNullOrEmpty(text))
                {
                    continue;
                }

                var smart = captionHandler.Extract(text);
                foreach (HashTagData tag in smart.Tags.Where(x => !string.IsNullOrEmpty(x.Text)))
                {
                    if (!table.ContainsKey(tag.Tag))
                    {
                        table[tag.Tag] = tag;
                        tag.MediaCount = 0;
                    }

                    table[tag.Tag].MediaCount += 1;
                }
            }

            log.LogInformation("Enriching {0} tags", table.Count);
            foreach (var data in table.ToArray())
            {
                if (table[data.Key].Rank.HasValue)
                {
                    continue;
                }

                var result = await smartTags.Get(data.Value).ConfigureAwait(false);

                foreach (var hashTagData in result)
                {
                    if (table.ContainsKey(hashTagData.Tag))
                    {
                        table[hashTagData.Tag] = hashTagData;
                    }
                }
            }

            return(table.Values.ToArray());
        }
        private async Task <HashTagData[]> GetMix(HashTagData[] tags, int total)
        {
            if (tags == null)
            {
                throw new ArgumentNullException(nameof(tags));
            }

            logger.LogInformation("Getting mix from {0} tags", tags.Length);

            var table = new Dictionary <string, HashTagData>(StringComparer.OrdinalIgnoreCase);

            foreach (var tag in tags)
            {
                table[tag.Text] = tag;
            }

            var tagsResults = new List <List <HashTagData> >();

            foreach (var tag in tags)
            {
                var result = await smartTags.Get(tag).ConfigureAwait(false);

                result = result.Where(item => item.MediaCount.HasValue).ToArray();
                if (result.Length > 0)
                {
                    tagsResults.Add(result.OrderByDescending(item => item.MediaCount).ToList());
                }
            }

            int indexResults = 0;

            while (table.Count < total)
            {
                if (tagsResults.Count == 0)
                {
                    logger.LogInformation("Tag population completed - all sources depleted");
                    break;
                }

                if (indexResults >= tagsResults.Count)
                {
                    indexResults = 0;
                }

                var  current = tagsResults[indexResults];
                bool added   = false;
                while (current.Count > 0)
                {
                    var selected = current[0];
                    current.RemoveAt(0);
                    if (!table.ContainsKey(selected.Text))
                    {
                        table.Add(selected.Text, selected);
                        added = true;
                        break;
                    }
                }

                if (!added)
                {
                    tagsResults.RemoveAt(indexResults);
                }
                else
                {
                    indexResults++;
                }
            }

            return(table.Values.ToArray());
        }
        public async Task GetSmart()
        {
            var result = await instance.Get(HashTagData.FromText("london")).ConfigureAwait(false);

            Assert.Greater(result.Length, 20);
        }