示例#1
0
        internal static Task <IList <MediaItem> > GetTrackByAlbumTrackAsync(Guid?userId, Guid albumId, int discNo, int trackNo)
        {
            IFilter filter = new RelationalFilter(AudioAspect.ATTR_DISCID, RelationalOperator.EQ, discNo);

            filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, new RelationalFilter(AudioAspect.ATTR_TRACK, RelationalOperator.EQ, trackNo));
            return(GetTracksAsync(userId, albumId, filter));
        }
        public static CompiledGroupedAttributeValueQuery Compile(MIA_Management miaManagement,
                                                                 IEnumerable <Guid> necessaryRequestedMIATypeIDs,
                                                                 MediaItemAspectMetadata.AttributeSpecification selectAttribute, IAttributeFilter selectAttributeFilter,
                                                                 SelectProjectionFunction selectProjectionFunction, Type projectionValueType, IFilter filter)
        {
            IDictionary <Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;

            // If we're doing a complex query, we can optimize if we have an extra select attribute filter, i.e. a restriction
            // on the result set of values. See ComplexAttributeQueryBuilder.GenerateSqlGroupByStatement().
            bool    simpleQuery    = selectAttribute.Cardinality == Cardinality.Inline || selectAttribute.Cardinality == Cardinality.ManyToOne;
            IFilter combinedFilter = simpleQuery ?
                                     BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] { filter, selectAttributeFilter }) : filter;

            selectAttributeFilter = simpleQuery ? null : selectAttributeFilter;

            ICollection <MediaItemAspectMetadata> necessaryMIATypes = new List <MediaItemAspectMetadata>();

            // Raise exception if necessary MIA types are not present
            foreach (Guid miaTypeID in necessaryRequestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    throw new InvalidDataException("Necessary requested MIA type of ID '{0}' is not present in the media library", miaTypeID);
                }
                necessaryMIATypes.Add(miam);
            }
            return(new CompiledGroupedAttributeValueQuery(miaManagement, necessaryMIATypes, selectAttribute, selectAttributeFilter,
                                                          selectProjectionFunction, projectionValueType, combinedFilter));
        }
        public override ICollection <FilterValue> GetAvailableValues(IEnumerable <Guid> necessaryMIATypeIds, IFilter selectAttributeFilter, IFilter filter)
        {
            IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory;

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

            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (!userProfileDataManagement.IsValidUser)
            {
                return(new List <FilterValue>());
            }

            IFilter unwatchedFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                                              new EmptyUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_COUNT),
                                                                              new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_COUNT, RelationalOperator.EQ, "0"));

            IFilter watchedFilter = new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_COUNT, RelationalOperator.GT, "0");

            int numUnwatchedItems = cd.CountMediaItems(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, unwatchedFilter), true, ShowVirtualSetting.ShowVirtualMedia(necessaryMIATypeIds));
            int numWatchedItems   = cd.CountMediaItems(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, watchedFilter), true, ShowVirtualSetting.ShowVirtualMedia(necessaryMIATypeIds));

            return(new List <FilterValue>(new FilterValue[]
            {
                new FilterValue(Consts.RES_VALUE_UNWATCHED, unwatchedFilter, null, numUnwatchedItems, this),
                new FilterValue(Consts.RES_VALUE_WATCHED, watchedFilter, null, numWatchedItems, this),
            }.Where(fv => !fv.NumItems.HasValue || fv.NumItems.Value > 0)));
        }
