public override async Task <ICollection <FilterValue> > GetAvailableValuesAsync(IEnumerable <Guid> necessaryMIATypeIds, IFilter selectAttributeFilter, IFilter filter)
        {
            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

            if (cd == null)
            {
                throw new NotConnectedException("The MediaLibrary is not connected");
            }

            bool            showVirtual = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds);
            ViewSettings    settings    = ServiceRegistration.Get <ISettingsManager>().Load <ViewSettings>();
            IGenreConverter converter   = ServiceRegistration.Get <IGenreConverter>();
            Dictionary <int, FilterValue> genredFilters   = new Dictionary <int, FilterValue>();
            List <FilterValue>            ungenredFilters = new List <FilterValue>();

            if (_necessaryMIATypeIds != null)
            {
                necessaryMIATypeIds = _necessaryMIATypeIds;
            }
            HomogenousMap valueGroups = null;
            HomogenousMap valueKeys   = null;

            if (_keyAttributeType != null)
            {
                Tuple <HomogenousMap, HomogenousMap> values = await cd.GetKeyValueGroupsAsync(_keyAttributeType, _valueAttributeType, selectAttributeFilter, ProjectionFunction.None, necessaryMIATypeIds, filter, true, showVirtual);

                valueGroups = values.Item1;
                valueKeys   = values.Item2;
            }
            else
            {
                valueGroups = await cd.GetValueGroupsAsync(_valueAttributeType, selectAttributeFilter, ProjectionFunction.None, necessaryMIATypeIds, filter, true, showVirtual);
            }
            IList <FilterValue> result = new List <FilterValue>(valueGroups.Count);
            int numEmptyEntries        = 0;

            foreach (KeyValuePair <object, object> group in valueGroups)
            {
                string name = GetDisplayName(group.Key);
                if (name == string.Empty)
                {
                    numEmptyEntries += (int)group.Value;
                }
                else if (!string.IsNullOrEmpty(_genreCategory) && settings.UseLocalizedGenres)
                {
                    int?genreId = valueKeys[group.Key] as int?;
                    if (!genreId.HasValue)
                    {
                        ungenredFilters.Add(new FilterValue(valueKeys[group.Key], name, new RelationalFilter(_valueAttributeType, RelationalOperator.EQ, group.Key), null, (int)group.Value, this));
                    }
                    else if (!genredFilters.ContainsKey(genreId.Value))
                    {
                        if (converter.GetGenreName(genreId.Value, _genreCategory, null, out string genreName))
                        {
                            name = genreName;
                        }
                        genredFilters.Add(genreId.Value, new FilterValue(genreId.Value, name, new RelationalFilter(_valueAttributeType, RelationalOperator.EQ, group.Key), null, (int)group.Value, this));
                    }
                    else
                    {
                        genredFilters[genreId.Value] = new FilterValue(genreId.Value, genredFilters[genreId.Value].Title,
                                                                       BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, genredFilters[genreId.Value].Filter, new RelationalFilter(_valueAttributeType, RelationalOperator.EQ, group.Key)), null,
                                                                       genredFilters[genreId.Value].NumItems.Value + (int)group.Value, this);
                    }
                }
                else
                {
                    result.Add(new FilterValue(valueKeys[group.Key], name, new RelationalFilter(_valueAttributeType, RelationalOperator.EQ, group.Key), null, (int)group.Value, this));
                }
            }

            foreach (var gf in genredFilters.Values)
            {
                result.Add(gf);
            }

            foreach (var ugf in ungenredFilters)
            {
                result.Add(ugf);
            }

            if (numEmptyEntries > 0)
            {
                result.Insert(0, new FilterValue(Consts.RES_VALUE_EMPTY_TITLE, new EmptyFilter(_valueAttributeType), null, numEmptyEntries, this));
            }

            return(result);
        }