示例#4
0
        internal static WebTVSeasonBasic TVSeasonBasic(IOwinContext context, MediaItem item, Guid?showId = null)
        {
            Guid?       user = ResourceAccessUtils.GetUser(context);
            ISet <Guid> necessaryMIATypespisodes = new HashSet <Guid>();

            necessaryMIATypespisodes.Add(MediaAspect.ASPECT_ID);
            necessaryMIATypespisodes.Add(EpisodeAspect.ASPECT_ID);

            IFilter unwatchedEpisodeFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                     new RelationshipFilter(EpisodeAspect.ROLE_EPISODE, SeasonAspect.ROLE_SEASON, item.MediaItemId),
                                                                                     new RelationalUserDataFilter(user.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100), true));

            int unwatchedCount = MediaLibraryAccess.CountMediaItems(context, necessaryMIATypespisodes, unwatchedEpisodeFilter);

            GetShowId(item, ref showId);

            var mediaAspect    = item.GetAspect(MediaAspect.Metadata);
            var seasonAspect   = item.GetAspect(SeasonAspect.Metadata);
            var importerAspect = item.GetAspect(ImporterAspect.Metadata);

            DateTime?firstAired = mediaAspect.GetAttributeValue <DateTime?>(MediaAspect.ATTR_RECORDINGTIME);

            return(new WebTVSeasonBasic
            {
                Title = mediaAspect.GetAttributeValue <string>(MediaAspect.ATTR_TITLE),
                Id = item.MediaItemId.ToString(),
                ShowId = showId.HasValue ? showId.Value.ToString() : null,
                SeasonNumber = seasonAspect.GetAttributeValue <int>(SeasonAspect.ATTR_SEASON),
                EpisodeCount = seasonAspect.GetAttributeValue <int>(SeasonAspect.ATTR_AVAILABLE_EPISODES),
                UnwatchedEpisodeCount = unwatchedCount,
                DateAdded = importerAspect.GetAttributeValue <DateTime>(ImporterAspect.ATTR_DATEADDED),
                Year = firstAired.HasValue ? firstAired.Value.Year : 0,
            });
        }
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?   userProfile  = CurrentUserProfile?.ProfileId;
            IFilter linkedFilter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                                  new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_COUNT)),
                                                                                                  new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_COUNT, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayCountString(0))) :
                                   null;
            IFilter filter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                            new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync(linkedFilter, _necessaryLinkedMias)),
                                                                                            new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_MAX_CHILD_COUNT))) :
                             new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.GT, 0);

            List <ISortInformation> sort = userProfile.HasValue ? new List <ISortInformation>
            {
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_MAX_CHILD_COUNT, SortDirection.Descending),
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_COUNT, SortDirection.Descending),
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending)
            } :
            new List <ISortInformation>
            {
                new AttributeSortInformation(MediaAspect.ATTR_PLAYCOUNT, SortDirection.Descending),
                new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending)
            };

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SubqueryFilter = GetNavigationFilter(_navigationInitializerType),
                SortInformation = sort
            });
        }
示例#6
0
        public IFilter GetSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
        {
            List <IFilter> searchFilters = new List <IFilter>();
            IList <MultipleMediaItemAspect> externalAspects;

            if (MediaItemAspect.TryGetAspects(extractedAspects, ExternalIdentifierAspect.Metadata, out externalAspects))
            {
                foreach (MultipleMediaItemAspect externalAspect in externalAspects)
                {
                    string source = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_SOURCE);
                    string type   = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_TYPE);
                    string id     = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_ID);
                    if (searchFilters.Count == 0)
                    {
                        searchFilters.Add(new BooleanCombinationFilter(BooleanOperator.And, new[]
                        {
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_SOURCE, RelationalOperator.EQ, source),
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_TYPE, RelationalOperator.EQ, type),
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_ID, RelationalOperator.EQ, id),
                        }));
                    }
                    else
                    {
                        searchFilters[0] = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, searchFilters[0],
                                                                                   new BooleanCombinationFilter(BooleanOperator.And, new[]
                        {
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_SOURCE, RelationalOperator.EQ, source),
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_TYPE, RelationalOperator.EQ, type),
                            new RelationalFilter(ExternalIdentifierAspect.ATTR_ID, RelationalOperator.EQ, id),
                        }));
                    }
                }
            }
            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, searchFilters.ToArray()));
        }
        public IFilter GetSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
        {
            SingleMediaItemAspect seasonAspect;

            if (!MediaItemAspect.TryGetAspect(extractedAspects, SeasonAspect.Metadata, out seasonAspect))
            {
                return(null);
            }

            IFilter seasonFilter = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_SEASON);
            IFilter seriesFilter = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_SERIES);

            if (seriesFilter == null)
            {
                return(seasonFilter);
            }

            int?    seasonNumber       = seasonAspect.GetAttributeValue <int?>(SeasonAspect.ATTR_SEASON);
            IFilter seasonNumberFilter = seasonNumber.HasValue ?
                                         new RelationalFilter(SeasonAspect.ATTR_SEASON, RelationalOperator.EQ, seasonNumber.Value) : null;

            seriesFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, seriesFilter, seasonNumberFilter);

            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, seasonFilter, seriesFilter));
        }
        public static IFilter GetEpisodeSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
        {
            SingleMediaItemAspect episodeAspect;

            if (!MediaItemAspect.TryGetAspect(extractedAspects, EpisodeAspect.Metadata, out episodeAspect))
            {
                return(null);
            }

            IFilter episodeFilter = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_EPISODE);
            IFilter seriesFilter  = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_SERIES);

            if (seriesFilter == null)
            {
                return(episodeFilter);
            }

            int?    seasonNumber       = episodeAspect.GetAttributeValue <int?>(EpisodeAspect.ATTR_SEASON);
            IFilter seasonNumberFilter = seasonNumber.HasValue ?
                                         new RelationalFilter(EpisodeAspect.ATTR_SEASON, RelationalOperator.EQ, seasonNumber.Value) : null;

            IEnumerable <int> episodeNumbers      = episodeAspect.GetCollectionAttribute <int>(EpisodeAspect.ATTR_EPISODE);
            IFilter           episodeNumberFilter = episodeNumbers != null && episodeNumbers.Any() ?
                                                    new RelationalFilter(EpisodeAspect.ATTR_EPISODE, RelationalOperator.EQ, episodeNumbers.First()) : null;

            seriesFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, seriesFilter, seasonNumberFilter, episodeNumberFilter);

            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, episodeFilter, seriesFilter));
        }
        public MediaLibraryQueryViewSpecification CreateSubViewSpecification(string viewDisplayName, IFilter filter, IEnumerable <Guid> filteredMias)
        {
            IFilter combinedFilter;

            if (_filter == null || !CanCombineFilters(filteredMias))
            {
                combinedFilter = filter;
            }
            else
            {
                if (filter is AbstractRelationshipFilter)
                {
                    //TODO: Check why reversing the filter order is necessary for RelationshipFilters
                    combinedFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] { filter, _filter });
                }
                else
                {
                    combinedFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] { _filter, filter });
                }
            }
            return(new MediaLibraryQueryViewSpecification(viewDisplayName, combinedFilter, _necessaryMIATypeIds, _optionalMIATypeIds, _onlyOnline, filteredMias)
            {
                MaxNumItems = _maxNumItems
            });
        }
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?   userProfile = CurrentUserProfile?.ProfileId;
            IFilter filter      = userProfile.HasValue ? await AppendUserFilterAsync(new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_COUNT)),
                                                                                     _necessaryMias) : new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.GT, 0);

            IFilter navigationFilter = GetNavigationFilter(_navigationInitializerType);

            if (navigationFilter != null)
            {
                filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, navigationFilter);
            }

            List <ISortInformation> sort = userProfile.HasValue ? new List <ISortInformation>
            {
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_COUNT, SortDirection.Descending),
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending)
            } :
            new List <ISortInformation>
            {
                new AttributeSortInformation(MediaAspect.ATTR_PLAYCOUNT, SortDirection.Descending),
                new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending)
            };

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SortInformation = sort
            });
        }
示例#11
0
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?   userProfile = CurrentUserProfile?.ProfileId;
            IFilter filter;

            if (userProfile.HasValue)
            {
                filter = await AppendUserFilterAsync(
                    new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0), true), _necessaryMias);
            }
            else
            {
                filter = new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.EQ, 0);
            }

            IFilter navigationFilter = GetNavigationFilter(_navigationInitializerType);

            if (navigationFilter != null)
            {
                filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, navigationFilter);
            }

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SortInformation = new List <ISortInformation> {
                    new AttributeSortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Ascending)
                }
            });
        }
示例#12
0
        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");
            }

            IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();

            if (!userProfileDataManagement.IsValidUser)
            {
                return(new List <FilterValue>());
            }

            IFilter unwatchedFilter = new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0), true);
            IFilter watchedFilter   = new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0));
            bool    showVirtual     = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds);
            var     taskUnwatched   = cd.CountMediaItemsAsync(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, unwatchedFilter), true, showVirtual);
            var     taskWatched     = cd.CountMediaItemsAsync(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, watchedFilter), true, showVirtual);
            var     counts          = await Task.WhenAll(taskUnwatched, taskWatched);

            return(new List <FilterValue>(new FilterValue[]
            {
                new FilterValue(Consts.RES_VALUE_UNWATCHED, unwatchedFilter, null, counts[0], this),
                new FilterValue(Consts.RES_VALUE_WATCHED, watchedFilter, null, counts[1], this),
            }.Where(fv => !fv.NumItems.HasValue || fv.NumItems.Value > 0)));
        }
示例#13
0
        public static IFilter GetUserRestrictionFilter(ICollection <Guid> necessaryMias, UserProfile userProfile, IFilter filter = null)
        {
            var check = CheckUserRestrictions();

            if (!check.ApplyUserRestrictions)
            {
                return(filter);
            }

            //ILogger logger = ServiceRegistration.Get<ILogger>(false);
            //logger?.Debug($"Media: Applying filter for user: {userProfile.Name} ({userProfile.ProfileId})");

            var userFilter = userProfile.GetUserFilter(necessaryMias);

            if (userFilter != null && filter != null)
            {
                return(BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, userFilter));
            }
            else if (userFilter != null)
            {
                return(userFilter);
            }

            return(filter);
        }
示例#14
0
        public IFilter GetSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
        {
            SingleMediaItemAspect audioAspect;

            if (!MediaItemAspect.TryGetAspect(extractedAspects, AudioAspect.Metadata, out audioAspect))
            {
                return(null);
            }

            IFilter trackFilter = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_TRACK);
            IFilter albumFilter = RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_ALBUM);

            if (albumFilter == null)
            {
                return(trackFilter);
            }

            int?trackNumber = audioAspect.GetAttributeValue <int?>(AudioAspect.ATTR_TRACK);

            if (trackNumber.HasValue)
            {
                albumFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, albumFilter,
                                                                      new RelationalFilter(AudioAspect.ATTR_TRACK, RelationalOperator.EQ, trackNumber.Value));
            }

            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, trackFilter, albumFilter));
        }
示例#15
0
        internal static async Task <MediaItem> GetEpisodeBySeriesEpisodeAsync(Guid?userId, Guid seriesId, int seasonNo, int episodeNo)
        {
            IFilter filter = new RelationalFilter(EpisodeAspect.ATTR_SEASON, RelationalOperator.EQ, seasonNo);

            filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, new InFilter(EpisodeAspect.ATTR_EPISODE, new object[] { episodeNo }));
            var items = await GetEpisodesAsync(userId, seriesId, filter);

            return(items.FirstOrDefault());
        }
示例#16
0
        public MediaLibraryQueryViewSpecification CreateSubViewSpecification(string viewDisplayName, IFilter filter)
        {
            IFilter combinedFilter = _filter == null ? filter : BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] { _filter, filter });

            return(new MediaLibraryQueryViewSpecification(viewDisplayName, combinedFilter, _necessaryMIATypeIds, _optionalMIATypeIds, _onlyOnline)
            {
                MaxNumItems = _maxNumItems
            });
        }
示例#17
0
        public void TestFilteredRelationshipQueryBuilder()
        {
            // Use the real RelationshipFilter because CompiledFilter is hard coded to look for it
            MockCore.AddMediaItemAspectStorage(RelationshipAspect.Metadata);

            SingleTestMIA mia1 = TestBackendUtils.CreateSingleMIA("Meta1", Cardinality.Inline, true, true);
            SingleTestMIA mia2 = TestBackendUtils.CreateSingleMIA("Meta2", Cardinality.Inline, true, true);
            SingleTestMIA mia3 = TestBackendUtils.CreateSingleMIA("Meta3", Cardinality.Inline, true, true);

            ICollection <MediaItemAspectMetadata> requiredMIATypes = new List <MediaItemAspectMetadata>();

            requiredMIATypes.Add(mia1.Metadata);
            requiredMIATypes.Add(mia2.Metadata);

            IFilter linkedMovieFilter = BooleanCombinationFilter.CombineFilters(
                BooleanOperator.And,
                new RelationalFilter(mia3.ATTR_INTEGER, RelationalOperator.EQ, 1),
                new RelationalFilter(mia3.ATTR_STRING, RelationalOperator.EQ, "test"));

            Guid    movieType = new Guid("bbbbbbbb-2222-2222-2222-bbbbbbbbbbbb");
            Guid    actorType = new Guid("cccccccc-3333-3333-3333-cccccccccccc");
            IFilter filter    = new FilteredRelationshipFilter(actorType, movieType, linkedMovieFilter);

            MIAQueryBuilder builder = new MIAQueryBuilder(MockCore.Management, new List <QueryAttribute>(), null, requiredMIATypes, new List <MediaItemAspectMetadata>(), filter, null, null);

            string mediaItemIdAlias = null;
            IDictionary <MediaItemAspectMetadata, string> miamAliases      = null;
            IDictionary <QueryAttribute, string>          attributeAliases = null;
            string          statementStr = null;
            IList <BindVar> bindVars     = null;

            builder.GenerateSqlStatement(out mediaItemIdAlias, out miamAliases, out attributeAliases, out statementStr, out bindVars);
            Console.WriteLine("mediaItemIdAlias: {0}", mediaItemIdAlias);
            Console.WriteLine("miamAliases: [{0}]", string.Join(",", miamAliases));
            Console.WriteLine("attributeAliases: [{0}]", string.Join(",", attributeAliases));
            Console.WriteLine("statementStr: {0}", statementStr);
            Console.WriteLine("bindVars: [{0}]", string.Join(",", bindVars));

            Assert.AreEqual("A0", mediaItemIdAlias, "Media item ID alias");
            Assert.AreEqual(CreateMIAMAliases(mia1.Metadata, "A1", mia2.Metadata, "A2"), miamAliases, "MIAM aliases");
            Assert.AreEqual(new Dictionary <QueryAttribute, string>(), attributeAliases, "Attribute aliases");
            Assert.AreEqual("SELECT T0.MEDIA_ITEM_ID A0, T0.MEDIA_ITEM_ID A1, T1.MEDIA_ITEM_ID A2 FROM M_META1 T0 INNER JOIN M_META2 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                            " WHERE T0.MEDIA_ITEM_ID IN(SELECT R1.MEDIA_ITEM_ID FROM M_RELATIONSHIP R1 WHERE R1.ROLE=@V0 AND R1.LINKEDROLE=@V1 AND R1.LINKEDID IN( " +
                            "SELECT TS.A0 FROM (SELECT T0.MEDIA_ITEM_ID A0, T1.MEDIA_ITEM_ID A1 FROM MEDIA_ITEMS T0 LEFT OUTER JOIN M_META3 T1 ON T0.MEDIA_ITEM_ID = T1.MEDIA_ITEM_ID " +
                            " WHERE (T1.ATTR_INTEGER = @V2 AND T1.ATTR_STRING = @V3)) TS) " +
                            "UNION SELECT R1.LINKEDID FROM M_RELATIONSHIP R1 WHERE R1.LINKEDROLE=@V0 AND R1.ROLE=@V1 AND R1.MEDIA_ITEM_ID IN( SELECT TS.A0 FROM (" +
                            "SELECT T0.MEDIA_ITEM_ID A0, T1.MEDIA_ITEM_ID A1 FROM MEDIA_ITEMS T0 LEFT OUTER JOIN M_META3 T1 ON T0.MEDIA_ITEM_ID = T1.MEDIA_ITEM_ID " +
                            " WHERE (T1.ATTR_INTEGER = @V2 AND T1.ATTR_STRING = @V3)) TS))", statementStr, "Statement");
            Assert.AreEqual(new List <BindVar>
            {
                new BindVar("V0", actorType, typeof(Guid)),
                new BindVar("V1", movieType, typeof(Guid)),
                new BindVar("V2", 1, typeof(int)),
                new BindVar("V3", "test", typeof(string))
            }, bindVars, "Bind vars");
        }
示例#18
0
        public async Task <IFilter> AppendUserFilterAsync(IFilter filter, IEnumerable <Guid> filterMias)
        {
            IFilter userFilter = await CertificationHelper.GetUserCertificateFilter(filterMias);

            if (userFilter != null)
            {
                return(filter != null?BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, userFilter) : userFilter);
            }
            return(filter);
        }
 public IFilter GetSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
 {
     if (!extractedAspects.ContainsKey(CharacterAspect.ASPECT_ID))
     {
         return(null);
     }
     return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                    RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_CHARACTER),
                                                    RelationshipExtractorUtils.CreateExternalItemFilter(extractedAspects, ExternalIdentifierAspect.TYPE_PERSON)));
 }
        /// <summary>
        /// Combines the <paramref name="currentFilter"/> with a <see cref="FilteredRelationshipFilter"/> with
        /// the specified <paramref name="role"/>, <paramref name="linkedRole"/> and <paramref name="subFilter"/>.
        /// </summary>
        /// <param name="currentFilter">The filter to combine.</param>
        /// <param name="role">The role to use for the <see cref="RelationshipFilter"/>.</param>
        /// <param name="linkedRole">The linked role to use for the <see cref="RelationshipFilter"/>.</param>
        /// <param name="subFilter">The filter to use for the <see cref="RelationshipFilter"/>.</param>
        /// <param name="ignoreNullSubFilter">Whether to not combine the filters if <paramref name="subFilter"/> is <c>null</c>.</param>
        /// <returns></returns>
        protected static IFilter CombineWithFilteredRelationship(IFilter currentFilter, Guid role, Guid linkedRole, IFilter subFilter, bool ignoreNullSubFilter)
        {
            if (subFilter == null && ignoreNullSubFilter)
            {
                return(currentFilter);
            }
            IFilter filteredRelationship = new FilteredRelationshipFilter(role, linkedRole, subFilter);

            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.And, currentFilter, filteredRelationship));
        }
示例#21
0
 public MediaLibraryUnwatchedContainer(string id, Guid[] necessaryMiaTypeIds, Guid[] optionalMiaTypeIds, EndPointSettings client)
     : base(id, "Unwatched", necessaryMiaTypeIds, optionalMiaTypeIds, null, client)
 {
     _filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                       new EmptyUserDataFilter(UserId, UserDataKeysKnown.KEY_PLAY_COUNT),
                                                       new RelationalUserDataFilter(UserId, UserDataKeysKnown.KEY_PLAY_COUNT, RelationalOperator.EQ, "0"));
     _queryLimit      = 10;
     _sortInformation = new List <ISortInformation> {
         new AttributeSortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Descending)
     };
 }
示例#22
0
 protected void CombineFilter(IFilter filter)
 {
     if (_filter == null)
     {
         _filter = filter;
     }
     else
     {
         _filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, _filter, filter);
     }
 }
示例#23
0
 protected IFilter CreateSubQueryFilter()
 {
     if (_subqueryFilter == null)
     {
         return(_filter);
     }
     if (_filter == null)
     {
         return(_subqueryFilter);
     }
     return(BooleanCombinationFilter.CombineFilters(BooleanOperator.And, _filter, _subqueryFilter));
 }
示例#24
0
 private static Task <IList <MediaItem> > SearchByGroupAsync(Guid?userId, Guid itemRole, Guid groupRole, Guid groupId, ISet <Guid> necessaryMIATypes, ISet <Guid> optionalMIATypes, IFilter filter = null, uint?limit = null, uint?offset = null, IList <ISortInformation> sort = null)
 {
     if (filter != null)
     {
         filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, new RelationshipFilter(itemRole, groupRole, groupId));
     }
     else
     {
         filter = new RelationshipFilter(itemRole, groupRole, groupId);
     }
     return(SearchAsync(userId, necessaryMIATypes, optionalMIATypes, filter, limit, offset, sort));
 }
示例#25
0
        public IFilter AppendUserFilter(IFilter filter, ICollection <Guid> necessaryMias)
        {
            IFilter userFilter = null;
            IUserProfileDataManagement userProfileDataManagement = ServiceRegistration.Get <IUserProfileDataManagement>();
            var res = userProfileDataManagement.GetProfileAsync(UserId).Result;

            if (res.Success)
            {
                userFilter = res.Result.GetUserFilter(necessaryMias);
            }

            return(filter == null ? userFilter : userFilter != null?BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, userFilter) : filter);
        }
示例#26
0
        internal static IFilter AppendUserFilter(Guid?userId, IFilter filter, ICollection <Guid> filterMias)
        {
            IFilter userFilter = null;

            if (userId.HasValue)
            {
                IUserProfileDataManagement userProfileDataManagement = ServiceRegistration.Get <IUserProfileDataManagement>();
                var res = userProfileDataManagement.GetProfileAsync(userId.Value).Result;
                if (res.Success)
                {
                    userFilter = res.Result.GetUserFilter(filterMias);
                }
            }
            return(filter == null ? userFilter : userFilter != null?BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, userFilter) : filter);
        }
示例#27
0
 /// <summary>
 /// Gets a <see cref="BooleanCombinationFilter"/> of all filters provided by plugins that are applied to media view initialized
 /// by the specified <paramref name="navigationInitializerType"/>.
 /// </summary>
 /// <param name="navigationInitializerType">The type of the derived <see cref="MediaPortal.UiComponents.Media.Models.NavigationModel.IMediaNavigationInitializer"/></param>
 /// <returns></returns>
 protected IFilter GetNavigationFilter(Type navigationInitializerType)
 {
     if (navigationInitializerType != null)
     {
         lock (_navigationFilterSync)
         {
             InitNavigationFilters();
             if (_navigationFilters.TryGetValue(navigationInitializerType.Name, out IList <IFilter> filters) && filters.Count > 0)
             {
                 return(filters.Count == 1 ? filters[0] : BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filters));
             }
         }
     }
     return(null);
 }
        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");
            }
            IFilter emptyFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                                          new EmptyFilter(ImageAspect.ATTR_WIDTH),
                                                                          new RelationalFilter(ImageAspect.ATTR_WIDTH, RelationalOperator.EQ, 0),
                                                                          new EmptyFilter(ImageAspect.ATTR_HEIGHT),
                                                                          new RelationalFilter(ImageAspect.ATTR_HEIGHT, RelationalOperator.EQ, 0));
            IFilter simpleSmallFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                new RelationalFilter(ImageAspect.ATTR_WIDTH, RelationalOperator.LT, Consts.SMALL_SIZE_THRESHOLD),
                                                                                new RelationalFilter(ImageAspect.ATTR_HEIGHT, RelationalOperator.LT, Consts.SMALL_SIZE_THRESHOLD));
            IFilter smallFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                          simpleSmallFilter,
                                                                          new NotFilter(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                                                                                                new RelationalFilter(ImageAspect.ATTR_WIDTH, RelationalOperator.EQ, 0),
                                                                                                                                new RelationalFilter(ImageAspect.ATTR_HEIGHT, RelationalOperator.EQ, 0))));
            IFilter bigFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                                        new RelationalFilter(ImageAspect.ATTR_WIDTH, RelationalOperator.GT, Consts.BIG_SIZE_THRESHOLD),
                                                                        new RelationalFilter(ImageAspect.ATTR_HEIGHT, RelationalOperator.GT, Consts.BIG_SIZE_THRESHOLD));
            IFilter mediumFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                           new NotFilter(simpleSmallFilter),
                                                                           new NotFilter(bigFilter));

            bool showVirtual = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds);

            var taskEmpty  = cd.CountMediaItemsAsync(necessaryMIATypeIds, emptyFilter, true, showVirtual);
            var taskSmall  = cd.CountMediaItemsAsync(necessaryMIATypeIds, smallFilter, true, showVirtual);
            var taskMedium = cd.CountMediaItemsAsync(necessaryMIATypeIds, mediumFilter, true, showVirtual);
            var taskBig    = cd.CountMediaItemsAsync(necessaryMIATypeIds, bigFilter, true, showVirtual);

            var counts = await Task.WhenAll(taskEmpty, taskSmall, taskMedium, taskBig);

            return(new List <FilterValue>(new FilterValue[]
            {
                new FilterValue(Consts.RES_VALUE_EMPTY_TITLE, emptyFilter, null, counts[0], this),
                new FilterValue(Consts.RES_IMAGE_FILTER_SMALL, smallFilter, null, counts[1], this),
                new FilterValue(Consts.RES_IMAGE_FILTER_MEDIUM, mediumFilter, null, counts[2], this),
                new FilterValue(Consts.RES_IMAGE_FILTER_BIG, bigFilter, null, counts[3], this),
            }.Where(fv => !fv.NumItems.HasValue || fv.NumItems.Value > 0)));
        }
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?userProfile = CurrentUserProfile?.ProfileId;

            return(new MediaItemQuery(_necessaryMias, _optionalMias, null)
            {
                Filter = userProfile.HasValue ? new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync(
                                                                                   BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                                                           new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE)),
                                                                                                                           new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100)),
                                                                                                                           new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0))),
                                                                                   _necessaryLinkedMias)) : null,
                SubqueryFilter = GetNavigationFilter(_navigationInitializerType),
                SortInformation = new List <ISortInformation> {
                    new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending)
                }
            });
        }
示例#30
0
        public static IFilter GetMovieCollectionSearchFilter(IDictionary <Guid, IList <MediaItemAspect> > extractedAspects)
        {
            List <IFilter> movieCollectionFilters = new List <IFilter>();

            if (!extractedAspects.ContainsKey(MovieCollectionAspect.ASPECT_ID))
            {
                return(null);
            }

            IList <MultipleMediaItemAspect> externalAspects;

            if (MediaItemAspect.TryGetAspects(extractedAspects, ExternalIdentifierAspect.Metadata, out externalAspects))
            {
                foreach (MultipleMediaItemAspect externalAspect in externalAspects)
                {
                    string source = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_SOURCE);
                    string type   = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_TYPE);
                    string id     = externalAspect.GetAttributeValue <string>(ExternalIdentifierAspect.ATTR_ID);
                    if (type == ExternalIdentifierAspect.TYPE_COLLECTION)
                    {
                        if (movieCollectionFilters.Count == 0)
                        {
                            movieCollectionFilters.Add(new BooleanCombinationFilter(BooleanOperator.And, new[]
                            {
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_SOURCE, RelationalOperator.EQ, source),
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_TYPE, RelationalOperator.EQ, type),
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_ID, RelationalOperator.EQ, id),
                            }));
                        }
                        else
                        {
                            movieCollectionFilters[0] = BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, movieCollectionFilters[0],
                                                                                                new BooleanCombinationFilter(BooleanOperator.And, new[]
                            {
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_SOURCE, RelationalOperator.EQ, source),
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_TYPE, RelationalOperator.EQ, type),
                                new RelationalFilter(ExternalIdentifierAspect.ATTR_ID, RelationalOperator.EQ, id),
                            }));
                        }
                    }
                }
            }
            return(BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, movieCollectionFilters.ToArray()));
        }